From c7643ca8f122668092ff6af3b50aab32562a057a 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 03b6cfda0f..b23df8a52c 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -495,6 +495,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 a6001e2206..d6fcde4f51 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -512,6 +512,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 60b6b587d151ded73f366d27d1830d8310d30d8c 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 --- .../Source/GameLogic/System/GameLogic.cpp | 20 ++++++------------- .../Source/GameLogic/System/GameLogic.cpp | 20 ++++++------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index b23df8a52c..643f978872 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -401,14 +401,11 @@ void GameLogic::init( void ) //ThePlayerList->setLocalPlayer(0); m_CRC = 0; - 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; for(Int i = 0; i < MAX_SLOTS; ++i) { @@ -444,14 +441,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(); @@ -495,8 +489,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 d6fcde4f51..3ae96ea9ae 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -416,14 +416,11 @@ void GameLogic::init( void ) //ThePlayerList->setLocalPlayer(0); m_CRC = 0; - 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; for(Int i = 0; i < MAX_SLOTS; ++i) { @@ -457,14 +454,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(); @@ -512,8 +506,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 6dfcb897a69b281f1feec07a6f6acf6c2ad8b2b7 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 | 20 +++++++++---------- .../GameEngine/Include/GameLogic/GameLogic.h | 6 +++--- .../Source/GameLogic/System/GameLogic.cpp | 20 +++++++++---------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h index 0993841d0a..4611fc1883 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 643f978872..f99308ac16 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -404,7 +404,7 @@ void GameLogic::init( void ) m_logicTimeScaleEnabledMemory = FALSE; m_inputEnabledMemory = TRUE; m_mouseVisibleMemory = TRUE; - setGamePaused(FALSE); + setGamePaused(FALSE, FALSE, FALSE, FALSE); m_pauseFrame = 0; for(Int i = 0; i < MAX_SLOTS; ++i) @@ -444,7 +444,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(); @@ -3649,7 +3649,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(); @@ -3727,7 +3727,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) @@ -3743,8 +3743,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(); @@ -3765,7 +3765,7 @@ void GameLogic::pauseGameLogic(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameSound(Bool paused) +void GameLogic::pauseGameSound(Bool paused, Bool allowResumeAudio) { if(m_pauseSound == paused) return; @@ -3784,7 +3784,7 @@ void GameLogic::pauseGameSound(Bool paused) drawable = drawable->getNextDrawable(); } } - else + else if (allowResumeAudio) { TheAudio->resumeAudio((AudioAffect)(AudioAffect_All & ~AudioAffect_Music)); @@ -3800,7 +3800,7 @@ void GameLogic::pauseGameSound(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameMusic(Bool paused) +void GameLogic::pauseGameMusic(Bool paused, Bool allowResumeAudio) { if(m_pauseMusic == paused) return; @@ -3811,7 +3811,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 420142129b..aec82bc07a 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 3ae96ea9ae..9734af70fb 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -419,7 +419,7 @@ void GameLogic::init( void ) m_logicTimeScaleEnabledMemory = FALSE; m_inputEnabledMemory = TRUE; m_mouseVisibleMemory = TRUE; - setGamePaused(FALSE); + setGamePaused(FALSE, FALSE, FALSE, FALSE); m_pauseFrame = 0; for(Int i = 0; i < MAX_SLOTS; ++i) @@ -457,7 +457,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(); @@ -4201,7 +4201,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(); @@ -4279,7 +4279,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) @@ -4295,8 +4295,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(); @@ -4317,7 +4317,7 @@ void GameLogic::pauseGameLogic(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameSound(Bool paused) +void GameLogic::pauseGameSound(Bool paused, Bool allowResumeAudio) { if(m_pauseSound == paused) return; @@ -4342,7 +4342,7 @@ void GameLogic::pauseGameSound(Bool paused) } #endif } - else + else if (allowResumeAudio) { TheAudio->resumeAudio((AudioAffect)(AudioAffect_All & ~AudioAffect_Music)); @@ -4360,7 +4360,7 @@ void GameLogic::pauseGameSound(Bool paused) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void GameLogic::pauseGameMusic(Bool paused) +void GameLogic::pauseGameMusic(Bool paused, Bool allowResumeAudio) { if(m_pauseMusic == paused) return; @@ -4371,7 +4371,7 @@ void GameLogic::pauseGameMusic(Bool paused) { TheAudio->pauseAudio(AudioAffect_Music); } - else + else if (allowResumeAudio) { TheAudio->resumeAudio(AudioAffect_Music); } From 7f91a78a0bee23ea10bac51f21377f8743f841a7 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 f99308ac16..443dab9dd3 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3649,7 +3649,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 9734af70fb..f75ad428b2 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -4201,7 +4201,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();