diff --git a/asm/event_flag.s b/asm/event_flag.s deleted file mode 100644 index 2c00aefdd..000000000 --- a/asm/event_flag.s +++ /dev/null @@ -1,447 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start ResetScriptVarArray -ResetScriptVarArray: - push {r4-r7,lr} - adds r7, r0, 0 - lsls r1, 16 - asrs r6, r1, 16 - ldr r0, _08001584 - cmp r6, r0 - bgt _0800158C - lsls r1, r6, 4 - ldr r0, _08001588 - b _08001590 - .align 2, 0 -_08001584: .4byte 0x000003ff -_08001588: .4byte gScriptVarInfo -_0800158C: - lsls r1, r6, 4 - ldr r0, _08001598 -_08001590: - adds r5, r1, r0 - movs r4, 0 - b _080015B0 - .align 2, 0 -_08001598: .4byte 0x080b2d30 -_0800159C: - movs r0, 0xA - ldrsh r3, [r5, r0] - adds r0, r7, 0 - adds r1, r6, 0 - adds r2, r4, 0 - bl SetScriptVarArrayValue - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 -_080015B0: - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r4, r0 - blt _0800159C - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end ResetScriptVarArray - - thumb_func_start ClearScriptVarArray -ClearScriptVarArray: - push {r4-r7,lr} - adds r7, r0, 0 - lsls r1, 16 - asrs r6, r1, 16 - ldr r0, _080015D4 - cmp r6, r0 - bgt _080015DC - lsls r1, r6, 4 - ldr r0, _080015D8 - b _080015E0 - .align 2, 0 -_080015D4: .4byte 0x000003ff -_080015D8: .4byte gScriptVarInfo -_080015DC: - lsls r1, r6, 4 - ldr r0, _080015E8 -_080015E0: - adds r5, r1, r0 - movs r4, 0 - b _080015FE - .align 2, 0 -_080015E8: .4byte 0x080b2d30 -_080015EC: - adds r0, r7, 0 - adds r1, r6, 0 - adds r2, r4, 0 - movs r3, 0 - bl SetScriptVarArrayValue - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 -_080015FE: - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r4, r0 - blt _080015EC - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end ClearScriptVarArray - - thumb_func_start GetScriptVarRef -GetScriptVarRef: - push {r4,lr} - adds r3, r0, 0 - adds r4, r1, 0 - lsls r2, 16 - asrs r1, r2, 16 - ldr r0, _08001630 - cmp r1, r0 - bgt _0800163C - lsls r1, 4 - ldr r0, _08001634 - adds r1, r0 - str r1, [r3] - movs r2, 0x4 - ldrsh r0, [r1, r2] - ldr r1, _08001638 - adds r0, r1 - b _0800164C - .align 2, 0 -_08001630: .4byte 0x000003ff -_08001634: .4byte gScriptVarInfo -_08001638: .4byte gScriptVarBuffer -_0800163C: - lsls r1, 4 - ldr r0, _08001654 - adds r1, r0 - str r1, [r3] - movs r2, 0x4 - ldrsh r0, [r1, r2] - lsls r0, 2 - adds r0, r4, r0 -_0800164C: - str r0, [r3, 0x4] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08001654: .4byte 0x080b2d30 - thumb_func_end GetScriptVarRef - - thumb_func_start GetScriptVarValue -GetScriptVarValue: - push {r4,lr} - sub sp, 0x8 - adds r2, r0, 0 - lsls r1, 16 - asrs r4, r1, 16 - mov r0, sp - adds r1, r2, 0 - adds r2, r4, 0 - bl GetScriptVarRef - ldr r0, [sp] - ldrh r0, [r0] - subs r0, 0x1 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x7 - bls _0800167C - b _08001778 -_0800167C: - lsls r0, 2 - ldr r1, _08001688 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08001688: .4byte _0800168C - .align 2, 0 -_0800168C: - .4byte _080016AC - .4byte _080016C2 - .4byte _080016C8 - .4byte _080016D2 - .4byte _080016D8 - .4byte _080016E0 - .4byte _080016C2 - .4byte _080016E6 -_080016AC: - ldr r0, [sp] - movs r1, 0x6 - ldrsh r0, [r0, r1] - movs r1, 0x80 - lsls r1, 17 - lsls r1, r0 - lsrs r1, 24 - ldr r0, [sp, 0x4] - ldrb r0, [r0] - ands r1, r0 - b _0800173E -_080016C2: - ldr r0, [sp, 0x4] - ldrb r0, [r0] - b _0800177A -_080016C8: - ldr r0, [sp, 0x4] - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - b _0800177A -_080016D2: - ldr r0, [sp, 0x4] - ldrh r0, [r0] - b _0800177A -_080016D8: - ldr r0, [sp, 0x4] - movs r1, 0 - ldrsh r0, [r0, r1] - b _0800177A -_080016E0: - ldr r0, [sp, 0x4] - ldr r0, [r0] - b _0800177A -_080016E6: - adds r0, r4, 0 - subs r0, 0x17 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0xC - bhi _08001778 - lsls r0, 2 - ldr r1, _080016FC - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080016FC: .4byte _08001700 - .align 2, 0 -_08001700: - .4byte _08001734 - .4byte _08001778 - .4byte _08001778 - .4byte _08001778 - .4byte _08001778 - .4byte _08001778 - .4byte _08001778 - .4byte _08001778 - .4byte _08001778 - .4byte _08001746 - .4byte _0800174C - .4byte _08001754 - .4byte _08001764 -_08001734: - bl GetScriptMode - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 -_0800173E: - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - b _0800177A -_08001746: - bl GetFriendSum_808D480 - b _0800177A -_0800174C: - movs r0, 0 - bl GetUnitSum_808D544 - b _0800177A -_08001754: - ldr r0, _08001760 - ldr r0, [r0] - movs r1, 0x98 - lsls r1, 2 - b _0800176C - .align 2, 0 -_08001760: .4byte gTeamInventoryRef -_08001764: - ldr r0, _08001774 - ldr r0, [r0] - movs r1, 0x99 - lsls r1, 2 -_0800176C: - adds r0, r1 - ldr r0, [r0] - b _0800177A - .align 2, 0 -_08001774: .4byte gTeamInventoryRef -_08001778: - movs r0, 0 -_0800177A: - add sp, 0x8 - pop {r4} - pop {r1} - bx r1 - thumb_func_end GetScriptVarValue - -@ https://decomp.me/scratch/5F0gW [100% - DizzyEggg] - thumb_func_start GetScriptVarArrayValue -GetScriptVarArrayValue: - push {r4,r5,lr} - sub sp, 0x8 - adds r3, r0, 0 - lsls r1, 16 - asrs r5, r1, 16 - lsls r2, 16 - lsrs r4, r2, 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 - bls _080017AC - b _080018CC -_080017AC: - lsls r0, 2 - ldr r1, _080017B8 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080017B8: .4byte _080017BC - .align 2, 0 -_080017BC: - .4byte _080017DC - .4byte _08001800 - .4byte _08001808 - .4byte _08001814 - .4byte _0800181E - .4byte _0800182A - .4byte _08001800 - .4byte _08001834 -_080017DC: - ldr r0, [sp] - ldrh r1, [r0, 0x6] - adds r1, r4, r1 - lsls r1, 16 - lsrs r0, r1, 19 - ldr r2, [sp, 0x4] - adds r2, r0 - movs r0, 0xE0 - lsls r0, 11 - ands r0, r1 - lsrs r0, 16 - movs r1, 0x80 - lsls r1, 17 - lsls r1, r0 - lsrs r1, 24 - ldrb r0, [r2] - ands r1, r0 - b _0800188E -_08001800: - ldr r0, [sp, 0x4] - adds r0, r4 - ldrb r0, [r0] - b _080018CE -_08001808: - ldr r0, [sp, 0x4] - adds r0, r4 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - b _080018CE -_08001814: - ldr r0, [sp, 0x4] - lsls r1, r4, 1 - adds r1, r0 - ldrh r0, [r1] - b _080018CE -_0800181E: - ldr r0, [sp, 0x4] - lsls r1, r4, 1 - adds r1, r0 - movs r2, 0 - ldrsh r0, [r1, r2] - b _080018CE -_0800182A: - ldr r0, [sp, 0x4] - lsls r1, r4, 2 - adds r1, r0 - ldr r0, [r1] - b _080018CE -_08001834: - adds r0, r5, 0 - subs r0, 0x17 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0xC - bhi _080018CC - lsls r0, 2 - ldr r1, _0800184C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0800184C: .4byte _08001850 - .align 2, 0 -_08001850: - .4byte _08001884 - .4byte _080018CC - .4byte _080018CC - .4byte _080018CC - .4byte _080018CC - .4byte _080018CC - .4byte _080018CC - .4byte _080018CC - .4byte _080018CC - .4byte _08001896 - .4byte _0800189C - .4byte _080018A4 - .4byte _080018B8 -_08001884: - bl GetScriptMode - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 -_0800188E: - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - b _080018CE -_08001896: - bl GetFriendSum_808D480 - b _080018CE -_0800189C: - movs r0, 0 - bl GetUnitSum_808D544 - b _080018CE -_080018A4: - ldr r0, _080018B4 - ldr r0, [r0] - movs r1, 0x98 - lsls r1, 2 - adds r0, r1 - ldr r0, [r0] - b _080018CE - .align 2, 0 -_080018B4: .4byte gTeamInventoryRef -_080018B8: - ldr r0, _080018C8 - ldr r0, [r0] - movs r2, 0x99 - lsls r2, 2 - adds r0, r2 - ldr r0, [r0] - b _080018CE - .align 2, 0 -_080018C8: .4byte gTeamInventoryRef -_080018CC: - movs r0, 0 -_080018CE: - add sp, 0x8 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end GetScriptVarArrayValue - - .align 2, 0 @ Don't pad with nop. diff --git a/include/code_80972F4.h b/include/code_80972F4.h index 043757bc4..61e269e1c 100644 --- a/include/code_80972F4.h +++ b/include/code_80972F4.h @@ -20,9 +20,7 @@ bool8 sub_8096F50(WonderMail *mail); void sub_8097418(s32 index, bool32); bool8 sub_8097504(s16 mazeIndex); const u8 *sub_80975DC(s16); - -// These two are definitely bool8 but can't get them to match with it yet -//bool8 sub_8097384(s16); -//bool8 RescueScenarioConquered(s16); +bool8 sub_8097384(s32 param_1); +bool8 RescueScenarioConquered(s32 param_1); #endif // GUARD_CODE_80972F4_H diff --git a/include/event_flag.h b/include/event_flag.h index ccd86f097..1c4d0c98c 100644 --- a/include/event_flag.h +++ b/include/event_flag.h @@ -144,7 +144,7 @@ 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); +s32 GetScriptVarArrayValue(u8 *localVarBuf, s32 varId, s32 idx); void SetScriptVarValue(u8 *localVarBuf, s32 varId, s32 val); void SetScriptVarArrayValue(u8 *localVarBuf, s32 varId, s32 idx, s32 val); s32 GetScriptVarArraySum(u8 *localVarBuf, s16 varId); diff --git a/ld_script.txt b/ld_script.txt index ba99fb2ac..33461a75e 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -52,7 +52,6 @@ SECTIONS { src/code_2.o(.text); asm/code_2.o(.text); src/code.o(.text); - asm/event_flag.o(.text); src/event_flag.o(.text); asm/code_8002774.o(.text); src/code_8002774.o(.text); diff --git a/src/code_80972F4.c b/src/code_80972F4.c index c6d803999..484eaddc3 100644 --- a/src/code_80972F4.c +++ b/src/code_80972F4.c @@ -29,12 +29,12 @@ s32 sub_8097318(s16 param_1) s32 param_1_s32; param_1_s32 = param_1; - + if (param_1_s32 == 0xd) { iVar1 = 0; } else { - iVar1 = GetScriptVarArrayValue(NULL,RESCUE_SCENARIO_ORDER_LIST,param_1_s32); + iVar1 = GetScriptVarArrayValue(NULL,RESCUE_SCENARIO_ORDER_LIST, (u16) param_1_s32); if (iVar1 != 0) { iVar1 = 1; } @@ -53,7 +53,7 @@ void sub_809733C(s16 param_1,u32 param_2) if (uVar2 != 0xd) { uVar2_u16 = uVar2; - if (GetScriptVarArrayValue(NULL,RESCUE_SCENARIO_JOB_LIST,uVar2_u16) == 0) { + if (GetScriptVarArrayValue(NULL,RESCUE_SCENARIO_JOB_LIST, (u16) uVar2_u16) == 0) { SetScriptVarArrayValue(NULL,RESCUE_SCENARIO_ORDER_LIST,uVar2_u16,param_2_u8); if (param_2_u8) { switch(uVar2) @@ -69,20 +69,16 @@ void sub_809733C(s16 param_1,u32 param_2) } } -bool32 sub_8097384(s16 param_1) +bool8 sub_8097384(s32 param_1) { - bool32 val; + s32 param1 = (s16) param_1; - if (param_1 == 13) - val = FALSE; - else { - // May not need the & 0xFFFF if the 3rd param is s16 - val = GetScriptVarArrayValue(NULL, RESCUE_SCENARIO_JOB_LIST, param_1 & 0xFFFF); - if (val != 0) - val = TRUE; + if (param1 == 13) { + return FALSE; + } + else { + return (GetScriptVarArrayValue(NULL, RESCUE_SCENARIO_JOB_LIST, (u16) param1) != FALSE); } - - return val; } void sub_80973A8(s32 param_1,u32 param_2) @@ -90,7 +86,7 @@ void sub_80973A8(s32 param_1,u32 param_2) s32 sVar1; 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); @@ -103,21 +99,16 @@ void sub_80973A8(s32 param_1,u32 param_2) } } -bool32 RescueScenarioConquered(s16 param_1) +bool8 RescueScenarioConquered(s32 param_1) { - bool32 val; + s32 param1 = (s16) param_1; - if (param_1 == 13) - val = FALSE; - else { - // May not need the & 0xFFFF if the 3rd param is s16 - // But it doesn't work - val = GetScriptVarArrayValue(NULL, RESCUE_SCENARIO_CONQUEST_LIST, param_1 & 0xFFFF); - if (val != 0) - val = TRUE; + if (param1 == 13) { + return FALSE; + } + else { + return (GetScriptVarArrayValue(NULL, RESCUE_SCENARIO_CONQUEST_LIST, (u16) param1) != FALSE); } - - return val; } void sub_8097418(s32 index,bool32 param_2) diff --git a/src/code_8097504.c b/src/code_8097504.c index b4c73cef6..df174e82b 100644 --- a/src/code_8097504.c +++ b/src/code_8097504.c @@ -59,7 +59,7 @@ bool8 sub_8097504(s16 mazeIndex) bool8 IsMazeCompleted(s16 mazeIndex) { - return (GetScriptVarArrayValue(NULL, TRAINING_CONQUEST_LIST, mazeIndex) != 0); + return (GetScriptVarArrayValue(NULL, TRAINING_CONQUEST_LIST, (u16) mazeIndex) != 0); } void sub_80975A8(s16 param_1,u8 param_2) diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c index f4c2d20b9..a74272d88 100644 --- a/src/code_80A26CC.c +++ b/src/code_80A26CC.c @@ -10,10 +10,6 @@ extern const s16 gUnknown_8116F24[]; extern const s16 gUnknown_8116F9A[]; extern const u8 *gUnknown_8117000[]; -// code_80972F4.h (read comment) -extern bool8 sub_8097384(s16); -extern bool8 RescueScenarioConquered(s16); - // code_8098BDC.s extern void sub_809AB4C(s32, s32); extern void sub_809ABB4(s32, s32); @@ -217,7 +213,7 @@ s16 sub_80A2750(s16 r0) return 1; if (sub_80023E4(5)) return 1; - if (!RescueScenarioConquered(temp->unkE)) + if (!RescueScenarioConquered((s16) temp->unkE)) return 1; if (!sub_80023E4(1)) return 1; @@ -243,7 +239,7 @@ bool8 sub_80A27CC(s16 r0) return TRUE; if (!sub_80023E4(1)) return FALSE; - if (!RescueScenarioConquered(temp)) + if (!RescueScenarioConquered((s16) temp)) return FALSE; return TRUE; } @@ -262,9 +258,9 @@ bool8 sub_80A2824(u8 index) if (temp->unk11 != 0) { if (temp->dungeonIndex == index) { - if (sub_8097384(i)) + if (sub_8097384((s16) i)) return TRUE; - if (RescueScenarioConquered(i)) + if (RescueScenarioConquered((s16) i)) return TRUE; } } @@ -276,7 +272,7 @@ bool8 sub_80A2824(u8 index) if (temp->unk11 != 0) if (temp->dungeonIndex == index) - if (sub_8097384(i)) + if (sub_8097384((s16) i)) return TRUE; } } @@ -310,9 +306,9 @@ bool8 sub_80A28F0(u8 index) if (temp->unk11 != 0) { if (temp->dungeonIndex == index) { - if (sub_8097384(counter)) + if (sub_8097384((s16) counter)) return TRUE; - if (RescueScenarioConquered(counter)) + if (RescueScenarioConquered((s16) counter)) return TRUE; } } @@ -342,7 +338,7 @@ UNUSED static s32 sub_80A293C(u8 *param_1) for (index = 0; index < 46; index++) { iVar3 = sub_80A2620(index); - if (iVar3->unk11 != 0 && sub_8097384(index)) + if (iVar3->unk11 != 0 && sub_8097384((s16) index)) local_68[iVar3->dungeonIndex] = 1; } @@ -387,7 +383,7 @@ s32 sub_80A29B0(u8 *param_1) for (index = 0; index < 46; index++) { iVar3 = sub_80A2620(index); - if (iVar3->unk11 != 0 && RescueScenarioConquered(index)) + if (iVar3->unk11 != 0 && RescueScenarioConquered((s16) index)) local_68[iVar3->dungeonIndex] = 1; } } @@ -429,7 +425,7 @@ UNUSED static s32 sub_80A2A5C(u8 *param_1) for (index = 0; index < 46; index++) { iVar3 = sub_80A2620(index); - if (iVar3->unk11 != 0 && (sub_8097384(index) || RescueScenarioConquered(index))) + if (iVar3->unk11 != 0 && (sub_8097384((s16) index) || RescueScenarioConquered((s16) index))) local_58[iVar3->dungeonIndex] = 1; } } @@ -437,7 +433,7 @@ UNUSED static s32 sub_80A2A5C(u8 *param_1) for (index = 0; index < 46; index++) { iVar3 = sub_80A2620(index); - if (iVar3->unk11 != 0 && sub_8097384(index)) + if (iVar3->unk11 != 0 && sub_8097384((s16) index)) local_58[iVar3->dungeonIndex] = 1; } } diff --git a/src/event_flag.c b/src/event_flag.c index 228f8bbc5..572a97f5f 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -43,14 +43,154 @@ extern u8 gUnknown_80B735C[]; extern u8 gUnknown_80B7378[]; extern u8 gUnknown_80B7388[]; +extern bool8 GetScriptMode(void); extern bool8 HasCompletedAllMazes(void); extern u8 sub_8002658(s16); extern void sub_809733C(u32, u32); extern void sub_80973A8(u32, u32); +// A fakematch? Debugging leftover? A bug? No clue. +#define GET_PTR_x400VAR(varId)(((void*) (&gScriptVarInfo[varId - 0x466])) - 4) -// code_80972F4.h (read comment) -extern bool8 RescueScenarioConquered(s16); +void ResetScriptVarArray(u8 *localVarBuf, s16 varId_) +{ + struct ScriptVarInfo *infoPtr; + u16 i; + s32 varId = varId_; + + if (varId < 0x400) { + infoPtr = &(gScriptVarInfo)[varId]; + } + else { + infoPtr = GET_PTR_x400VAR(varId); + } + + for (i = 0; i < infoPtr->arrayLen; i++) { + SetScriptVarArrayValue(localVarBuf,varId,i,infoPtr->defaultValue); + } +} + +void ClearScriptVarArray(u8 *localVarBuf, s16 varId_) +{ + struct ScriptVarInfo *infoPtr; + u16 i; + s32 varId = varId_; + + if (varId < 0x400) { + infoPtr = &(gScriptVarInfo)[varId]; + } + else { + infoPtr = GET_PTR_x400VAR(varId); + } + + for (i = 0; i < infoPtr->arrayLen; i++) { + SetScriptVarArrayValue(localVarBuf,varId,i,0); + } +} + +void GetScriptVarRef(struct ScriptVarPtr *out, u8 *localVarBuf, s32 varId_) +{ + struct ScriptVarInfo *infoPtr; + s32 varId = (s16) varId_; + + if (varId < 0x400) { + infoPtr = &gScriptVarInfo[varId]; + out->info = infoPtr; + out->ptr = &gScriptVarBuffer[infoPtr->bufOffset]; + } + else { + infoPtr = GET_PTR_x400VAR(varId); + out->info = infoPtr; + out->ptr = &localVarBuf[infoPtr->bufOffset * 4]; + } +} + +s32 GetScriptVarValue(u8 *localVarBuf, s32 varId_) +{ + struct ScriptVarPtr sp; + s32 varId = (s16) varId_; + + GetScriptVarRef(&sp, localVarBuf, varId); + + switch (sp.info->type) { + case 1: { + s32 bitOffset = sp.info->bitOffset; + u8 a = 1 << bitOffset; + return (*sp.ptr & a) != FALSE; // Read bit-packed bool flag + } + case 2: + case 7: + return *((u8 *)sp.ptr); + case 3: + return *((s8 *)sp.ptr); + case 4: + return *((u16 *)sp.ptr); + case 5: + return *((s16 *)sp.ptr); + case 6: + return *((u32 *)sp.ptr); + case 8: + switch ((s16)varId) { + case 23: + return GetScriptMode() != FALSE; + case 32: + return GetFriendSum_808D480(); + case 33: + return GetUnitSum_808D544(0); + case 34: + return gTeamInventoryRef->teamMoney; + case 35: + return gTeamInventoryRef->teamSavings; + } + default: + return 0; + } +} + +s32 GetScriptVarArrayValue(u8 *localVarBuf, s32 varId_, s32 idx_) +{ + struct ScriptVarPtr sp; + s32 varId = (s16) varId_; + s32 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 b = 1 << (flagNum % 8); + return (*a & b) != FALSE; // Read bit-packed bool flag + } + case 2: + case 7: + return ((u8 *)sp.ptr)[idx]; + case 3: + return ((s8 *)sp.ptr)[idx]; + case 4: + return ((u16 *)sp.ptr)[idx]; + case 5: + return ((s16 *)sp.ptr)[idx]; + case 6: + return ((u32 *)sp.ptr)[idx]; + case 8: + switch ((s16)varId) { + case 23: + return GetScriptMode() != FALSE; + case 32: + return GetFriendSum_808D480(); + case 33: + return GetUnitSum_808D544(0); + case 34: + return gTeamInventoryRef->teamMoney; + case 35: + return gTeamInventoryRef->teamSavings; + } + default: + return 0; + } +} void SetScriptVarValue(u8 *localVarBuf, s32 varId_, s32 val) { @@ -199,7 +339,7 @@ s32 GetScriptVarArraySum(u8 *localVarBuf, s16 varId) GetScriptVarRef(&local_1c, 0, varId_s32); for(counter = 0; counter < local_1c.info->arrayLen; counter++) { - total += GetScriptVarArrayValue(localVarBuf, varId_s32, counter); + total += GetScriptVarArrayValue(localVarBuf, varId_s32, (u16) counter); } return total; } diff --git a/src/ground_script_1.c b/src/ground_script_1.c index 2cd9d1ac6..24c93f877 100644 --- a/src/ground_script_1.c +++ b/src/ground_script_1.c @@ -490,7 +490,7 @@ s32 ExecuteScriptCommand(Action *action) { case 0x1f: { s32 a = (s16)GetScriptVarValue(NULL, DUNGEON_ENTER); const DungeonInfo *ret1 = GetDungeonInfo_80A2608(a); - s32 thing = GetScriptVarArrayValue(NULL, DUNGEON_ENTER_LIST, a) == 0 ? ret1->unk6 : ret1->unk8; + s32 thing = GetScriptVarArrayValue(NULL, DUNGEON_ENTER_LIST, (u16) a) == 0 ? ret1->unk6 : ret1->unk8; // fakematch: this is almost certainly a range check of the form 0x37 <= a && a < 0x48 // but that loses the s32 -> u16 cast. Inlines, macros, or other schenanigans are likely involved if (!((u16)(a - 0x37) < 0x11) && (s16)sub_80A2750(a) == 1) {