Skip to content

Commit

Permalink
More time cutscene skip fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
garrettjoecox committed Apr 21, 2024
1 parent 28a2cc9 commit 14c7f0c
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 5 deletions.
3 changes: 3 additions & 0 deletions soh/soh/Enhancements/game-interactor/GameInteractor.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ typedef enum {
// Opt: *EnMd
// Vanilla condition: CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)
GI_VB_MIDO_CONSIDER_DEKU_TREE_DEAD,
// Opt: *ObjDekujr
// Vanilla condition: CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)
GI_VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED,
// Opt: *EnKo
// Vanilla condition: CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)
GI_VB_OPEN_KOKIRI_FOREST,
Expand Down
29 changes: 25 additions & 4 deletions soh/soh/Enhancements/timesaver_hook_handlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*
if ((gSaveContext.entranceIndex == ENTR_DESERT_COLOSSUS_1) && !Flags_GetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT)) {
Flags_SetEventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT);
// Normally happens in the cutscene
gSaveContext.dayTime = gSaveContext.skyboxTime = 0xAC60;
if (GameInteractor_Should(GI_VB_GIVE_ITEM_REQUIEM_OF_SPIRIT, true, NULL)) {
Item_Give(gPlayState, ITEM_SONG_REQUIEM);
}
Expand Down Expand Up @@ -183,8 +184,6 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*
uint8_t isBlueWarp = 0;
// Deku Tree Blue warp
if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) {
gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000;

gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_11;
isBlueWarp = 1;
// Dodongo's Cavern Blue warp
Expand All @@ -199,16 +198,23 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*
} else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) {
// Normally set in the blue warp cutscene
Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_DEKU_TREE_SPROUT);
gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000;

gSaveContext.entranceIndex = ENTR_SACRED_FOREST_MEADOW_3;
if (IS_RANDO) {
gSaveContext.entranceIndex = ENTR_SACRED_FOREST_MEADOW_3;
} else {
gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_12;
}

isBlueWarp = 1;
// Fire Temple Blue warp
} else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_0 && gSaveContext.cutsceneIndex == 0xFFF3) {
gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_5;
isBlueWarp = 1;
// Water Temple Blue warp
} else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) {
// Normally set in the blue warp cutscene
gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4800;

gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_9;
isBlueWarp = 1;
// Spirit Temple Blue warp
Expand All @@ -222,6 +228,9 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*
}

if (isBlueWarp) {
// Normally set in the blue warp cutscene
gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000;

*should = false;
gSaveContext.cutsceneIndex = 0;

Expand All @@ -232,6 +241,9 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*

// Flee hyrule castle cutscene
if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_0 && gSaveContext.cutsceneIndex == 0xFFF1) {
// Normally set in the blue warp cutscene
gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4AAA;

gSaveContext.cutsceneIndex = 0;
*should = false;
}
Expand Down Expand Up @@ -420,6 +432,14 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*
}
break;
}
case GI_VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED: {
// We're overriding this so that the Deku JR doesn't despawn after skipping the forest temple blue warp cutscene.
// It typically relies on the forest medallion being obtained, but that isn't given yet until after scene init
if (CVarGetInteger("gTimeSavers.SkipCutscene.Story", IS_RANDO)) {
*should = Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP);
}
break;
}
case GI_VB_GIVE_ITEM_FROM_BLUE_WARP:
case GI_VB_PLAY_SHIEK_BLOCK_MASTER_SWORD_CS:
case GI_VB_GIVE_ITEM_FAIRY_OCARINA:
Expand Down Expand Up @@ -514,6 +534,7 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void*
} else {
gPlayState->nextEntranceIndex = ENTR_HYRULE_FIELD_17;
}
gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000;
gPlayState->transitionType = TRANS_TYPE_FADE_WHITE;
gPlayState->transitionTrigger = TRANS_TRIGGER_START;
gSaveContext.nextTransitionType = 2;
Expand Down
3 changes: 2 additions & 1 deletion soh/src/overlays/actors/ovl_Obj_Dekujr/z_obj_dekujr.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "z_obj_dekujr.h"
#include "objects/object_dekujr/object_dekujr.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"

#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY)

Expand Down Expand Up @@ -56,7 +57,7 @@ void ObjDekujr_Init(Actor* thisx, PlayState* play) {
this->unk_19C = 0;
this->unk_19B = 1;
}
if (!CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)) {
if (!GameInteractor_Should(GI_VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST), this)) {
Actor_Kill(thisx);
} else {
ActorShape_Init(&thisx->shape, 0.0f, NULL, 0.0f);
Expand Down

0 comments on commit 14c7f0c

Please sign in to comment.