From 96a1193dfbb1ed92ae07bd1df1207aa6ea4c829c Mon Sep 17 00:00:00 2001 From: Mauro Junior <45118493+jetrotal@users.noreply.github.com> Date: Sun, 1 Oct 2023 15:11:53 -0300 Subject: [PATCH 1/3] New Command - SetGameSpeed To use it, write in Maniacs TPC: `@raw 2049, "", speedIsVar, speed` e.g.: `@raw 2049, "", 0,12` The command must be inserted inside a parallel process, because `Game_Clock::SetGameSpeedFactor(speed);` only changes the speed at current frame. Any refactor (to improve how it's called or to hide the speed counter) is welcome. --- src/game_interpreter.cpp | 8 ++++++++ src/game_interpreter.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/game_interpreter.cpp b/src/game_interpreter.cpp index 0b61a59070..63ce5c949f 100644 --- a/src/game_interpreter.cpp +++ b/src/game_interpreter.cpp @@ -825,6 +825,8 @@ bool Game_Interpreter::ExecuteCommand(lcf::rpg::EventCommand const& com) { return CommandManiacControlStrings(com); case Cmd::Maniac_CallCommand: return CommandManiacCallCommand(com); + case static_cast(2049) : //Cmd::Easy_SetGameSpeed + return CommandSetGameSpeed(com); default: return true; } @@ -4985,6 +4987,12 @@ bool Game_Interpreter::CommandManiacCallCommand(lcf::rpg::EventCommand const&) { return true; } +bool Game_Interpreter::CommandSetGameSpeed(lcf::rpg::EventCommand const& com) { + int32_t speed = ValueOrVariable(com.parameters[0], com.parameters[1]); + Game_Clock::SetGameSpeedFactor(speed); + return true; +} + Game_Interpreter& Game_Interpreter::GetForegroundInterpreter() { return Game_Battle::IsBattleRunning() ? Game_Battle::GetInterpreter() diff --git a/src/game_interpreter.h b/src/game_interpreter.h index a24c51e9dd..32ad9b771b 100644 --- a/src/game_interpreter.h +++ b/src/game_interpreter.h @@ -285,6 +285,7 @@ class Game_Interpreter bool CommandManiacSetGameOption(lcf::rpg::EventCommand const& com); bool CommandManiacControlStrings(lcf::rpg::EventCommand const& com); bool CommandManiacCallCommand(lcf::rpg::EventCommand const& com); + bool CommandSetGameSpeed(lcf::rpg::EventCommand const& com); int DecodeInt(lcf::DBArray::const_iterator& it); const std::string DecodeString(lcf::DBArray::const_iterator& it); From 02c1d375c03cb914c7dc7763dde90ac2f68cd894 Mon Sep 17 00:00:00 2001 From: Mauro Junior <45118493+jetrotal@users.noreply.github.com> Date: Fri, 6 Oct 2023 18:21:31 -0300 Subject: [PATCH 2/3] keep FF speed as a multiplier now speedup command is also influenced by FF buttons. Put a cap of 100 to avoid glitches. --- src/game_interpreter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game_interpreter.cpp b/src/game_interpreter.cpp index 63ce5c949f..0d4a4a9dd2 100644 --- a/src/game_interpreter.cpp +++ b/src/game_interpreter.cpp @@ -4988,7 +4988,8 @@ bool Game_Interpreter::CommandManiacCallCommand(lcf::rpg::EventCommand const&) { } bool Game_Interpreter::CommandSetGameSpeed(lcf::rpg::EventCommand const& com) { - int32_t speed = ValueOrVariable(com.parameters[0], com.parameters[1]); + int32_t speed = ValueOrVariable(com.parameters[0], com.parameters[1]) * Game_Clock::GetGameSpeedFactor(); + if (speed > 100) speed = 100; Game_Clock::SetGameSpeedFactor(speed); return true; } From bf8c96bc92bfb9777986b17ad5ca54ee8dc97e78 Mon Sep 17 00:00:00 2001 From: Mauro Junior <45118493+jetrotal@users.noreply.github.com> Date: Sat, 18 Nov 2023 15:59:00 -0300 Subject: [PATCH 3/3] SetGameSpeed - custom FF display can be set up as hidden or visible + small refactors to cover those new options: - Custom Maximum Speed. --- src/fps_overlay.cpp | 2 +- src/game_clock.cpp | 2 ++ src/game_clock.h | 17 +++++++++++++++++ src/game_interpreter.cpp | 14 +++++++++++++- src/player.cpp | 1 + 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/fps_overlay.cpp b/src/fps_overlay.cpp index 8a99bacb5b..f45c599aad 100644 --- a/src/fps_overlay.cpp +++ b/src/fps_overlay.cpp @@ -85,7 +85,7 @@ void FpsOverlay::Draw(Bitmap& dst) { } // Always drawn when speedup is on independent of FPS - if (last_speed_mod > 1) { + if (!Game_Clock::GetSpeedOverlayMode() && last_speed_mod > 1) { if (speedup_dirty) { std::string text = "> x" + std::to_string(last_speed_mod); diff --git a/src/game_clock.cpp b/src/game_clock.cpp index 99c7dae5b8..15c3c029f9 100644 --- a/src/game_clock.cpp +++ b/src/game_clock.cpp @@ -25,6 +25,8 @@ constexpr bool Game_Clock::is_steady; Game_Clock::Data Game_Clock::data; +int hideDisplay = 0; + // Damping factor fps computation. static constexpr auto _fps_smooth = 2.0f / 121.0f; diff --git a/src/game_clock.h b/src/game_clock.h index c277cf2d9d..a5dbf3e0ce 100644 --- a/src/game_clock.h +++ b/src/game_clock.h @@ -36,6 +36,8 @@ class Game_Clock { using duration = clock::duration; using time_point = clock::time_point; + int hideDisplay; + static constexpr bool is_steady = clock::is_steady; /** Get current time */ @@ -76,6 +78,12 @@ class Game_Clock { /** @return the speed up or slowdown factor we'll use to run the game. */ static float GetGameSpeedFactor(); + /** Set either if Speed Multiplier Overlay is hidden or Visible. */ + static void setSpeedOverlayMode(bool mode); + + /** Check if Speed Multiplier Overlay is hidden or Visible. */ + static int GetSpeedOverlayMode(); + /** Get the time of the current frame */ static time_point GetFrameTime(); @@ -117,6 +125,7 @@ class Game_Clock { float speed = 1.0; float fps = 0.0; int frame = 0; + bool hideSpeedOverlay = 0; }; static Data data; }; @@ -180,4 +189,12 @@ inline float Game_Clock::GetGameSpeedFactor() { return data.speed; } +inline int Game_Clock::GetSpeedOverlayMode() { + return data.hideSpeedOverlay; +} + +inline void Game_Clock::setSpeedOverlayMode(bool s) { + data.hideSpeedOverlay = s; +} + #endif diff --git a/src/game_interpreter.cpp b/src/game_interpreter.cpp index 0d4a4a9dd2..ec20fa4d06 100644 --- a/src/game_interpreter.cpp +++ b/src/game_interpreter.cpp @@ -4988,8 +4988,20 @@ bool Game_Interpreter::CommandManiacCallCommand(lcf::rpg::EventCommand const&) { } bool Game_Interpreter::CommandSetGameSpeed(lcf::rpg::EventCommand const& com) { + // #SetGameSpeed, "",[speedIsVar, speed, speedLimitIsVar,speedLimit, hideSpeedMultiplierIsVar, hideSpeedMultiplier ]; + int32_t speed = ValueOrVariable(com.parameters[0], com.parameters[1]) * Game_Clock::GetGameSpeedFactor(); - if (speed > 100) speed = 100; + int32_t speedLimit = ValueOrVariable(com.parameters[2], com.parameters[3]); + bool hideSpeedMultiplier = ValueOrVariable(com.parameters[4], com.parameters[5]); + + if (speedLimit == 0) speedLimit = 100; + if (speed > speedLimit) speed = speedLimit; + + if (Input::IsSystemPressed(Input::FAST_FORWARD_A) || Input::IsSystemPressed(Input::FAST_FORWARD_B)) + Game_Clock::setSpeedOverlayMode(0); + else + Game_Clock::setSpeedOverlayMode(hideSpeedMultiplier); + Game_Clock::SetGameSpeedFactor(speed); return true; } diff --git a/src/player.cpp b/src/player.cpp index f1e23add71..735dd6f42b 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -310,6 +310,7 @@ void Player::UpdateInput() { if (Input::IsSystemPressed(Input::FAST_FORWARD_B)) { speed = speed_modifier_b; } + Game_Clock::setSpeedOverlayMode(0); Game_Clock::SetGameSpeedFactor(speed); if (Main_Data::game_quit) {