SaveGame.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. * Copyright © 2011-2020 Frictional Games
  3. *
  4. * This file is part of Amnesia: A Machine For Pigs.
  5. *
  6. * Amnesia: A Machine For Pigs is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. * Amnesia: A Machine For Pigs is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with Amnesia: A Machine For Pigs. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. #ifndef HPL_SAVE_GAME_H
  19. #define HPL_SAVE_GAME_H
  20. #include <map>
  21. #include "system/SystemTypes.h"
  22. #include "system/SerializeClass.h"
  23. class TiXmlElement;
  24. #define kSaveData_LoadFromBegin(aClass) \
  25. __super::LoadFromSaveData(apSaveData); \
  26. cSaveData_##aClass *pData = static_cast<cSaveData_##aClass*>(apSaveData);
  27. #define kSaveData_SaveToBegin(aClass) \
  28. __super::SaveToSaveData(apSaveData);\
  29. cSaveData_##aClass *pData = static_cast<cSaveData_##aClass*>(apSaveData);
  30. #define kSaveData_SetupBegin(aClass) \
  31. __super::SaveDataSetup(apSaveObjectHandler,apGame);\
  32. cSaveData_##aClass *pData = static_cast<cSaveData_##aClass*>(mpSaveData); \
  33. const char *sClassNameString = #aClass;
  34. #define kSaveData_BaseClass(aClass) class cSaveData_##aClass : public iSaveData
  35. #define kSaveData_ChildClass(aParent, aChild) class cSaveData_##aChild : public cSaveData_##aParent
  36. #define kSaveData_ClassInit(aClass) kSerializableClassInit(cSaveData_##aClass)
  37. //////////////////////////////////////////////
  38. //Helpers to copy data.
  39. #define kSaveData_SaveTo(aVar) pData->aVar = aVar;
  40. #define kSaveData_LoadFrom(aVar) aVar = pData->aVar;
  41. #define kSaveData_SaveObject(aObject, aId) \
  42. if(aObject) \
  43. pData->aId = aObject->GetSaveObjectId(); \
  44. else \
  45. pData->aId = -1;
  46. //Only used in setup:
  47. #define kSaveData_LoadObject(aObject, aId,aClass) \
  48. if(pData->aId == -1) \
  49. aObject = NULL; \
  50. else {\
  51. aObject = static_cast<aClass>(apSaveObjectHandler->Get(pData->aId)); \
  52. }
  53. //////////////////////////////////////////////
  54. //Helpers to copy containers with SaveDataId
  55. #define kSaveData_SaveIdList(aSrcList,aSrcIt,aDestList) \
  56. pData->aDestList.Clear(); \
  57. for(aSrcIt it = aSrcList.begin();it != aSrcList.end();++it) \
  58. { \
  59. pData->aDestList.Add((*it)->GetSaveObjectId()); \
  60. }
  61. //Only used in setup:
  62. #define kSaveData_LoadIdList(aSrcList,aDestList, aClass) \
  63. { cContainerListIterator<int> it = pData->aDestList.GetIterator(); \
  64. aSrcList.clear(); \
  65. while(it.HasNext()) \
  66. { \
  67. int lId = it.Next(); \
  68. iSaveObject* pObject = apSaveObjectHandler->Get(lId); \
  69. if(pObject==NULL) \
  70. { \
  71. continue; \
  72. } \
  73. aSrcList.push_back(static_cast<aClass>(pObject)); \
  74. } \
  75. }
  76. namespace hpl {
  77. //--------------------------------------------------------
  78. class cSaveObjectHandler;
  79. class iSaveObject;
  80. class cEngine;
  81. /**
  82. * This is data that is created by a SaveObject and the data can be loaded into the object.
  83. */
  84. class iSaveData : public iSerializable
  85. {
  86. kSerializableClassInit(iSaveData)
  87. public:
  88. virtual ~iSaveData() {}
  89. int mlSaveDataId;
  90. /**
  91. * Creates the SaveObject using previously saved objects and the data in this class.
  92. */
  93. virtual iSaveObject* CreateSaveObject(cSaveObjectHandler *apSaveObjectHandler,cEngine *apGame)=0;
  94. /**
  95. * The lower number the earlier it will be created.
  96. */
  97. virtual int GetSaveCreatePrio()=0;
  98. };
  99. //--------------------------------------------------------
  100. /**
  101. * This is class is inherited by object that are to be saved.
  102. */
  103. class iSaveObject
  104. {
  105. friend class cSaveObjectHandler;
  106. public:
  107. iSaveObject();
  108. ~iSaveObject();
  109. /**
  110. * Get a unique id for this object.
  111. */
  112. int GetSaveObjectId(){ return mlSaveObjectId;}
  113. /**
  114. * Save it's data to a SaveData
  115. */
  116. virtual void SaveToSaveData(iSaveData *apSaveData);
  117. /**
  118. * Load it's data from a SaveData
  119. */
  120. virtual void LoadFromSaveData(iSaveData *apSaveData);
  121. /**
  122. * Creates the SaveData that this class uses.
  123. */
  124. virtual iSaveData* CreateSaveData()=0;
  125. /**
  126. * After all objects have been created, this function is called to enable setup.
  127. */
  128. virtual void SaveDataSetup(cSaveObjectHandler *apSaveObjectHandler, cEngine *apGame);
  129. void SetIsSaved(bool abX){ mbIsSaved = abX;}
  130. bool IsSaved(){ return mbIsSaved;}
  131. protected:
  132. iSaveData *mpSaveData;
  133. private:
  134. int mlSaveObjectId;
  135. bool mbIsSaved;
  136. static int _mlGlobalIdCount;
  137. };
  138. //---------------------------------------------------------
  139. typedef std::multimap<int, iSaveObject*> tSaveObjectMap;
  140. typedef tSaveObjectMap::iterator tSaveObjectMapIt;
  141. typedef cSTLMapIterator<iSaveObject*,tSaveObjectMap,tSaveObjectMapIt> cSaveObjectIterator;
  142. /**
  143. * This store all the SaveObjects created at load time.
  144. */
  145. class cSaveObjectHandler
  146. {
  147. public:
  148. cSaveObjectHandler();
  149. ~cSaveObjectHandler();
  150. public:
  151. void Add(iSaveObject *pObject);
  152. iSaveObject* Get(int alId);
  153. cSaveObjectIterator GetIterator();
  154. void SetUpAll(cEngine *apGame);
  155. void Clear();
  156. size_t Size();
  157. private:
  158. tSaveObjectMap m_mapSaveObjects;
  159. };
  160. //---------------------------------------------------------
  161. typedef std::multimap<int, iSaveData*> tSaveDataMap;
  162. typedef tSaveDataMap::iterator tSaveDataMapIt;
  163. typedef cSTLMapIterator<iSaveData*,tSaveDataMap,tSaveDataMapIt> cSaveDataIterator;
  164. /**
  165. * Used to keep track of save data.
  166. */
  167. class cSaveDataHandler : public iContainer
  168. {
  169. public:
  170. cSaveDataHandler();
  171. ~cSaveDataHandler();
  172. void Add(iSaveData *pData);
  173. cSaveDataIterator GetIterator();
  174. void Clear();
  175. size_t Size();
  176. private:
  177. void AddVoidPtr(void **apPtr);
  178. void AddVoidClass(void *apClass);
  179. iContainerIterator* CreateIteratorPtr();
  180. tSaveDataMap m_mapSaveData;
  181. };
  182. //---------------------------------------------------------
  183. };
  184. #endif // HPL_SAVE_GAME_H