1 #pragma once
2 
3 #include "game/GameRes.h"
4 
5 #include "ContentManager.h"
6 #include "ContentMusic.h"
7 #include "IGameDataLoader.h"
8 #include "StringEncodingTypes.h"
9 #include "RustInterface.h"
10 
11 #include "rapidjson/document.h"
12 #include <string_theory/string>
13 
14 #include <map>
15 #include <memory>
16 #include <stdexcept>
17 #include <vector>
18 
19 class DefaultContentManager : public ContentManager, public IGameDataLoader
20 {
21 public:
22 
23 	DefaultContentManager(GameVersion gameVersion,
24 				const ST::string &userHomeDir,
25 				const ST::string &gameResRootPath,
26 				const ST::string &externalizedDataPath);
27 
28 	virtual ~DefaultContentManager() override;
29 
30 	/// Called after construction.
31 	/// @throw runtime_error
32 	virtual void init(EngineOptions* engine_options);
33 
34 	/** Load the game data. */
35 	bool loadGameData();
36 
37 	/** Get map file path. */
38 	virtual ST::string getMapPath(const ST::string& mapName) const override;
39 
40 	/** Get radar map resource name. */
41 	virtual ST::string getRadarMapResourceName(const ST::string &mapName) const override;
42 
43 	/** Get tileset resource name. */
44 	virtual ST::string getTilesetResourceName(int number, const ST::string& fileName) const override;
45 
46 	/** Get tileset db resource name. */
47 	virtual ST::string getTilesetDBResName() const override;
48 
49 	/** Open map for reading. */
50 	virtual SGPFile* openMapForReading(const ST::string& mapName) const override;
51 
52 	/** Get directory for storing new map file. */
53 	virtual ST::string getNewMapFolder() const override;
54 
55 	/** Get all available maps. */
56 	virtual std::vector<ST::string> getAllMaps() const override;
57 
58 	/** Get all available tilecache. */
59 	virtual std::vector<ST::string> getAllTilecache() const override;
60 
61 	/* Open a game resource file for reading. */
62 	virtual SGPFile* openGameResForReading(const ST::string& filename) const override;
63 
64 	/** Open temporary file for writing. */
65 	virtual SGPFile* openTempFileForWriting(const ST::string& filename, bool truncate) const override;
66 
67 	/** Open temporary file for reading. */
68 	virtual SGPFile* openTempFileForReading(const ST::string& filename) const override;
69 
70 	/** Open temporary file for appending. */
71 	virtual SGPFile* openTempFileForAppend(const ST::string& filename) const override;
72 
73 	/** Delete temporary file. */
74 	virtual void deleteTempFile(const ST::string& filename) const override;
75 
76 	/** Open user's private file (e.g. saved game, settings) for reading. */
77 	virtual SGPFile* openUserPrivateFileForReading(const ST::string& filename) const override;
78 
79 	/* Checks if a game resource exists. */
80 	virtual bool doesGameResExists(const ST::string& filename) const override;
81 
82 	/** Get folder for screenshots. */
83 	virtual ST::string getScreenshotFolder() const override;
84 
85 	/** Get folder for video capture. */
86 	virtual ST::string getVideoCaptureFolder() const override;
87 
getDataDir()88 	const ST::string& getDataDir() { return m_dataDir; }
getTileDir()89 	const ST::string& getTileDir() { return m_tileDir; }
90 
getExternalizedDataDir()91 	const ST::string& getExternalizedDataDir() { return m_externalizedDataPath; }
92 
93 	/** Get folder for saved games. */
94 	virtual ST::string getSavedGamesFolder() const override;
95 
96 	/** Load encrypted string from game resource file. */
97 	virtual ST::string loadEncryptedString(const ST::string& fileName, uint32_t seek_chars, uint32_t read_chars) const override;
98 
99 	virtual ST::string loadEncryptedString(SGPFile* File, uint32_t seek_chars, uint32_t read_chars) const override;
100 
101 	/** Load dialogue quote from file. */
102 	virtual ST::string* loadDialogQuoteFromFile(const ST::string& filename, int quote_number) override;
103 
104 	/** Load all dialogue quotes for a character. */
105 	void loadAllDialogQuotes(STRING_ENC_TYPE encType, const ST::string& filename, std::vector<ST::string*> &quotes) const;
106 
107 	/** Get weapons with the give index. */
108 	virtual const WeaponModel* getWeapon(uint16_t index) override;
109 	virtual const WeaponModel* getWeaponByName(const ST::string &internalName) override;
110 
111 	virtual const MagazineModel* getMagazineByName(const ST::string &internalName) override;
112 	virtual const MagazineModel* getMagazineByItemIndex(uint16_t itemIndex) override;
113 	virtual const std::vector<const MagazineModel*>& getMagazines() const override;
114 
115 	virtual const CalibreModel* getCalibre(uint8_t index) override;
116 	virtual const ST::string* getCalibreName(uint8_t index) const override;
117 	virtual const ST::string* getCalibreNameForBobbyRay(uint8_t index) const override;
118 
119 	virtual const AmmoTypeModel* getAmmoType(uint8_t index) override;
120 
121 	virtual const ItemModel* getItem(uint16_t index) const override;
122 	virtual const ItemModel* getItemByName(const ST::string &internalName) const override;
123 	virtual const std::map<uint16_t, uint16_t> getMapItemReplacements() const override;
124 
125 	virtual const std::vector<std::vector<const WeaponModel*> > & getNormalGunChoice() const override;
126 	virtual const std::vector<std::vector<const WeaponModel*> > & getExtendedGunChoice() const override;
127 	virtual const std::vector<GARRISON_GROUP>& getGarrisonGroups() const override;
128 	virtual const std::vector<PATROL_GROUP>& getPatrolGroups() const override;
129 	virtual const std::vector<ARMY_COMPOSITION>& getArmyCompositions() const override;
130 
131 	virtual const DealerInventory* getDealerInventory(int dealerId) const override;
132 	virtual const DealerInventory* getBobbyRayNewInventory() const override;
133 	virtual const DealerInventory* getBobbyRayUsedInventory() const override;
134 
135 	virtual const DealerModel* getDealer(uint8_t dealerID) const override;
136 	virtual const std::vector<const DealerModel*> getDealers() const override;
137 
138 	virtual const std::vector<const ShippingDestinationModel*>& getShippingDestinations() const override;
139 	virtual const ShippingDestinationModel* getShippingDestination(uint8_t locationId) const override;
140 	virtual const ShippingDestinationModel* getPrimaryShippingDestination() const override;
141 	virtual const ST::string* getShippingDestinationName(uint8_t index) const override;
142 
143 	virtual const NpcActionParamsModel* getNpcActionParams(uint16_t actionCode) const override;
144 	virtual const FactParamsModel* getFactParams(Fact fact) const override;
145 
146 	virtual const ST::string* getMusicForMode(MusicMode mode) const override;
147 
148 	virtual const GamePolicy* getGamePolicy() const override;
149 	virtual const IMPPolicy* getIMPPolicy() const override;
150 	virtual const StrategicAIPolicy* getStrategicAIPolicy() const override;
151 
152 	virtual const ST::string* getNewString(size_t stringId) const override;
153 	virtual const ST::string& getLandTypeString(size_t index) const override;
154 
155 	virtual const std::vector<const BloodCatPlacementsModel*>& getBloodCatPlacements() const override;
156 	virtual const std::vector<const BloodCatSpawnsModel*>& getBloodCatSpawns() const override;
157 	virtual const BloodCatSpawnsModel* getBloodCatSpawnsOfSector(uint8_t sectorId) const override;
158 	virtual const std::vector<const CreatureLairModel*>& getCreatureLairs() const override;
159 	virtual const CreatureLairModel* getCreatureLair(uint8_t lairId) const override;
160 	virtual const CreatureLairModel* getCreatureLairByMineId(uint8_t mineId) const override;
161 	virtual const MineModel* getMineForSector(uint8_t sectorX, uint8_t sectorY, uint8_t sectorZ) const override;
162 	virtual const MineModel* getMine(uint8_t mineId) const override;
163 	virtual const std::vector<const MineModel*>& getMines() const override;
164 	virtual const std::vector<const SamSiteModel*>& getSamSites() const override;
165 	virtual const int8_t findSamIDBySector(uint8_t sectorId) const override;
166 	virtual const SamSiteModel* findSamSiteBySector(uint8_t sectorId) const override;
167 	virtual const int8_t getControllingSamSite(uint8_t sectorId) const override;
168 	virtual const TownModel* getTown(int8_t townId) const  override;
169 	virtual const std::map<int8_t, const TownModel*>& getTowns() const override;
170 	virtual const ST::string getTownName(uint8_t townId) const override;
171 	virtual const ST::string getTownLocative(uint8_t townId) const override;
172 	virtual const std::vector <const UndergroundSectorModel*>& getUndergroundSectors() const override;
173 	virtual const MovementCostsModel* getMovementCosts() const override;
174 	virtual int16_t getSectorLandType(uint8_t sectorID, uint8_t sectorLevel) const override;
175 	virtual const std::vector<const StrategicMapSecretModel*>& getMapSecrets() const override;
176 	virtual const CacheSectorsModel* getCacheSectors() const override;
177 	virtual const std::map<uint8_t, const NpcPlacementModel*>& listNpcPlacements() const override;
178 	virtual const NpcPlacementModel* getNpcPlacement(uint8_t profileId) const override;
179 	virtual const RPCSmallFaceModel* getRPCSmallFaceOffsets(uint8_t profileID) const override;
180 	virtual const std::vector<const MERCListingModel*>& getMERCListings() const override;
181 	virtual const std::vector<const MercProfile*>& listMercProfiles() const override;
182 	virtual const LoadingScreen* getLoadingScreenForSector(uint8_t sectorId, uint8_t sectorLevel, bool isNight) const override;
183 	virtual const LoadingScreen* getLoadingScreen(uint8_t index) const override;
184 
185 protected:
186 	ST::string m_dataDir;
187 	ST::string m_tileDir;
188 	ST::string m_userHomeDir;
189 	ST::string m_gameResRootPath;
190 	ST::string m_externalizedDataPath;
191 
192 	const GameVersion m_gameVersion;
193 
194 	std::vector<const ST::string*> m_newStrings;
195 	std::vector<const ST::string*> m_landTypeStrings;
196 
197 	std::vector<const ItemModel*> m_items;
198 	std::vector<const MagazineModel*> m_magazines;
199 
200 	std::vector<const CalibreModel*> m_calibres;
201 	std::vector<const ST::string*> m_calibreNames;
202 	std::vector<const ST::string*> m_calibreNamesBobbyRay;
203 
204 	std::vector<AmmoTypeModel*> m_ammoTypes;
205 
206 	/** Mapping of calibre names to objects. */
207 	std::map<ST::string, const AmmoTypeModel*> m_ammoTypeMap;
208 	std::map<ST::string, const CalibreModel*> m_calibreMap;
209 	std::map<ST::string, const MagazineModel*> m_magazineMap;
210 	std::map<ST::string, const WeaponModel*> m_weaponMap;
211 	std::map<ST::string, const ItemModel*> m_itemMap;
212 	std::map<uint16_t, uint16_t> m_mapItemReplacements;
213 	std::map<MusicMode, const std::vector<const ST::string*>*> m_musicMap;
214 
215 	std::vector<std::vector<const WeaponModel*> > mNormalGunChoice;
216 	std::vector<std::vector<const WeaponModel*> > mExtendedGunChoice;
217 	std::vector<GARRISON_GROUP> m_garrisonGroups;
218 	std::vector<PATROL_GROUP> m_patrolGroups;
219 	std::vector<ARMY_COMPOSITION> m_armyCompositions;
220 
221 	std::vector<const DealerInventory*> m_dealersInventory;
222 	const DealerInventory *m_bobbyRayNewInventory;
223 	const DealerInventory *m_bobbyRayUsedInventory;
224 
225 	std::vector<const DealerModel*> m_dealers;
226 
227 	std::vector<const ShippingDestinationModel*> m_shippingDestinations;
228 	std::vector<const ST::string*> m_shippingDestinationNames;
229 
230 	std::map<Fact, const FactParamsModel*> m_factParams;
231 	std::map<uint16_t, const NpcActionParamsModel*> m_npcActionParams;
232 	std::map<uint8_t, const NpcPlacementModel*> m_npcPlacements;
233 
234 	const IMPPolicy *m_impPolicy;
235 	const GamePolicy *m_gamePolicy;
236 	const StrategicAIPolicy *m_strategicAIPolicy;
237 
238 	const CacheSectorsModel* m_cacheSectors;
239 	const LoadingScreenModel* m_loadingScreenModel;
240 	const MovementCostsModel* m_movementCosts;
241 	std::map<std::tuple<uint8_t, uint8_t>, uint8_t> m_sectorLandTypes;
242 
243 	std::vector<const BloodCatPlacementsModel*> m_bloodCatPlacements;
244 	std::vector<const BloodCatSpawnsModel*> m_bloodCatSpawns;
245 	std::vector<const CreatureLairModel*> m_creatureLairs;
246 	std::vector<const MineModel*> m_mines;
247 	std::vector<const SamSiteModel*> m_samSites;
248 	const SamSiteAirControlModel* m_samSitesAirControl;
249 	std::vector<const StrategicMapSecretModel*> m_mapSecrets;
250 	std::map<int8_t, const TownModel*> m_towns;
251 	std::vector<const ST::string*> m_townNames;
252 	std::vector<const ST::string*> m_townNameLocatives;
253 	std::vector<const UndergroundSectorModel*> m_undergroundSectors;
254 
255 	std::map<uint8_t, const RPCSmallFaceModel*> m_rpcSmallFaces;
256 	std::vector<const MERCListingModel*> m_MERCListings;
257 
258 	// List of pre-constructed MercProfile objects; indices of elements are arbitrary (unlike gMercProfiles) and not guaranteed to follow any order
259 	std::vector<const MercProfile*> m_mercProfiles;
260 	std::map<uint8_t, const MercProfileInfo*> m_mercProfileInfo;
261 
262 	RustPointer<Vfs> m_vfs;
263 
264 	bool loadWeapons();
265 	bool loadItems();
266 	bool loadMagazines();
267 	bool loadCalibres();
268 	bool loadAmmoTypes();
269 	bool loadArmyData();
270 	bool loadMusicModeList(MusicMode mode, rapidjson::Value &array);
271 	bool loadMusic();
272 
273 	const DealerInventory * loadDealerInventory(const ST::string& fileName);
274 	bool loadAllDealersAndInventory();
275 	void loadStringRes(const ST::string& name, std::vector<const ST::string*> &strings) const;
276 
277 	bool readWeaponTable(
278 		const ST::string& fileName,
279 		std::vector<std::vector<const WeaponModel*> > & weaponTable);
280 
281 	bool loadStrategicLayerData();
282 	bool loadTacticalLayerData();
283 	bool loadMercsData();
284 
285 	std::unique_ptr<rapidjson::Document> readJsonDataFile(const ST::string& fileName) const;
286 
287 	/**
288 	 * @param profileID
289 	 * @return pointer to a MercProfileInfo. Never returns null. A pointer to the empty instance is returned if not defined in JSON.
290 	 */
291 	const MercProfileInfo* getMercProfileInfo(uint8_t profileID) const;
292 };
293