From f4046ec813f2f95c9f7be8daec21b6082163e25f Mon Sep 17 00:00:00 2001 From: githubawn <115191165+githubawn@users.noreply.github.com> Date: Tue, 19 May 2026 22:49:42 +0200 Subject: [PATCH] fix(headless): Prevent setting quit state in headless mode Avoid setting the quit or quitting state in the engine or logic while running in headless mode. This ensures that OS messages (like WM_CLOSE) or game replay quit events do not stick and prematurely abort subsequent replay simulations in the process queue. Also removes the redundant load progress bypass hack in updateLoadProgress. --- Generals/Code/GameEngine/Include/Common/GameEngine.h | 1 - Generals/Code/GameEngine/Source/Common/GameEngine.cpp | 9 +++++++++ .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 5 +++++ GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h | 1 - GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp | 9 +++++++++ .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 5 +++++ 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/GameEngine.h b/Generals/Code/GameEngine/Include/Common/GameEngine.h index 67a45eb5f2e..8243afaaac7 100644 --- a/Generals/Code/GameEngine/Include/Common/GameEngine.h +++ b/Generals/Code/GameEngine/Include/Common/GameEngine.h @@ -104,7 +104,6 @@ class GameEngine : public SubsystemInterface Bool m_isActive; ///< app has OS focus. }; -inline void GameEngine::setQuitting( Bool quitting ) { m_quitting = quitting; } inline Bool GameEngine::getQuitting() { return m_quitting; } // the game engine singleton diff --git a/Generals/Code/GameEngine/Source/Common/GameEngine.cpp b/Generals/Code/GameEngine/Source/Common/GameEngine.cpp index ce2fdf16bac..0fd8d10ffaf 100644 --- a/Generals/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/Generals/Code/GameEngine/Source/Common/GameEngine.cpp @@ -299,6 +299,15 @@ GameEngine::~GameEngine() #endif } +void GameEngine::setQuitting( Bool quitting ) +{ + if (quitting && TheGlobalData && TheGlobalData->m_headless) + { + return; + } + m_quitting = quitting; +} + //------------------------------------------------------------------------------------------------- Bool GameEngine::isTimeFrozen() { diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index be7d76d2894..4ba6fb37fe7 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3712,6 +3712,11 @@ void GameLogic::exitGame() void GameLogic::quit(Bool toDesktop) { + if (TheGlobalData && TheGlobalData->m_headless) + { + return; + } + const Bool isNotLoading = (!isLoadingMap() && !isLoadingSave()); if (isInGame()) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h index 20e7188b3e6..c77385a7d4a 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h @@ -103,7 +103,6 @@ class GameEngine : public SubsystemInterface Bool m_isActive; ///< app has OS focus. }; -inline void GameEngine::setQuitting( Bool quitting ) { m_quitting = quitting; } inline Bool GameEngine::getQuitting() { return m_quitting; } // the game engine singleton diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp index a34487538d8..38d01b9221a 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp @@ -300,6 +300,15 @@ GameEngine::~GameEngine() #endif } +void GameEngine::setQuitting( Bool quitting ) +{ + if (quitting && TheGlobalData && TheGlobalData->m_headless) + { + return; + } + m_quitting = quitting; +} + //------------------------------------------------------------------------------------------------- Bool GameEngine::isTimeFrozen() { diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 622aeb5da10..049a49d8164 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -4272,6 +4272,11 @@ void GameLogic::exitGame() void GameLogic::quit(Bool toDesktop) { + if (TheGlobalData && TheGlobalData->m_headless) + { + return; + } + const Bool isNotLoading = (!isLoadingMap() && !isLoadingSave()); if (isInGame())