Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Script vars #219

Merged
merged 9 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ tags
types_*.taghl
*.swp
*.swo
.*~
*.s.old
*.s.old2
*.dump
Expand All @@ -39,4 +40,4 @@ build/
*.pl
*.a
.vscode/
*.ss[0-9]
*.ss[0-9]
4 changes: 2 additions & 2 deletions data/data.s
Original file line number Diff line number Diff line change
Expand Up @@ -471,8 +471,8 @@ gUnknown_80B71A0: @ 80B71A0
.string "{COLOR_1 GREEN_2}START{END_COLOR_TEXT_1}\0"
.align 2,0

.global gUnknown_80B71E4
gUnknown_80B71E4: @ 80B71E4
.global gGroundEnterLookupTable
gGroundEnterLookupTable: @ 80B71E4
@ [struct unkEventStruct]
.2byte 105, 1
.2byte 106, 2
Expand Down
194 changes: 167 additions & 27 deletions include/event_flag.h
Original file line number Diff line number Diff line change
@@ -1,39 +1,179 @@
#ifndef GUARD_EVENT_FLAG_H
#define GUARD_EVENT_FLAG_H

enum FlagCalcOperation {
CALC_SET,
CALC_SUB,
CALC_ADD,
CALC_MUL,
CALC_DIV,
CALC_MOD,
CALC_AND,
CALC_OR,
CALC_XOR,
CALC_SETBIT,
CALC_CLEARBIT,
CALC_RANDOM,
};

enum FlagJudgeOperation {
JUDGE_TRUE,
JUDGE_FALSE,
JUDGE_EQ,
JUDGE_GT,
JUDGE_LT,
JUDGE_GE,
JUDGE_LE,
JUDGE_NE,
JUDGE_AND_NONZERO,
JUDGE_XOR_NONZERO, // logically identical to JUDGE_NE
JUDGE_BIT_SET,
};

enum ScriptVarId {
/* 0x00 */ VERSION,
/* 0x01 */ CONDITION,
/* 0x02 */ SCENARIO_SELECT,
/* 0x03 */ SCENARIO_MAIN,
/* 0x04 */ SCENARIO_SUB1,
/* 0x05 */ SCENARIO_SUB2,
/* 0x06 */ SCENARIO_SUB3,
/* 0x07 */ SCENARIO_SUB4,
/* 0x08 */ SCENARIO_SUB5,
/* 0x09 */ SCENARIO_SUB6,
/* 0x0a */ SCENARIO_SUB7,
/* 0x0b */ SCENARIO_SUB8,
/* 0x0c */ SCENARIO_SUB9,
/* 0x0d */ GROUND_ENTER,
/* 0x0e */ GROUND_ENTER_LINK,
/* 0x0f */ GROUND_GETOUT,
/* 0x10 */ GROUND_MAP,
/* 0x11 */ GROUND_PLACE,
/* 0x12 */ DUNGEON_SELECT,
/* 0x13 */ DUNGEON_ENTER,
/* 0x14 */ DUNGEON_ENTER_INDEX,
/* 0x15 */ DUNGEON_ENTER_FREQUENCY,
/* 0x16 */ DUNGEON_RESULT,
/* 0x17 */ SCRIPT_MODE,
/* 0x18 */ START_MODE,
/* 0x19 */ CLEAR_COUNT,
/* 0x1a */ CONDITION_KIND,
/* 0x1b */ WEATHER_KIND,
/* 0x1c */ PLAYER_KIND,
/* 0x1d */ PARTNER1_KIND,
/* 0x1e */ PARTNER2_KIND,
/* 0x1f */ NEW_FRIEND_KIND,
/* 0x20 */ FRIEND_SUM,
/* 0x21 */ UNIT_SUM,
/* 0x22 */ GOLD,
/* 0x23 */ BANK_GOLD,
/* 0x24 */ WARP_LIST,
/* 0x25 */ WARP_LOCK,
/* 0x26 */ PARTNER_TALK_KIND,
/* 0x27 */ BASE_KIND,
/* 0x28 */ BASE_LEVEL,
/* 0x29 */ FLAG_KIND,
/* 0x2a */ FLAG_KIND_CHANGE_REQUEST,
/* 0x2b */ RESCUE_SCENARIO_ORDER_LIST,
/* 0x2c */ RESCUE_SCENARIO_JOB_LIST,
/* 0x2d */ RESCUE_SCENARIO_CONQUEST_LIST,
/* 0x2e */ TRAINING_CONQUEST_LIST,
/* 0x2f */ TRAINING_PRESENT_LIST,
/* 0x30 */ DUNGEON_ENTER_LIST,
/* 0x31 */ DUNGEON_CLEAR_LIST,
/* 0x32 */ POSITION_X,
/* 0x33 */ POSITION_Y,
/* 0x34 */ POSITION_HEIGHT,
/* 0x35 */ POSITION_DIRECTION,
/* 0x36 */ GROUND_LOCAL,
/* 0x37 */ MAP_LOCAL,
/* 0x38 */ MAP_LOCAL_DOOR,
/* 0x39 */ EVENT_LOCAL,
/* 0x3a */ STATION_ITEM_STATIC,
/* 0x3b */ STATION_ITEM_TEMP,
/* 0x3c */ DELIVER_ITEM_STATIC,
/* 0x3d */ DELIVER_ITEM_TEMP,
/* 0x3e */ SHOP_TEMP,
/* 0x3f */ INN_TEMP,
/* 0x40 */ EVENT_S07E01,
/* 0x41 */ EVENT_S08E01,
/* 0x42 */ EVENT_GONBE,
/* 0x43 */ EVENT_ORNAMENT_01,
/* 0x44 */ EVENT_ORNAMENT_02,
/* 0x45 */ EVENT_ORNAMENT_03,
/* 0x46 */ EVENT_ORNAMENT_04,
/* 0x47 */ EVENT_B01P01,
/* 0x48 */ EVENT_T01P01,
/* 0x49 */ EVENT_T01P02,
/* 0x4a */ EVENT_T01P03,
/* 0x4b */ EVENT_M01E09A_2N,
/* 0x4c */ EVENT_M01E09A_8N,
/* 0x4d */ EVENT_M01E10A_1N,
/* 0x4e */ EVENT_M01E10A_3N,
/* 0x4f */ EVENT_M01E10A_5N,
/* 0x50 */ EVENT_M02E01A_2N,
/* 0x51 */ SUM,
/* 0x400 */ LOCAL0 = 0x400,
/* 0x401 */ LOCAL1,
/* 0x402 */ LOCAL2,
/* 0x403 */ LOCAL3,
};

// size: 0x10
struct ScriptVarInfo {
s16 type;
s16 unk2;
s16 bufOffset;
s16 bitOffset;
s16 arrayLen;
s16 defaultValue;
char *name;
};

// size: 0x8
struct UnkEventStruct
struct ScriptVarPtr
{
/* 0x0 */ s16 *unk0;
/* 0x4 */ u8 *unk4;
/* 0x0 */ struct ScriptVarInfo *info;
/* 0x4 */ u8 *ptr;
};

void GetScriptVarScenario(s32 param_1,u32 *param_2,u32 *param_3);
void ScenarioCalc(s16 param_1, s32 param_2, s32 param_3);
bool8 ScriptVarScenarioBefore(s16 param_1, u32 param_2, s32 param_3);
bool8 ScriptVarScenarioEqual(s16 param_1, u32 param_2, s32 param_3);
bool8 ScriptVarScenarioAfter(s16 param_1, u32 param_2, s32 param_3);
// event_flag.s

void ThoroughlyResetScriptVars(void);
void ResetScriptVarArray(u8 *localVarBuf, s16 varId);
void ClearScriptVarArray(u8 *localVarBuf, s16 varId);
void GetScriptVarRef(struct ScriptVarPtr *out, u8 *localVarBuf, s32 varId);
s32 GetScriptVarValue(u8 *localVarBuf, s32 varId);
s32 GetScriptVarArrayValue(u8 *localVarBuf, s32 varId, u16 idx);
void SetScriptVarValue(u8 *localVarBuf, s32 varId, s32 val);
void SetScriptVarArrayValue(u8 *localVarBuf, s32 varId, u16 idx, s32 val);
s32 GetScriptVarArraySum(u8 *localVarBuf, s16 varId);
void GetScriptVarScenario(s32 varId,u32 *outMain,u32 *outSub);
void ScenarioCalc(s16 varId, s32 main, s32 sub);
bool8 ScriptVarScenarioBefore(s16 varId, u32 main, s32 sub);
bool8 ScriptVarScenarioEqual(s16 varId, u32 main, s32 sub);
bool8 ScriptVarScenarioAfter(s16 varId, u32 main, s32 sub);
void sub_8001D88(void);
u32 _FlagCalc(s32 param_1, s32 param_2, u32 operation);
u8 _FlagJudge(s32 param_1, s32 param_2, u32 operation);
u32 FlagCalc(s32 r0, s32 r1, u32 operation);
void UpdateScriptVarWithImmediate(u32 param_1, s16 param_2, s32 param_3, u32 operation);
void UpdateScriptVarWithVar(u32 param_1, s16 param_2, s16 param_3, u32 operation);
u8 FlagJudge(s32 r0, s32 r1, u32 operation);
u8 sub_80022F8(u32 param_1, s16 param_2, s32 param_3, u32 operation);
u8 sub_8002318(u32 param_1, s16 param_2, s16 param_3, u32 operation);
bool8 sub_80023E4(u32 param_1);
u8 sub_8002658(s16 param_1);
s16 sub_8002694(u8 param_1);
s32 _FlagCalc(s32 param_1, s32 param_2, enum FlagCalcOperation operation);
bool8 _FlagJudge(s32 param_1, s32 param_2, enum FlagJudgeOperation operation);
s32 FlagCalc(s32 r0, s32 r1, enum FlagCalcOperation operation);
void UpdateScriptVarWithImmediate(u8 *localVarBuf, s16 varId, s32 val, enum FlagCalcOperation operation);
void UpdateScriptVarWithVar(u8 *localVarBuf, s16 dstVarId, s16 srcVarId, enum FlagCalcOperation operation);
bool8 FlagJudge(s32 r0, s32 r1, enum FlagJudgeOperation operation);
bool8 JudgeVarWithImmediate(u8 *localVarBuf, s16 varId, s32 val, enum FlagJudgeOperation operation);
bool8 JudgeVarWithVar(u8 *localVarBuf, s16 varId1, s16 varId2, enum FlagJudgeOperation operation);
bool8 sub_80023E4(u32 param_1); // some kind of helper for predefined scenario checks
u8 sub_8002658(s16 param_1); // GroundEnter -> value lookup
s16 sub_8002694(u8 param_1); // value -> GroundEnter lookup
bool8 sub_80026CC(s16 r0);
void sub_80026E8(s16 r0);
bool8 sub_8002700(void *r0);
bool8 sub_8002718(u8 *r0);
void sub_8002758(s32 r0);
u8 sub_800276C(void);
void sub_80026E8(s16 r0, bool8 r1);
bool8 SaveGlobalScriptVars(void *r0);
bool8 RestoreGlobalScriptVars(u8 *r0);

// event_flag.s
extern void ClearScriptVarArray(u32, u32);
extern u32 GetScriptVarValue(u32, u32);
// .rodata
extern struct ScriptVarInfo gScriptVarInfo[];

// EWRAM
extern u8 gScriptVarBuffer[0x400];

#endif // GUARD_EVENT_FLAG_H
10 changes: 4 additions & 6 deletions include/ground_script.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,6 @@ typedef struct ScriptInfo
/* 0xA */ s8 sector;
} ScriptInfo;

typedef union ScriptUnion832 {
s32 raw;
s8 arr[4];
} ScriptUnion832;

typedef union ScriptUnion1632 {
s32 raw;
s16 arr[2];
Expand Down Expand Up @@ -70,7 +65,10 @@ typedef struct ScriptData
/* 0x4D */ u8 unk4D;
// padding
// ultimately accessed as ldrb, doesn't work as array of u32-sized structs, needs union
/* 0x50 */ ScriptUnion832 unk50[4];
/* 0x50 */ union {
u8 buf[16];
u32 val[4];
} localVars;
} ScriptData;

typedef struct CallbackData
Expand Down
110 changes: 47 additions & 63 deletions src/code.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,6 @@ void nullsub_3(s32 a0, s32 a1)
/// TODO merge with event_flag
/////////////////////////////////

extern u8 gScriptVarBuffer[0x400];

struct unkStruct_80B7394
{
s16 unk0;
s16 unk2;
s16 unk4;
s16 unk6;
s16 unk8;
s16 unkA;
u8 *text;
};

extern struct unkStruct_80B7394 gScriptVarInfo[];
extern void SetScriptVarArrayValue(u32, s32, u32, s32);
extern void SetScriptVarValue(u32, u32, u32);
extern void sub_80972F4(void);
extern void nullsub_128(void);

Expand All @@ -60,7 +44,7 @@ void ThoroughlyResetScriptVars(void)
s32 iVar1;
s32 iVar3;
u16 uVar2;
struct unkStruct_80B7394 *puVar1;
struct ScriptVarInfo *puVar1;

for(iVar3 = 0; iVar3 < 0x400; iVar3++)
{
Expand All @@ -70,55 +54,55 @@ void ThoroughlyResetScriptVars(void)
for(iVar1 = 0; iVar1 < 0x51; iVar1 = (iVar1 + 1) * 0x10000 >> 0x10)
{
puVar1 = &gScriptVarInfo[iVar1];
if (((puVar1->unk0 != 0) && ((puVar1->unk0 != 8)))) {
for (uVar2 = 0; uVar2 < puVar1->unk8; uVar2++) {
SetScriptVarArrayValue(0, iVar1, uVar2, puVar1->unkA);
if (((puVar1->type != 0) && ((puVar1->type != 8)))) {
for (uVar2 = 0; uVar2 < puVar1->arrayLen; uVar2++) {
SetScriptVarArrayValue(NULL, iVar1, uVar2, puVar1->defaultValue);
}
}
}
ClearScriptVarArray(0,1);
ScenarioCalc(2,0,0);
ScenarioCalc(3,0,0);
ScenarioCalc(4,0,0);
ScenarioCalc(5,0,0);
ScenarioCalc(6,0,0);
ScenarioCalc(7,0,0);
ScenarioCalc(8,0,0);
ScenarioCalc(9,0,0);
ScenarioCalc(10,0,0);
ScenarioCalc(0xb,0,0);
ScenarioCalc(0xc,0,0);
SetScriptVarValue(0,0xd,0xa2);
SetScriptVarValue(0,0xe,0);
SetScriptVarValue(0,0xf,0xa2);
SetScriptVarValue(0,0x10,-1);
SetScriptVarValue(0,0x11,0x24);
SetScriptVarValue(0,0x12,-1);
SetScriptVarValue(0,0x13,0);
SetScriptVarValue(0,0x14,-1);
SetScriptVarValue(0,0x16,0);
SetScriptVarValue(0,0x18,0);
SetScriptVarValue(0,0x19,0);
SetScriptVarValue(0,0x1b,-1);
SetScriptVarValue(0,0x1c,0);
SetScriptVarValue(0,0x1d,0);
SetScriptVarValue(0,0x1e,0);
SetScriptVarValue(0,0x1f,0);
ClearScriptVarArray(0,0x24);
SetScriptVarValue(0,0x25,0);
SetScriptVarValue(0,0x26,0);
SetScriptVarValue(0,0x27,0);
SetScriptVarValue(0,0x28,0);
SetScriptVarValue(0,0x29,0);
SetScriptVarValue(0,0x2a,0);
ClearScriptVarArray(0,0x2b);
ClearScriptVarArray(0,0x2c);
ClearScriptVarArray(0,0x2d);
ClearScriptVarArray(0,0x2e);
ClearScriptVarArray(0,0x2f);
ClearScriptVarArray(0,0x30);
ClearScriptVarArray(0,0x31);
ClearScriptVarArray(0,0x41);
ClearScriptVarArray(NULL, CONDITION);
ScenarioCalc(SCENARIO_SELECT,0,0);
ScenarioCalc(SCENARIO_MAIN,0,0);
ScenarioCalc(SCENARIO_SUB1,0,0);
ScenarioCalc(SCENARIO_SUB2,0,0);
ScenarioCalc(SCENARIO_SUB3,0,0);
ScenarioCalc(SCENARIO_SUB4,0,0);
ScenarioCalc(SCENARIO_SUB5,0,0);
ScenarioCalc(SCENARIO_SUB6,0,0);
ScenarioCalc(SCENARIO_SUB7,0,0);
ScenarioCalc(SCENARIO_SUB8,0,0);
ScenarioCalc(SCENARIO_SUB9,0,0);
SetScriptVarValue(NULL,GROUND_ENTER,0xa2);
SetScriptVarValue(NULL,GROUND_ENTER_LINK,0);
SetScriptVarValue(NULL,GROUND_GETOUT,0xa2);
SetScriptVarValue(NULL,GROUND_MAP,-1);
SetScriptVarValue(NULL,GROUND_PLACE,0x24);
SetScriptVarValue(NULL,DUNGEON_SELECT,-1);
SetScriptVarValue(NULL,DUNGEON_ENTER,0);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,-1);
SetScriptVarValue(NULL,DUNGEON_RESULT,0);
SetScriptVarValue(NULL,START_MODE,0);
SetScriptVarValue(NULL,CLEAR_COUNT,0);
SetScriptVarValue(NULL,WEATHER_KIND,-1);
SetScriptVarValue(NULL,PLAYER_KIND,0);
SetScriptVarValue(NULL,PARTNER1_KIND,0);
SetScriptVarValue(NULL,PARTNER2_KIND,0);
SetScriptVarValue(NULL,NEW_FRIEND_KIND,0);
ClearScriptVarArray(NULL,WARP_LIST);
SetScriptVarValue(NULL,WARP_LOCK,0);
SetScriptVarValue(NULL,PARTNER_TALK_KIND,0);
SetScriptVarValue(NULL,BASE_KIND,0);
SetScriptVarValue(NULL,BASE_LEVEL,0);
SetScriptVarValue(NULL,FLAG_KIND,0);
SetScriptVarValue(NULL,FLAG_KIND_CHANGE_REQUEST,0);
ClearScriptVarArray(NULL,RESCUE_SCENARIO_ORDER_LIST);
ClearScriptVarArray(NULL,RESCUE_SCENARIO_JOB_LIST);
ClearScriptVarArray(NULL,RESCUE_SCENARIO_CONQUEST_LIST);
ClearScriptVarArray(NULL,TRAINING_CONQUEST_LIST);
ClearScriptVarArray(NULL,TRAINING_PRESENT_LIST);
ClearScriptVarArray(NULL,DUNGEON_ENTER_LIST);
ClearScriptVarArray(NULL,DUNGEON_CLEAR_LIST);
ClearScriptVarArray(NULL,EVENT_S08E01);
sub_80972F4();
}

Expand Down
Loading