Peoplemon  0.1.0
Peoplemon 3 game source documentation
GameSave.hpp
Go to the documentation of this file.
1 #ifndef CORE_FILES_GAMESAVE_HPP
2 #define CORE_FILES_GAMESAVE_HPP
3 
4 #include <BLIB/Events.hpp>
5 #include <BLIB/Serialization/JSON.hpp>
6 #include <BLIB/Tilemap/Position.hpp>
8 #include <Core/Player/Bag.hpp>
9 #include <Core/Player/Gender.hpp>
11 #include <Core/Systems/Clock.hpp>
13 
14 namespace core
15 {
16 namespace file
17 {
24 struct GameSave {
26  unsigned long long saveTime;
27 
29  std::string saveName;
30 
33  std::unordered_map<std::string, std::unordered_set<std::string>>* talkedto;
34  std::unordered_set<std::string>* convFlags;
36 
39  std::string* playerName;
42  long* monei;
43  std::vector<pplmn::OwnedPeoplemon>* peoplemon;
44  std::string* whiteoutMap;
45  unsigned int* whiteoutSpawn;
46  unsigned int* repelSteps;
47  std::array<std::vector<pplmn::StoredPeoplemon>, player::StorageSystem::BoxCount>* storage;
48  std::unordered_set<std::string>* visitedTowns;
49  std::unordered_map<pplmn::Id, std::uint32_t>* seenPeoplemon;
50  std::unordered_map<pplmn::Id, std::string>* firstSightingLocations;
51  } player;
52 
55  std::string* currentMap;
56  std::string* prevMap;
57  bl::tmap::Position* playerPos;
58  bl::tmap::Position* prevPlayerPos;
59  } world;
60 
63  std::unordered_map<std::string, bl::script::Value>* entries;
65 
67  struct ClockPointers {
69  } clock;
70 
72  struct TrainerPointers {
73  std::unordered_set<std::string>* defeated;
75 
80  GameSave();
81 
87  static void listSaves(std::vector<GameSave>& result);
88 
96  static bool saveGame(const std::string& name);
97 
104  static bool loadFromFile(const std::string& sourceFile);
105 
112  bool load();
113 
118  void editorSave();
119 
126  bool remove() const;
127 
134  bool operator<(const GameSave& rhs) const;
135 
141  void useLocalData();
142 
150  static std::string filename(const std::string& saveName);
151 
152 private:
153  struct Data {
154  std::unordered_map<std::string, std::unordered_set<std::string>> talkedto;
155  std::unordered_set<std::string> convFlags;
156  std::string playerName;
157  player::Gender sex;
158  player::Bag inventory;
159  long monei;
160  std::vector<pplmn::OwnedPeoplemon> peoplemon;
161  std::string whiteoutMap;
162  unsigned int whiteoutSpawn;
163  unsigned int repelSteps;
164  std::array<std::vector<pplmn::StoredPeoplemon>, player::StorageSystem::BoxCount> storage;
165  std::unordered_set<std::string> visitedTowns;
166  std::string currentMap;
167  std::string prevMap;
168  bl::tmap::Position playerPos;
169  bl::tmap::Position prevPlayerPos;
170  std::unordered_map<std::string, bl::script::Value> entries;
171  system::Clock::Time clockTime;
172  std::unordered_set<std::string> defeatedTrainers;
173  std::unordered_map<pplmn::Id, std::uint32_t> seenPeoplemon;
174  std::unordered_map<pplmn::Id, std::string> firstSightingLocations;
175  };
176 
177  std::optional<Data> localData;
178  std::string sourceFile;
179 };
180 
181 } // namespace file
182 } // namespace core
183 
184 namespace bl
185 {
186 namespace serial
187 {
188 template<>
189 struct SerializableObject<core::file::GameSave::InteractDataPointers>
190 : public SerializableObjectBase {
192  using M = std::unordered_map<std::string, std::unordered_set<std::string>>;
193  using F = std::unordered_set<std::string>;
194 
195  SerializableField<1, I, M*> talkedTo;
196  SerializableField<2, I, F*> flags;
197 
199  : SerializableObjectBase("GameSaveInteraction")
200  , talkedTo("talked", *this, &I::talkedto, SerializableFieldBase::Required{})
201  , flags("flags", *this, &I::convFlags, SerializableFieldBase::Required{}) {}
202 };
203 
204 template<>
205 struct SerializableObject<core::file::GameSave::WorldDataPointers> : SerializableObjectBase {
207  using Pos = bl::tmap::Position;
208 
209  SerializableField<1, World, std::string*> currentMap;
210  SerializableField<2, World, std::string*> prevMap;
211  SerializableField<3, World, Pos*> playerPos;
212  SerializableField<4, World, Pos*> prevPlayerPos;
213 
215  : SerializableObjectBase("GameSaveWorld")
216  , currentMap("current", *this, &World::currentMap, SerializableFieldBase::Required{})
217  , prevMap("previous", *this, &World::prevMap, SerializableFieldBase::Required{})
218  , playerPos("position", *this, &World::playerPos, SerializableFieldBase::Required{})
219  , prevPlayerPos("prevPos", *this, &World::prevPlayerPos, SerializableFieldBase::Required{}) {}
220 };
221 
222 template<>
223 struct SerializableObject<core::file::GameSave::PlayerDataPointers>
224 : public SerializableObjectBase {
226 
227  SerializableField<1, Player, std::string*> name;
228  SerializableField<2, Player, core::player::Gender*> gender;
229  SerializableField<3, Player, core::player::Bag*> bag;
230  SerializableField<4, Player, std::vector<core::pplmn::OwnedPeoplemon>*> peoplemon;
231  SerializableField<5, Player, long*> money;
232  SerializableField<6, Player, std::string*> whiteoutMap;
233  SerializableField<7, Player, unsigned int*> whiteoutSpawn;
234  SerializableField<8, Player, unsigned int*> repelSteps;
235  SerializableField<9, Player,
236  std::array<std::vector<core::pplmn::StoredPeoplemon>,
239  SerializableField<10, Player, std::unordered_set<std::string>*> visitedTowns;
240  SerializableField<11, Player, std::unordered_map<core::pplmn::Id, std::uint32_t>*> seenCounts;
241  SerializableField<12, Player, std::unordered_map<core::pplmn::Id, std::string>*> seenSpots;
242 
244  : SerializableObjectBase("GameSavePlayer")
245  , name("name", *this, &Player::playerName, SerializableFieldBase::Required{})
246  , gender("gender", *this, &Player::sex, SerializableFieldBase::Required{})
247  , bag("bag", *this, &Player::inventory, SerializableFieldBase::Required{})
248  , peoplemon("peoplemon", *this, &Player::peoplemon, SerializableFieldBase::Required{})
249  , money("money", *this, &Player::monei, SerializableFieldBase::Required{})
250  , whiteoutMap("whiteoutMap", *this, &Player::whiteoutMap, SerializableFieldBase::Required{})
251  , whiteoutSpawn("whiteoutSpawn", *this, &Player::whiteoutSpawn,
252  SerializableFieldBase::Required{})
253  , repelSteps("repelSteps", *this, &Player::repelSteps, SerializableFieldBase::Required{})
254  , storage("storage", *this, &Player::storage, SerializableFieldBase::Optional{})
255  , visitedTowns("visitedTowns", *this, &Player::visitedTowns, SerializableFieldBase::Optional{})
256  , seenCounts("seenPeoplemon", *this, &Player::seenPeoplemon, SerializableFieldBase::Optional{})
257  , seenSpots("seenSpots", *this, &Player::firstSightingLocations,
258  SerializableFieldBase::Optional{}) {}
259 };
260 
261 template<>
262 struct SerializableObject<core::file::GameSave::ScriptDataPointers>
263 : public SerializableObjectBase {
265  using M = std::unordered_map<std::string, bl::script::Value>;
266 
267  SerializableField<1, S, M*> entries;
268 
270  : SerializableObjectBase("GameSaveScript")
271  , entries("saveEntries", *this, &S::entries, SerializableFieldBase::Required{}) {}
272 };
273 
274 template<>
275 struct SerializableObject<core::file::GameSave::ClockPointers> : public SerializableObjectBase {
278 
279  SerializableField<1, C, T*> time;
280 
282  : SerializableObjectBase("GameSaveTime")
283  , time("time", *this, &C::time, SerializableFieldBase::Required{}) {}
284 };
285 
286 template<>
287 struct SerializableObject<core::file::GameSave::TrainerPointers> : public SerializableObjectBase {
289  using D = std::unordered_set<std::string>;
290 
291  SerializableField<1, T, D*> defeated;
292 
294  : SerializableObjectBase("GameSaveTrainer")
295  , defeated("defeated", *this, &T::defeated, SerializableFieldBase::Required{}) {}
296 };
297 
298 template<>
299 struct SerializableObject<core::file::GameSave> : public SerializableObjectBase {
301  SerializableField<1, GS, unsigned long long> saveTime;
302  SerializableField<2, GS, GS::PlayerDataPointers> player;
303  SerializableField<3, GS, GS::InteractDataPointers> interaction;
304  SerializableField<4, GS, GS::WorldDataPointers> world;
305  SerializableField<5, GS, GS::ScriptDataPointers> script;
306  SerializableField<6, GS, GS::ClockPointers> clock;
307 
309  : SerializableObjectBase("GameSave")
310  , saveTime("saveTime", *this, &GS::saveTime, SerializableFieldBase::Required{})
311  , player("player", *this, &GS::player, SerializableFieldBase::Required{})
312  , interaction("interaction", *this, &GS::interaction, SerializableFieldBase::Required{})
313  , world("world", *this, &GS::world, SerializableFieldBase::Required{})
314  , script("script", *this, &GS::scripts, SerializableFieldBase::Required{})
315  , clock("clock", *this, &GS::clock, SerializableFieldBase::Required{}) {}
316 };
317 
318 } // namespace serial
319 } // namespace bl
320 
321 #endif
Gender
Possible genders for the player.
Definition: Gender.hpp:24
Core classes and functionality for both the editor and game.
Represents a game save and provides functionality to load and save.
Definition: GameSave.hpp:24
bool operator<(const GameSave &rhs) const
For sorting.
Definition: GameSave.cpp:116
struct core::file::GameSave::ScriptDataPointers scripts
struct core::file::GameSave::TrainerPointers trainers
struct core::file::GameSave::WorldDataPointers world
static bool loadFromFile(const std::string &sourceFile)
Loads the game from the given save file.
Definition: GameSave.cpp:78
struct core::file::GameSave::PlayerDataPointers player
GameSave()
Initializes all pointers to the local members.
Definition: GameSave.cpp:152
struct core::file::GameSave::InteractDataPointers interaction
unsigned long long saveTime
Local timestamp that the save was modified on.
Definition: GameSave.hpp:26
bool load()
Loads the save represented by this object and fires an event::GameSaveLoaded event to allow systems t...
Definition: GameSave.cpp:90
static bool saveGame(const std::string &name)
Saves the game. Fires an event::GameSaveInitializing event for systems to add their data to the save ...
Definition: GameSave.cpp:62
static std::string filename(const std::string &saveName)
Returns the filename for the given save name.
Definition: GameSave.cpp:180
void useLocalData()
Instantiates the save data in this object and sets all the pointers to it. Useful for loading a save ...
Definition: GameSave.cpp:121
static void listSaves(std::vector< GameSave > &result)
Lists all saves in the save directory.
Definition: GameSave.cpp:40
bool remove() const
Deletes the game save.
Definition: GameSave.cpp:114
std::string saveName
Same as the player name but always valid.
Definition: GameSave.hpp:29
void editorSave()
Saves the data back to the file it was loaded from.
Definition: GameSave.cpp:84
struct core::file::GameSave::ClockPointers clock
Stores pointers to the actual data to save/load from.
Definition: GameSave.hpp:32
std::unordered_set< std::string > * convFlags
Definition: GameSave.hpp:34
std::unordered_map< std::string, std::unordered_set< std::string > > * talkedto
Definition: GameSave.hpp:33
Stores pointers to the actual data to save/load from.
Definition: GameSave.hpp:38
std::unordered_map< pplmn::Id, std::string > * firstSightingLocations
Definition: GameSave.hpp:50
std::array< std::vector< pplmn::StoredPeoplemon >, player::StorageSystem::BoxCount > * storage
Definition: GameSave.hpp:47
std::unordered_set< std::string > * visitedTowns
Definition: GameSave.hpp:48
std::vector< pplmn::OwnedPeoplemon > * peoplemon
Definition: GameSave.hpp:43
std::unordered_map< pplmn::Id, std::uint32_t > * seenPeoplemon
Definition: GameSave.hpp:49
Stores pointers to the actual data to save/load from.
Definition: GameSave.hpp:54
bl::tmap::Position * prevPlayerPos
Definition: GameSave.hpp:58
Stores pointers to the actual data to save/load from.
Definition: GameSave.hpp:62
std::unordered_map< std::string, bl::script::Value > * entries
Definition: GameSave.hpp:63
Stores the date in game.
Definition: GameSave.hpp:67
system::Clock::Time * time
Definition: GameSave.hpp:68
Stores defeated trainer information.
Definition: GameSave.hpp:72
std::unordered_set< std::string > * defeated
Definition: GameSave.hpp:73
std::unordered_map< std::string, std::unordered_set< std::string > > M
Definition: GameSave.hpp:192
SerializableField< 12, Player, std::unordered_map< core::pplmn::Id, std::string > * > seenSpots
Definition: GameSave.hpp:241
SerializableField< 2, Player, core::player::Gender * > gender
Definition: GameSave.hpp:228
SerializableField< 4, Player, std::vector< core::pplmn::OwnedPeoplemon > * > peoplemon
Definition: GameSave.hpp:230
SerializableField< 8, Player, unsigned int * > repelSteps
Definition: GameSave.hpp:234
SerializableField< 7, Player, unsigned int * > whiteoutSpawn
Definition: GameSave.hpp:233
SerializableField< 6, Player, std::string * > whiteoutMap
Definition: GameSave.hpp:232
SerializableField< 11, Player, std::unordered_map< core::pplmn::Id, std::uint32_t > * > seenCounts
Definition: GameSave.hpp:240
SerializableField< 10, Player, std::unordered_set< std::string > * > visitedTowns
Definition: GameSave.hpp:239
SerializableField< 3, Player, core::player::Bag * > bag
Definition: GameSave.hpp:229
SerializableField< 9, Player, std::array< std::vector< core::pplmn::StoredPeoplemon >, core::player::StorageSystem::BoxCount > * > storage
Definition: GameSave.hpp:238
std::unordered_map< std::string, bl::script::Value > M
Definition: GameSave.hpp:265
SerializableField< 3, GS, GS::InteractDataPointers > interaction
Definition: GameSave.hpp:303
SerializableField< 5, GS, GS::ScriptDataPointers > script
Definition: GameSave.hpp:305
SerializableField< 1, GS, unsigned long long > saveTime
Definition: GameSave.hpp:301
SerializableField< 2, GS, GS::PlayerDataPointers > player
Definition: GameSave.hpp:302
SerializableField< 6, GS, GS::ClockPointers > clock
Definition: GameSave.hpp:306
SerializableField< 4, GS, GS::WorldDataPointers > world
Definition: GameSave.hpp:304
Basic inventory class for managing player items.
Definition: Bag.hpp:18
static constexpr int BoxCount
Simple struct representing a point in time.
Definition: Clock.hpp:32