From 6889b3f327f0e89b9fb9d313a0a70ae2b55456c1 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 26 Mar 2026 17:06:32 +0100 Subject: [PATCH 1/4] Moved AudioManagerDummy class. --- Core/GameEngine/Include/Common/GameAudio.h | 51 ------------------- .../MilesAudioDevice/MilesAudioManager.h | 49 ++++++++++++++++++ 2 files changed, 49 insertions(+), 51 deletions(-) diff --git a/Core/GameEngine/Include/Common/GameAudio.h b/Core/GameEngine/Include/Common/GameAudio.h index de7d754c4b2..dae9d7cd132 100644 --- a/Core/GameEngine/Include/Common/GameAudio.h +++ b/Core/GameEngine/Include/Common/GameAudio.h @@ -383,55 +383,4 @@ class AudioManager : public SubsystemInterface Bool m_disallowSpeech : 1; }; -// TheSuperHackers @feature helmutbuhler 17/05/2025 -// AudioManager that does nothing. Used for Headless Mode. -class AudioManagerDummy : public AudioManager -{ -#if defined(RTS_DEBUG) - virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} -#endif - virtual void stopAudio(AudioAffect which) override {} - virtual void pauseAudio(AudioAffect which) override {} - virtual void resumeAudio(AudioAffect which) override {} - virtual void pauseAmbient(Bool shouldPause) override {} - virtual void killAudioEventImmediately(AudioHandle audioEvent) override {} - virtual void nextMusicTrack() override {} - virtual void prevMusicTrack() override {} - virtual Bool isMusicPlaying() const override { return false; } - virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const override { return false; } - virtual AsciiString getMusicTrackName() const override { return ""; } - virtual void openDevice() override {} - virtual void closeDevice() override {} - virtual void* getDevice() override { return nullptr; } - virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) override {} - virtual UnsignedInt getProviderCount() const override { return 0; }; - virtual AsciiString getProviderName(UnsignedInt providerNum) const override { return ""; } - virtual UnsignedInt getProviderIndex(AsciiString providerName) const override { return 0; } - virtual void selectProvider(UnsignedInt providerNdx) override {} - virtual void unselectProvider() override {} - virtual UnsignedInt getSelectedProvider() const override { return 0; } - virtual void setSpeakerType(UnsignedInt speakerType) override {} - virtual UnsignedInt getSpeakerType() override { return 0; } - virtual UnsignedInt getNum2DSamples() const override { return 0; } - virtual UnsignedInt getNum3DSamples() const override { return 0; } - virtual UnsignedInt getNumStreams() const override { return 0; } - virtual Bool doesViolateLimit(AudioEventRTS* event) const override { return false; } - virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const override { return false; } - virtual Bool isPlayingAlready(AudioEventRTS* event) const override { return false; } - virtual Bool isObjectPlayingVoice(UnsignedInt objID) const override { return false; } - virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) override {} - virtual void removePlayingAudio(AsciiString eventName) override {} - virtual void removeAllDisabledAudio() override {} - virtual Bool has3DSensitiveStreamsPlaying() const override { return false; } - virtual void* getHandleForBink() override { return nullptr; } - virtual void releaseHandleForBink() override {} - virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) override {} - virtual void setPreferredProvider(AsciiString providerNdx) override {} - virtual void setPreferredSpeaker(AsciiString speakerType) override {} - virtual Real getFileLengthMS(AsciiString strToLoad) const override { return -1; } - virtual void closeAnySamplesUsingFile(const void* fileToClose) override {} - virtual void setDeviceListenerPosition() override {} -}; - - extern AudioManager *TheAudio; diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index 49aed779a21..8d01a1fd639 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -330,3 +330,52 @@ class MilesAudioManager : public AudioManager }; +// TheSuperHackers @feature helmutbuhler 17/05/2025 +// AudioManager that does nothing. Used for Headless Mode. +class AudioManagerDummy : public AudioManager +{ +#if defined(RTS_DEBUG) + virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} +#endif + virtual void stopAudio(AudioAffect which) override {} + virtual void pauseAudio(AudioAffect which) override {} + virtual void resumeAudio(AudioAffect which) override {} + virtual void pauseAmbient(Bool shouldPause) override {} + virtual void killAudioEventImmediately(AudioHandle audioEvent) override {} + virtual void nextMusicTrack() override {} + virtual void prevMusicTrack() override {} + virtual Bool isMusicPlaying() const override { return false; } + virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const override { return false; } + virtual AsciiString getMusicTrackName() const override { return ""; } + virtual void openDevice() override {} + virtual void closeDevice() override {} + virtual void* getDevice() override { return nullptr; } + virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) override {} + virtual UnsignedInt getProviderCount() const override { return 0; }; + virtual AsciiString getProviderName(UnsignedInt providerNum) const override { return ""; } + virtual UnsignedInt getProviderIndex(AsciiString providerName) const override { return 0; } + virtual void selectProvider(UnsignedInt providerNdx) override {} + virtual void unselectProvider() override {} + virtual UnsignedInt getSelectedProvider() const override { return 0; } + virtual void setSpeakerType(UnsignedInt speakerType) override {} + virtual UnsignedInt getSpeakerType() override { return 0; } + virtual UnsignedInt getNum2DSamples() const override { return 0; } + virtual UnsignedInt getNum3DSamples() const override { return 0; } + virtual UnsignedInt getNumStreams() const override { return 0; } + virtual Bool doesViolateLimit(AudioEventRTS* event) const override { return false; } + virtual Bool isPlayingLowerPriority(AudioEventRTS* event) const override { return false; } + virtual Bool isPlayingAlready(AudioEventRTS* event) const override { return false; } + virtual Bool isObjectPlayingVoice(UnsignedInt objID) const override { return false; } + virtual void adjustVolumeOfPlayingAudio(AsciiString eventName, Real newVolume) override {} + virtual void removePlayingAudio(AsciiString eventName) override {} + virtual void removeAllDisabledAudio() override {} + virtual Bool has3DSensitiveStreamsPlaying() const override { return false; } + virtual void* getHandleForBink() override { return nullptr; } + virtual void releaseHandleForBink() override {} + virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) override {} + virtual void setPreferredProvider(AsciiString providerNdx) override {} + virtual void setPreferredSpeaker(AsciiString speakerType) override {} + virtual Real getFileLengthMS(AsciiString strToLoad) const override { return -1; } + virtual void closeAnySamplesUsingFile(const void* fileToClose) override {} + virtual void setDeviceListenerPosition() override {} +}; From bda0bde24ee2c0de10173c0ca8b12b6c6214d68b Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 26 Mar 2026 17:20:39 +0100 Subject: [PATCH 2/4] Changed 'AudioManagerDummy' to 'MilesAudioManagerDummy'. Changed TSH comment and uncommented functions from the base class. --- .../Include/MilesAudioDevice/MilesAudioManager.h | 15 ++++++++------- .../Code/GameEngine/Include/Common/GameEngine.h | 2 +- .../Code/GameEngine/Source/Common/GameEngine.cpp | 2 +- .../Include/Win32Device/Common/Win32GameEngine.h | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index 8d01a1fd639..e7e10cc8bd1 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -330,9 +330,10 @@ class MilesAudioManager : public AudioManager }; -// TheSuperHackers @feature helmutbuhler 17/05/2025 -// AudioManager that does nothing. Used for Headless Mode. -class AudioManagerDummy : public AudioManager +// TheSuperHackers @feature helmutbuhler 17/05/2025 AudioManager that does almost nothing. Useful for headless mode. +// @bugfix Caball009 26/03/2026 Scripts may require the actual audio file length to function properly, which is important for the CRC computation. +// The Miles AudioManager handles the device opening / closure, so that getFileLengthMS can function as intended. +class MilesAudioManagerDummy : public MilesAudioManager { #if defined(RTS_DEBUG) virtual void audioDebugDisplay(DebugDisplayInterface* dd, void* userData, FILE* fp) {} @@ -347,9 +348,9 @@ class AudioManagerDummy : public AudioManager virtual Bool isMusicPlaying() const override { return false; } virtual Bool hasMusicTrackCompleted(const AsciiString& trackName, Int numberOfTimes) const override { return false; } virtual AsciiString getMusicTrackName() const override { return ""; } - virtual void openDevice() override {} - virtual void closeDevice() override {} - virtual void* getDevice() override { return nullptr; } + //virtual void openDevice() override {} + //virtual void closeDevice() override {} + //virtual void* getDevice() override { return nullptr; } virtual void notifyOfAudioCompletion(UnsignedInt audioCompleted, UnsignedInt flags) override {} virtual UnsignedInt getProviderCount() const override { return 0; }; virtual AsciiString getProviderName(UnsignedInt providerNum) const override { return ""; } @@ -375,7 +376,7 @@ class AudioManagerDummy : public AudioManager virtual void friend_forcePlayAudioEventRTS(const AudioEventRTS* eventToPlay) override {} virtual void setPreferredProvider(AsciiString providerNdx) override {} virtual void setPreferredSpeaker(AsciiString speakerType) override {} - virtual Real getFileLengthMS(AsciiString strToLoad) const override { return -1; } + //virtual Real getFileLengthMS(AsciiString strToLoad) const override { return 0.0f; } virtual void closeAnySamplesUsingFile(const void* fileToClose) override {} virtual void setDeviceListenerPosition() override {} }; diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h index f86fd8d38e5..6bc2e51f41e 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h @@ -95,7 +95,7 @@ class GameEngine : public SubsystemInterface virtual Radar *createRadar() = 0; ///< Factory for radar virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0; - virtual AudioManager *createAudioManager() = 0; ///< Factory for Audio Manager + virtual AudioManager *createAudioManager(Bool dummy) = 0; ///< Factory for Audio Manager Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp index f8743c30079..811ad18d276 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp @@ -525,7 +525,7 @@ void GameEngine::init() startTime64 = endTime64;//Reset the clock //////////////////////////////////////////////////////// DEBUG_LOG(("%s", Buf));//////////////////////////////////////////////////////////////////////////// #endif///////////////////////////////////////////////////////////////////////////////////////////// - initSubsystem(TheAudio,"TheAudio", TheGlobalData->m_headless ? NEW AudioManagerDummy : createAudioManager(), nullptr); + initSubsystem(TheAudio,"TheAudio", createAudioManager(TheGlobalData->m_headless), nullptr); if (!TheAudio->isMusicAlreadyLoaded()) setQuitting(TRUE); diff --git a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h index 3a5251413f6..57a47093b11 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h @@ -78,7 +78,7 @@ class Win32GameEngine : public GameEngine virtual NetworkInterface *createNetwork(); ///< Factory for the network virtual Radar *createRadar(); ///< Factory for radar virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser - virtual AudioManager *createAudioManager(); ///< Factory for audio device + virtual AudioManager *createAudioManager(Bool dummy); ///< Factory for audio device virtual ParticleSystemManager* createParticleSystemManager(Bool dummy); @@ -99,4 +99,4 @@ inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); } inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; } inline WebBrowser *Win32GameEngine::createWebBrowser() { return NEW CComObject; } -inline AudioManager *Win32GameEngine::createAudioManager() { return NEW MilesAudioManager; } +inline AudioManager *Win32GameEngine::createAudioManager(Bool dummy) { return dummy ? NEW MilesAudioManagerDummy : NEW MilesAudioManager; } From c4397048e48208fb258fd96a23ab410a60862a00 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 26 Mar 2026 17:21:01 +0100 Subject: [PATCH 3/4] Applied the same class creation logic for Radar as MilesAudioManager. --- GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h | 2 +- GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp | 2 +- .../Include/Win32Device/Common/Win32GameEngine.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h index 6bc2e51f41e..20e7188b3e6 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/GameEngine.h @@ -92,7 +92,7 @@ class GameEngine : public SubsystemInterface virtual ModuleFactory *createModuleFactory() = 0; ///< Factory for modules virtual ThingFactory *createThingFactory() = 0; ///< Factory for the thing factory virtual FunctionLexicon *createFunctionLexicon() = 0; ///< Factory for Function Lexicon - virtual Radar *createRadar() = 0; ///< Factory for radar + virtual Radar *createRadar(Bool dummy) = 0; ///< Factory for radar virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0; virtual AudioManager *createAudioManager(Bool dummy) = 0; ///< Factory for Audio Manager diff --git a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp index 811ad18d276..b3609bb5d3d 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/GameEngine.cpp @@ -610,7 +610,7 @@ void GameEngine::init() initSubsystem(TheCrateSystem,"TheCrateSystem", MSGNEW("GameEngineSubsystem") CrateSystem(), &xferCRC, "Data\\INI\\Default\\Crate", "Data\\INI\\Crate"); initSubsystem(ThePlayerList,"ThePlayerList", MSGNEW("GameEngineSubsystem") PlayerList(), nullptr); initSubsystem(TheRecorder,"TheRecorder", createRecorder(), nullptr); - initSubsystem(TheRadar,"TheRadar", TheGlobalData->m_headless ? NEW RadarDummy : createRadar(), nullptr); + initSubsystem(TheRadar,"TheRadar", createRadar(TheGlobalData->m_headless), nullptr); initSubsystem(TheVictoryConditions,"TheVictoryConditions", createVictoryConditions(), nullptr); diff --git a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h index 57a47093b11..a3893d1a3ad 100644 --- a/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h +++ b/GeneralsMD/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h @@ -76,7 +76,7 @@ class Win32GameEngine : public GameEngine virtual LocalFileSystem *createLocalFileSystem(); ///< factory for local file system virtual ArchiveFileSystem *createArchiveFileSystem(); ///< factory for archive file system virtual NetworkInterface *createNetwork(); ///< Factory for the network - virtual Radar *createRadar(); ///< Factory for radar + virtual Radar *createRadar(Bool dummy); ///< Factory for radar virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser virtual AudioManager *createAudioManager(Bool dummy); ///< Factory for audio device virtual ParticleSystemManager* createParticleSystemManager(Bool dummy); @@ -97,6 +97,6 @@ inline ArchiveFileSystem *Win32GameEngine::createArchiveFileSystem() { return NE inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool dummy) { return dummy ? static_cast(NEW ParticleSystemManagerDummy) : NEW W3DParticleSystemManager; } inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); } -inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; } +inline Radar *Win32GameEngine::createRadar(Bool dummy) { return dummy ? static_cast(NEW RadarDummy) : NEW W3DRadar; } inline WebBrowser *Win32GameEngine::createWebBrowser() { return NEW CComObject; } inline AudioManager *Win32GameEngine::createAudioManager(Bool dummy) { return dummy ? NEW MilesAudioManagerDummy : NEW MilesAudioManager; } From 924a799aa5f41700a4584ce9a16e364932c74bf7 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 26 Mar 2026 17:41:25 +0100 Subject: [PATCH 4/4] Replicated in Generals. --- Generals/Code/GameEngine/Include/Common/GameEngine.h | 4 ++-- Generals/Code/GameEngine/Source/Common/GameEngine.cpp | 4 ++-- .../Include/Win32Device/Common/Win32GameEngine.h | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/GameEngine.h b/Generals/Code/GameEngine/Include/Common/GameEngine.h index 98835569e77..67a45eb5f2e 100644 --- a/Generals/Code/GameEngine/Include/Common/GameEngine.h +++ b/Generals/Code/GameEngine/Include/Common/GameEngine.h @@ -93,10 +93,10 @@ class GameEngine : public SubsystemInterface virtual ModuleFactory *createModuleFactory() = 0; ///< Factory for modules virtual ThingFactory *createThingFactory() = 0; ///< Factory for the thing factory virtual FunctionLexicon *createFunctionLexicon() = 0; ///< Factory for Function Lexicon - virtual Radar *createRadar() = 0; ///< Factory for radar + virtual Radar *createRadar(Bool dummy) = 0; ///< Factory for radar virtual WebBrowser *createWebBrowser() = 0; ///< Factory for embedded browser virtual ParticleSystemManager* createParticleSystemManager(Bool dummy) = 0; - virtual AudioManager *createAudioManager() = 0; ///< Factory for Audio Manager + virtual AudioManager *createAudioManager(Bool dummy) = 0; ///< Factory for Audio Manager Real m_logicTimeAccumulator; ///< Frame time accumulated towards submitting a new logic frame diff --git a/Generals/Code/GameEngine/Source/Common/GameEngine.cpp b/Generals/Code/GameEngine/Source/Common/GameEngine.cpp index 9e40587138e..f7cfb7d3ec4 100644 --- a/Generals/Code/GameEngine/Source/Common/GameEngine.cpp +++ b/Generals/Code/GameEngine/Source/Common/GameEngine.cpp @@ -440,7 +440,7 @@ void GameEngine::init() initSubsystem(TheTerrainRoads,"TheTerrainRoads", MSGNEW("GameEngineSubsystem") TerrainRoadCollection(), &xferCRC, "Data\\INI\\Default\\Roads", "Data\\INI\\Roads"); initSubsystem(TheGlobalLanguageData,"TheGlobalLanguageData",MSGNEW("GameEngineSubsystem") GlobalLanguage, nullptr); // must be before the game text TheGlobalLanguageData->parseCustomDefinition(); - initSubsystem(TheAudio,"TheAudio", TheGlobalData->m_headless ? NEW AudioManagerDummy : createAudioManager(), nullptr); + initSubsystem(TheAudio,"TheAudio", createAudioManager(TheGlobalData->m_headless), nullptr); if (!TheAudio->isMusicAlreadyLoaded()) setQuitting(TRUE); @@ -479,7 +479,7 @@ void GameEngine::init() initSubsystem(TheCrateSystem,"TheCrateSystem", MSGNEW("GameEngineSubsystem") CrateSystem(), &xferCRC, "Data\\INI\\Default\\Crate", "Data\\INI\\Crate"); initSubsystem(ThePlayerList,"ThePlayerList", MSGNEW("GameEngineSubsystem") PlayerList(), nullptr); initSubsystem(TheRecorder,"TheRecorder", createRecorder(), nullptr); - initSubsystem(TheRadar,"TheRadar", TheGlobalData->m_headless ? NEW RadarDummy : createRadar(), nullptr); + initSubsystem(TheRadar,"TheRadar", createRadar(TheGlobalData->m_headless), nullptr); initSubsystem(TheVictoryConditions,"TheVictoryConditions", createVictoryConditions(), nullptr); AsciiString fname; diff --git a/Generals/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h b/Generals/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h index 17eeb2c6c5c..ec54b033628 100644 --- a/Generals/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h +++ b/Generals/Code/GameEngineDevice/Include/Win32Device/Common/Win32GameEngine.h @@ -76,9 +76,9 @@ class Win32GameEngine : public GameEngine virtual LocalFileSystem *createLocalFileSystem(); ///< factory for local file system virtual ArchiveFileSystem *createArchiveFileSystem(); ///< factory for archive file system virtual NetworkInterface *createNetwork(); ///< Factory for the network - virtual Radar *createRadar(); ///< Factory for radar + virtual Radar *createRadar(Bool dummy); ///< Factory for radar virtual WebBrowser *createWebBrowser(); ///< Factory for embedded browser - virtual AudioManager *createAudioManager(); ///< Factory for audio device + virtual AudioManager *createAudioManager(Bool dummy); ///< Factory for audio device virtual ParticleSystemManager* createParticleSystemManager(Bool dummy); @@ -97,6 +97,6 @@ inline ArchiveFileSystem *Win32GameEngine::createArchiveFileSystem() { return NE inline ParticleSystemManager* Win32GameEngine::createParticleSystemManager(Bool dummy) { return dummy ? static_cast(NEW ParticleSystemManagerDummy) : NEW W3DParticleSystemManager; } inline NetworkInterface *Win32GameEngine::createNetwork() { return NetworkInterface::createNetwork(); } -inline Radar *Win32GameEngine::createRadar() { return NEW W3DRadar; } +inline Radar *Win32GameEngine::createRadar(Bool dummy) { return dummy ? static_cast(NEW RadarDummy) : NEW W3DRadar; } inline WebBrowser *Win32GameEngine::createWebBrowser() { return NEW CComObject; } -inline AudioManager *Win32GameEngine::createAudioManager() { return NEW MilesAudioManager; } +inline AudioManager *Win32GameEngine::createAudioManager(Bool dummy) { return dummy ? NEW MilesAudioManagerDummy : NEW MilesAudioManager; }