From 312834bffe14022b337593cdf534b6211079bfed Mon Sep 17 00:00:00 2001 From: stm <14291421+stephanmeesters@users.noreply.github.com> Date: Tue, 16 Dec 2025 18:13:17 +0100 Subject: [PATCH 1/4] bugfix: Camera edge scroll broken after loading a savegame from ingame menu --- Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 2 ++ .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 1b2fa9b864..715241ac98 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -451,6 +451,8 @@ void GameLogic::reset( void ) TheWaterTransparency = (WaterTransparencySetting*) wt->deleteOverrides(); m_rankPointsToAddAtGameStart = 0; + + TheMouse->onGamePaused(FALSE); } static Object * placeObjectAtPosition(Int slotNum, AsciiString objectTemplateName, Coord3D& pos, Player *pPlayer, diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 67a23d92c0..9b4f252cc2 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -467,6 +467,8 @@ void GameLogic::reset( void ) TheWeatherSetting = (WeatherSetting*) ws->deleteOverrides(); m_rankPointsToAddAtGameStart = 0; + + TheMouse->onGamePaused(FALSE); } static Object * placeObjectAtPosition(Int slotNum, AsciiString objectTemplateName, Coord3D& pos, Player *pPlayer, From 53bf9c2b86ae6fb53bc67b2642700bd969437152 Mon Sep 17 00:00:00 2001 From: stm <14291421+stephanmeesters@users.noreply.github.com> Date: Wed, 17 Dec 2025 21:28:16 +0100 Subject: [PATCH 2/4] refactor: Use setGamePaused in reset and init --- .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 11 +++-------- .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 11 +++-------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 715241ac98..4609e7d5c2 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -387,14 +387,11 @@ void GameLogic::reset( void ) m_objHash.reserve(OBJ_HASH_SIZE); #endif - m_pauseFrame = 0; - m_gamePaused = FALSE; - m_pauseSound = FALSE; - m_pauseMusic = FALSE; - m_pauseInput = FALSE; + m_logicTimeScaleEnabledMemory = FALSE; m_inputEnabledMemory = TRUE; m_mouseVisibleMemory = TRUE; - m_logicTimeScaleEnabledMemory = FALSE; + setGamePaused(FALSE); + m_pauseFrame = 0; setFPMode(); @@ -451,8 +448,6 @@ void GameLogic::reset( void ) TheWaterTransparency = (WaterTransparencySetting*) wt->deleteOverrides(); m_rankPointsToAddAtGameStart = 0; - - TheMouse->onGamePaused(FALSE); } static Object * placeObjectAtPosition(Int slotNum, AsciiString objectTemplateName, Coord3D& pos, Player *pPlayer, diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 9b4f252cc2..04cb80cddf 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -399,14 +399,11 @@ void GameLogic::reset( void ) m_objVector.clear(); m_objVector.resize(OBJ_HASH_SIZE, NULL); - m_pauseFrame = 0; - m_gamePaused = FALSE; - m_pauseSound = FALSE; - m_pauseMusic = FALSE; - m_pauseInput = FALSE; + m_logicTimeScaleEnabledMemory = FALSE; m_inputEnabledMemory = TRUE; m_mouseVisibleMemory = TRUE; - m_logicTimeScaleEnabledMemory = FALSE; + setGamePaused(FALSE); + m_pauseFrame = 0; setFPMode(); @@ -467,8 +464,6 @@ void GameLogic::reset( void ) TheWeatherSetting = (WeatherSetting*) ws->deleteOverrides(); m_rankPointsToAddAtGameStart = 0; - - TheMouse->onGamePaused(FALSE); } static Object * placeObjectAtPosition(Int slotNum, AsciiString objectTemplateName, Coord3D& pos, Player *pPlayer, From 571ba19b482ff47d0429b195ffd1c86b5f60693a Mon Sep 17 00:00:00 2001 From: stm <14291421+stephanmeesters@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:33:40 +0100 Subject: [PATCH 3/4] bugfix: Prevent setGamePaused from resuming audio in init() and reset() --- .../GameEngine/Include/GameLogic/GameLogic.h | 6 +++--- .../Source/GameLogic/System/GameLogic.cpp | 18 +++++++++--------- .../GameEngine/Include/GameLogic/GameLogic.h | 6 +++--- .../Source/GameLogic/System/GameLogic.cpp | 18 +++++++++--------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h index 5a138b5c19..4ab0dbb42d 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h +++ b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h @@ -206,7 +206,7 @@ class GameLogic : public SubsystemInterface, public Snapshot void setGamePausedInFrame( UnsignedInt frame, Bool disableLogicTimeScale ); UnsignedInt getGamePauseFrame() const { return m_pauseFrame; } - void setGamePaused( Bool paused, Bool pauseMusic = TRUE, Bool pauseInput = TRUE ); + void setGamePaused( Bool paused, Bool pauseMusic = TRUE, Bool pauseInput = TRUE, Bool allowResumeAudio = TRUE ); Bool isGamePaused( void ); Bool getInputEnabledMemory( void ) const { return m_inputEnabledMemory; } @@ -255,8 +255,8 @@ class GameLogic : public SubsystemInterface, public Snapshot void updateDisplayBusyState(); void pauseGameLogic(Bool paused); - void pauseGameSound(Bool paused); - void pauseGameMusic(Bool paused); + void pauseGameSound(Bool paused, Bool allowResumeAudio); + void pauseGameMusic(Bool paused, Bool allowResumeAudio); void pauseGameInput(Bool paused); void pushSleepyUpdate(UpdateModulePtr u); diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 4609e7d5c2..9667561d83 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -390,7 +390,7 @@ void GameLogic::reset( void ) m_logicTimeScaleEnabledMemory = FALSE; m_inputEnabledMemory = TRUE; m_mouseVisibleMemory = TRUE; - setGamePaused(FALSE); + setGamePaused(FALSE, FALSE, FALSE, FALSE); m_pauseFrame = 0; setFPMode(); @@ -3609,7 +3609,7 @@ UnsignedInt GameLogic::getCRC( Int mode, AsciiString deepCRCFileName ) void GameLogic::exitGame() { // TheSuperHackers @fix The logic update must not be halted to process the game exit message. - setGamePaused(FALSE); + setGamePaused(FALSE, TRUE, TRUE, FALSE); TheScriptEngine->forceUnfreezeTime(); TheScriptEngine->doUnfreezeTime(); @@ -3687,7 +3687,7 @@ void GameLogic::setGamePausedInFrame( UnsignedInt frame, Bool disableLogicTimeSc // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::setGamePaused( Bool paused, Bool pauseMusic, Bool pauseInput ) +void GameLogic::setGamePaused( Bool paused, Bool pauseMusic, Bool pauseInput, Bool allowResumeAudio ) { // We need to ignore an unpause called when we are unpaused or else: // Mouse is hidden for some reason (script or something) @@ -3703,8 +3703,8 @@ void GameLogic::setGamePaused( Bool paused, Bool pauseMusic, Bool pauseInput ) // Set mouse the way it "was" <--- Was counting on right answer being set in Pause. pauseGameLogic(paused); - pauseGameSound(paused); - pauseGameMusic(paused && pauseMusic); + pauseGameSound(paused, allowResumeAudio); + pauseGameMusic(paused && pauseMusic, allowResumeAudio); pauseGameInput(paused && pauseInput); updateDisplayBusyState(); @@ -3725,7 +3725,7 @@ void GameLogic::pauseGameLogic(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameSound(Bool paused) +void GameLogic::pauseGameSound(Bool paused, Bool allowResumeAudio) { if(m_pauseSound == paused) return; @@ -3744,7 +3744,7 @@ void GameLogic::pauseGameSound(Bool paused) drawable = drawable->getNextDrawable(); } } - else + else if (allowResumeAudio) { TheAudio->resumeAudio((AudioAffect)(AudioAffect_All & ~AudioAffect_Music)); @@ -3760,7 +3760,7 @@ void GameLogic::pauseGameSound(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameMusic(Bool paused) +void GameLogic::pauseGameMusic(Bool paused, Bool allowResumeAudio) { if(m_pauseMusic == paused) return; @@ -3771,7 +3771,7 @@ void GameLogic::pauseGameMusic(Bool paused) { TheAudio->pauseAudio(AudioAffect_Music); } - else + else if (allowResumeAudio) { TheAudio->resumeAudio(AudioAffect_Music); } diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h index c4f7e13073..64bf800d3f 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h @@ -221,7 +221,7 @@ class GameLogic : public SubsystemInterface, public Snapshot void setGamePausedInFrame( UnsignedInt frame, Bool disableLogicTimeScale ); UnsignedInt getGamePauseFrame() const { return m_pauseFrame; } - void setGamePaused( Bool paused, Bool pauseMusic = TRUE, Bool pauseInput = TRUE ); + void setGamePaused( Bool paused, Bool pauseMusic = TRUE, Bool pauseInput = TRUE, Bool allowResumeAudio = TRUE); Bool isGamePaused( void ); Bool getInputEnabledMemory( void ) const { return m_inputEnabledMemory; } @@ -273,8 +273,8 @@ class GameLogic : public SubsystemInterface, public Snapshot void updateDisplayBusyState(); void pauseGameLogic(Bool paused); - void pauseGameSound(Bool paused); - void pauseGameMusic(Bool paused); + void pauseGameSound(Bool paused, Bool allowResumeAudio); + void pauseGameMusic(Bool paused, Bool allowResumeAudio); void pauseGameInput(Bool paused); void pushSleepyUpdate(UpdateModulePtr u); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 04cb80cddf..289b3a720e 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -402,7 +402,7 @@ void GameLogic::reset( void ) m_logicTimeScaleEnabledMemory = FALSE; m_inputEnabledMemory = TRUE; m_mouseVisibleMemory = TRUE; - setGamePaused(FALSE); + setGamePaused(FALSE, FALSE, FALSE, FALSE); m_pauseFrame = 0; setFPMode(); @@ -4160,7 +4160,7 @@ UnsignedInt GameLogic::getCRC( Int mode, AsciiString deepCRCFileName ) void GameLogic::exitGame() { // TheSuperHackers @fix The logic update must not be halted to process the game exit message. - setGamePaused(FALSE); + setGamePaused(FALSE, TRUE, TRUE, FALSE); TheScriptEngine->forceUnfreezeTime(); TheScriptEngine->doUnfreezeTime(); @@ -4238,7 +4238,7 @@ void GameLogic::setGamePausedInFrame( UnsignedInt frame, Bool disableLogicTimeSc // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::setGamePaused( Bool paused, Bool pauseMusic, Bool pauseInput ) +void GameLogic::setGamePaused( Bool paused, Bool pauseMusic, Bool pauseInput, Bool allowResumeAudio) { // We need to ignore an unpause called when we are unpaused or else: // Mouse is hidden for some reason (script or something) @@ -4254,8 +4254,8 @@ void GameLogic::setGamePaused( Bool paused, Bool pauseMusic, Bool pauseInput ) // Set mouse the way it "was" <--- Was counting on right answer being set in Pause. pauseGameLogic(paused); - pauseGameSound(paused); - pauseGameMusic(paused && pauseMusic); + pauseGameSound(paused, allowResumeAudio); + pauseGameMusic(paused && pauseMusic, allowResumeAudio); pauseGameInput(paused && pauseInput); updateDisplayBusyState(); @@ -4276,7 +4276,7 @@ void GameLogic::pauseGameLogic(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameSound(Bool paused) +void GameLogic::pauseGameSound(Bool paused, Bool allowResumeAudio) { if(m_pauseSound == paused) return; @@ -4301,7 +4301,7 @@ void GameLogic::pauseGameSound(Bool paused) } #endif } - else + else if (allowResumeAudio) { TheAudio->resumeAudio((AudioAffect)(AudioAffect_All & ~AudioAffect_Music)); @@ -4319,7 +4319,7 @@ void GameLogic::pauseGameSound(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameMusic(Bool paused) +void GameLogic::pauseGameMusic(Bool paused, Bool allowResumeAudio) { if(m_pauseMusic == paused) return; @@ -4330,7 +4330,7 @@ void GameLogic::pauseGameMusic(Bool paused) { TheAudio->pauseAudio(AudioAffect_Music); } - else + else if (allowResumeAudio) { TheAudio->resumeAudio(AudioAffect_Music); } From 3a4c348eee33870422c287db25499c1af0a5b24b Mon Sep 17 00:00:00 2001 From: stm <14291421+stephanmeesters@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:54:07 +0100 Subject: [PATCH 4/4] bugfix: Correct accidental change --- Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 2 +- .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 9667561d83..f0889db784 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3609,7 +3609,7 @@ UnsignedInt GameLogic::getCRC( Int mode, AsciiString deepCRCFileName ) void GameLogic::exitGame() { // TheSuperHackers @fix The logic update must not be halted to process the game exit message. - setGamePaused(FALSE, TRUE, TRUE, FALSE); + setGamePaused(FALSE); TheScriptEngine->forceUnfreezeTime(); TheScriptEngine->doUnfreezeTime(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 289b3a720e..03cc9f6d59 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -4160,7 +4160,7 @@ UnsignedInt GameLogic::getCRC( Int mode, AsciiString deepCRCFileName ) void GameLogic::exitGame() { // TheSuperHackers @fix The logic update must not be halted to process the game exit message. - setGamePaused(FALSE, TRUE, TRUE, FALSE); + setGamePaused(FALSE); TheScriptEngine->forceUnfreezeTime(); TheScriptEngine->doUnfreezeTime();