diff --git a/asm/include/main_0204CBE8.inc b/asm/include/main_0204CD88.inc similarity index 91% rename from asm/include/main_0204CBE8.inc rename to asm/include/main_0204CD88.inc index 42ca111e..fd0dff01 100644 --- a/asm/include/main_0204CBE8.inc +++ b/asm/include/main_0204CD88.inc @@ -1,6 +1,6 @@ #pragma once -.public _0209DFC8 -.public _0209DFE8 +.public SCENARIO_FLAG_RESUME_DEBUG_MSG +.public SCENARIO_FLAG_BACKUP_DEBUG_MSG .public _0209E008 .public _0209E010 .public _0209E011 diff --git a/asm/main_0204CBE8.s b/asm/main_0204CD88.s similarity index 89% rename from asm/main_0204CBE8.s rename to asm/main_0204CD88.s index 902b1ea7..0d6190c5 100644 --- a/asm/main_0204CBE8.s +++ b/asm/main_0204CD88.s @@ -1,124 +1,8 @@ .include "asm/macros.inc" - .include "main_0204CBE8.inc" + .include "main_0204CD88.inc" .text - arm_func_start sub_0204CBE8 -sub_0204CBE8: ; 0x0204CBE8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - bl GetGameMode - cmp r0, #1 - ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - sub r4, r0, #2 - ldr r0, _0204CCB4 ; =_0209DFC8 - mov r1, r4 - bl Debug_Print0 - mov r0, r4, lsl #0x10 - mov r2, r0, lsr #0x10 - mov r0, #0 - mov r1, #0x1a - bl LoadScriptVariableValueAtIndex - mov r3, r0 - mov r0, #0 - mov r2, r0 - mov r1, #2 - bl SaveScriptVariableValueAtIndex - add r2, r4, #4 - mov r2, r2, lsl #0x10 - mov r0, #0 - mov r1, #0x1a - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r3, r0 - mov r0, #0 - mov r1, #2 - mov r2, #1 - bl SaveScriptVariableValueAtIndex - mov r8, #0 - mov sb, r4, lsl #7 - mov r7, r8 - mov r6, #0x1b - mov r5, r8 - mov r4, #0x11 -_0204CC74: - mov r2, sb, lsl #0x10 - mov r0, r7 - mov r1, r6 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, r8, lsl #0x10 - mov r3, r0 - mov r0, r5 - mov r1, r4 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - add r8, r8, #1 - cmp r8, #0x80 - add sb, sb, #1 - blt _0204CC74 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0204CCB4: .word _0209DFC8 - arm_func_end sub_0204CBE8 - - arm_func_start ScenarioFlagBackup -ScenarioFlagBackup: ; 0x0204CCB8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - bl GetGameMode - cmp r0, #1 - ldmlsia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - sub r4, r0, #2 - ldr r0, _0204CD84 ; =_0209DFE8 - mov r1, r4 - bl Debug_Print0 - mov r0, #0 - mov r2, r0 - mov r1, #2 - bl LoadScriptVariableValueAtIndex - mov r1, r4, lsl #0x10 - mov r3, r0 - mov r2, r1, lsr #0x10 - mov r0, #0 - mov r1, #0x1a - bl SaveScriptVariableValueAtIndex - mov r0, #0 - mov r1, #2 - mov r2, #1 - bl LoadScriptVariableValueAtIndex - add r2, r4, #4 - mov r2, r2, lsl #0x10 - mov r3, r0 - mov r0, #0 - mov r1, #0x1a - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - mov r8, #0 - mov sb, r4, lsl #7 - mov r7, r8 - mov r6, #0x11 - mov r5, r8 - mov r4, #0x1b -_0204CD44: - mov r2, r8, lsl #0x10 - mov r0, r7 - mov r1, r6 - mov r2, r2, lsr #0x10 - bl LoadScriptVariableValueAtIndex - mov r2, sb, lsl #0x10 - mov r3, r0 - mov r0, r5 - mov r1, r4 - mov r2, r2, lsr #0x10 - bl SaveScriptVariableValueAtIndex - add r8, r8, #1 - cmp r8, #0x80 - add sb, sb, #1 - blt _0204CD44 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_0204CD84: .word _0209DFE8 - arm_func_end ScenarioFlagBackup - arm_func_start InitWorldMapScriptVars InitWorldMapScriptVars: ; 0x0204CD88 stmdb sp!, {r3, lr} diff --git a/asm/main_rodata_0209CECC.s b/asm/main_rodata_0209CECC.s index 0e4d3387..89e072a8 100644 --- a/asm/main_rodata_0209CECC.s +++ b/asm/main_rodata_0209CECC.s @@ -866,13 +866,13 @@ SCENARIO_CALC_DEBUG_MSG: .byte 0x41, 0x52, 0x49, 0x4F, 0x20, 0x43, 0x41, 0x4C, 0x43, 0x20, 0x5B, 0x25, 0x33, 0x64, 0x5D, 0x20 .byte 0x25, 0x34, 0x64, 0x20, 0x25, 0x34, 0x64, 0x20, 0x2D, 0x3E, 0x20, 0x25, 0x34, 0x64, 0x20, 0x25 .byte 0x34, 0x64, 0x00, 0x00 - .global _0209DFC8 -_0209DFC8: + .global SCENARIO_FLAG_RESUME_DEBUG_MSG +SCENARIO_FLAG_RESUME_DEBUG_MSG: .byte 0x53, 0x63, 0x65, 0x6E, 0x61, 0x72, 0x69, 0x6F, 0x46, 0x6C, 0x61, 0x67 .byte 0x20, 0x52, 0x65, 0x73, 0x75, 0x6D, 0x65, 0x47, 0x61, 0x6D, 0x65, 0x4D, 0x6F, 0x64, 0x65, 0x20 .byte 0x25, 0x64, 0x0A, 0x00 - .global _0209DFE8 -_0209DFE8: + .global SCENARIO_FLAG_BACKUP_DEBUG_MSG +SCENARIO_FLAG_BACKUP_DEBUG_MSG: .byte 0x53, 0x63, 0x65, 0x6E, 0x61, 0x72, 0x69, 0x6F, 0x46, 0x6C, 0x61, 0x67 .byte 0x20, 0x42, 0x61, 0x63, 0x6B, 0x75, 0x70, 0x47, 0x61, 0x6D, 0x65, 0x4D, 0x6F, 0x64, 0x65, 0x20 .byte 0x25, 0x64, 0x0A, 0x00 diff --git a/include/enums.h b/include/enums.h index 5dbc5480..f9fbf464 100644 --- a/include/enums.h +++ b/include/enums.h @@ -3066,9 +3066,13 @@ enum script_var_id { // Used to identify a cutscene save in a Special Episode. Acts very similar to // COMPULSORY_SAVE_POINT. VAR_COMPULSORY_SAVE_POINT_SIDE = 25, - // The backup version of SCENARIO_SELECT saved in the function ScenarioFlagBackup. + // Backup storage for two SCENARIO_SELECT values per game mode. + // When restoring, values for the current game mode are copied back into SCENARIO_SELECT. + // Layout (grouped by value then mode): Value1: modes 2-5; Value2: modes 2-5. VAR_SCENARIO_SELECT_BACKUP = 26, - // The backup version of SCENARIO_MAIN_BIT_FLAG saved in the function ScenarioFlagBackup. + // Backup storage for SCENARIO_MAIN_BIT_FLAG each game mode. + // When restoring, values for the current game mode are copied back into SCENARIO_MAIN_BIT_FLAG. + // Layout (grouped by mode then value): Mode 2: 128 bits; Mode 3: 128 bits etc VAR_SCENARIO_MAIN_BIT_FLAG_BACKUP = 27, // The Level ID (see the version-dependent script_level_id_* enums) that the player is in in the // overworld. diff --git a/include/scenario_flag.h b/include/scenario_flag.h new file mode 100644 index 00000000..70b3e4d5 --- /dev/null +++ b/include/scenario_flag.h @@ -0,0 +1,7 @@ +#ifndef PMDSKY_SCENARIO_FLAG_H +#define PMDSKY_SCENARIO_FLAG_H + +void ScenarioFlagRestore(); +void ScenarioFlagBackup(); + +#endif //PMDSKY_SCENARIO_FLAG_H diff --git a/include/script_variable.h b/include/script_variable.h index 394f316f..d354440d 100644 --- a/include/script_variable.h +++ b/include/script_variable.h @@ -1,5 +1,5 @@ -#ifndef PMDSKY_SCRIPTING_H -#define PMDSKY_SCRIPTING_H +#ifndef PMDSKY_SCRIPT_VARIABLE_H +#define PMDSKY_SCRIPT_VARIABLE_H #include "enums.h" #include "util.h" @@ -54,4 +54,4 @@ bool8 RestoreScriptVariableValues(u8* src); void InitScenarioProgressScriptVars(); void LoadScriptVarValuePair(enum script_var_id script_var_id, s32* val_1, s32* val_2); -#endif //PMDSKY_SCRIPTING_H +#endif //PMDSKY_SCRIPT_VARIABLE_H diff --git a/include/special_episode.h b/include/special_episode.h index 2efb0889..c8e24160 100644 --- a/include/special_episode.h +++ b/include/special_episode.h @@ -15,4 +15,4 @@ void SetSpecialEpisodeOpenOld(u32 idx, u32 val); bool8 IsSpecialEpisodeBeaten(u32 idx); void SetSpecialEpisodeBeaten(u32 idx, u32 special_ep_beaten); -#endif //PMDSKY_SCRIPTING_H +#endif //PMDSKY_SPECIAL_EPISODE_H diff --git a/main.lsf b/main.lsf index 90302075..4f8c3ef1 100644 --- a/main.lsf +++ b/main.lsf @@ -91,7 +91,8 @@ Static main Object src/has_played_old_game.o Object src/performance_progress.o Object src/main_0204CB94.o - Object asm/main_0204CBE8.o + Object src/scenario_flag.o + Object asm/main_0204CD88.o Object src/main_0204DA2C.o Object asm/main_0204DB08.o Object src/main_0204DD80.o diff --git a/src/scenario_flag.c b/src/scenario_flag.c new file mode 100644 index 00000000..78a9e714 --- /dev/null +++ b/src/scenario_flag.c @@ -0,0 +1,61 @@ +#include "debug.h" +#include "enums.h" +#include "scenario_flag.h" +#include "script_variable.h" + +extern u32 GetGameMode(); + +extern u8 SCENARIO_FLAG_RESUME_DEBUG_MSG; +extern u8 SCENARIO_FLAG_BACKUP_DEBUG_MSG; + +void ScenarioFlagRestore() { + u32 val; + + u32 game_mode = GetGameMode(); + if (game_mode <= GAME_MODE_1) { + return; + } + + u32 game_mode_adjusted = game_mode - 2; + Debug_Print0(&SCENARIO_FLAG_RESUME_DEBUG_MSG, game_mode_adjusted); + + val = LoadScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT_BACKUP, game_mode_adjusted); + SaveScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT, 0, val); + val = LoadScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT_BACKUP, game_mode_adjusted + 4); + SaveScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT, 1, val); + + s32 restore_idx = 0; + s32 backup_idx = game_mode_adjusted << 7; + do { + val = LoadScriptVariableValueAtIndex(0, VAR_SCENARIO_MAIN_BIT_FLAG_BACKUP, backup_idx); + SaveScriptVariableValueAtIndex(0, VAR_SCENARIO_MAIN_BIT_FLAG, restore_idx, val); + backup_idx += 1; + restore_idx += 1; + } while (restore_idx < 128); +} + +void ScenarioFlagBackup() { + u32 val; + + u32 game_mode = GetGameMode(); + if (game_mode <= GAME_MODE_1) { + return; + } + + u32 game_mode_adjusted = game_mode - 2; + Debug_Print0(&SCENARIO_FLAG_BACKUP_DEBUG_MSG, game_mode_adjusted); + + val = LoadScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT, 0); + SaveScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT_BACKUP, game_mode_adjusted, val); + val = LoadScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT, 1); + SaveScriptVariableValueAtIndex(0, VAR_SCENARIO_SELECT_BACKUP, game_mode_adjusted + 4, val); + + s32 source_idx = 0; + s32 backup_idx = game_mode_adjusted << 7; + do { + val = LoadScriptVariableValueAtIndex(0, VAR_SCENARIO_MAIN_BIT_FLAG, source_idx); + SaveScriptVariableValueAtIndex(0, VAR_SCENARIO_MAIN_BIT_FLAG_BACKUP, backup_idx, val); + source_idx += 1; + backup_idx += 1; + } while (source_idx < 128); +} diff --git a/src/script_variable.c b/src/script_variable.c index 7687589e..952dfadc 100644 --- a/src/script_variable.c +++ b/src/script_variable.c @@ -1,6 +1,9 @@ #include "debug.h" #include "enums.h" #include "main_0200224C.h" +#include "main_0200330C.h" +#include "main_0200ECFC.h" +#include "scenario_flag.h" #include "script_variable.h" #include "special_episode.h" #include "story_progress.h" @@ -28,19 +31,14 @@ const struct prog_pos_info EVENT_FLAG_PROG_POS_INFO_COMPARE_SCRIPT_VARIABLES = { }; extern s32 GetPartyMembers(s32 param1); -extern s32 GetMoneyCarried(); extern s32 GetMoneyStored(); extern s32 GetLanguageType(); extern enum game_mode GetGameMode(); -extern s32 GetSpecialEpisodeType(); extern s32 GetNotifyNote(); extern s32 AddMoneyCarried(s32 arg0); extern s32 SetMoneyCarried(s32 arg0); extern s32 SetMoneyStored(s32 arg0); extern s32 SetNotifyNote(s32 arg0); -extern void sub_0204CBE8(); -extern void ScenarioFlagBackup(); -void MemcpySimple(u8* dest, u8* src, s32 n); extern void ZinitScriptVariable(u32 param_1, u32 param_2); void LoadScriptVariableRaw(struct script_var_raw* sv_raw, @@ -514,7 +512,7 @@ void EventFlagResume() SaveScriptVariableValue(0, VAR_ATTENDANT1_KIND, LoadScriptVariableValueAtIndexInline(VAR_ATTENDANT1_KIND_BACKUP, idx)); SaveScriptVariableValue(0, VAR_ATTENDANT2_KIND, LoadScriptVariableValueAtIndexInline(VAR_ATTENDANT2_KIND_BACKUP, idx)); - sub_0204CBE8(); + ScenarioFlagRestore(); } // This inline allows EventFlagBackup to match