diff --git a/asm/event_flag.s b/asm/event_flag.s index 04365908c..2c00aefdd 100644 --- a/asm/event_flag.s +++ b/asm/event_flag.s @@ -444,221 +444,4 @@ _080018CE: bx r1 thumb_func_end GetScriptVarArrayValue - thumb_func_start SetScriptVarValue -SetScriptVarValue: - push {r4,r5,lr} - sub sp, 0x8 - adds r3, r0, 0 - adds r4, r2, 0 - lsls r1, 16 - asrs r5, r1, 16 - mov r0, sp - adds r1, r3, 0 - adds r2, r5, 0 - bl GetScriptVarRef - ldr r0, [sp] - ldrh r0, [r0] - subs r0, 0x1 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x7 - bhi _08001990 - lsls r0, 2 - ldr r1, _08001908 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08001908: .4byte _0800190C - .align 2, 0 -_0800190C: - .4byte _0800192C - .4byte _08001958 - .4byte _08001958 - .4byte _0800195E - .4byte _0800195E - .4byte _08001964 - .4byte _08001958 - .4byte _08001968 -_0800192C: - ldr r0, [sp] - movs r2, 0x6 - ldrsh r1, [r0, r2] - movs r0, 0x80 - lsls r0, 17 - lsls r0, r1 - lsrs r3, r0, 24 - cmp r4, 0 - beq _0800194A - ldr r2, [sp, 0x4] - ldrb r1, [r2] - adds r0, r3, 0 - orrs r0, r1 - strb r0, [r2] - b _08001990 -_0800194A: - ldr r2, [sp, 0x4] - ldrb r1, [r2] - adds r0, r3, 0 - orrs r0, r1 - eors r0, r3 - strb r0, [r2] - b _08001990 -_08001958: - ldr r0, [sp, 0x4] - strb r4, [r0] - b _08001990 -_0800195E: - ldr r0, [sp, 0x4] - strh r4, [r0] - b _08001990 -_08001964: - ldr r0, [sp, 0x4] - b _0800198E -_08001968: - cmp r5, 0x22 - beq _08001972 - cmp r5, 0x23 - beq _08001984 - b _08001990 -_08001972: - ldr r0, _08001980 - ldr r0, [r0] - movs r1, 0x98 - lsls r1, 2 - adds r0, r1 - b _0800198E - .align 2, 0 -_08001980: .4byte gTeamInventoryRef -_08001984: - ldr r0, _08001998 - ldr r0, [r0] - movs r2, 0x99 - lsls r2, 2 - adds r0, r2 -_0800198E: - str r4, [r0] -_08001990: - add sp, 0x8 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08001998: .4byte gTeamInventoryRef - thumb_func_end SetScriptVarValue - - thumb_func_start SetScriptVarArrayValue -SetScriptVarArrayValue: - push {r4-r7,lr} - sub sp, 0x8 - adds r4, r0, 0 - adds r6, r3, 0 - lsls r1, 16 - asrs r7, r1, 16 - lsls r2, 16 - lsrs r5, r2, 16 - mov r0, sp - adds r1, r4, 0 - adds r2, r7, 0 - bl GetScriptVarRef - ldr r0, [sp] - ldrh r0, [r0] - subs r0, 0x1 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x7 - bhi _08001A68 - lsls r0, 2 - ldr r1, _080019D0 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080019D0: .4byte _080019D4 - .align 2, 0 -_080019D4: - .4byte _080019F4 - .4byte _08001A2C - .4byte _08001A2C - .4byte _08001A34 - .4byte _08001A34 - .4byte _08001A3E - .4byte _08001A2C - .4byte _08001A44 -_080019F4: - ldr r0, [sp] - ldrh r0, [r0, 0x6] - adds r0, r5, r0 - lsls r0, 16 - lsrs r2, r0, 19 - ldr r1, [sp, 0x4] - adds r3, r1, r2 - movs r1, 0xE0 - lsls r1, 11 - ands r1, r0 - lsrs r1, 16 - movs r0, 0x80 - lsls r0, 17 - lsls r0, r1 - lsrs r2, r0, 24 - cmp r6, 0 - beq _08001A20 - ldrb r1, [r3] - adds r0, r2, 0 - orrs r0, r1 - strb r0, [r3] - b _08001A68 -_08001A20: - ldrb r1, [r3] - adds r0, r2, 0 - orrs r0, r1 - eors r0, r2 - strb r0, [r3] - b _08001A68 -_08001A2C: - ldr r0, [sp, 0x4] - adds r0, r5 - strb r6, [r0] - b _08001A68 -_08001A34: - ldr r1, [sp, 0x4] - lsls r0, r5, 1 - adds r0, r1 - strh r6, [r0] - b _08001A68 -_08001A3E: - ldr r1, [sp, 0x4] - lsls r0, r5, 2 - b _08001A64 -_08001A44: - cmp r7, 0x22 - beq _08001A4E - cmp r7, 0x23 - beq _08001A5C - b _08001A68 -_08001A4E: - ldr r0, _08001A58 - ldr r0, [r0] - movs r1, 0x98 - lsls r1, 2 - b _08001A64 - .align 2, 0 -_08001A58: .4byte gTeamInventoryRef -_08001A5C: - ldr r0, _08001A70 - ldr r0, [r0] - movs r1, 0x99 - lsls r1, 2 -_08001A64: - adds r0, r1 - str r6, [r0] -_08001A68: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08001A70: .4byte gTeamInventoryRef - thumb_func_end SetScriptVarArrayValue - .align 2, 0 @ Don't pad with nop. diff --git a/include/code_80972F4.h b/include/code_80972F4.h index b5bd91141..043757bc4 100644 --- a/include/code_80972F4.h +++ b/include/code_80972F4.h @@ -17,7 +17,7 @@ const u8 *GetCurrentMissionText(s16 index); bool8 IsMazeCompleted(s16 mazeIndex); bool8 sub_8096F50(WonderMail *mail); -void sub_8097418(s16 index, bool32); +void sub_8097418(s32 index, bool32); bool8 sub_8097504(s16 mazeIndex); const u8 *sub_80975DC(s16); diff --git a/include/event_flag.h b/include/event_flag.h index 2c83e6918..ccd86f097 100644 --- a/include/event_flag.h +++ b/include/event_flag.h @@ -146,7 +146,7 @@ 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); +void SetScriptVarArrayValue(u8 *localVarBuf, s32 varId, s32 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); diff --git a/src/code_80972F4.c b/src/code_80972F4.c index 7868e734c..c6d803999 100644 --- a/src/code_80972F4.c +++ b/src/code_80972F4.c @@ -1,8 +1,8 @@ #include "global.h" #include "globaldata.h" #include "dungeon.h" -#include "exclusive_pokemon.h" #include "event_flag.h" +#include "exclusive_pokemon.h" #include "code_80A26CC.h" #include "code_80972F4.h" @@ -85,21 +85,21 @@ bool32 sub_8097384(s16 param_1) return val; } -void sub_80973A8(s16 param_1,u32 param_2) +void sub_80973A8(s32 param_1,u32 param_2) { s32 sVar1; - s32 param_1_s32 = param_1; + s32 param_1_s32 = (s16)param_1; u8 param_2_u32 = param_2; if (param_1_s32 != 0xd) { if (param_2_u32 != 0) { sVar1 = sub_80A26B8(param_1); - SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_ORDER_LIST,param_1_s32,0); + SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_ORDER_LIST,(u16)param_1_s32,0); if (sVar1 != -1) { SetScriptVarValue(NULL,DUNGEON_SELECT,sVar1); } } - SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_JOB_LIST,param_1_s32,param_2_u32); + SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_JOB_LIST,(u16)param_1_s32,param_2_u32); } } @@ -120,12 +120,12 @@ bool32 RescueScenarioConquered(s16 param_1) return val; } -void sub_8097418(s16 index,bool32 param_2) +void sub_8097418(s32 index,bool32 param_2) { - int index_s32 = index; + int index_s32 = (s16)index; bool8 param_2_u8 = param_2; if (index_s32 != 0xd) { - if ((param_2_u8) && (SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_JOB_LIST,index_s32,0), index_s32 < 0x1f)) { + if ((param_2_u8) && (SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_JOB_LIST,(u16)index_s32,0), index_s32 < 0x1f)) { const MissionText *mt = &sStoryMissionText[index_s32]; if (mt->unk4 != 0xFF) { sub_8097FA8(mt->unk4); @@ -138,7 +138,7 @@ void sub_8097418(s16 index,bool32 param_2) } sub_8097FF8(); } - SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_CONQUEST_LIST,index_s32,param_2_u8); + SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_CONQUEST_LIST,(u16)index_s32,param_2_u8); } } diff --git a/src/event_flag.c b/src/event_flag.c index 1754f72b5..228f8bbc5 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -52,6 +52,124 @@ extern void sub_80973A8(u32, u32); // code_80972F4.h (read comment) extern bool8 RescueScenarioConquered(s16); +void SetScriptVarValue(u8 *localVarBuf, s32 varId_, s32 val) +{ + s32 varID; + struct ScriptVarPtr sp; + + varID = (s16)varId_; + GetScriptVarRef(&sp, localVarBuf, varID); + + switch (sp.info->type) { + case 1: { + u8 bVar1 = 1 << sp.info->bitOffset; + + if (val != 0) + *sp.ptr |= bVar1; + else + *sp.ptr = (bVar1 | *sp.ptr) ^ bVar1; + break; + } + case 2: { + *((s8 *)sp.ptr) = val; + break; + } + case 3: { + *((u8 *)sp.ptr) = val; + break; + } + case 7: { + *((bool8 *)sp.ptr) = val; + break; + } + case 4: { + *((s16 *)sp.ptr) = val; + break; + } + case 5: { + *((u16 *)sp.ptr) = val; + break; + } + case 6: { + *((s32 *)sp.ptr) = val; + break; + } + case 8: { + switch (varID) { + case 0x22: { + gTeamInventoryRef->teamMoney = val; + break; + } + case 0x23: { + gTeamInventoryRef->teamSavings = val; + break; + } + } + } + } +} + +void SetScriptVarArrayValue(u8 *localVarBuf, s32 varId_, s32 idx_, s32 val) +{ + s32 varID; + struct ScriptVarPtr sp; + s32 idx; + + varID = (s16)varId_; + idx = (u16)idx_; + GetScriptVarRef(&sp, localVarBuf, varID); + + switch (sp.info->type) { + case 1: { + s32 bitOffset = (u16)sp.info->bitOffset; + u16 flagNum = idx + bitOffset; + u8 *a = &sp.ptr[flagNum / 8]; + u8 bVar1 = 1 << (flagNum % 8); + if (val != 0) + *a |= bVar1; + else + *a = (bVar1 | *a) ^ bVar1; + break; + } + case 2: { + ((s8 *)sp.ptr)[idx] = val; + break; + } + case 3: { + ((u8 *)sp.ptr)[idx] = val; + break; + } + case 7: { + ((bool8 *)sp.ptr)[idx] = val; + break; + } + case 4: { + ((s16 *)sp.ptr)[idx] = val; + break; + } + case 5: { + ((u16 *)sp.ptr)[idx] = val; + break; + } + case 6: { + ((s32 *)sp.ptr)[idx] = val; + break; + } + case 8: { + switch (varID) { + case 0x22: { + gTeamInventoryRef->teamMoney = val; + break; + } + case 0x23: { + gTeamInventoryRef->teamSavings = val; + break; + } + } + } + } +} + UNUSED u8 *GetScriptVarPointer(s16 varId) { struct ScriptVarPtr local_1c;