Made loading autosaves spawn the player in dungeons when the save was made while in a dungeon

This commit is contained in:
Mr-Wiseguy 2024-05-04 14:32:33 -04:00
parent 54b862599c
commit a324b7853d
1 changed files with 79 additions and 1 deletions

View File

@ -358,6 +358,79 @@ extern u16 D_801C6A58[];
((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \ ((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \
(newf)[5] != '3') (newf)[5] != '3')
typedef struct {
/* 0x00 */ s16 csId;
/* 0x02 */ s16 length;
/* 0x04 */ s16 endCsId;
/* 0x06 */ s16 subCamId;
/* 0x08 */ Actor* targetActor;
/* 0x0C */ s32 startMethod;
/* 0x10 */ PlayState* play;
/* 0x14 */ s16 retCamId;
/* 0x16 */ s16 isCameraStored;
} CutsceneManager; // size = 0x18
extern CutsceneManager sCutsceneMgr;
extern ActorCutscene* sSceneCutsceneList;
extern s16 sSceneCutsceneCount;
bool skip_entry_cutscene = false;
// @recomp Patched to skip the entrance cutscene if the flag is enabled.
s16 CutsceneManager_FindEntranceCsId(void) {
PlayState* play;
s32 csId;
for (csId = 0; csId < sSceneCutsceneCount; csId++) {
//! FAKE:
if ((sSceneCutsceneList[csId].scriptIndex != CS_SCRIPT_ID_NONE) &&
(sSceneCutsceneList[csId].scriptIndex < (play = sCutsceneMgr.play)->csCtx.scriptListCount) &&
(sCutsceneMgr.play->curSpawn ==
sCutsceneMgr.play->csCtx.scriptList[sSceneCutsceneList[csId].scriptIndex].spawn)) {
// @recomp Check if the entry cutscene should be skipped and do so.
if (skip_entry_cutscene) {
skip_entry_cutscene = false;
return -1;
}
return csId;
}
}
for (csId = 0; csId < sSceneCutsceneCount; csId++) {
if ((sSceneCutsceneList[csId].customValue >= 100) &&
(sSceneCutsceneList[csId].customValue == (sCutsceneMgr.play->curSpawn + 100))) {
return csId;
}
}
return -1;
}
s32 spawn_entrance_from_autosave_entrance(s16 autosave_entrance) {
s32 scene_id = Entrance_GetSceneIdAbsolute(gSaveContext.save.entrance);
recomp_printf("Loaded entrance: %d in scene: %d\n", autosave_entrance, scene_id);
switch (scene_id) {
default:
return ENTRANCE(SOUTH_CLOCK_TOWN, 0);
case SCENE_MITURIN: // Woodfall Temple
case SCENE_MITURIN_BS: // Odolwa's Lair
return ENTRANCE(WOODFALL_TEMPLE, 0);
case SCENE_HAKUGIN: // Snowhead Temple
case SCENE_HAKUGIN_BS: // Goht's Lair
return ENTRANCE(SNOWHEAD_TEMPLE, 0);
case SCENE_SEA: // Great Bay Temple
case SCENE_SEA_BS: // Gyorg's Lair
return ENTRANCE(GREAT_BAY_TEMPLE, 0);
case SCENE_INISIE_N: // Stone Tower Temple
return ENTRANCE(STONE_TOWER_TEMPLE, 0);
case SCENE_INISIE_R: // Inverted Stone Tower Temple
case SCENE_INISIE_BS: // Twinmold's Lair
return ENTRANCE(STONE_TOWER_TEMPLE_INVERTED, 0);
}
}
// @recomp Patched to change the entrance for autosaves and initialize autosaves. // @recomp Patched to change the entrance for autosaves and initialize autosaves.
void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) { void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
s32 i; s32 i;
@ -433,7 +506,12 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
} }
// @recomp Handle autosaves. // @recomp Handle autosaves.
else if (gSaveContext.save.isOwlSave == SAVE_TYPE_AUTOSAVE) { else if (gSaveContext.save.isOwlSave == SAVE_TYPE_AUTOSAVE) {
gSaveContext.save.entrance = ENTRANCE(SOUTH_CLOCK_TOWN, 0); gSaveContext.save.entrance = spawn_entrance_from_autosave_entrance(gSaveContext.save.entrance);
// Skip the turtle cutscene that happens when entering Great Bay Temple.
if (gSaveContext.save.entrance == ENTRANCE(GREAT_BAY_TEMPLE, 0)) {
skip_entry_cutscene = true;
}
for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) { for (i = 0; i < ARRAY_COUNT(gSaveContext.cycleSceneFlags); i++) {
gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.saveInfo.permanentSceneFlags[i].chest; gSaveContext.cycleSceneFlags[i].chest = gSaveContext.save.saveInfo.permanentSceneFlags[i].chest;