Index: ps/trunk/source/ps/Game.cpp =================================================================== --- ps/trunk/source/ps/Game.cpp +++ ps/trunk/source/ps/Game.cpp @@ -68,7 +68,7 @@ * **/ CGame::CGame(bool replayLog): - m_World(new CWorld(this)), + m_World(new CWorld(*this)), m_Simulation2(new CSimulation2(&m_World->GetUnitManager(), g_ScriptContext, &m_World->GetTerrain())), // TODO: we need to remove that global dependency. Maybe the game view // should be created outside only if needed. Index: ps/trunk/source/ps/World.h =================================================================== --- ps/trunk/source/ps/World.h +++ ps/trunk/source/ps/World.h @@ -27,6 +27,8 @@ #include "ps/CStrForward.h" #include "ps/Errors.h" +#include + #ifndef ERROR_GROUP_GAME_DEFINED #define ERROR_GROUP_GAME_DEFINED ERROR_GROUP(Game); @@ -46,26 +48,8 @@ **/ class CWorld { - NONCOPYABLE(CWorld); - /** - * pointer to the CGame object representing the game. - **/ - CGame *m_pGame; - - /** - * pointer to the CTerrain object representing the height map. - **/ - CTerrain *m_Terrain; - - /** - * pointer to the CUnitManager that holds all the units in the world. - **/ - CUnitManager *m_UnitManager; - - CMapReader* m_MapReader; - public: - CWorld(CGame *pGame); + CWorld(CGame& game); ~CWorld(); /* @@ -102,6 +86,27 @@ { return *m_UnitManager; } + +private: + /** + * Reference to the CGame object representing the game. + */ + CGame& m_Game; + + /** + * The CTerrain object represents the height map. + */ + const std::unique_ptr m_Terrain; + + /** + * The CUnitManager that holds all the units in the world. + */ + const std::unique_ptr m_UnitManager; + + /** + * The map reader gets deleted just after the map is read. + */ + std::unique_ptr m_MapReader; }; // rationale: see definition. Index: ps/trunk/source/ps/World.cpp =================================================================== --- ps/trunk/source/ps/World.cpp +++ ps/trunk/source/ps/World.cpp @@ -46,16 +46,18 @@ /** * Constructor. * - * @param pGame CGame * pGame pointer to the container game object. + * @param game CGame& game reference to the container game object. **/ -CWorld::CWorld(CGame *pGame): - m_pGame(pGame), - m_Terrain(new CTerrain()), - m_UnitManager(new CUnitManager()), - m_MapReader(new CMapReader) +CWorld::CWorld(CGame& game): + m_Game{game}, + m_Terrain{std::make_unique()}, + m_UnitManager{std::make_unique()}, + m_MapReader{std::make_unique()} { } +CWorld::~CWorld() = default; + /** * Initializes the game world with the attributes provided. **/ @@ -68,14 +70,16 @@ try { - CTriggerManager* pTriggerManager = NULL; - m_MapReader->LoadMap(mapfilename, cx, settings, m_Terrain, - CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetWaterManager() : NULL, - CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetSkyManager() : NULL, - &g_LightEnv, m_pGame->GetView(), - m_pGame->GetView() ? m_pGame->GetView()->GetCinema() : NULL, - pTriggerManager, CRenderer::IsInitialised() ? &g_Renderer.GetPostprocManager() : NULL, - m_pGame->GetSimulation2(), &m_pGame->GetSimulation2()->GetSimContext(), playerID, false); + CTriggerManager* pTriggerManager = nullptr; + m_MapReader->LoadMap(mapfilename, cx, settings, m_Terrain.get(), + CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetWaterManager() : + nullptr, + CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetSkyManager() : + nullptr, &g_LightEnv, m_Game.GetView(), + m_Game.GetView() ? m_Game.GetView()->GetCinema() : nullptr, pTriggerManager, + CRenderer::IsInitialised() ? &g_Renderer.GetPostprocManager() : nullptr, + m_Game.GetSimulation2(), &m_Game.GetSimulation2()->GetSimContext(), playerID, + false); // fails immediately, or registers for delay loading LDR_Register([this](const double) { @@ -84,7 +88,7 @@ } catch (PSERROR_File& err) { - SAFE_DELETE(m_MapReader); + m_MapReader.reset(); LOGERROR("Failed to load map %s: %s", mapfilename.string8(), err.what()); throw PSERROR_Game_World_MapLoadFailed("Failed to load map.\nCheck application log for details."); } @@ -94,14 +98,13 @@ void CWorld::RegisterInitRMS(const CStrW& scriptFile, const ScriptContext& cx, JS::HandleValue settings, int playerID) { // If scriptFile is empty, a blank map will be generated using settings (no RMS run) - CTriggerManager* pTriggerManager = NULL; - m_MapReader->LoadRandomMap(scriptFile, cx, settings, m_Terrain, - CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetWaterManager() : NULL, - CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetSkyManager() : NULL, - &g_LightEnv, m_pGame->GetView(), - m_pGame->GetView() ? m_pGame->GetView()->GetCinema() : NULL, - pTriggerManager, CRenderer::IsInitialised() ? &g_Renderer.GetPostprocManager() : NULL, - m_pGame->GetSimulation2(), playerID); + CTriggerManager* pTriggerManager = nullptr; + m_MapReader->LoadRandomMap(scriptFile, cx, settings, m_Terrain.get(), + CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetWaterManager() : nullptr, + CRenderer::IsInitialised() ? &g_Renderer.GetSceneRenderer().GetSkyManager() : nullptr, + &g_LightEnv, m_Game.GetView(), m_Game.GetView() ? m_Game.GetView()->GetCinema() : nullptr, + pTriggerManager, CRenderer::IsInitialised() ? &g_Renderer.GetPostprocManager() : nullptr, + m_Game.GetSimulation2(), playerID); // registers for delay loading LDR_Register([this](const double) { @@ -111,17 +114,6 @@ int CWorld::DeleteMapReader() { - SAFE_DELETE(m_MapReader); + m_MapReader.reset(); return 0; } - -/** - * Destructor. - * - **/ -CWorld::~CWorld() -{ - delete m_Terrain; - delete m_UnitManager; - delete m_MapReader; -}