diff --git a/mm/2s2h/BenGui/BenMenuBar.cpp b/mm/2s2h/BenGui/BenMenuBar.cpp index ae63ead7b..056fbd055 100644 --- a/mm/2s2h/BenGui/BenMenuBar.cpp +++ b/mm/2s2h/BenGui/BenMenuBar.cpp @@ -10,6 +10,7 @@ #include "2s2h/Enhancements/Enhancements.h" #include "2s2h/Enhancements/Graphics/MotionBlur.h" #include "2s2h/Enhancements/Graphics/PlayAsKafei.h" +#include "2s2h/Enhancements/Modes/TimeMovesWhenYouMove.h" #include "2s2h/DeveloperTools/DeveloperTools.h" #include "2s2h/DeveloperTools/WarpPoint.h" #include "HudEditor.h" @@ -539,6 +540,9 @@ void DrawEnhancementsMenu() { if (UIWidgets::BeginMenu("Modes")) { UIWidgets::CVarCheckbox("Play As Kafei", "gModes.PlayAsKafei", { .tooltip = "Requires scene reload to take effect." }); + if (UIWidgets::CVarCheckbox("Time Moves When You Move", "gModes.TimeMovesWhenYouMove")) { + RegisterTimeMovesWhenYouMove(); + } ImGui::EndMenu(); } if (UIWidgets::BeginMenu("Player Movement")) { diff --git a/mm/2s2h/Enhancements/Enhancements.cpp b/mm/2s2h/Enhancements/Enhancements.cpp index c71ab37af..c7623e6a6 100644 --- a/mm/2s2h/Enhancements/Enhancements.cpp +++ b/mm/2s2h/Enhancements/Enhancements.cpp @@ -42,6 +42,7 @@ void InitEnhancements() { // Modes RegisterPlayAsKafei(); + RegisterTimeMovesWhenYouMove(); // Player Movement RegisterClimbSpeed(); diff --git a/mm/2s2h/Enhancements/Enhancements.h b/mm/2s2h/Enhancements/Enhancements.h index 3a6a303b6..673aa3fd1 100644 --- a/mm/2s2h/Enhancements/Enhancements.h +++ b/mm/2s2h/Enhancements/Enhancements.h @@ -23,6 +23,7 @@ #include "PlayerMovement/ClimbSpeed.h" #include "Songs/EnableSunsSong.h" #include "Saving/SavingEnhancements.h" +#include "Modes/TimeMovesWhenYouMove.h" enum AlwaysWinDoggyRaceOptions { ALWAYS_WIN_DOGGY_RACE_OFF, diff --git a/mm/2s2h/Enhancements/Modes/TimeMovesWhenYouMove.cpp b/mm/2s2h/Enhancements/Modes/TimeMovesWhenYouMove.cpp new file mode 100644 index 000000000..8c56f8b8c --- /dev/null +++ b/mm/2s2h/Enhancements/Modes/TimeMovesWhenYouMove.cpp @@ -0,0 +1,31 @@ +#include "TimeMovesWhenYouMove.h" +#include "libultraship/libultraship.h" +#include "2s2h/Enhancements/GameInteractor/GameInteractor.h" + +extern "C" { +#include "macros.h" +#include "z64.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; +} + +static HOOK_ID onActorUpdateHookId = 0; + +void RegisterTimeMovesWhenYouMove() { + GameInteractor::Instance->UnregisterGameHookForID(onActorUpdateHookId); + onActorUpdateHookId = 0; + gSaveContext.save.timeSpeedOffset = 0; + + if (CVarGetInteger("gModes.TimeMovesWhenYouMove", 0)) { + onActorUpdateHookId = GameInteractor::Instance->RegisterGameHookForID( + ACTOR_PLAYER, [](Actor* actor) { + Player* player = GET_PLAYER(gPlayState); + + gSaveContext.save.timeSpeedOffset = -R_TIME_SPEED; + if (player->linearVelocity != 0) { + gSaveContext.save.timeSpeedOffset = + CLAMP(player->linearVelocity / 2 - R_TIME_SPEED, -R_TIME_SPEED, 10); + } + }); + } +} diff --git a/mm/2s2h/Enhancements/Modes/TimeMovesWhenYouMove.h b/mm/2s2h/Enhancements/Modes/TimeMovesWhenYouMove.h new file mode 100644 index 000000000..15532cd21 --- /dev/null +++ b/mm/2s2h/Enhancements/Modes/TimeMovesWhenYouMove.h @@ -0,0 +1,6 @@ +#ifndef MODES_TIME_MOVES_WHEN_YOU_MOVE_H +#define MODES_TIME_MOVES_WHEN_YOU_MOVE_H + +void RegisterTimeMovesWhenYouMove(); + +#endif // MODES_TIME_MOVES_WHEN_YOU_MOVE_H