From 7ff93a396017d72c6fef3fc6f3477a0d4d534351 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Sun, 9 Nov 2025 20:27:09 -0500 Subject: [PATCH] Dampe's Hut open all night when Dampe is out (#5937) --- .../Enhancements/TimeSavers/DampeAllNight.cpp | 37 +++++++++++++++++++ .../Enhancements/timesaver_hook_handlers.cpp | 5 --- 2 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 soh/soh/Enhancements/TimeSavers/DampeAllNight.cpp diff --git a/soh/soh/Enhancements/TimeSavers/DampeAllNight.cpp b/soh/soh/Enhancements/TimeSavers/DampeAllNight.cpp new file mode 100644 index 000000000..683e7fbca --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/DampeAllNight.cpp @@ -0,0 +1,37 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "src/overlays/actors/ovl_En_Door/z_en_door.h" +extern SaveContext gSaveContext; +extern PlayState* gPlayState; +} + +static constexpr int32_t CVAR_DAMPE_ALL_NIGHT_DEFAULT = 0; +#define CVAR_DAMPE_ALL_NIGHT_NAME CVAR_ENHANCEMENT("DampeAllNight") +#define CVAR_DAMPE_ALL_NIGHT_VALUE CVarGetInteger(CVAR_DAMPE_ALL_NIGHT_NAME, CVAR_DAMPE_ALL_NIGHT_DEFAULT) + +static constexpr s16 DAMPE_HUT_DOOR_OPEN = 447; +static constexpr s16 DAMPE_HUT_DOOR_CLOSED = 774; + +static bool DampeIsResting() { + return LINK_IS_ADULT || gPlayState->sceneNum != SCENE_GRAVEYARD; +} + +static void OpenDampeHutDoor(void* refActor) { + EnDoor* enDoor = static_cast(refActor); + s16* params = &enDoor->actor.params; + + if (*params == DAMPE_HUT_DOOR_CLOSED && !DampeIsResting()) { + *params = DAMPE_HUT_DOOR_OPEN; + EnDoor_SetupType(enDoor, gPlayState); + } +} + +static void RegisterDampeAllNight() { + COND_VB_SHOULD(VB_DAMPE_IN_GRAVEYARD_DESPAWN, CVAR_DAMPE_ALL_NIGHT_VALUE, { *should = DampeIsResting(); }); + COND_ID_HOOK(OnActorInit, ACTOR_EN_DOOR, CVAR_DAMPE_ALL_NIGHT_VALUE, OpenDampeHutDoor); +} + +static RegisterShipInitFunc initFunc(RegisterDampeAllNight, { CVAR_DAMPE_ALL_NIGHT_NAME }); diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 8bcd19903..89bef13c5 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -709,11 +709,6 @@ void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li *should = false; } break; - case VB_DAMPE_IN_GRAVEYARD_DESPAWN: - if (CVarGetInteger(CVAR_ENHANCEMENT("DampeAllNight"), 0)) { - *should = LINK_IS_ADULT || gPlayState->sceneNum != SCENE_GRAVEYARD; - } - break; case VB_BE_VALID_GRAVEDIGGING_SPOT: if (CVarGetInteger(CVAR_ENHANCEMENT("DampeWin"), IS_RANDO)) { EnTk* enTk = va_arg(args, EnTk*);