From 4f645e6b6e59f85998329e0547c778cccd5a46cb Mon Sep 17 00:00:00 2001 From: Chesyon <55322011+Chesyon@users.noreply.github.com> Date: Fri, 24 Oct 2025 11:35:53 -0400 Subject: [PATCH] Decomped LoadScriptVariableValueAtIndex --- .../{main_0204B678.inc => main_0204B820.inc} | 6 +- asm/{main_0204B678.s => main_0204B820.s} | 137 +----------------- include/enums.h | 12 ++ include/main_0204AFF8.h | 12 -- include/scripting.h | 1 + main.lsf | 2 +- src/main_0204AFF8.c | 1 + src/scripting.c | 62 +++++++- 8 files changed, 76 insertions(+), 157 deletions(-) rename asm/include/{main_0204B678.inc => main_0204B820.inc} (82%) rename asm/{main_0204B678.s => main_0204B820.s} (91%) diff --git a/asm/include/main_0204B678.inc b/asm/include/main_0204B820.inc similarity index 82% rename from asm/include/main_0204B678.inc rename to asm/include/main_0204B820.inc index 59bf32af..f83d6e49 100644 --- a/asm/include/main_0204B678.inc +++ b/asm/include/main_0204B820.inc @@ -5,13 +5,9 @@ .public Debug_Print .public Debug_Print0 .public GetGameMode -.public GetLanguageType -.public GetMoneyCarried -.public GetMoneyStored -.public GetNotifyNote -.public GetPartyMembers .public LoadScriptVariableRaw .public LoadScriptVariableValue +.public LoadScriptVariableValueAtIndex .public MemcpySimple .public RandInt .public SCRIPT_VARS_VALUES diff --git a/asm/main_0204B678.s b/asm/main_0204B820.s similarity index 91% rename from asm/main_0204B678.s rename to asm/main_0204B820.s index e46adbac..54aab04d 100644 --- a/asm/main_0204B678.s +++ b/asm/main_0204B820.s @@ -1,143 +1,8 @@ .include "asm/macros.inc" - .include "main_0204B678.inc" + .include "main_0204B820.inc" .text - arm_func_start LoadScriptVariableValueAtIndex -LoadScriptVariableValueAtIndex: ; 0x0204B678 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #8 - mov r3, r0 - mov r5, r1 - mov r4, r2 - add r0, sp, #0 - mov r1, r3 - mov r2, r5 - bl LoadScriptVariableRaw - ldr r1, [sp] - ldrsh r0, [r1] - cmp r0, #9 - addls pc, pc, r0, lsl #2 - b _0204B814 -_0204B6B0: ; jump table - b _0204B814 ; case 0 - b _0204B6D8 ; case 1 - b _0204B70C ; case 2 - b _0204B70C ; case 3 - b _0204B718 ; case 4 - b _0204B724 ; case 5 - b _0204B734 ; case 6 - b _0204B744 ; case 7 - b _0204B744 ; case 8 - b _0204B750 ; case 9 -_0204B6D8: - ldrsh r1, [r1, #6] - ldr r2, [sp, #4] - mov r0, #1 - add r1, r4, r1 - mov r1, r1, lsl #0x10 - mov r3, r1, lsr #0x10 - and r1, r3, #7 - mov r1, r0, lsl r1 - ldrb r2, [r2, r3, lsr #3] - and r1, r1, #0xff - tst r2, r1 - moveq r0, #0 - b _0204B818 -_0204B70C: - ldr r0, [sp, #4] - ldrb r0, [r0, r4] - b _0204B818 -_0204B718: - ldr r0, [sp, #4] - ldrsb r0, [r0, r4] - b _0204B818 -_0204B724: - ldr r1, [sp, #4] - mov r0, r4, lsl #1 - ldrh r0, [r1, r0] - b _0204B818 -_0204B734: - ldr r1, [sp, #4] - mov r0, r4, lsl #1 - ldrsh r0, [r1, r0] - b _0204B818 -_0204B744: - ldr r0, [sp, #4] - ldr r0, [r0, r4, lsl #2] - b _0204B818 -_0204B750: - cmp r5, #0x48 - bgt _0204B78C - bge _0204B7D4 - cmp r5, #0x3d - bgt _0204B780 - subs r0, r5, #0x3a - addpl pc, pc, r0, lsl #2 - b _0204B814 -_0204B770: ; jump table - b _0204B7A8 ; case 0 - b _0204B7B0 ; case 1 - b _0204B7BC ; case 2 - b _0204B7C4 ; case 3 -_0204B780: - cmp r5, #0x47 - beq _0204B7CC - b _0204B814 -_0204B78C: - cmp r5, #0x49 - bgt _0204B79C - beq _0204B7DC - b _0204B814 -_0204B79C: - cmp r5, #0x70 - beq _0204B80C - b _0204B814 -_0204B7A8: - mov r0, #1 - b _0204B818 -_0204B7B0: - mov r0, #0 - bl GetPartyMembers - b _0204B818 -_0204B7BC: - bl GetMoneyCarried - b _0204B818 -_0204B7C4: - bl GetMoneyStored - b _0204B818 -_0204B7CC: - bl GetLanguageType - b _0204B818 -_0204B7D4: - bl GetGameMode - b _0204B818 -_0204B7DC: - bl GetGameMode - cmp r0, #1 - beq _0204B7F4 - cmp r0, #3 - beq _0204B7FC - b _0204B804 -_0204B7F4: - bl sub_0204C918 - b _0204B818 -_0204B7FC: - bl GetSpecialEpisodeType - b _0204B818 -_0204B804: - mvn r0, #0 - b _0204B818 -_0204B80C: - bl GetNotifyNote - b _0204B818 -_0204B814: - mov r0, #0 -_0204B818: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end LoadScriptVariableValueAtIndex - arm_func_start SaveScriptVariableValue SaveScriptVariableValue: ; 0x0204B820 stmdb sp!, {r3, r4, r5, lr} diff --git a/include/enums.h b/include/enums.h index 7b420f75..254df387 100644 --- a/include/enums.h +++ b/include/enums.h @@ -3429,4 +3429,16 @@ enum special_episode_type { NUM_SPECIAL_EPISODES = 5 }; +enum game_mode +{ + GAME_MODE_MENU = 0, // top menu + GAME_MODE_1 = 1, // also related to special episodes? But 3 is the main one + GAME_MODE_NORMAL = 2, // normal play, including both overworld/dungeons + GAME_MODE_SPECIAL_EPISODE = 3, // during special episodes + // Pelipper Island (and likely also in the dungeon while rescuing, need to confirm) + GAME_MODE_RESCUE = 4, + GAME_MODE_5 = 5, + // Possibly more? +}; + #endif //PMDSKY_ENUMS_H diff --git a/include/main_0204AFF8.h b/include/main_0204AFF8.h index e398c513..880ba1bf 100644 --- a/include/main_0204AFF8.h +++ b/include/main_0204AFF8.h @@ -3,18 +3,6 @@ #include "util.h" -enum game_mode -{ - GAME_MODE_MENU = 0, // top menu - GAME_MODE_1 = 1, // also related to special episodes? But 3 is the main one - GAME_MODE_NORMAL = 2, // normal play, including both overworld/dungeons - GAME_MODE_SPECIAL_EPISODE = 3, // during special episodes - // Pelipper Island (and likely also in the dungeon while rescuing, need to confirm) - GAME_MODE_RESCUE = 4, - GAME_MODE_5 = 5, - // Possibly more? -}; - bool8 IsGameModeRescue(); #endif //PMDSKY_MAIN_0204AFF8_H diff --git a/include/scripting.h b/include/scripting.h index 3b0b1e9c..eb33149d 100644 --- a/include/scripting.h +++ b/include/scripting.h @@ -36,5 +36,6 @@ void LoadScriptVariableRaw(struct script_var_raw* sv_raw, const enum script_var_id sv_id); s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_id sv_id); +s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, int idx); #endif //PMDSKY_SCRIPTING_H diff --git a/main.lsf b/main.lsf index df127565..260d8824 100644 --- a/main.lsf +++ b/main.lsf @@ -81,7 +81,7 @@ Static main Object src/main_0204AFF8.o Object asm/main_0204B018.o Object src/scripting.o - Object asm/main_0204B678.o + Object asm/main_0204B820.o Object src/main_0204C938.o Object asm/main_0204C94C.o Object src/dungeon_recruitment_3.o diff --git a/src/main_0204AFF8.c b/src/main_0204AFF8.c index 6a081ce3..19375ff9 100644 --- a/src/main_0204AFF8.c +++ b/src/main_0204AFF8.c @@ -1,4 +1,5 @@ #include "main_0204AFF8.h" +#include "enums.h" extern enum game_mode GAME_MODE; diff --git a/src/scripting.c b/src/scripting.c index 70cc2750..5eaf00cd 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -12,7 +12,7 @@ extern s32 GetPartyMembers(s32 param1); extern s32 GetMoneyCarried(); extern s32 GetMoneyStored(); extern s32 GetLanguageType(); -extern s32 GetGameMode(); +extern enum game_mode GetGameMode(); extern s32 sub_0204C918(); extern s32 GetSpecialEpisodeType(); extern s32 GetNotifyNote(); @@ -77,9 +77,9 @@ s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_i return GetGameMode(); case VAR_EXECUTE_SPECIAL_EPISODE_TYPE: switch(GetGameMode()) { - case EPISODE_IGGLYBUFF_THE_PRODIGY: + case GAME_MODE_1: return sub_0204C918(); - case EPISODE_HERE_COMES_TEAM_CHARM: + case GAME_MODE_SPECIAL_EPISODE: return GetSpecialEpisodeType(); default: return -1; @@ -91,3 +91,59 @@ s32 LoadScriptVariableValue(union script_var_value sv_local[], enum script_var_i return 0; } + +s32 LoadScriptVariableValueAtIndex(union script_var_value sv_local[], enum script_var_id id, int idx) +{ + struct script_var_raw result; + LoadScriptVariableRaw(&result, sv_local, id); + + switch ((s16)result.def->type) { + case VARTYPE_NONE: + break; + case VARTYPE_BIT: { + u16 offset = idx + result.def->bitshift; + u8 val = ((u8*)result.value)[offset / 8]; + u8 bit = (1 << (offset & (8 - 1))); + return (val & bit) != 0; + } + case VARTYPE_STRING: + case VARTYPE_UINT8: + return ((u8*)result.value)[idx]; + case VARTYPE_INT8: + return ((s8*)result.value)[idx]; + case VARTYPE_UINT16: + return ((u16*)result.value)[idx]; + case VARTYPE_INT16: + return ((s16*)result.value)[idx]; + case VARTYPE_UINT32: + case VARTYPE_INT32: + return ((u32*)result.value)[idx]; + case VARTYPE_SPECIAL: + switch (id) { + case VAR_FRIEND_SUM: + return 1; + case VAR_UNIT_SUM: + return GetPartyMembers(0); + case VAR_CARRY_GOLD: + return GetMoneyCarried(); + case VAR_BANK_GOLD: + return GetMoneyStored(); + case VAR_LANGUAGE_TYPE: + return GetLanguageType(); + case VAR_GAME_MODE: + return GetGameMode(); + case VAR_EXECUTE_SPECIAL_EPISODE_TYPE: + switch (GetGameMode()) { + case GAME_MODE_1: + return sub_0204C918(); + case GAME_MODE_SPECIAL_EPISODE: + return GetSpecialEpisodeType(); + default: + return -1; + } + case VAR_NOTE_MODIFY_FLAG: + return GetNotifyNote(); + } + } + return 0; +}