diff options
| author | Jordan Longstaff <JordanLongstaff@users.noreply.github.com> | 2026-09-15 12:56:25 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-15 16:56:25 +0000 |
| commit | aff03cd7b8d4a84862f508e943d32eeea67719bf (patch) | |
| tree | cbb1528d86f37d60118944562f4a0784ae397988 | |
| parent | 4bd2356b11457e81dc17c6724f2459a781f8c9ea (diff) | |
Hookify Mweep cutscene options (#7199)
5 files changed, 91 insertions, 38 deletions
diff --git a/soh/soh/Enhancements/TimeSavers/MweepSpeed.cpp b/soh/soh/Enhancements/TimeSavers/MweepSpeed.cpp new file mode 100644 index 000000000..4bf370623 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/MweepSpeed.cpp @@ -0,0 +1,27 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" +#include "soh/cvar_prefixes.h" + +extern "C" { +#include "src/overlays/actors/ovl_En_Kz/z_en_kz.h" + +void EnKz_Mweep(EnKz* enKz, PlayState* play); +} + +#define CVAR_SPEED_NAME CVAR_ENHANCEMENT("MweepSpeed") +#define CVAR_SPEED CVarGetFloat(CVAR_SPEED_NAME, 1.0f) + +static void EnKz_SetSpeed(void* actorPtr) { + EnKz* enKz = (EnKz*)actorPtr; + if (enKz->actionFunc != EnKz_Mweep) { + return; + } + + enKz->actor.speedXZ = 0.1f * CVAR_SPEED; +} + +static void RegisterMweepSpeed() { + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_KZ, CVAR_SPEED != 1.0f, EnKz_SetSpeed); +} + +static RegisterShipInitFunc initFunc(RegisterMweepSpeed, { CVAR_SPEED_NAME }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipKingZoraMoveOver.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipKingZoraMoveOver.cpp new file mode 100644 index 000000000..836fec986 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipKingZoraMoveOver.cpp @@ -0,0 +1,52 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" +#include "soh/cvar_prefixes.h" + +extern "C" { +#include "src/overlays/actors/ovl_En_Kz/z_en_kz.h" +#include "objects/object_kz/object_kz.h" + +s32 EnKz_FollowPath(EnKz* enKz, PlayState* play); +s32 EnKz_SetMovedPos(EnKz* enKz, PlayState* play); +void EnKz_SetupMweep(EnKz* enKz, PlayState* play); +void EnKz_Wait(EnKz* enKz, PlayState* play); +} + +#define CVAR_STORY_NAME CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story") +#define CVAR_STORY CVarGetInteger(CVAR_STORY_NAME, IS_RANDO) + +#define CVAR_SPEED_NAME CVAR_ENHANCEMENT("MweepSpeed") +#define CVAR_SPEED CVarGetFloat(CVAR_SPEED_NAME, 1.0f) + +static void EnKz_MweepNoCutscene(EnKz* enKz, PlayState* play) { + if ((EnKz_FollowPath(enKz, play) == 1) && (enKz->waypoint == 0)) { + Animation_Change(&enKz->skelanime, (AnimationHeader*)&gKzIdleAnim, 1.0f, 0.0f, + Animation_GetLastFrame((void*)&gKzIdleAnim), ANIMMODE_LOOP, -10.0f); + EnKz_SetMovedPos(enKz, play); + enKz->actor.speedXZ = 0.0; + enKz->actionFunc = EnKz_Wait; + } else { + enKz->actor.speedXZ = 0.1f * CVAR_SPEED; + } + if (enKz->skelanime.curFrame == 13.0f) { + Audio_PlayActorSound2(&enKz->actor, NA_SE_VO_KZ_MOVE); + } +} + +static void EnKz_InterceptMweep(void* actorPtr) { + EnKz* enKz = (EnKz*)actorPtr; + if (enKz->actionFunc != EnKz_SetupMweep) { + return; + } + + enKz->actor.speedXZ = 0.1f * CVAR_SPEED; + Inventory_ReplaceItem(gPlayState, ITEM_LETTER_RUTO, ITEM_BOTTLE); + Flags_SetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED); + enKz->actionFunc = EnKz_MweepNoCutscene; +} + +static void RegisterSkipKingZoraMoveOver() { + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_KZ, CVAR_STORY, EnKz_InterceptMweep); +} + +static RegisterShipInitFunc initFunc(RegisterSkipKingZoraMoveOver, { CVAR_STORY_NAME, "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp index a344540bf..7b3f150df 100644 --- a/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp @@ -574,14 +574,6 @@ 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_JABU_JABU_EAT_FISH: if (*should && CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { *should = false; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 3ffb79a2e..ef1deb693 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2187,14 +2187,6 @@ typedef enum { // #### `result` // ```c - // true - // ``` - // #### `args` - // - None - VB_PLAY_MWEEP_CS, - - // #### `result` - // ```c // this->getItemId == GI_GAUNTLETS_SILVER // ``` // #### `args` 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 395209620..45b37141e 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 @@ -328,7 +328,7 @@ s32 EnKz_FollowPath(EnKz* this, PlayState* play) { pathDiffZ = pointPos->z - this->actor.world.pos.z; Math_SmoothStepToS(&this->actor.world.rot.y, (Math_FAtan2F(pathDiffX, pathDiffZ) * (0x8000 / M_PI)), 0xA, 0x3E8, 1); - if ((SQ(pathDiffX) + SQ(pathDiffZ)) < 10.0f * CVarGetFloat(CVAR_ENHANCEMENT("MweepSpeed"), 1.0f)) { + if ((SQ(pathDiffX) + SQ(pathDiffZ)) < 10.0f) { this->waypoint++; if (this->waypoint >= path->count) { this->waypoint = 0; @@ -407,24 +407,18 @@ void EnKz_SetupMweep(EnKz* this, PlayState* play) { Vec3f pos; Vec3f initPos; - 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); - } + 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; - 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); + Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); + Player_SetCsActionWithHaltedActors(play, &this->actor, 8); + this->actor.speedXZ = 0.1f; this->actionFunc = EnKz_Mweep; } @@ -438,9 +432,7 @@ void EnKz_Mweep(EnKz* this, PlayState* play) { pos.y += 60.0f; initPos.y += -100.0f; initPos.z += 260.0f; - if (GameInteractor_Should(VB_PLAY_MWEEP_CS, true)) { - Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); - } + 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); @@ -455,11 +447,9 @@ void EnKz_Mweep(EnKz* this, PlayState* play) { } void EnKz_StopMweep(EnKz* this, PlayState* play) { - 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); - } + Play_ChangeCameraStatus(play, this->gameplayCamera, CAM_STAT_ACTIVE); + Play_ClearCamera(play, this->cutsceneCamera); + Player_SetCsActionWithHaltedActors(play, &this->actor, 7); this->actionFunc = EnKz_Wait; } |
