diff --git a/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp b/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp new file mode 100644 index 000000000..3e7660b84 --- /dev/null +++ b/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp @@ -0,0 +1,42 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" +#include "macros.h" +#include "variables.h" + +extern "C" PlayState* gPlayState; + +static constexpr int32_t CVAR_RUPEE_DASH_DEFAULT = 0; +#define CVAR_RUPEE_DASH_NAME CVAR_ENHANCEMENT("RupeeDash") +#define CVAR_RUPEE_DASH_VALUE CVarGetInteger(CVAR_RUPEE_DASH_NAME, CVAR_RUPEE_DASH_DEFAULT) + +static constexpr int32_t CVAR_RUPEE_DASH_INTERVAL_DEFAULT = 5; +#define CVAR_RUPEE_DASH_INTERVAL_NAME CVAR_ENHANCEMENT("RupeeDashInterval") +#define CVAR_RUPEE_DASH_INTERVAL_TIME \ + CVarGetInteger(CVAR_RUPEE_DASH_INTERVAL_NAME, CVAR_RUPEE_DASH_INTERVAL_DEFAULT) * 20 + +void UpdateRupeeDash() { + // Initialize Timer + static uint16_t rupeeDashTimer = 0; + + // Did time change by DashInterval? + if (rupeeDashTimer < CVAR_RUPEE_DASH_INTERVAL_TIME) { + rupeeDashTimer++; + return; + } + + rupeeDashTimer = 0; + if (gSaveContext.rupees > 0) { + uint16_t walletSize = (CUR_UPG_VALUE(UPG_WALLET) + 1) * -1; + Rupees_ChangeBy(walletSize); + } else { + Health_ChangeBy(gPlayState, -16); + } +} + +void RegisterRupeeDash() { + COND_HOOK(OnPlayerUpdate, CVAR_RUPEE_DASH_VALUE, UpdateRupeeDash); +} + +static RegisterShipInitFunc initFunc_RupeeDash(RegisterRupeeDash, { CVAR_RUPEE_DASH_NAME }); diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 2e302ea1d..64c4265d0 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -134,31 +134,6 @@ void RegisterOcarinaTimeTravel() { }); } -void RegisterRupeeDash() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0)) { - return; - } - - // Initialize Timer - static uint16_t rupeeDashTimer = 0; - uint16_t rdmTime = CVarGetInteger(CVAR_ENHANCEMENT("RupeeDashInterval"), 5) * 20; - - // Did time change by DashInterval? - if (rupeeDashTimer >= rdmTime) { - rupeeDashTimer = 0; - if (gSaveContext.rupees > 0) { - uint16_t walletSize = (CUR_UPG_VALUE(UPG_WALLET) + 1) * -1; - Rupees_ChangeBy(walletSize); - } else { - Health_ChangeBy(gPlayState, -16); - } - } else { - rupeeDashTimer++; - } - }); -} - static bool hasAffectedHealth = false; void UpdatePermanentHeartLossState() { if (!GameInteractor::IsSaveLoaded()) @@ -982,7 +957,6 @@ void InitMods() { TimeSavers_Register(); RegisterTTS(); RegisterOcarinaTimeTravel(); - RegisterRupeeDash(); RegisterPermanentHeartLoss(); RegisterDeleteFileOnDeath(); RegisterHyperBosses();