summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Longstaff <JordanLongstaff@users.noreply.github.com>2026-09-15 12:56:25 -0400
committerGitHub <noreply@github.com>2026-09-15 16:56:25 +0000
commitaff03cd7b8d4a84862f508e943d32eeea67719bf (patch)
treecbb1528d86f37d60118944562f4a0784ae397988
parent4bd2356b11457e81dc17c6724f2459a781f8c9ea (diff)
Hookify Mweep cutscene options (#7199)
-rw-r--r--soh/soh/Enhancements/TimeSavers/MweepSpeed.cpp27
-rw-r--r--soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipKingZoraMoveOver.cpp52
-rw-r--r--soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp8
-rw-r--r--soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h8
-rw-r--r--soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c34
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;
}