Decomped LoadScriptVariableValueAtIndex

This commit is contained in:
Chesyon 2025-10-24 11:35:53 -04:00
parent 9397be8440
commit 4f645e6b6e
8 changed files with 76 additions and 157 deletions

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,4 +1,5 @@
#include "main_0204AFF8.h"
#include "enums.h"
extern enum game_mode GAME_MODE;

View File

@ -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;
}