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*> "es) 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