diff --git a/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp index 33eb5278a7..85edd14ecc 100644 --- a/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/TimeSavers/timesaver_hook_handlers.cpp @@ -3,6 +3,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/randomizer/SeedContext.h" +#include "soh/Enhancements/randomizer/randomizer_entrance.h" extern "C" { #include "src/overlays/actors/ovl_En_Wonder_Talk2/z_en_wonder_talk2.h" @@ -128,6 +129,20 @@ bool ForcedDialogIsDisabled(ForcedDialogMode type) { type) != 0; } +static void SkipJabuFeedingCutscene() { + Player_UpdateBottleHeld(gPlayState, GET_PLAYER(gPlayState), ITEM_BOTTLE, PLAYER_IA_BOTTLE); + Flags_SetEventChkInf(EVENTCHKINF_OFFERED_FISH_TO_JABU_JABU); + Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); + + if (IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_ENTRANCES)) { + gPlayState->nextEntranceIndex = Entrance_OverrideNextIndex(ENTR_JABU_JABU_ENTRANCE); + } else { + gPlayState->nextEntranceIndex = ENTR_JABU_JABU_ENTRANCE; + } + gPlayState->transitionTrigger = TRANS_TRIGGER_START; + gPlayState->transitionType = TRANS_TYPE_FADE_BLACK; +} + void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { va_list args; va_copy(args, originalArgs); @@ -581,10 +596,15 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li } break; } + case VB_JABU_JABU_EAT_FISH: + if (*should && CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { + *should = false; + SkipJabuFeedingCutscene(); + } + break; case VB_PLAY_BEAN_PLANTING_CS: case VB_PLAY_EYEDROP_CREATION_ANIM: case VB_PLAY_EYEDROPS_CS: - case VB_PLAY_DROP_FISH_FOR_JABU_CS: case VB_PLAY_DARUNIAS_JOY_CS: if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { *should = false; @@ -940,8 +960,6 @@ static uint32_t enMa1UpdateHook = 0; static uint32_t enMa1KillHook = 0; static uint32_t enFuUpdateHook = 0; static uint32_t enFuKillHook = 0; -static uint32_t enJjUpdateHook = 0; -static uint32_t enJjKillHook = 0; static uint32_t bgSpot02UpdateHook = 0; static uint32_t bgSpot02KillHook = 0; static uint32_t bgSpot03UpdateHook = 0; @@ -1010,36 +1028,12 @@ void TimeSaverOnActorInitHandler(void* actorRef) { } if (actor->id == ACTOR_EN_JJ) { - enJjUpdateHook = - GameInteractor::Instance->RegisterGameHook([](void* innerActorRef) mutable { - Actor* innerActor = static_cast(innerActorRef); - - if (innerActor->id != ACTOR_EN_JJ || Flags_GetEventChkInf(EVENTCHKINF_OFFERED_FISH_TO_JABU_JABU)) { - return; - } - - bool shouldOpen = IS_RANDO ? RAND_GET_OPTION(RSK_JABU_OPEN).Get() - : CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipJabuJabuFish"), 0); - if (!shouldOpen) { - return; - } - - EnJj* enJj = static_cast(innerActorRef); - if (enJj->actionFunc == EnJj_WaitForFish) { - EnJj_SetupAction(enJj, EnJj_WaitToOpenMouth); - GameInteractor::Instance->UnregisterGameHook(enJjUpdateHook); - GameInteractor::Instance->UnregisterGameHook(enJjKillHook); - enJjUpdateHook = 0; - enJjKillHook = 0; - } - }); - enJjKillHook = - GameInteractor::Instance->RegisterGameHook([](int16_t sceneNum) mutable { - GameInteractor::Instance->UnregisterGameHook(enJjUpdateHook); - GameInteractor::Instance->UnregisterGameHook(enJjKillHook); - enJjUpdateHook = 0; - enJjKillHook = 0; - }); + EnJj* enJj = static_cast(actorRef); + bool shouldOpen = IS_RANDO ? RAND_GET_OPTION(RSK_JABU_OPEN).Get() + : CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipJabuJabuFish"), 0); + if (shouldOpen && enJj->actionFunc == EnJj_WaitForFish) { + EnJj_SetupAction(enJj, EnJj_WaitToOpenMouth); + } } if (actor->id == ACTOR_EN_OWL && gPlayState->sceneNum == SCENE_ZORAS_RIVER && diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index cd0fc22551..239c7520e6 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1584,6 +1584,14 @@ typedef enum { // - `*EnItem00` VB_ITEM00_TIMER_TICK, + // #### `result` + // ```c + // Math_Vec3f_DistXZ(&feedingSpot, &player->actor.world.pos) < 300.0f && play->isPlayerDroppingFish(play) + // ``` + // #### `args` + // - `*EnJj` + VB_JABU_JABU_EAT_FISH, + // #### `result` // ```c // true @@ -2036,14 +2044,6 @@ typedef enum { // - `*EnOkarinaTag` VB_PLAY_DRAIN_WELL_CS, - // #### `result` - // ```c - // true - // ``` - // #### `args` - // - None - VB_PLAY_DROP_FISH_FOR_JABU_CS, - // #### `result` // ```c // true diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c index 74429c2371..65aa89b22e 100644 --- a/soh/src/code/z_demo.c +++ b/soh/src/code/z_demo.c @@ -497,18 +497,9 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB Player* player = GET_PLAYER(play); s32 temp = 0; - bool shouldSkipCommand = false; - - if (cmd->base == 8 && !GameInteractor_Should(VB_PLAY_PULL_MASTER_SWORD_CS, true)) { - shouldSkipCommand = true; - } - - if (cmd->base == 24 && !GameInteractor_Should(VB_PLAY_DROP_FISH_FOR_JABU_CS, true)) { - shouldSkipCommand = true; - } - - bool debugCsSkip = (CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) && - (gSaveContext.fileNum != 0xFEDC) && CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0)); + bool shouldSkipCommand = cmd->base == 8 && !GameInteractor_Should(VB_PLAY_PULL_MASTER_SWORD_CS, true); + bool debugCsSkip = CHECK_BTN_ALL(play->state.input[0].press.button, BTN_START) && + (gSaveContext.fileNum != 0xFEDC) && CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); if ((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_END_CREDITS) && (play->sceneNum != SCENE_HYRULE_FIELD) && (csCtx->frames > 20) && diff --git a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c index 161ad0b31e..1e573051bb 100644 --- a/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c +++ b/soh/src/overlays/actors/ovl_En_Jj/z_en_jj.c @@ -7,6 +7,7 @@ #include "z_en_jj.h" #include "objects/object_jj/object_jj.h" #include "overlays/actors/ovl_Eff_Dust/z_eff_dust.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) @@ -197,7 +198,10 @@ void EnJj_WaitForFish(EnJj* this, PlayState* play) { static Vec3f feedingSpot = { -1589.0f, 53.0f, -43.0f }; Player* player = GET_PLAYER(play); - if ((Math_Vec3f_DistXZ(&feedingSpot, &player->actor.world.pos) < 300.0f) && play->isPlayerDroppingFish(play)) { + if (GameInteractor_Should(VB_JABU_JABU_EAT_FISH, + (Math_Vec3f_DistXZ(&feedingSpot, &player->actor.world.pos) < 300.0f) && + play->isPlayerDroppingFish(play), + this)) { this->cutsceneCountdownTimer = 100; EnJj_SetupAction(this, EnJj_BeginCutscene); }