Merge pull request #221 from slaw-22/ScenarioFlagBackupAndRestore

Decomp ScenarioFlagRestore and ScenarioFlagBackup
This commit is contained in:
AnonymousRandomPerson 2025-12-11 21:43:08 -05:00 committed by GitHub
commit 97ccf7fce6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 91 additions and 136 deletions

View File

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

View File

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

View File

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

View File

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

7
include/scenario_flag.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef PMDSKY_SCENARIO_FLAG_H
#define PMDSKY_SCENARIO_FLAG_H
void ScenarioFlagRestore();
void ScenarioFlagBackup();
#endif //PMDSKY_SCENARIO_FLAG_H

View File

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

View File

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

View File

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

61
src/scenario_flag.c Normal file
View File

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

View File

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