Line data Source code
1 : /* Copyright (C) 2022 Wildfire Games.
2 : * This file is part of 0 A.D.
3 : *
4 : * 0 A.D. is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 2 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * 0 A.D. is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 : */
17 :
18 : #ifndef INCLUDED_MAPREADER
19 : #define INCLUDED_MAPREADER
20 :
21 : #include "MapIO.h"
22 :
23 : #include "graphics/LightEnv.h"
24 : #include "ps/CStr.h"
25 : #include "ps/FileIo.h"
26 : #include "scriptinterface/ScriptTypes.h"
27 : #include "simulation2/system/Entity.h"
28 :
29 : class CTerrain;
30 : class WaterManager;
31 : class SkyManager;
32 : class CLightEnv;
33 : class CCinemaManager;
34 : class CPostprocManager;
35 : class CTriggerManager;
36 : class CSimulation2;
37 : class CSimContext;
38 : class CTerrainTextureEntry;
39 : class CGameView;
40 : class CXMLReader;
41 : class CMapGenerator;
42 : class ScriptContext;
43 : class ScriptInterface;
44 :
45 : class CMapReader : public CMapIO
46 : {
47 : friend class CXMLReader;
48 :
49 : public:
50 : // constructor
51 : CMapReader();
52 : ~CMapReader();
53 :
54 : // LoadMap: try to load the map from given file; reinitialise the scene to new data if successful
55 : void LoadMap(const VfsPath& pathname, const ScriptContext& cx, JS::HandleValue settings, CTerrain*, WaterManager*, SkyManager*, CLightEnv*, CGameView*,
56 : CCinemaManager*, CTriggerManager*, CPostprocManager* pPostproc, CSimulation2*, const CSimContext*,
57 : int playerID, bool skipEntities);
58 :
59 : void LoadRandomMap(const CStrW& scriptFile, const ScriptContext& cx, JS::HandleValue settings, CTerrain*, WaterManager*, SkyManager*, CLightEnv*, CGameView*, CCinemaManager*, CTriggerManager*, CPostprocManager* pPostproc_, CSimulation2*, int playerID);
60 :
61 : private:
62 : // Load script settings for use by scripts
63 : int LoadScriptSettings();
64 :
65 : // load player settings only
66 : int LoadPlayerSettings();
67 :
68 : // load map settings only
69 : int LoadMapSettings();
70 :
71 : // UnpackTerrain: unpack the terrain from the input stream
72 : int UnpackTerrain();
73 : // UnpackCinema: unpack the cinematic tracks from the input stream
74 : int UnpackCinema();
75 :
76 : // UnpackMap: unpack the given data from the raw data stream into local variables
77 : int UnpackMap();
78 :
79 : // ApplyData: take all the input data, and rebuild the scene from it
80 : int ApplyData();
81 : int ApplyTerrainData();
82 :
83 : // read some misc data from the XML file
84 : int ReadXML();
85 :
86 : // read entity data from the XML file
87 : int ReadXMLEntities();
88 :
89 : // Copy random map settings over to sim
90 : int LoadRMSettings();
91 :
92 : // Generate random map
93 : int GenerateMap();
94 :
95 : // Parse script data into terrain
96 : int ParseTerrain();
97 :
98 : // Parse script data into entities
99 : int ParseEntities();
100 :
101 : // Parse script data into environment
102 : int ParseEnvironment();
103 :
104 : // Parse script data into camera
105 : int ParseCamera();
106 :
107 :
108 : // size of map
109 : ssize_t m_PatchesPerSide;
110 : // heightmap for map
111 : std::vector<u16> m_Heightmap;
112 : // list of terrain textures used by map
113 : std::vector<CTerrainTextureEntry*> m_TerrainTextures;
114 : // tile descriptions for each tile
115 : std::vector<STileDesc> m_Tiles;
116 : // lightenv stored in file
117 : CLightEnv m_LightEnv;
118 : // startup script
119 : CStrW m_Script;
120 :
121 : // random map data
122 : CStrW m_ScriptFile;
123 : JS::PersistentRootedValue m_ScriptSettings;
124 : JS::PersistentRootedValue m_MapData;
125 :
126 : CMapGenerator* m_MapGen;
127 :
128 : CFileUnpacker unpacker;
129 : CTerrain* pTerrain;
130 : WaterManager* pWaterMan;
131 : SkyManager* pSkyMan;
132 : CPostprocManager* pPostproc;
133 : CLightEnv* pLightEnv;
134 : CGameView* pGameView;
135 : CCinemaManager* pCinema;
136 : CTriggerManager* pTrigMan;
137 : CSimulation2* pSimulation2;
138 : const CSimContext* pSimContext;
139 : int m_PlayerID;
140 : bool m_SkipEntities;
141 : VfsPath filename_xml;
142 : bool only_xml;
143 : u32 file_format_version;
144 : entity_id_t m_StartingCameraTarget;
145 : CVector3D m_StartingCamera;
146 :
147 : // UnpackTerrain generator state
148 : size_t cur_terrain_tex;
149 : size_t num_terrain_tex;
150 :
151 : CXMLReader* xml_reader;
152 : };
153 :
154 : /**
155 : * A restricted map reader that returns various summary information
156 : * for use by scripts (particularly the GUI).
157 : */
158 0 : class CMapSummaryReader
159 : {
160 : public:
161 : /**
162 : * Try to load a map file.
163 : * @param pathname Path to .pmp or .xml file
164 : */
165 : PSRETURN LoadMap(const VfsPath& pathname);
166 :
167 : /**
168 : * Returns a value of the form:
169 : * @code
170 : * {
171 : * "settings": { ... contents of the map's <ScriptSettings> ... }
172 : * }
173 : * @endcode
174 : */
175 : void GetMapSettings(const ScriptInterface& scriptInterface, JS::MutableHandleValue);
176 :
177 : private:
178 : CStr m_ScriptSettings;
179 : };
180 :
181 : #endif
|