From 3b60940a206f29e89bbb42d51524cc0d8d741ff8 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 28 Jun 2026 11:52:37 -0400 Subject: [PATCH 1/5] feat(gui): Add configurable menu transition speed --- Core/GameEngine/Include/Common/OptionPreferences.h | 2 ++ Core/GameEngine/Source/Common/OptionPreferences.cpp | 10 ++++++++++ .../Source/GameClient/GUI/GameWindowTransitions.cpp | 4 +++- GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h | 3 +++ .../Code/GameEngine/Source/Common/GlobalData.cpp | 3 +++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Core/GameEngine/Include/Common/OptionPreferences.h b/Core/GameEngine/Include/Common/OptionPreferences.h index 8448ccd1a14..31d45438355 100644 --- a/Core/GameEngine/Include/Common/OptionPreferences.h +++ b/Core/GameEngine/Include/Common/OptionPreferences.h @@ -129,4 +129,6 @@ class OptionPreferences : public UserPreferences Real getResolutionFontAdjustment(); Bool getShowMoneyPerMinute() const; + + Real getMenuTransitionSpeed(); }; diff --git a/Core/GameEngine/Source/Common/OptionPreferences.cpp b/Core/GameEngine/Source/Common/OptionPreferences.cpp index bab11cb7c76..23efe4568c8 100644 --- a/Core/GameEngine/Source/Common/OptionPreferences.cpp +++ b/Core/GameEngine/Source/Common/OptionPreferences.cpp @@ -884,3 +884,13 @@ Bool OptionPreferences::getShowMoneyPerMinute() const } return FALSE; } + +Real OptionPreferences::getMenuTransitionSpeed() +{ + OptionPreferences::const_iterator it = find("MenuTransitionSpeed"); + if (it == end()) + return 1.0f; + + Real speed = (Real) atof(it->second.str()); + return clamp(0.1f, speed, 10.0f); +} diff --git a/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp b/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp index 0685fc85b9d..fb78bca80fa 100644 --- a/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp +++ b/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp @@ -56,6 +56,7 @@ #include "GameClient/GameWindow.h" #include "GameClient/GameWindowManager.h" #include "Common/FramePacer.h" +#include "Common/GlobalData.h" //----------------------------------------------------------------------------- // DEFINES //////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- @@ -274,7 +275,8 @@ void TransitionGroup::update() // TheSuperHackers @tweak bobtista GUI transition timing is now decoupled from the render update. // Step every integer frame between the old and new accumulator value so discrete-state-machine // transitions cannot skip a state when the render frame rate dips below the base rate. - const Real timeScale = TheFramePacer->getBaseOverUpdateFpsRatio(); + // TheSuperHackers @feature bobtista 28/06/2026 Scale by the user menu transition speed preference. + const Real timeScale = TheFramePacer->getBaseOverUpdateFpsRatio() * TheGlobalData->m_menuTransitionSpeed; const Int prevFrame = (Int)m_currentFrame; m_currentFrame += m_directionMultiplier * timeScale; const Int newFrame = (Int)m_currentFrame; diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h b/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h index 4c5130e1c05..0dc36c0d011 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h @@ -427,6 +427,9 @@ class GlobalData : public SubsystemInterface Bool m_showMoneyPerMinute; Bool m_allowMoneyPerMinuteForPlayer; + // TheSuperHackers @feature bobtista 28/06/2026 user-configurable speed multiplier for menu window transitions + Real m_menuTransitionSpeed; + Real m_shakeSubtleIntensity; ///< Intensity for shaking a camera with SHAKE_SUBTLE Real m_shakeNormalIntensity; ///< Intensity for shaking a camera with SHAKE_NORMAL Real m_shakeStrongIntensity; ///< Intensity for shaking a camera with SHAKE_STRONG diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp index 9900029d48d..e536c97d7f4 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp @@ -963,6 +963,8 @@ GlobalData::GlobalData() m_showMoneyPerMinute = FALSE; m_allowMoneyPerMinuteForPlayer = FALSE; + m_menuTransitionSpeed = 1.0f; + m_debugShowGraphicalFramerate = FALSE; // By default, show all asserts. @@ -1224,6 +1226,7 @@ void GlobalData::parseGameDataDefinition( INI* ini ) TheWritableGlobalData->m_gameTimeFontSize = optionPref.getGameTimeFontSize(); TheWritableGlobalData->m_playerInfoListFontSize = optionPref.getPlayerInfoListFontSize(); TheWritableGlobalData->m_showMoneyPerMinute = optionPref.getShowMoneyPerMinute(); + TheWritableGlobalData->m_menuTransitionSpeed = optionPref.getMenuTransitionSpeed(); TheWritableGlobalData->m_antiAliasLevel = optionPref.getAntiAliasing(); TheWritableGlobalData->m_textureFilteringMode = optionPref.getTextureFilterMode(); From 36d40ea20ac4870d2b8c573d1b910f8d07980417 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 28 Jun 2026 11:53:14 -0400 Subject: [PATCH 2/5] feat(gui): Replicate configurable menu transition speed to Generals --- Generals/Code/GameEngine/Include/Common/GlobalData.h | 3 +++ Generals/Code/GameEngine/Source/Common/GlobalData.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Generals/Code/GameEngine/Include/Common/GlobalData.h b/Generals/Code/GameEngine/Include/Common/GlobalData.h index 67264cbea62..ddfee858527 100644 --- a/Generals/Code/GameEngine/Include/Common/GlobalData.h +++ b/Generals/Code/GameEngine/Include/Common/GlobalData.h @@ -426,6 +426,9 @@ class GlobalData : public SubsystemInterface Bool m_showMoneyPerMinute; Bool m_allowMoneyPerMinuteForPlayer; + // TheSuperHackers @feature bobtista 28/06/2026 user-configurable speed multiplier for menu window transitions + Real m_menuTransitionSpeed; + Real m_shakeSubtleIntensity; ///< Intensity for shaking a camera with SHAKE_SUBTLE Real m_shakeNormalIntensity; ///< Intensity for shaking a camera with SHAKE_NORMAL Real m_shakeStrongIntensity; ///< Intensity for shaking a camera with SHAKE_STRONG diff --git a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp index 3aabf4ca449..8a1a75d0f41 100644 --- a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp @@ -956,6 +956,8 @@ GlobalData::GlobalData() m_showMoneyPerMinute = FALSE; m_allowMoneyPerMinuteForPlayer = FALSE; + m_menuTransitionSpeed = 1.0f; + m_debugShowGraphicalFramerate = FALSE; // By default, show all asserts. @@ -1217,6 +1219,7 @@ void GlobalData::parseGameDataDefinition( INI* ini ) TheWritableGlobalData->m_gameTimeFontSize = optionPref.getGameTimeFontSize(); TheWritableGlobalData->m_playerInfoListFontSize = optionPref.getPlayerInfoListFontSize(); TheWritableGlobalData->m_showMoneyPerMinute = optionPref.getShowMoneyPerMinute(); + TheWritableGlobalData->m_menuTransitionSpeed = optionPref.getMenuTransitionSpeed(); TheWritableGlobalData->m_antiAliasLevel = optionPref.getAntiAliasing(); TheWritableGlobalData->m_textureFilteringMode = optionPref.getTextureFilterMode(); From 454270311ed7b785c00b031d332418134e2ced56 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 28 Jun 2026 12:45:28 -0400 Subject: [PATCH 3/5] style(options): Const-qualify getMenuTransitionSpeed getter --- Core/GameEngine/Include/Common/OptionPreferences.h | 2 +- Core/GameEngine/Source/Common/OptionPreferences.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/GameEngine/Include/Common/OptionPreferences.h b/Core/GameEngine/Include/Common/OptionPreferences.h index 31d45438355..2293a40456f 100644 --- a/Core/GameEngine/Include/Common/OptionPreferences.h +++ b/Core/GameEngine/Include/Common/OptionPreferences.h @@ -130,5 +130,5 @@ class OptionPreferences : public UserPreferences Bool getShowMoneyPerMinute() const; - Real getMenuTransitionSpeed(); + Real getMenuTransitionSpeed() const; }; diff --git a/Core/GameEngine/Source/Common/OptionPreferences.cpp b/Core/GameEngine/Source/Common/OptionPreferences.cpp index 23efe4568c8..3ea3eb696c1 100644 --- a/Core/GameEngine/Source/Common/OptionPreferences.cpp +++ b/Core/GameEngine/Source/Common/OptionPreferences.cpp @@ -885,7 +885,7 @@ Bool OptionPreferences::getShowMoneyPerMinute() const return FALSE; } -Real OptionPreferences::getMenuTransitionSpeed() +Real OptionPreferences::getMenuTransitionSpeed() const { OptionPreferences::const_iterator it = find("MenuTransitionSpeed"); if (it == end()) From fa0954c350ddbcd9749f180513022d4a1a8e5ca1 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 28 Jun 2026 14:39:17 -0400 Subject: [PATCH 4/5] refactor(gui): Rename menu transition speed to game window transition speed and widen range --- Core/GameEngine/Include/Common/OptionPreferences.h | 2 +- Core/GameEngine/Source/Common/OptionPreferences.cpp | 8 +++++--- .../Source/GameClient/GUI/GameWindowTransitions.cpp | 4 ++-- GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h | 4 ++-- GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp | 4 ++-- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Core/GameEngine/Include/Common/OptionPreferences.h b/Core/GameEngine/Include/Common/OptionPreferences.h index 2293a40456f..ae7580cac51 100644 --- a/Core/GameEngine/Include/Common/OptionPreferences.h +++ b/Core/GameEngine/Include/Common/OptionPreferences.h @@ -130,5 +130,5 @@ class OptionPreferences : public UserPreferences Bool getShowMoneyPerMinute() const; - Real getMenuTransitionSpeed() const; + Real getGameWindowTransitionSpeed() const; }; diff --git a/Core/GameEngine/Source/Common/OptionPreferences.cpp b/Core/GameEngine/Source/Common/OptionPreferences.cpp index 3ea3eb696c1..946e780e676 100644 --- a/Core/GameEngine/Source/Common/OptionPreferences.cpp +++ b/Core/GameEngine/Source/Common/OptionPreferences.cpp @@ -885,12 +885,14 @@ Bool OptionPreferences::getShowMoneyPerMinute() const return FALSE; } -Real OptionPreferences::getMenuTransitionSpeed() const +Real OptionPreferences::getGameWindowTransitionSpeed() const { - OptionPreferences::const_iterator it = find("MenuTransitionSpeed"); + OptionPreferences::const_iterator it = find("GameWindowTransitionSpeed"); if (it == end()) return 1.0f; Real speed = (Real) atof(it->second.str()); - return clamp(0.1f, speed, 10.0f); + if (speed <= 0.0f) + return 1.0f; + return min(speed, 1000.0f); } diff --git a/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp b/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp index fb78bca80fa..17ba692b7cf 100644 --- a/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp +++ b/Core/GameEngine/Source/GameClient/GUI/GameWindowTransitions.cpp @@ -275,8 +275,8 @@ void TransitionGroup::update() // TheSuperHackers @tweak bobtista GUI transition timing is now decoupled from the render update. // Step every integer frame between the old and new accumulator value so discrete-state-machine // transitions cannot skip a state when the render frame rate dips below the base rate. - // TheSuperHackers @feature bobtista 28/06/2026 Scale by the user menu transition speed preference. - const Real timeScale = TheFramePacer->getBaseOverUpdateFpsRatio() * TheGlobalData->m_menuTransitionSpeed; + // TheSuperHackers @feature bobtista 28/06/2026 Scale by the user game window transition speed preference. + const Real timeScale = TheFramePacer->getBaseOverUpdateFpsRatio() * TheGlobalData->m_gameWindowTransitionSpeed; const Int prevFrame = (Int)m_currentFrame; m_currentFrame += m_directionMultiplier * timeScale; const Int newFrame = (Int)m_currentFrame; diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h b/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h index 0dc36c0d011..ea33391acc4 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h @@ -427,8 +427,8 @@ class GlobalData : public SubsystemInterface Bool m_showMoneyPerMinute; Bool m_allowMoneyPerMinuteForPlayer; - // TheSuperHackers @feature bobtista 28/06/2026 user-configurable speed multiplier for menu window transitions - Real m_menuTransitionSpeed; + // TheSuperHackers @feature bobtista 28/06/2026 user-configurable speed multiplier for game window transitions + Real m_gameWindowTransitionSpeed; Real m_shakeSubtleIntensity; ///< Intensity for shaking a camera with SHAKE_SUBTLE Real m_shakeNormalIntensity; ///< Intensity for shaking a camera with SHAKE_NORMAL diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp index e536c97d7f4..4cdf056cc59 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GlobalData.cpp @@ -963,7 +963,7 @@ GlobalData::GlobalData() m_showMoneyPerMinute = FALSE; m_allowMoneyPerMinuteForPlayer = FALSE; - m_menuTransitionSpeed = 1.0f; + m_gameWindowTransitionSpeed = 1.0f; m_debugShowGraphicalFramerate = FALSE; @@ -1226,7 +1226,7 @@ void GlobalData::parseGameDataDefinition( INI* ini ) TheWritableGlobalData->m_gameTimeFontSize = optionPref.getGameTimeFontSize(); TheWritableGlobalData->m_playerInfoListFontSize = optionPref.getPlayerInfoListFontSize(); TheWritableGlobalData->m_showMoneyPerMinute = optionPref.getShowMoneyPerMinute(); - TheWritableGlobalData->m_menuTransitionSpeed = optionPref.getMenuTransitionSpeed(); + TheWritableGlobalData->m_gameWindowTransitionSpeed = optionPref.getGameWindowTransitionSpeed(); TheWritableGlobalData->m_antiAliasLevel = optionPref.getAntiAliasing(); TheWritableGlobalData->m_textureFilteringMode = optionPref.getTextureFilterMode(); From 418d50cb141a3de7cb1b1c9872bb6206635cebde Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 28 Jun 2026 14:39:17 -0400 Subject: [PATCH 5/5] refactor(gui): Replicate game window transition speed rename to Generals --- Generals/Code/GameEngine/Include/Common/GlobalData.h | 4 ++-- Generals/Code/GameEngine/Source/Common/GlobalData.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/GlobalData.h b/Generals/Code/GameEngine/Include/Common/GlobalData.h index ddfee858527..4f5b5cde1cc 100644 --- a/Generals/Code/GameEngine/Include/Common/GlobalData.h +++ b/Generals/Code/GameEngine/Include/Common/GlobalData.h @@ -426,8 +426,8 @@ class GlobalData : public SubsystemInterface Bool m_showMoneyPerMinute; Bool m_allowMoneyPerMinuteForPlayer; - // TheSuperHackers @feature bobtista 28/06/2026 user-configurable speed multiplier for menu window transitions - Real m_menuTransitionSpeed; + // TheSuperHackers @feature bobtista 28/06/2026 user-configurable speed multiplier for game window transitions + Real m_gameWindowTransitionSpeed; Real m_shakeSubtleIntensity; ///< Intensity for shaking a camera with SHAKE_SUBTLE Real m_shakeNormalIntensity; ///< Intensity for shaking a camera with SHAKE_NORMAL diff --git a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp index 8a1a75d0f41..cbefc7cb07c 100644 --- a/Generals/Code/GameEngine/Source/Common/GlobalData.cpp +++ b/Generals/Code/GameEngine/Source/Common/GlobalData.cpp @@ -956,7 +956,7 @@ GlobalData::GlobalData() m_showMoneyPerMinute = FALSE; m_allowMoneyPerMinuteForPlayer = FALSE; - m_menuTransitionSpeed = 1.0f; + m_gameWindowTransitionSpeed = 1.0f; m_debugShowGraphicalFramerate = FALSE; @@ -1219,7 +1219,7 @@ void GlobalData::parseGameDataDefinition( INI* ini ) TheWritableGlobalData->m_gameTimeFontSize = optionPref.getGameTimeFontSize(); TheWritableGlobalData->m_playerInfoListFontSize = optionPref.getPlayerInfoListFontSize(); TheWritableGlobalData->m_showMoneyPerMinute = optionPref.getShowMoneyPerMinute(); - TheWritableGlobalData->m_menuTransitionSpeed = optionPref.getMenuTransitionSpeed(); + TheWritableGlobalData->m_gameWindowTransitionSpeed = optionPref.getGameWindowTransitionSpeed(); TheWritableGlobalData->m_antiAliasLevel = optionPref.getAntiAliasing(); TheWritableGlobalData->m_textureFilteringMode = optionPref.getTextureFilterMode();