From 9506b608316d5ee22f2ced467c65cc2b6c370122 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 2 Feb 2026 13:36:15 -0600 Subject: [PATCH 01/10] feature(headless): Add GhostObjectManagerDummy for headless mode --- .../GameEngine/Include/GameLogic/GhostObject.h | 14 ++++++++++++++ .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h index 907596e94bf..a0805f2e4b7 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h @@ -108,5 +108,19 @@ inline Bool GhostObjectManager::trackAllPlayers() const #endif } +// TheSuperHackers @feature bobtista 19/01/2026 +// GhostObjectManager that does nothing for headless mode. +// Note: Does NOT override crc/xfer/loadPostProcess to maintain save compatibility. +class GhostObjectManagerDummy : public GhostObjectManager +{ +public: + virtual void reset(void) {} + virtual GhostObject *addGhostObject(Object *object, PartitionData *pd) { return nullptr; } + virtual void removeGhostObject(GhostObject *mod) {} + virtual void updateOrphanedObjects(int *playerIndexList, int playerIndexCount) {} + virtual void releasePartitionData(void) {} + virtual void restorePartitionData(void) {} +}; + // the singleton extern GhostObjectManager *TheGhostObjectManager; diff --git a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 74a736a46cf..851bdbe7fde 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -36,6 +36,7 @@ // SYSTEM INCLUDES //////////////////////////////////////////////////////////// // USER INCLUDES ////////////////////////////////////////////////////////////// +#include "Common/GlobalData.h" #include "GameLogic/GameLogic.h" #include "W3DDevice/GameLogic/W3DTerrainLogic.h" #include "W3DDevice/GameLogic/W3DGhostObject.h" @@ -59,6 +60,7 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; - virtual GhostObjectManager *createGhostObjectManager() { return NEW W3DGhostObjectManager; } + // TheSuperHackers @feature bobtista 19/01/2026 Use dummy for headless mode + virtual GhostObjectManager *createGhostObjectManager() { return TheGlobalData->m_headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } }; From 05b40ee1a65705eaee3bd3e84fcaa3b76b41842b Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 2 Feb 2026 13:37:04 -0600 Subject: [PATCH 02/10] feature(headless): Replicate GhostObjectManagerDummy to Generals --- .../GameEngine/Include/GameLogic/GhostObject.h | 14 ++++++++++++++ .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h b/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h index 6c63ee2f769..a2bc935449d 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h +++ b/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h @@ -108,5 +108,19 @@ inline Bool GhostObjectManager::trackAllPlayers() const #endif } +// TheSuperHackers @feature bobtista 19/01/2026 +// GhostObjectManager that does nothing for headless mode. +// Note: Does NOT override crc/xfer/loadPostProcess to maintain save compatibility. +class GhostObjectManagerDummy : public GhostObjectManager +{ +public: + virtual void reset(void) {} + virtual GhostObject *addGhostObject(Object *object, PartitionData *pd) { return nullptr; } + virtual void removeGhostObject(GhostObject *mod) {} + virtual void updateOrphanedObjects(int *playerIndexList, int playerIndexCount) {} + virtual void releasePartitionData(void) {} + virtual void restorePartitionData(void) {} +}; + // the singleton extern GhostObjectManager *TheGhostObjectManager; diff --git a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index a48ecfb93ab..191c01e97d7 100644 --- a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -36,6 +36,7 @@ // SYSTEM INCLUDES //////////////////////////////////////////////////////////// // USER INCLUDES ////////////////////////////////////////////////////////////// +#include "Common/GlobalData.h" #include "GameLogic/GameLogic.h" #include "W3DDevice/GameLogic/W3DTerrainLogic.h" #include "W3DDevice/GameLogic/W3DGhostObject.h" @@ -59,6 +60,7 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; - virtual GhostObjectManager *createGhostObjectManager() { return NEW W3DGhostObjectManager; } + // TheSuperHackers @feature bobtista 19/01/2026 Use dummy for headless mode + virtual GhostObjectManager *createGhostObjectManager() { return TheGlobalData->m_headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } }; From 5f90c554eef4d2dbcf6f2887202844057caf412f Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 2 Feb 2026 17:04:37 -0600 Subject: [PATCH 03/10] refactor(headless): Remove redundant 3DScene null check now handled by dummy --- .../Source/W3DDevice/GameLogic/W3DGhostObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp index d2be8e5fb1d..ea4276098b0 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp @@ -157,7 +157,7 @@ void W3DRenderObjectSnapshot::update(RenderObjClass *robj, DrawableInfo *drawInf // ------------------------------------------------------------------------------------------------ Bool W3DRenderObjectSnapshot::addToScene() { - if (W3DDisplay::m_3DScene != nullptr && !m_robj->Is_In_Scene()) + if (!m_robj->Is_In_Scene()) { W3DDisplay::m_3DScene->Add_Render_Object(m_robj); return true; From f02b950450b0c501f547196df591c44fb5ac04b5 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Mon, 2 Feb 2026 17:04:44 -0600 Subject: [PATCH 04/10] refactor(headless): Replicate 3DScene null check removal to Generals --- .../Source/W3DDevice/GameLogic/W3DGhostObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp index 9ba4bd16acb..dd139056adb 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameLogic/W3DGhostObject.cpp @@ -153,7 +153,7 @@ void W3DRenderObjectSnapshot::update(RenderObjClass *robj, DrawableInfo *drawInf // ------------------------------------------------------------------------------------------------ Bool W3DRenderObjectSnapshot::addToScene() { - if (W3DDisplay::m_3DScene != nullptr && !m_robj->Is_In_Scene()) + if (!m_robj->Is_In_Scene()) { W3DDisplay::m_3DScene->Add_Render_Object(m_robj); return true; From 92c86ea51f025ee817fde6fdf623b70576075e85 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 11 Mar 2026 17:40:58 -0600 Subject: [PATCH 05/10] bugfix(headless): Add override, remove void params, pass headless as bool arg in GeneralsMD GhostObjectManagerDummy --- .../Code/GameEngine/Include/GameLogic/GameLogic.h | 2 +- .../Code/GameEngine/Include/GameLogic/GhostObject.h | 12 ++++++------ .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 4 ++-- .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 3 +-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h index 160d1dbd4cf..a53c4a6a8ed 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h @@ -359,7 +359,7 @@ class GameLogic : public SubsystemInterface, public Snapshot /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic(); - virtual GhostObjectManager *createGhostObjectManager(); + virtual GhostObjectManager *createGhostObjectManager(bool headless = false); GameMode m_gameMode; Int m_rankLevelLimit; diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h index a0805f2e4b7..e320c50cbd7 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/GhostObject.h @@ -114,12 +114,12 @@ inline Bool GhostObjectManager::trackAllPlayers() const class GhostObjectManagerDummy : public GhostObjectManager { public: - virtual void reset(void) {} - virtual GhostObject *addGhostObject(Object *object, PartitionData *pd) { return nullptr; } - virtual void removeGhostObject(GhostObject *mod) {} - virtual void updateOrphanedObjects(int *playerIndexList, int playerIndexCount) {} - virtual void releasePartitionData(void) {} - virtual void restorePartitionData(void) {} + virtual void reset() override {} + virtual GhostObject *addGhostObject(Object *object, PartitionData *pd) override { return nullptr; } + virtual void removeGhostObject(GhostObject *mod) override {} + virtual void updateOrphanedObjects(int *playerIndexList, int playerIndexCount) override {} + virtual void releasePartitionData() override {} + virtual void restorePartitionData() override {} }; // the singleton diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 4d0bb085dc4..fe7de50da3a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -364,7 +364,7 @@ void GameLogic::init() // Create system for holding deleted objects that are // still in the partition manager because player has a fogged // view of them. - TheGhostObjectManager = createGhostObjectManager(); + TheGhostObjectManager = createGhostObjectManager(TheGlobalData->m_headless); // create the terrain logic TheTerrainLogic = createTerrainLogic(); @@ -4492,7 +4492,7 @@ UnsignedInt GameLogic::getObjectCount() // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -GhostObjectManager *GameLogic::createGhostObjectManager() +GhostObjectManager *GameLogic::createGhostObjectManager(bool) { return NEW GhostObjectManager; } diff --git a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 851bdbe7fde..7ca53a273e4 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -36,7 +36,6 @@ // SYSTEM INCLUDES //////////////////////////////////////////////////////////// // USER INCLUDES ////////////////////////////////////////////////////////////// -#include "Common/GlobalData.h" #include "GameLogic/GameLogic.h" #include "W3DDevice/GameLogic/W3DTerrainLogic.h" #include "W3DDevice/GameLogic/W3DGhostObject.h" @@ -61,6 +60,6 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; // TheSuperHackers @feature bobtista 19/01/2026 Use dummy for headless mode - virtual GhostObjectManager *createGhostObjectManager() { return TheGlobalData->m_headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } + virtual GhostObjectManager *createGhostObjectManager(bool headless) { return headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } }; From ecf1ecf52367ac6e529aed314b9bbb43c7a5380e Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 11 Mar 2026 17:41:08 -0600 Subject: [PATCH 06/10] bugfix(headless): Add override, remove void params, pass headless as bool arg in Generals GhostObjectManagerDummy --- .../Code/GameEngine/Include/GameLogic/GameLogic.h | 2 +- .../Code/GameEngine/Include/GameLogic/GhostObject.h | 12 ++++++------ .../GameEngine/Source/GameLogic/System/GameLogic.cpp | 4 ++-- .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 3 +-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h index a5b91bb8f6f..0c02bdecd75 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h +++ b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h @@ -335,7 +335,7 @@ class GameLogic : public SubsystemInterface, public Snapshot /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic(); - virtual GhostObjectManager *createGhostObjectManager(); + virtual GhostObjectManager *createGhostObjectManager(bool headless = false); GameMode m_gameMode; Int m_rankLevelLimit; diff --git a/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h b/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h index a2bc935449d..8a6b28f0186 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h +++ b/Generals/Code/GameEngine/Include/GameLogic/GhostObject.h @@ -114,12 +114,12 @@ inline Bool GhostObjectManager::trackAllPlayers() const class GhostObjectManagerDummy : public GhostObjectManager { public: - virtual void reset(void) {} - virtual GhostObject *addGhostObject(Object *object, PartitionData *pd) { return nullptr; } - virtual void removeGhostObject(GhostObject *mod) {} - virtual void updateOrphanedObjects(int *playerIndexList, int playerIndexCount) {} - virtual void releasePartitionData(void) {} - virtual void restorePartitionData(void) {} + virtual void reset() override {} + virtual GhostObject *addGhostObject(Object *object, PartitionData *pd) override { return nullptr; } + virtual void removeGhostObject(GhostObject *mod) override {} + virtual void updateOrphanedObjects(int *playerIndexList, int playerIndexCount) override {} + virtual void releasePartitionData() override {} + virtual void restorePartitionData() override {} }; // the singleton diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index 25a0bdf0175..b0571f6180e 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -349,7 +349,7 @@ void GameLogic::init() // Create system for holding deleted objects that are // still in the partition manager because player has a fogged // view of them. - TheGhostObjectManager = createGhostObjectManager(); + TheGhostObjectManager = createGhostObjectManager(TheGlobalData->m_headless); // create the terrain logic TheTerrainLogic = createTerrainLogic(); @@ -3933,7 +3933,7 @@ UnsignedInt GameLogic::getObjectCount() // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -GhostObjectManager *GameLogic::createGhostObjectManager() +GhostObjectManager *GameLogic::createGhostObjectManager(bool) { return NEW GhostObjectManager; } diff --git a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 191c01e97d7..4c386a5e032 100644 --- a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -36,7 +36,6 @@ // SYSTEM INCLUDES //////////////////////////////////////////////////////////// // USER INCLUDES ////////////////////////////////////////////////////////////// -#include "Common/GlobalData.h" #include "GameLogic/GameLogic.h" #include "W3DDevice/GameLogic/W3DTerrainLogic.h" #include "W3DDevice/GameLogic/W3DGhostObject.h" @@ -61,6 +60,6 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; // TheSuperHackers @feature bobtista 19/01/2026 Use dummy for headless mode - virtual GhostObjectManager *createGhostObjectManager() { return TheGlobalData->m_headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } + virtual GhostObjectManager *createGhostObjectManager(bool headless) { return headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } }; From d0d15aaf858ec167d2b829645d715f5ca9c0020a Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 18 Mar 2026 16:56:21 -0400 Subject: [PATCH 07/10] refactor(headless): Rename headless param to dummy, use if/else, handle dummy in base class in GeneralsMD GhostObjectManagerDummy --- GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h | 2 +- .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 4 +++- .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h index a53c4a6a8ed..fad7c4428f8 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/GameLogic.h @@ -359,7 +359,7 @@ class GameLogic : public SubsystemInterface, public Snapshot /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic(); - virtual GhostObjectManager *createGhostObjectManager(bool headless = false); + virtual GhostObjectManager *createGhostObjectManager(bool dummy = false); GameMode m_gameMode; Int m_rankLevelLimit; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index fe7de50da3a..9d7fa1000ef 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -4492,8 +4492,10 @@ UnsignedInt GameLogic::getObjectCount() // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -GhostObjectManager *GameLogic::createGhostObjectManager(bool) +GhostObjectManager *GameLogic::createGhostObjectManager(bool dummy) { + if (dummy) + return NEW GhostObjectManagerDummy; return NEW GhostObjectManager; } diff --git a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 7ca53a273e4..2d457b49ed0 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -59,7 +59,6 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; - // TheSuperHackers @feature bobtista 19/01/2026 Use dummy for headless mode - virtual GhostObjectManager *createGhostObjectManager(bool headless) { return headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } + virtual GhostObjectManager *createGhostObjectManager(bool dummy) { if (dummy) return NEW GhostObjectManagerDummy; return NEW W3DGhostObjectManager; } }; From 5b5d5195155bc658522b5aafa950ff782ff1f267 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 18 Mar 2026 16:57:24 -0400 Subject: [PATCH 08/10] refactor(headless): Rename headless param to dummy, use if/else, handle dummy in base class in Generals GhostObjectManagerDummy --- Generals/Code/GameEngine/Include/GameLogic/GameLogic.h | 2 +- .../Code/GameEngine/Source/GameLogic/System/GameLogic.cpp | 4 +++- .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h index 0c02bdecd75..f16ce6f6c1b 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h +++ b/Generals/Code/GameEngine/Include/GameLogic/GameLogic.h @@ -335,7 +335,7 @@ class GameLogic : public SubsystemInterface, public Snapshot /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic(); - virtual GhostObjectManager *createGhostObjectManager(bool headless = false); + virtual GhostObjectManager *createGhostObjectManager(bool dummy = false); GameMode m_gameMode; Int m_rankLevelLimit; diff --git a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp index b0571f6180e..462b64552de 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp @@ -3933,8 +3933,10 @@ UnsignedInt GameLogic::getObjectCount() // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -GhostObjectManager *GameLogic::createGhostObjectManager(bool) +GhostObjectManager *GameLogic::createGhostObjectManager(bool dummy) { + if (dummy) + return NEW GhostObjectManagerDummy; return NEW GhostObjectManager; } diff --git a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 4c386a5e032..17eac57ba01 100644 --- a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -59,7 +59,6 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; - // TheSuperHackers @feature bobtista 19/01/2026 Use dummy for headless mode - virtual GhostObjectManager *createGhostObjectManager(bool headless) { return headless ? static_cast(NEW GhostObjectManagerDummy) : NEW W3DGhostObjectManager; } + virtual GhostObjectManager *createGhostObjectManager(bool dummy) { if (dummy) return NEW GhostObjectManagerDummy; return NEW W3DGhostObjectManager; } }; From ea8620531e5a6bad7de5e0fa365016506b96082e Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Thu, 19 Mar 2026 15:51:56 -0400 Subject: [PATCH 09/10] style(headless): Expand createGhostObjectManager inline body in GeneralsMD W3DGameLogic --- .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 2d457b49ed0..70dbb5a27a1 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -59,6 +59,11 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; - virtual GhostObjectManager *createGhostObjectManager(bool dummy) { if (dummy) return NEW GhostObjectManagerDummy; return NEW W3DGhostObjectManager; } + virtual GhostObjectManager *createGhostObjectManager(bool dummy) + { + if (dummy) + return NEW GhostObjectManagerDummy; + return NEW W3DGhostObjectManager; + } }; From 5523e01bf30eb6ec9636e728135511bbb13967b5 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Thu, 19 Mar 2026 15:54:16 -0400 Subject: [PATCH 10/10] style(headless): Expand createGhostObjectManager inline body in Generals W3DGameLogic --- .../Include/W3DDevice/GameLogic/W3DGameLogic.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h index 17eac57ba01..aeee0119d01 100644 --- a/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h +++ b/Generals/Code/GameEngineDevice/Include/W3DDevice/GameLogic/W3DGameLogic.h @@ -59,6 +59,11 @@ class W3DGameLogic : public GameLogic /// factory for TheTerrainLogic, called from init() virtual TerrainLogic *createTerrainLogic() { return NEW W3DTerrainLogic; }; - virtual GhostObjectManager *createGhostObjectManager(bool dummy) { if (dummy) return NEW GhostObjectManagerDummy; return NEW W3DGhostObjectManager; } + virtual GhostObjectManager *createGhostObjectManager(bool dummy) + { + if (dummy) + return NEW GhostObjectManagerDummy; + return NEW W3DGhostObjectManager; + } };