/* Copyright (C) 2025 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ #ifndef INCLUDED_MAPREADER #define INCLUDED_MAPREADER #include "MapIO.h" #include "graphics/LightEnv.h" #include "lib/file/vfs/vfs_path.h" #include "lib/posix/posix_types.h" #include "lib/types.h" #include "maths/Vector3D.h" #include "ps/CStr.h" #include "ps/Errors.h" #include "ps/FileIo.h" #include "ps/Loader.h" #include "simulation2/system/Entity.h" #include #include #include #include #include #include class CCinemaManager; class CGameView; class CPostprocManager; class CSimContext; class CSimulation2; class CTerrain; class CTerrainTextureEntry; class CTriggerManager; class CXMLReader; class ScriptContext; class ScriptInterface; class SkyManager; class WaterManager; class CMapReader : public CMapIO { friend class CXMLReader; public: // constructor CMapReader(); CMapReader(const CMapReader&) = delete; CMapReader& operator =(const CMapReader&) = delete; CMapReader(CMapReader&&) = delete; CMapReader& operator =(CMapReader&&) = delete; ~CMapReader(); // LoadMap: try to load the map from given file; reinitialise the scene to new data if successful void LoadMap(const VfsPath& pathname, const ScriptContext& cx, JS::HandleValue settings, CTerrain*, WaterManager*, SkyManager*, CLightEnv*, CGameView*, CCinemaManager*, CTriggerManager*, CPostprocManager* pPostproc, CSimulation2*, const CSimContext*, int playerID, bool skipEntities); void LoadRandomMap(const CStrW& scriptFile, const ScriptContext& cx, JS::HandleValue settings, CTerrain*, WaterManager*, SkyManager*, CLightEnv*, CGameView*, CCinemaManager*, CTriggerManager*, CPostprocManager* pPostproc_, CSimulation2*, int playerID); private: // Load script settings for use by scripts int LoadScriptSettings(); // load player settings only int LoadPlayerSettings(); // load map settings only int LoadMapSettings(); // UnpackTerrain: unpack the terrain from the input stream PS::Loader::Task UnpackTerrain(); // UnpackCinema: unpack the cinematic tracks from the input stream int UnpackCinema(); // ApplyData: take all the input data, and rebuild the scene from it int ApplyData(); int ApplyTerrainData(); // read some misc data from the XML file int ReadXML(); // read entity data from the XML file PS::Loader::Task ReadXMLEntities(); // Copy random map settings over to sim int LoadRMSettings(); // Generate random map PS::Loader::Task RunMapGeneration(const CStrW& scriptFile); // Parse script data into terrain int ParseTerrain(); // Parse script data into entities PS::Loader::Task ParseEntities(); // Parse script data into environment int ParseEnvironment(); // Parse script data into camera int ParseCamera(); // size of map ssize_t m_PatchesPerSide{0}; // heightmap for map std::vector m_Heightmap; // list of terrain textures used by map std::vector m_TerrainTextures; // tile descriptions for each tile std::vector m_Tiles; // lightenv stored in file CLightEnv m_LightEnv; // startup script CStrW m_Script; // random map data JS::PersistentRootedValue m_ScriptSettings; JS::PersistentRootedValue m_MapData; CFileUnpacker unpacker; CTerrain* pTerrain; WaterManager* pWaterMan; SkyManager* pSkyMan; CPostprocManager* pPostproc; CLightEnv* pLightEnv; CGameView* pGameView; CCinemaManager* pCinema; CTriggerManager* pTrigMan; CSimulation2* pSimulation2; const CSimContext* pSimContext; int m_PlayerID; bool m_SkipEntities; VfsPath m_FilenameXml; bool only_xml; u32 file_format_version; entity_id_t m_StartingCameraTarget; CVector3D m_StartingCamera; std::unique_ptr m_XmlReader; }; /** * A restricted map reader that returns various summary information * for use by scripts (particularly the GUI). */ class CMapSummaryReader { public: /** * Try to load a map file. * @param pathname Path to .pmp or .xml file */ PSRETURN LoadMap(const VfsPath& pathname); /** * Returns a value of the form: * @code * { * "settings": { ... contents of the map's ... } * } * @endcode */ void GetMapSettings(const ScriptInterface& scriptInterface, JS::MutableHandleValue); private: CStr m_ScriptSettings; }; #endif