From 7e510f69ff17b0eeb23abd3d5d900add7e26065e Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 10 Oct 2026 22:35:34 -0400 Subject: [PATCH] [Bugfix] Restore Ganondorf Lights Hint (#7363) --- .../TimeSavers/SkipCutscene/GanonIntros.cpp | 10 +++++++++- .../vanilla-behavior/GIVanillaBehavior.h | 1 + soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c | 6 +++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/GanonIntros.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/GanonIntros.cpp index 1f634a8425..e7dc93f1e6 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/GanonIntros.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/GanonIntros.cpp @@ -2,7 +2,9 @@ #include +#include "soh/Enhancements/custom-message/CustomMessageTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/randomizer/SeedContext.h" #include "soh/ShipInit.hpp" extern "C" { @@ -29,7 +31,13 @@ void RegisterGanonIntros() { } }); - COND_VB_SHOULD(VB_PLAY_GANONDORF_INTRO_CS, CVAR_VALUE || IS_RANDO || IS_BOSS_RUSH, { *should = false; }); + COND_VB_SHOULD(VB_PLAY_GANONDORF_INTRO_CS, CVAR_VALUE || IS_RANDO || IS_BOSS_RUSH, { + va_arg(args, void*); + u16 textId = va_arg(args, int); + if (textId != TEXT_GANONDORF || !IS_RANDO || !RAND_GET_OPTION(RSK_GANONDORF_HINT)) { + *should = false; + } + }); // Skip Ganon rising from the rubble, transforming and landing. Skip to knocking sword away. COND_VB_SHOULD(VB_PLAY_GANON_INTRO_CS, CVAR_VALUE, { diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 41f34ca4e8..dac11a2939 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2234,6 +2234,7 @@ typedef enum { // ``` // #### `args` // - `*BossGanon` + // - `u16` text ID VB_PLAY_GANONDORF_INTRO_CS, // #### `result` diff --git a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 6311e0bdbf..58bd1b0164 100644 --- a/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/soh/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -918,7 +918,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { this->csTimer = 0; this->csCamFov = 60.0f; BossGanon_SetIntroCsCamera(this, 12); - if (GameInteractor_Should(VB_PLAY_GANONDORF_INTRO_CS, true, this)) { + if (GameInteractor_Should(VB_PLAY_GANONDORF_INTRO_CS, true, this, 0x70CB)) { Message_StartTextbox(play, 0x70CB, NULL); } } @@ -942,7 +942,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { this->csState = 19; this->csTimer = 0; - if (GameInteractor_Should(VB_PLAY_GANONDORF_INTRO_CS, true, this)) { + if (GameInteractor_Should(VB_PLAY_GANONDORF_INTRO_CS, true, this, 0x70CC)) { Message_StartTextbox(play, 0x70CC, NULL); } Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfRaiseHandStartAnim, -5.0f); @@ -985,7 +985,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { } if ((this->csTimer > 80) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) { - if (!GameInteractor_Should(VB_PLAY_GANONDORF_INTRO_CS, true, this)) { + if (!GameInteractor_Should(VB_PLAY_GANONDORF_INTRO_CS, true, this, 0)) { this->timers[2] = 30; this->csCamAt.x = this->unk_1FC.x - 10.0f; this->csCamAt.y = this->unk_1FC.y + 30.0f;