summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Longstaff <JordanLongstaff@users.noreply.github.com>2025-05-01 23:27:20 -0400
committerGitHub <noreply@github.com>2025-05-01 20:27:20 -0700
commit19eb4f39abe6e10cbc603c3d2f2e407e6d173b80 (patch)
tree6da3047f441ef77a78c4acc7e230f22e1518a58b
parentbc3b17f4abdae665b0aafbd7b877a110efe90695 (diff)
Skip trial barrier dispel cutscenes (#5464)
-rw-r--r--soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h8
-rw-r--r--soh/soh/Enhancements/timesaver_hook_handlers.cpp21
-rw-r--r--soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c17
-rw-r--r--soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.h2
4 files changed, 40 insertions, 8 deletions
diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
index d57d5029a..3eb7916a7 100644
--- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
+++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h
@@ -1363,6 +1363,14 @@ typedef enum {
// true
// ```
// #### `args`
+ // - `*DemoKekkai`
+ VB_PLAY_DISPEL_BARRIER_CS,
+
+ // #### `result`
+ // ```c
+ // true
+ // ```
+ // #### `args`
// - `*EnOkarinaTag`
VB_PLAY_DOOR_OF_TIME_CS,
diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp
index 32de18552..0a9a77e40 100644
--- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp
+++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp
@@ -19,6 +19,7 @@ extern "C" {
#include "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h"
#include "src/overlays/actors/ovl_En_Box/z_en_box.h"
#include "src/overlays/actors/ovl_Demo_Im/z_demo_im.h"
+#include "src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.h"
#include "src/overlays/actors/ovl_En_Sa/z_en_sa.h"
#include "src/overlays/actors/ovl_Bg_Ddan_Kd/z_bg_ddan_kd.h"
#include "src/overlays/actors/ovl_En_Tk/z_en_tk.h"
@@ -465,6 +466,26 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
*should = false;
}
break;
+ case VB_PLAY_DISPEL_BARRIER_CS: {
+ if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) {
+ static s16 trialEntrances[] = {
+ 0,
+ ENTR_INSIDE_GANONS_CASTLE_3,
+ ENTR_INSIDE_GANONS_CASTLE_6,
+ ENTR_INSIDE_GANONS_CASTLE_5,
+ ENTR_INSIDE_GANONS_CASTLE_4,
+ ENTR_INSIDE_GANONS_CASTLE_7,
+ ENTR_INSIDE_GANONS_CASTLE_2,
+ };
+ RateLimitedSuccessChime();
+ DemoKekkai* kekkai = va_arg(args, DemoKekkai*);
+ gPlayState->nextEntranceIndex = trialEntrances[kekkai->actor.params];
+ gPlayState->transitionTrigger = TRANS_TRIGGER_START;
+ gPlayState->transitionType = TRANS_TYPE_FADE_BLACK;
+ *should = false;
+ }
+ break;
+ }
case VB_OWL_INTERACTION: {
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipOwlInteractions"), IS_RANDO) && *should) {
EnOwl* enOwl = va_arg(args, EnOwl*);
diff --git a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c
index ad1c76a3d..3d50bf330 100644
--- a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c
+++ b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.c
@@ -7,6 +7,7 @@
#include "z_demo_kekkai.h"
#include "objects/object_demo_kekkai/object_demo_kekkai.h"
#include "scenes/dungeons/ganontika/ganontika_scene.h"
+#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/ResourceManagerHelpers.h"
#define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED)
@@ -257,13 +258,15 @@ void DemoKekkai_TrialBarrierIdle(Actor* thisx, PlayState* play) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider1.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider1.base);
if (this->collider2.base.acFlags & AC_HIT) {
- Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME);
- // "I got it"
- LOG_STRING("当ったよ");
- this->actor.update = DemoKekkai_TrialBarrierDispel;
- this->timer = 0;
- play->csCtx.segment = SEGMENTED_TO_VIRTUAL(sSageCutscenes[this->actor.params]);
- gSaveContext.cutsceneTrigger = 1;
+ if (GameInteractor_Should(VB_PLAY_DISPEL_BARRIER_CS, true, this)) {
+ Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME);
+ // "I got it"
+ LOG_STRING("当ったよ");
+ this->actor.update = DemoKekkai_TrialBarrierDispel;
+ this->timer = 0;
+ play->csCtx.segment = SEGMENTED_TO_VIRTUAL(sSageCutscenes[this->actor.params]);
+ gSaveContext.cutsceneTrigger = 1;
+ }
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider2.base);
func_8002F974(&this->actor, NA_SE_EV_TOWER_ENERGY - SFX_FLAG);
diff --git a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.h b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.h
index 4e4a06c18..a8df145c2 100644
--- a/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.h
+++ b/soh/src/overlays/actors/ovl_Demo_Kekkai/z_demo_kekkai.h
@@ -6,7 +6,7 @@
struct DemoKekkai;
-typedef void (*DemoKekkaiUpdateFunc)(struct DemoKekkai* this, PlayState* play);
+typedef void (*DemoKekkaiUpdateFunc)(struct DemoKekkai* thisx, PlayState* play);
typedef struct DemoKekkai {
/* 0x0000 */ Actor actor;