diff --git a/soh/soh/Enhancements/Fixes/FloorSwitches.cpp b/soh/soh/Enhancements/Fixes/FloorSwitches.cpp new file mode 100644 index 000000000..8c05c5c67 --- /dev/null +++ b/soh/soh/Enhancements/Fixes/FloorSwitches.cpp @@ -0,0 +1,26 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "macros.h" +#include "src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h" +} + +static constexpr int32_t CVAR_FLOOR_SWITCHES_DEFAULT = 0; +#define CVAR_FLOOR_SWITCHES_NAME CVAR_ENHANCEMENT("FixFloorSwitches") +#define CVAR_FLOOR_SWITCHES_VALUE CVarGetInteger(CVAR_FLOOR_SWITCHES_NAME, CVAR_FLOOR_SWITCHES_DEFAULT) + +static void OnInitFloorSwitches(void* refActor) { + ObjSwitch* switchActor = reinterpret_cast(refActor); + s32 type = (switchActor->dyna.actor.params & 7); + + if (switchActor->dyna.actor.params == 0x1200 || switchActor->dyna.actor.params == 0x3A00) { + switchActor->dyna.actor.world.pos.y -= 1; + } +} + +static void RegisterFloorSwitchesFix() { + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_SWITCH, CVAR_FLOOR_SWITCHES_VALUE, OnInitFloorSwitches); +} + +static RegisterShipInitFunc initFunc(RegisterFloorSwitchesFix, { CVAR_FLOOR_SWITCHES_NAME }); diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 919658348..00f92e7bf 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -28,7 +28,6 @@ #include "src/overlays/actors/ovl_En_Firefly/z_en_firefly.h" #include "src/overlays/actors/ovl_En_Xc/z_en_xc.h" #include "src/overlays/actors/ovl_Fishing/z_fishing.h" -#include "src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h" #include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h" #include "src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h" #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" @@ -842,22 +841,6 @@ void RegisterToTMedallions() { }); } -void RegisterFloorSwitchesHook() { - GameInteractor::Instance->RegisterGameHook([](void* refActor) { - Actor* actor = static_cast(refActor); - if (actor->id != ACTOR_OBJ_SWITCH || !CVarGetInteger(CVAR_ENHANCEMENT("FixFloorSwitches"), 0)) { - return; - } - - ObjSwitch* switchActor = reinterpret_cast(actor); - s32 type = (switchActor->dyna.actor.params & 7); - - if (switchActor->dyna.actor.params == 0x1200 || switchActor->dyna.actor.params == 0x3A00) { - switchActor->dyna.actor.world.pos.y -= 1; - } - }); -} - void RegisterPauseMenuHooks() { static bool pauseWarpHooksRegistered = false; GameInteractor::Instance->RegisterGameHook([&]() { @@ -914,7 +897,6 @@ void InitMods() { RegisterBossDefeatTimestamps(); RegisterRandomizedEnemySizes(); RegisterToTMedallions(); - RegisterFloorSwitchesHook(); RegisterPatchHandHandler(); RegisterHurtContainerModeHandler(); RegisterPauseMenuHooks();