From 43ee63d8bf99cebf5e09e92408329e56c5df0d08 Mon Sep 17 00:00:00 2001 From: flash-computer Date: Fri, 15 May 2026 15:40:29 +0100 Subject: [PATCH] - Added a "Turbo Speed" setting to manage the target speed of the game. - Percentage fields in the settings now automatically snap to the defined step value. --- include/dusk/settings.h | 1 + libs/JSystem/src/JFramework/JFWDisplay.cpp | 2 +- src/dusk/game_clock.cpp | 6 +----- src/dusk/settings.cpp | 2 ++ src/dusk/ui/settings.cpp | 10 +++++++--- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 43e565ed5e..3df4fbbbeb 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -179,6 +179,7 @@ struct UserSettings { // Controls ConfigVar enableTurboKeybind; + ConfigVar turboSpeed; ConfigVar enableResetKeybind; // Tools diff --git a/libs/JSystem/src/JFramework/JFWDisplay.cpp b/libs/JSystem/src/JFramework/JFWDisplay.cpp index b8054e2130..470547ff7b 100644 --- a/libs/JSystem/src/JFramework/JFWDisplay.cpp +++ b/libs/JSystem/src/JFramework/JFWDisplay.cpp @@ -384,7 +384,7 @@ static void waitForTick(u32 p1, u16 p2) { return; } if (dusk::getTransientSettings().skipFrameRateLimit) { - p1 = OS_TIMER_CLOCK / 120; + p1 = (int)((OS_TIMER_CLOCK / 30) / dusk::getSettings().game.turboSpeed); } #if TARGET_PC diff --git a/src/dusk/game_clock.cpp b/src/dusk/game_clock.cpp index 8b887f610c..1736cd094e 100644 --- a/src/dusk/game_clock.cpp +++ b/src/dusk/game_clock.cpp @@ -63,12 +63,8 @@ MainLoopPacer advance_main_loop() { } int sim_ticks_to_run = 0; - clock::time_point projected_snapshot_time = s_current_snapshot_time; const clock::time_point render_time = now - kSimPeriodDuration; - while (sim_ticks_to_run < kMaxSimTicksPerFrame && projected_snapshot_time < render_time) { - projected_snapshot_time += kSimPeriodDuration; - sim_ticks_to_run++; - } + sim_ticks_to_run = std::min(kMaxSimTicksPerFrame, (int)std::floor(std::chrono::duration(render_time - s_current_snapshot_time)/kSimPeriodDuration)); out.sim_ticks_to_run = sim_ticks_to_run; return out; } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index dbe27db8aa..867d28b589 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -114,6 +114,7 @@ UserSettings g_userSettings = { // Controls .enableTurboKeybind {"game.enableTurboKeybind", false}, + .turboSpeed {"game.turboSpeed", 4.0f}, .enableResetKeybind {"game.enableResetKeybind", false}, // Tools @@ -235,6 +236,7 @@ void registerSettings() { Register(g_userSettings.game.noLowHpSound); Register(g_userSettings.game.midnasLamentNonStop); Register(g_userSettings.game.enableTurboKeybind); + Register(g_userSettings.game.turboSpeed); Register(g_userSettings.game.enableResetKeybind); Register(g_userSettings.game.speedrunMode); Register(g_userSettings.game.liveSplitEnabled); diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 34b7496df0..5d2cb644c1 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -422,8 +422,9 @@ SelectButton& config_percent_select(Pane& leftPane, Pane& rightPane, ConfigVar= (step+1)>>1)? step : 0)) : over, 0, max - min)) / 100.0f); config::Save(); }, .isDisabled = std::move(isDisabled), @@ -932,8 +933,11 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { leftPane.add_section("Tools"); addOption("Turbo Key", getSettings().game.enableTurboKeybind, - "Hold Tab to increase game speed by up to 4x.", + "Hold Tab to adjust game speed up to the selected factor.", [] { return getSettings().game.speedrunMode; }); + config_percent_select(leftPane, rightPane, getSettings().game.turboSpeed, + "Turbo Speed", "Adjusts the target speed of the game.", 10, 2000, 5, + [] { return (!getSettings().game.enableTurboKeybind || getSettings().game.speedrunMode); }); addOption("Reset Key (" + Rml::String{hotkeys::DO_RESET} + ")", getSettings().game.enableResetKeybind, "Press " + Rml::String{hotkeys::DO_RESET} + " to reset the game.");