CRmgTemplate.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /*
  2. * CRmgTemplate.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "../int3.h"
  12. #include "../GameConstants.h"
  13. #include "../Point.h"
  14. #include "../ResourceSet.h"
  15. #include "ObjectInfo.h"
  16. #include "ObjectConfig.h"
  17. #include "../mapObjectConstructors/CObjectClassesHandler.h"
  18. VCMI_LIB_NAMESPACE_BEGIN
  19. class JsonSerializeFormat;
  20. struct CompoundMapObjectID;
  21. class TemplateEditor;
  22. enum class ETemplateZoneType
  23. {
  24. PLAYER_START,
  25. CPU_START,
  26. TREASURE,
  27. JUNCTION,
  28. WATER,
  29. SEALED
  30. };
  31. namespace EWaterContent // Not enum class, because it's used in method RandomMapTab::setMapGenOptions
  32. { // defined in client\lobby\RandomMapTab.cpp and probably in other similar places
  33. enum EWaterContent // as an argument of CToggleGroup::setSelected(int id) from \client\widgets\Buttons.cpp
  34. {
  35. RANDOM = -1,
  36. NONE,
  37. NORMAL,
  38. ISLANDS
  39. };
  40. }
  41. namespace EMonsterStrength // used as int in monster generation procedure and in map description for the generated random map
  42. {
  43. enum EMonsterStrength
  44. {
  45. ZONE_NONE = -3,
  46. RANDOM = -2,
  47. ZONE_WEAK = -1,
  48. ZONE_NORMAL = 0,
  49. ZONE_STRONG = 1,
  50. GLOBAL_WEAK = 2,
  51. GLOBAL_NORMAL = 3,
  52. GLOBAL_STRONG = 4
  53. };
  54. }
  55. class DLL_LINKAGE CTreasureInfo
  56. {
  57. public:
  58. ui32 min;
  59. ui32 max;
  60. ui16 density;
  61. CTreasureInfo();
  62. CTreasureInfo(ui32 min, ui32 max, ui16 density);
  63. bool operator ==(const CTreasureInfo & other) const;
  64. void serializeJson(JsonSerializeFormat & handler);
  65. };
  66. namespace rmg
  67. {
  68. enum class EConnectionType
  69. {
  70. GUARDED = 0, //default
  71. FICTIVE,
  72. REPULSIVE,
  73. WIDE,
  74. FORCE_PORTAL
  75. };
  76. enum class ERoadOption
  77. {
  78. ROAD_TRUE,
  79. ROAD_FALSE,
  80. ROAD_RANDOM
  81. };
  82. class DLL_LINKAGE ZoneConnection
  83. {
  84. #ifdef ENABLE_TEMPLATE_EDITOR
  85. friend class ::TemplateEditor;
  86. #endif
  87. public:
  88. ZoneConnection();
  89. int getId() const;
  90. void setId(int id);
  91. TRmgTemplateZoneId getZoneA() const;
  92. TRmgTemplateZoneId getZoneB() const;
  93. TRmgTemplateZoneId getOtherZoneId(TRmgTemplateZoneId id) const;
  94. int getGuardStrength() const;
  95. rmg::EConnectionType getConnectionType() const;
  96. rmg::ERoadOption getRoadOption() const;
  97. void serializeJson(JsonSerializeFormat & handler);
  98. friend bool operator==(const ZoneConnection &, const ZoneConnection &);
  99. private:
  100. int id;
  101. TRmgTemplateZoneId zoneA;
  102. TRmgTemplateZoneId zoneB;
  103. int guardStrength;
  104. rmg::EConnectionType connectionType;
  105. rmg::ERoadOption hasRoad;
  106. };
  107. class DLL_LINKAGE ZoneOptions
  108. {
  109. #ifdef ENABLE_TEMPLATE_EDITOR
  110. friend class ::TemplateEditor;
  111. #endif
  112. public:
  113. static const TRmgTemplateZoneId NO_ZONE;
  114. class DLL_LINKAGE CTownInfo
  115. {
  116. #ifdef ENABLE_TEMPLATE_EDITOR
  117. friend class ::TemplateEditor;
  118. #endif
  119. public:
  120. CTownInfo();
  121. int getTownCount() const;
  122. int getCastleCount() const;
  123. int getTownDensity() const;
  124. int getCastleDensity() const;
  125. void serializeJson(JsonSerializeFormat & handler);
  126. private:
  127. int townCount;
  128. int castleCount;
  129. int townDensity;
  130. int castleDensity;
  131. // TODO: Copy from another zone once its randomized
  132. TRmgTemplateZoneId townTypesLikeZone = NO_ZONE;
  133. TRmgTemplateZoneId townTypesNotLikeZone = NO_ZONE;
  134. TRmgTemplateZoneId townTypesRelatedToZoneTerrain = NO_ZONE;
  135. };
  136. class DLL_LINKAGE CTownHints
  137. {
  138. public:
  139. CTownHints();
  140. // TODO: Make private
  141. TRmgTemplateZoneId likeZone = NO_ZONE;
  142. std::vector<TRmgTemplateZoneId> notLikeZone;
  143. TRmgTemplateZoneId relatedToZoneTerrain = NO_ZONE;
  144. void serializeJson(JsonSerializeFormat & handler);
  145. };
  146. ZoneOptions();
  147. TRmgTemplateZoneId getId() const;
  148. void setId(TRmgTemplateZoneId value);
  149. ETemplateZoneType getType() const;
  150. void setType(ETemplateZoneType value);
  151. int getSize() const;
  152. void setSize(int value);
  153. std::optional<int> getOwner() const;
  154. std::set<TerrainId> getTerrainTypes() const;
  155. void setTerrainTypes(const std::set<TerrainId> & value);
  156. std::set<TerrainId> getDefaultTerrainTypes() const;
  157. const CTownInfo & getPlayerTowns() const;
  158. void setPlayerTowns(const CTownInfo & value);
  159. const CTownInfo & getNeutralTowns() const;
  160. void setNeutralTowns(const CTownInfo & value);
  161. bool isMatchTerrainToTown() const;
  162. void setMatchTerrainToTown(bool value);
  163. const std::vector<CTownHints> & getTownHints() const;
  164. void setTownHints(const std::vector<CTownHints> & value);
  165. std::set<FactionID> getTownTypes() const;
  166. void setTownTypes(const std::set<FactionID> & value);
  167. std::set<FactionID> getBannedTownTypes() const;
  168. void setBannedTownTypes(const std::set<FactionID> & value);
  169. std::set<FactionID> getDefaultTownTypes() const;
  170. std::set<FactionID> getMonsterTypes() const;
  171. void setMonsterTypes(const std::set<FactionID> & value);
  172. void setMinesInfo(const std::map<TResource, ui16> & value);
  173. std::map<TResource, ui16> getMinesInfo() const;
  174. void setTreasureInfo(const std::vector<CTreasureInfo> & value);
  175. void addTreasureInfo(const CTreasureInfo & value);
  176. std::vector<CTreasureInfo> getTreasureInfo() const;
  177. ui32 getMaxTreasureValue() const;
  178. void recalculateMaxTreasureValue();
  179. TRmgTemplateZoneId getMinesLikeZone() const;
  180. TRmgTemplateZoneId getTerrainTypeLikeZone() const;
  181. TRmgTemplateZoneId getTreasureLikeZone() const;
  182. void addConnection(const ZoneConnection & connection);
  183. std::vector<ZoneConnection> getConnections() const;
  184. std::vector<TRmgTemplateZoneId> getConnectedZoneIds() const;
  185. void serializeJson(JsonSerializeFormat & handler);
  186. EMonsterStrength::EMonsterStrength monsterStrength;
  187. bool areTownsSameType() const;
  188. // Get a group of configured objects
  189. const std::vector<CompoundMapObjectID> & getBannedObjects() const;
  190. const std::vector<ObjectConfig::EObjectCategory> & getBannedObjectCategories() const;
  191. const std::vector<ObjectInfo> & getConfiguredObjects() const;
  192. // Copy whole custom object config from another zone
  193. ObjectConfig getCustomObjects() const;
  194. void setCustomObjects(const ObjectConfig & value);
  195. TRmgTemplateZoneId getCustomObjectsLikeZone() const;
  196. TRmgTemplateZoneId getTownsLikeZone() const;
  197. Point getVisiblePosition() const;
  198. void setVisiblePosition(Point value);
  199. float getVisibleSize() const;
  200. void setVisibleSize(float value);
  201. protected:
  202. TRmgTemplateZoneId id;
  203. ETemplateZoneType type;
  204. int size;
  205. ui32 maxTreasureValue;
  206. std::optional<int> owner;
  207. Point visiblePosition;
  208. float visibleSize;
  209. ObjectConfig objectConfig;
  210. CTownInfo playerTowns;
  211. CTownInfo neutralTowns;
  212. bool matchTerrainToTown;
  213. std::set<TerrainId> terrainTypes;
  214. std::set<TerrainId> bannedTerrains;
  215. bool townsAreSameType;
  216. std::vector<CTownHints> townHints; // For every town present on map
  217. std::set<FactionID> townTypes;
  218. std::set<FactionID> bannedTownTypes;
  219. std::set<FactionID> monsterTypes;
  220. std::set<FactionID> bannedMonsters;
  221. std::map<TResource, ui16> mines; //obligatory mines to spawn in this zone
  222. std::vector<CTreasureInfo> treasureInfo;
  223. std::vector<TRmgTemplateZoneId> connectedZoneIds; //list of adjacent zone ids
  224. std::vector<ZoneConnection> connectionDetails; //list of connections linked to that zone
  225. TRmgTemplateZoneId townsLikeZone;
  226. TRmgTemplateZoneId minesLikeZone;
  227. TRmgTemplateZoneId terrainTypeLikeZone;
  228. TRmgTemplateZoneId treasureLikeZone;
  229. TRmgTemplateZoneId customObjectsLikeZone;
  230. };
  231. }
  232. /// The CRmgTemplate describes a random map template.
  233. class DLL_LINKAGE CRmgTemplate : boost::noncopyable
  234. {
  235. #ifdef ENABLE_TEMPLATE_EDITOR
  236. friend class ::TemplateEditor;
  237. #endif
  238. public:
  239. using Zones = std::map<TRmgTemplateZoneId, std::shared_ptr<rmg::ZoneOptions>>;
  240. class DLL_LINKAGE CPlayerCountRange
  241. {
  242. #ifdef ENABLE_TEMPLATE_EDITOR
  243. friend class ::TemplateEditor;
  244. #endif
  245. public:
  246. void addRange(int lower, int upper);
  247. void addNumber(int value);
  248. bool isInRange(int count) const;
  249. std::set<int> getNumbers() const;
  250. std::string toString() const;
  251. void fromString(const std::string & value);
  252. int maxValue() const;
  253. int minValue() const;
  254. private:
  255. std::vector<std::pair<int, int> > range;
  256. };
  257. CRmgTemplate();
  258. ~CRmgTemplate();
  259. bool matchesSize(const int3 & value) const;
  260. bool isWaterContentAllowed(EWaterContent::EWaterContent waterContent) const;
  261. const std::set<EWaterContent::EWaterContent> & getWaterContentAllowed() const;
  262. void setId(const std::string & value);
  263. void setName(const std::string & value);
  264. const std::string & getId() const;
  265. const std::string & getName() const;
  266. const std::string & getDescription() const;
  267. const CPlayerCountRange & getPlayers() const;
  268. const CPlayerCountRange & getHumanPlayers() const;
  269. std::pair<int3, int3> getMapSizes() const;
  270. const Zones & getZones() const;
  271. const JsonNode & getMapSettings() const;
  272. const std::vector<rmg::ZoneConnection> & getConnectedZoneIds() const;
  273. void validate() const; /// Tests template on validity and throws exception on failure
  274. void serializeJson(JsonSerializeFormat & handler);
  275. void afterLoad();
  276. private:
  277. std::string id;
  278. std::string name;
  279. std::string description;
  280. int3 minSize;
  281. int3 maxSize;
  282. CPlayerCountRange players;
  283. CPlayerCountRange humanPlayers;
  284. Zones zones;
  285. std::vector<rmg::ZoneConnection> connections;
  286. std::set<EWaterContent::EWaterContent> allowedWaterContent;
  287. std::unique_ptr<JsonNode> mapSettings;
  288. std::set<TerrainId> inheritTerrainType(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
  289. std::map<TResource, ui16> inheritMineTypes(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
  290. std::vector<CTreasureInfo> inheritTreasureInfo(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
  291. void inheritTownProperties(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
  292. void serializeSize(JsonSerializeFormat & handler, int3 & value, const std::string & fieldName);
  293. void serializePlayers(JsonSerializeFormat & handler, CPlayerCountRange & value, const std::string & fieldName);
  294. template<typename T>
  295. T inheritZoneProperty(std::shared_ptr<rmg::ZoneOptions> zone,
  296. T (rmg::ZoneOptions::*getter)() const,
  297. void (rmg::ZoneOptions::*setter)(const T&),
  298. TRmgTemplateZoneId (rmg::ZoneOptions::*inheritFrom)() const,
  299. const std::string& propertyString,
  300. uint32_t iteration = 0);
  301. };
  302. VCMI_LIB_NAMESPACE_END