From d0bfa6860b554a73cc1aeb4d025be4f26ee84b01 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Mon, 9 Dec 2024 11:13:45 -0500 Subject: [PATCH] Skip the Mweep cutscene (#4646) * Skip the Mweep cutscene * Fix bug: Ruto's letter was not removed from bottle --- .../game-interactor/GameInteractor.h | 2 ++ .../Enhancements/timesaver_hook_handlers.cpp | 8 +++++ soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c | 30 ++++++++++++------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index e731205018..8aa37a5803 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -309,6 +309,8 @@ typedef enum { // Vanilla condition: !EVENTCHKINF_PULLED_MASTER_SWORD_FROM_PEDESTAL VB_PLAY_PULL_MASTER_SWORD_CS, VB_PLAY_DROP_FISH_FOR_JABU_CS, + // Opt: *EnKz + VB_PLAY_MWEEP_CS, // Vanilla condition: player->getItemId == GI_GAUNTLETS_SILVER VB_PLAY_NABOORU_CAPTURED_CS, VB_PLAY_ZELDAS_LULLABY_CS, diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 9fd658bc32..64ce4cfb5e 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -404,6 +404,14 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } break; } + case VB_PLAY_MWEEP_CS: { + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), 0)) { + *should = false; + Inventory_ReplaceItem(gPlayState, ITEM_LETTER_RUTO, ITEM_BOTTLE); + Flags_SetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED); + } + break; + } case VB_PLAY_EYEDROP_CREATION_ANIM: case VB_PLAY_EYEDROPS_CS: case VB_PLAY_DROP_FISH_FOR_JABU_CS: diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index d5f14c9595..79b7197343 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -437,17 +437,23 @@ void EnKz_SetupMweep(EnKz* this, PlayState* play) { Vec3f pos; Vec3f initPos; - this->cutsceneCamera = Play_CreateSubCamera(play); - this->gameplayCamera = play->activeCamera; - Play_ChangeCameraStatus(play, this->gameplayCamera, CAM_STAT_WAIT); - Play_ChangeCameraStatus(play, this->cutsceneCamera, CAM_STAT_ACTIVE); + bool shouldPlayCutscene = GameInteractor_Should(VB_PLAY_MWEEP_CS, true); + + if (shouldPlayCutscene) { + this->cutsceneCamera = Play_CreateSubCamera(play); + this->gameplayCamera = play->activeCamera; + Play_ChangeCameraStatus(play, this->gameplayCamera, CAM_STAT_WAIT); + Play_ChangeCameraStatus(play, this->cutsceneCamera, CAM_STAT_ACTIVE); + } pos = this->actor.world.pos; initPos = this->actor.home.pos; pos.y += 60.0f; initPos.y += -100.0f; initPos.z += 260.0f; - Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); - Player_SetCsActionWithHaltedActors(play, &this->actor, 8); + if (shouldPlayCutscene) { + Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); + Player_SetCsActionWithHaltedActors(play, &this->actor, 8); + } this->actor.speedXZ = 0.1f * CVarGetFloat(CVAR_ENHANCEMENT("MweepSpeed"), 1.0f); this->actionFunc = EnKz_Mweep; } @@ -462,7 +468,9 @@ void EnKz_Mweep(EnKz* this, PlayState* play) { pos.y += 60.0f; initPos.y += -100.0f; initPos.z += 260.0f; - Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); + if (GameInteractor_Should(VB_PLAY_MWEEP_CS, true)) { + Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); + } if ((EnKz_FollowPath(this, play) == 1) && (this->waypoint == 0)) { Animation_ChangeByInfo(&this->skelanime, sAnimationInfo, ENKZ_ANIM_1); Inventory_ReplaceItem(play, ITEM_LETTER_RUTO, ITEM_BOTTLE); @@ -477,9 +485,11 @@ void EnKz_Mweep(EnKz* this, PlayState* play) { } void EnKz_StopMweep(EnKz* this, PlayState* play) { - Play_ChangeCameraStatus(play, this->gameplayCamera, CAM_STAT_ACTIVE); - Play_ClearCamera(play, this->cutsceneCamera); - Player_SetCsActionWithHaltedActors(play, &this->actor, 7); + if (GameInteractor_Should(VB_PLAY_MWEEP_CS, true)) { + Play_ChangeCameraStatus(play, this->gameplayCamera, CAM_STAT_ACTIVE); + Play_ClearCamera(play, this->cutsceneCamera); + Player_SetCsActionWithHaltedActors(play, &this->actor, 7); + } this->actionFunc = EnKz_Wait; }