From fdcfbc4baa7e548e57e7b302a5844133a7c1f618 Mon Sep 17 00:00:00 2001 From: slaw-22 Date: Tue, 25 Nov 2025 16:25:38 +0000 Subject: [PATCH] Decomp EventFlagResume and EventFlagBackup --- .../{main_0204BFC0.inc => main_0204C408.inc} | 7 +- asm/{main_0204BFC0.s => main_0204C408.s} | 286 +----------------- asm/main_rodata_0209CECC.s | 8 +- include/script_variable.h | 4 +- main.lsf | 2 +- src/script_variable.c | 73 ++++- 6 files changed, 82 insertions(+), 298 deletions(-) rename asm/include/{main_0204BFC0.inc => main_0204C408.inc} (72%) rename asm/{main_0204BFC0.s => main_0204C408.s} (58%) diff --git a/asm/include/main_0204BFC0.inc b/asm/include/main_0204C408.inc similarity index 72% rename from asm/include/main_0204BFC0.inc rename to asm/include/main_0204C408.inc index 012d9de8..38d08197 100644 --- a/asm/include/main_0204BFC0.inc +++ b/asm/include/main_0204C408.inc @@ -1,8 +1,7 @@ #pragma once .public DEBUG_SPECIAL_EPISODE_NUMBER .public Debug_Print -.public Debug_Print0 -.public GetGameMode +.public EventFlagBackup .public LoadScriptVariableRaw .public LoadScriptVariableValue .public LoadScriptVariableValueAtIndex @@ -10,9 +9,5 @@ .public SCRIPT_VARS_VALUES .public SaveScriptVariableValue .public SaveScriptVariableValueAtIndex -.public ScenarioFlagBackup .public ZinitScriptVariable -.public _0209CF64 -.public _0209CF84 .public _0209DFA0 -.public sub_0204CBE8 diff --git a/asm/main_0204BFC0.s b/asm/main_0204C408.s similarity index 58% rename from asm/main_0204BFC0.s rename to asm/main_0204C408.s index dd118846..153c7ed1 100644 --- a/asm/main_0204BFC0.s +++ b/asm/main_0204C408.s @@ -1,292 +1,8 @@ .include "asm/macros.inc" - .include "main_0204BFC0.inc" + .include "main_0204C408.inc" .text - arm_func_start EventFlagResume -EventFlagResume: ; 0x0204BFC0 - stmdb sp!, {r4, lr} - bl GetGameMode - cmp r0, #1 - ldmlsia sp!, {r4, pc} - sub r4, r0, #2 - ldr r0, _0204C1E0 ; =_0209CF64 - mov r1, r4 - bl Debug_Print0 - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x21 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x1c - bl SaveScriptVariableValue - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x22 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x1d - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x23 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x1e - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x24 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x1f - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x25 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x20 - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x2d - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x27 - bl SaveScriptVariableValue - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x2e - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x28 - bl SaveScriptVariableValue - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x2f - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x29 - bl SaveScriptVariableValue - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x30 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x2a - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x31 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x2b - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x32 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x2c - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x37 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x34 - bl SaveScriptVariableValue - mov r0, #0 - mov r1, #0x38 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x35 - bl SaveScriptVariableValue - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x39 - bl LoadScriptVariableValueAtIndex - mov r2, r0 - mov r0, #0 - mov r1, #0x36 - bl SaveScriptVariableValue - bl sub_0204CBE8 - ldmia sp!, {r4, pc} - .align 2, 0 -_0204C1E0: .word _0209CF64 - arm_func_end EventFlagResume - - arm_func_start EventFlagBackup -EventFlagBackup: ; 0x0204C1E4 - stmdb sp!, {r4, lr} - bl GetGameMode - cmp r0, #1 - ldmlsia sp!, {r4, pc} - sub r4, r0, #2 - ldr r0, _0204C404 ; =_0209CF84 - mov r1, r4 - bl Debug_Print0 - mov r0, #0 - mov r1, #0x1c - bl LoadScriptVariableValue - mov r1, r4, lsl #0x10 - mov r3, r0 - mov r2, r1, lsr #0x10 - mov r0, #0 - mov r1, #0x21 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x1d - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x22 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x1e - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x23 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x1f - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x24 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x20 - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x25 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x27 - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x2d - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x28 - bl LoadScriptVariableValue - mov r1, r4, lsl #0x10 - mov r3, r0 - mov r2, r1, lsr #0x10 - mov r0, #0 - mov r1, #0x2e - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x29 - bl LoadScriptVariableValue - mov r1, r4, lsl #0x10 - mov r2, r1, lsr #0x10 - mov r3, r0 - mov r0, #0 - mov r1, #0x2f - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x2a - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x30 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x2b - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x31 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x2c - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x32 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x34 - bl LoadScriptVariableValue - mov r3, r0 - mov r0, #0 - mov r1, #0x37 - mov r2, r4, lsl #0x10 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x35 - bl LoadScriptVariableValue - mov r3, r0 - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x38 - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #0x36 - bl LoadScriptVariableValue - mov r1, r4, lsl #0x10 - mov r3, r0 - mov r2, r1, lsr #0x10 - mov r0, #0 - mov r1, #0x39 - bl SaveScriptVariableValueAtIndex - bl ScenarioFlagBackup - ldmia sp!, {r4, pc} - .align 2, 0 -_0204C404: .word _0209CF84 - arm_func_end EventFlagBackup - arm_func_start DumpScriptVariableValues DumpScriptVariableValues: ; 0x0204C408 stmdb sp!, {r4, lr} diff --git a/asm/main_rodata_0209CECC.s b/asm/main_rodata_0209CECC.s index 64940e76..a3d3b79b 100644 --- a/asm/main_rodata_0209CECC.s +++ b/asm/main_rodata_0209CECC.s @@ -31,12 +31,12 @@ EVENT_FLAG_EXPANSION_ERROR: EVENT_FLAG_RULE_ERROR: .byte 0x65, 0x76, 0x65, 0x6E, 0x74, 0x20, 0x66, 0x6C, 0x61, 0x67, 0x20, 0x72 .byte 0x75, 0x6C, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x25, 0x64, 0x00, 0x00, 0x00, 0x00 - .global _0209CF64 -_0209CF64: + .global EVENT_FLAG_GAME_MODE_DEBUG_MSG +EVENT_FLAG_GAME_MODE_DEBUG_MSG: .byte 0x45, 0x76, 0x65, 0x6E, 0x74, 0x46, 0x6C, 0x61, 0x67, 0x20, 0x52, 0x65, 0x73, 0x75, 0x6D, 0x65 .byte 0x47, 0x61, 0x6D, 0x65, 0x4D, 0x6F, 0x64, 0x65, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x00, 0x00, 0x00 - .global _0209CF84 -_0209CF84: + .global EVENT_FLAG_BACKUP_DEBUG_MSG +EVENT_FLAG_BACKUP_DEBUG_MSG: .byte 0x45, 0x76, 0x65, 0x6E, 0x74, 0x46, 0x6C, 0x61, 0x67, 0x20, 0x42, 0x61, 0x63, 0x6B, 0x75, 0x70 .byte 0x47, 0x61, 0x6D, 0x65, 0x4D, 0x6F, 0x64, 0x65, 0x20, 0x25, 0x64, 0x0A, 0x00, 0x00, 0x00, 0x00 .global _0209CFA4 diff --git a/include/script_variable.h b/include/script_variable.h index c7dafb34..2f9d56eb 100644 --- a/include/script_variable.h +++ b/include/script_variable.h @@ -35,7 +35,7 @@ void LoadScriptVariableRaw(struct script_var_raw* sv_raw, union script_var_value 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, u16 idx); void SaveScriptVariableValue(union script_var_value sv_locals[], const enum script_var_id script_var_id, u32 new_val); -void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, int idx, s32 new_val); +void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, u16 idx, s32 new_val); s32 LoadScriptVariableValueSum(union script_var_value sv_local[], const enum script_var_id sv_id); void LoadScriptVariableValueBytes(const enum script_var_id sv_id, u8* result, s32 num_bytes); void LoadScriptVariableValueString(const enum script_var_id sv_id, u8* result, u8 num_bytes); @@ -49,5 +49,7 @@ void UpdateScriptVarWithVar(union script_var_value sv_local[], enum script_var_i bool8 CompareScriptVariablesVeneer(s32 param_1, s32 param_2, enum compare_operation operation); s32 CompareScriptVarWithParam(union script_var_value sv_local[], enum script_var_id sv_id, s32 param, enum compare_operation op); s32 LoadAndCompareScriptVars(union script_var_value sv_local[], enum script_var_id sv_id_1, enum script_var_id sv_id_2, enum compare_operation op); +void EventFlagResume(); +void EventFlagBackup(); #endif //PMDSKY_SCRIPTING_H diff --git a/main.lsf b/main.lsf index ad9175c6..99973c93 100644 --- a/main.lsf +++ b/main.lsf @@ -82,7 +82,7 @@ Static main Object asm/main_0204B018.o Object src/script_variable.o Object asm/main_rodata_0209CECC.o - Object asm/main_0204BFC0.o + Object asm/main_0204C408.o Object src/main_0204C938.o Object asm/main_0204C94C.o Object src/dungeon_recruitment_3.o diff --git a/src/script_variable.c b/src/script_variable.c index 9c5e8866..17856957 100644 --- a/src/script_variable.c +++ b/src/script_variable.c @@ -23,10 +23,15 @@ extern s32 SetMoneyCarried(s32 arg0); extern s32 SetMoneyStored(s32 arg0); extern s32 SetNotifyNote(s32 arg0); extern s32 sub_0204C928(s32 arg0); +void sub_0204CBE8(); +void ScenarioFlagBackup(); extern u8 EVENT_FLAG_EXPANSION_ERROR; extern u8 EVENT_FLAG_RULE_ERROR; +extern const u8 EVENT_FLAG_GAME_MODE_DEBUG_MSG; +extern const u8 EVENT_FLAG_BACKUP_DEBUG_MSG; + const u8 EVENT_FLAG_FILE_NAME[] = "event_flag.c"; const struct prog_pos_info EVENT_FLAG_PROG_POS_INFO_LINE_1011 = { (u8*) EVENT_FLAG_FILE_NAME, @@ -239,7 +244,7 @@ void SaveScriptVariableValue(union script_var_value sv_locals[], const enum scri return; } -void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, int idx, s32 new_val) +void SaveScriptVariableValueAtIndex(union script_var_value sv_locals[], const enum script_var_id script_var_id, u16 idx, s32 new_val) { struct script_var_raw script_var_raw; LoadScriptVariableRaw(&script_var_raw, sv_locals, script_var_id); @@ -479,3 +484,69 @@ s32 LoadAndCompareScriptVars(union script_var_value sv_local[], enum script_var_ s32 value_2 = LoadScriptVariableValue(sv_local, sv_id_2); return CompareScriptVariables(value_1, value_2, op); } + +// This inline allows EventFlagResume to match +static inline s32 LoadScriptVariableValueAtIndexInline(enum script_var_id sv_id, u32 idx) { + return LoadScriptVariableValueAtIndex(0, sv_id, idx); +} + +void EventFlagResume() +{ + u32 game_mode = GetGameMode(); + if (game_mode <= 1U) { + return; + } + u32 idx = game_mode - 2; + Debug_Print0(&EVENT_FLAG_GAME_MODE_DEBUG_MSG, idx); + + SaveScriptVariableValue(0, VAR_GROUND_ENTER, LoadScriptVariableValueAtIndexInline(VAR_GROUND_ENTER_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_GROUND_ENTER_LINK, LoadScriptVariableValueAtIndexInline(VAR_GROUND_ENTER_LINK_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_GROUND_GETOUT, LoadScriptVariableValueAtIndexInline(VAR_GROUND_GETOUT_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_GROUND_MAP, LoadScriptVariableValueAtIndexInline(VAR_GROUND_MAP_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_GROUND_PLACE, LoadScriptVariableValueAtIndexInline(VAR_GROUND_PLACE_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_DUNGEON_ENTER, LoadScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_DUNGEON_ENTER_MODE, LoadScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_MODE_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_DUNGEON_ENTER_INDEX, LoadScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_INDEX_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_DUNGEON_ENTER_FREQUENCY, LoadScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_FREQUENCY_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_DUNGEON_RESULT, LoadScriptVariableValueAtIndexInline(VAR_DUNGEON_RESULT_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_GROUND_START_MODE, LoadScriptVariableValueAtIndexInline(VAR_GROUND_START_MODE_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_PLAYER_KIND, LoadScriptVariableValueAtIndexInline(VAR_PLAYER_KIND_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_ATTENDANT1_KIND, LoadScriptVariableValueAtIndexInline(VAR_ATTENDANT1_KIND_BACKUP, idx)); + SaveScriptVariableValue(0, VAR_ATTENDANT2_KIND, LoadScriptVariableValueAtIndexInline(VAR_ATTENDANT2_KIND_BACKUP, idx)); + + sub_0204CBE8(); +} + +// This inline allows EventFlagBackup to match +static inline s32 SaveScriptVariableValueAtIndexInline(enum script_var_id sv_id, u32 idx, u32 new_val) { + SaveScriptVariableValueAtIndex(0, sv_id, idx, new_val); +} + +void EventFlagBackup() { + u32 game_mode; + u32 idx; + + game_mode = GetGameMode(); + if (game_mode <= 1U) { + return; + } + idx = game_mode - 2; + Debug_Print0(&EVENT_FLAG_BACKUP_DEBUG_MSG, idx); + + SaveScriptVariableValueAtIndexInline(VAR_GROUND_ENTER_BACKUP, idx, LoadScriptVariableValue(0, VAR_GROUND_ENTER)); + SaveScriptVariableValueAtIndexInline(VAR_GROUND_ENTER_LINK_BACKUP, idx, LoadScriptVariableValue(0, VAR_GROUND_ENTER_LINK)); + SaveScriptVariableValueAtIndexInline(VAR_GROUND_GETOUT_BACKUP, idx, LoadScriptVariableValue(0, VAR_GROUND_GETOUT)); + SaveScriptVariableValueAtIndexInline(VAR_GROUND_MAP_BACKUP, idx, LoadScriptVariableValue(0, VAR_GROUND_MAP)); + SaveScriptVariableValueAtIndexInline(VAR_GROUND_PLACE_BACKUP, idx, LoadScriptVariableValue(0, VAR_GROUND_PLACE)); + SaveScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_BACKUP, idx, LoadScriptVariableValue(0, VAR_DUNGEON_ENTER)); + SaveScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_MODE_BACKUP, idx, LoadScriptVariableValue(0, VAR_DUNGEON_ENTER_MODE)); + SaveScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_INDEX_BACKUP, idx, LoadScriptVariableValue(0, VAR_DUNGEON_ENTER_INDEX)); + SaveScriptVariableValueAtIndexInline(VAR_DUNGEON_ENTER_FREQUENCY_BACKUP, idx, LoadScriptVariableValue(0, VAR_DUNGEON_ENTER_FREQUENCY)); + SaveScriptVariableValueAtIndexInline(VAR_DUNGEON_RESULT_BACKUP, idx, LoadScriptVariableValue(0, VAR_DUNGEON_RESULT)); + SaveScriptVariableValueAtIndexInline(VAR_GROUND_START_MODE_BACKUP, idx, LoadScriptVariableValue(0, VAR_GROUND_START_MODE)); + SaveScriptVariableValueAtIndexInline(VAR_PLAYER_KIND_BACKUP, idx, LoadScriptVariableValue(0, VAR_PLAYER_KIND)); + SaveScriptVariableValueAtIndexInline(VAR_ATTENDANT1_KIND_BACKUP, idx, LoadScriptVariableValue(0, VAR_ATTENDANT1_KIND)); + SaveScriptVariableValueAtIndexInline(VAR_ATTENDANT2_KIND_BACKUP, idx, LoadScriptVariableValue(0, VAR_ATTENDANT2_KIND)); + + ScenarioFlagBackup(); +}