Limiters.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /*
  2. * Limiters.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 "BonusCustomTypes.h"
  12. #include "BonusEnum.h"
  13. #include "../battle/BattleHexArray.h"
  14. #include "../serializer/Serializeable.h"
  15. #include "../constants/Enumerations.h"
  16. VCMI_LIB_NAMESPACE_BEGIN
  17. struct Bonus;
  18. class BonusList;
  19. class CBonusSystemNode;
  20. class CCreature;
  21. class JsonNode;
  22. struct BonusLimitationContext
  23. {
  24. const Bonus & b;
  25. const CBonusSystemNode & node;
  26. const BonusList & alreadyAccepted;
  27. const BonusList & stillUndecided;
  28. };
  29. class DLL_LINKAGE ILimiter : public Serializeable
  30. {
  31. public:
  32. enum class EDecision : uint8_t
  33. {
  34. ACCEPT,
  35. DISCARD,
  36. NOT_SURE, // result may still change based on not yet resolved bonuses
  37. NOT_APPLICABLE // limiter is not applicable to current node and is never applicable
  38. };
  39. virtual ~ILimiter() = default;
  40. virtual EDecision limit(const BonusLimitationContext &context) const;
  41. virtual std::string toString() const;
  42. virtual JsonNode toJsonNode() const;
  43. template <typename Handler> void serialize(Handler &h)
  44. {
  45. }
  46. };
  47. using TLimiterPtr = std::shared_ptr<const ILimiter>;
  48. extern DLL_LINKAGE const std::map<std::string, TLimiterPtr> bonusLimiterMap;
  49. class DLL_LINKAGE AggregateLimiter : public ILimiter
  50. {
  51. protected:
  52. virtual const std::string & getAggregator() const = 0;
  53. AggregateLimiter(std::vector<TLimiterPtr> limiters = {});
  54. public:
  55. std::vector<TLimiterPtr> limiters;
  56. void add(const TLimiterPtr & limiter);
  57. JsonNode toJsonNode() const override;
  58. template <typename Handler> void serialize(Handler & h)
  59. {
  60. h & static_cast<ILimiter&>(*this);
  61. h & limiters;
  62. }
  63. };
  64. class DLL_LINKAGE AllOfLimiter : public AggregateLimiter
  65. {
  66. protected:
  67. const std::string & getAggregator() const override;
  68. public:
  69. AllOfLimiter(std::vector<TLimiterPtr> limiters = {});
  70. static const std::string aggregator;
  71. EDecision limit(const BonusLimitationContext & context) const override;
  72. };
  73. class DLL_LINKAGE AnyOfLimiter : public AggregateLimiter
  74. {
  75. protected:
  76. const std::string & getAggregator() const override;
  77. public:
  78. AnyOfLimiter(std::vector<TLimiterPtr> limiters = {});
  79. static const std::string aggregator;
  80. EDecision limit(const BonusLimitationContext & context) const override;
  81. };
  82. class DLL_LINKAGE NoneOfLimiter : public AggregateLimiter
  83. {
  84. protected:
  85. const std::string & getAggregator() const override;
  86. public:
  87. NoneOfLimiter(std::vector<TLimiterPtr> limiters = {});
  88. static const std::string aggregator;
  89. EDecision limit(const BonusLimitationContext & context) const override;
  90. };
  91. class DLL_LINKAGE CCreatureTypeLimiter : public ILimiter //affect only stacks of given creature (and optionally it's upgrades)
  92. {
  93. public:
  94. CreatureID creatureID;
  95. bool includeUpgrades = false;
  96. CCreatureTypeLimiter() = default;
  97. CCreatureTypeLimiter(const CCreature & creature_, bool IncludeUpgrades);
  98. void setCreature(const CreatureID & id);
  99. EDecision limit(const BonusLimitationContext &context) const override;
  100. std::string toString() const override;
  101. JsonNode toJsonNode() const override;
  102. template <typename Handler> void serialize(Handler &h)
  103. {
  104. h & static_cast<ILimiter&>(*this);
  105. h & creatureID;
  106. h & includeUpgrades;
  107. }
  108. };
  109. class DLL_LINKAGE HasAnotherBonusLimiter : public ILimiter //applies only to nodes that have another bonus working
  110. {
  111. public:
  112. BonusType type;
  113. BonusSubtypeID subtype;
  114. BonusSource source = BonusSource::OTHER;
  115. BonusSourceID sid;
  116. bool isSubtypeRelevant; //check for subtype only if this is true
  117. bool isSourceRelevant; //check for bonus source only if this is true
  118. bool isSourceIDRelevant; //check for bonus source only if this is true
  119. HasAnotherBonusLimiter(BonusType bonus = BonusType::NONE);
  120. HasAnotherBonusLimiter(BonusType bonus, BonusSubtypeID _subtype);
  121. HasAnotherBonusLimiter(BonusType bonus, BonusSource src);
  122. HasAnotherBonusLimiter(BonusType bonus, BonusSubtypeID _subtype, BonusSource src);
  123. EDecision limit(const BonusLimitationContext &context) const override;
  124. std::string toString() const override;
  125. JsonNode toJsonNode() const override;
  126. template <typename Handler> void serialize(Handler &h)
  127. {
  128. h & static_cast<ILimiter&>(*this);
  129. h & type;
  130. h & subtype;
  131. h & isSubtypeRelevant;
  132. h & source;
  133. h & isSourceRelevant;
  134. h & sid;
  135. h & isSourceIDRelevant;
  136. }
  137. };
  138. class DLL_LINKAGE CreatureTerrainLimiter : public ILimiter //applies only to creatures that are on specified terrain, default native terrain
  139. {
  140. public:
  141. TerrainId terrainType;
  142. CreatureTerrainLimiter();
  143. CreatureTerrainLimiter(TerrainId terrain);
  144. EDecision limit(const BonusLimitationContext &context) const override;
  145. std::string toString() const override;
  146. JsonNode toJsonNode() const override;
  147. template <typename Handler> void serialize(Handler &h)
  148. {
  149. h & static_cast<ILimiter&>(*this);
  150. h & terrainType;
  151. }
  152. };
  153. class DLL_LINKAGE CreatureLevelLimiter : public ILimiter //applies only to creatures of given faction
  154. {
  155. public:
  156. uint32_t minLevel;
  157. uint32_t maxLevel;
  158. //accept all levels by default, accept creatures of minLevel <= creature->getLevel() < maxLevel
  159. CreatureLevelLimiter(uint32_t minLevel = std::numeric_limits<uint32_t>::min(), uint32_t maxLevel = std::numeric_limits<uint32_t>::max());
  160. EDecision limit(const BonusLimitationContext &context) const override;
  161. std::string toString() const override;
  162. JsonNode toJsonNode() const override;
  163. template <typename Handler> void serialize(Handler &h)
  164. {
  165. h & static_cast<ILimiter&>(*this);
  166. h & minLevel;
  167. h & maxLevel;
  168. }
  169. };
  170. class DLL_LINKAGE FactionLimiter : public ILimiter //applies only to creatures of given faction
  171. {
  172. public:
  173. FactionID faction;
  174. FactionLimiter(FactionID faction = FactionID::DEFAULT);
  175. EDecision limit(const BonusLimitationContext &context) const override;
  176. std::string toString() const override;
  177. JsonNode toJsonNode() const override;
  178. template <typename Handler> void serialize(Handler &h)
  179. {
  180. h & static_cast<ILimiter&>(*this);
  181. h & faction;
  182. }
  183. };
  184. class DLL_LINKAGE CreatureAlignmentLimiter : public ILimiter //applies only to creatures of given alignment
  185. {
  186. public:
  187. EAlignment alignment;
  188. CreatureAlignmentLimiter(EAlignment Alignment = EAlignment::NEUTRAL);
  189. EDecision limit(const BonusLimitationContext &context) const override;
  190. std::string toString() const override;
  191. JsonNode toJsonNode() const override;
  192. template <typename Handler> void serialize(Handler &h)
  193. {
  194. h & static_cast<ILimiter&>(*this);
  195. h & alignment;
  196. }
  197. };
  198. class DLL_LINKAGE OppositeSideLimiter : public ILimiter //applies only to creatures of enemy army during combat
  199. {
  200. public:
  201. OppositeSideLimiter();
  202. EDecision limit(const BonusLimitationContext &context) const override;
  203. template <typename Handler> void serialize(Handler &h)
  204. {
  205. h & static_cast<ILimiter&>(*this);
  206. if (!h.hasFeature(Handler::Version::OPPOSITE_SIDE_LIMITER_OWNER))
  207. {
  208. PlayerColor owner;
  209. h & owner;
  210. }
  211. }
  212. };
  213. class DLL_LINKAGE RankRangeLimiter : public ILimiter //applies to creatures with min <= Rank <= max
  214. {
  215. public:
  216. ui8 minRank;
  217. ui8 maxRank;
  218. RankRangeLimiter();
  219. RankRangeLimiter(ui8 Min, ui8 Max = 255);
  220. EDecision limit(const BonusLimitationContext &context) const override;
  221. template <typename Handler> void serialize(Handler &h)
  222. {
  223. h & static_cast<ILimiter&>(*this);
  224. h & minRank;
  225. h & maxRank;
  226. }
  227. };
  228. class DLL_LINKAGE UnitOnHexLimiter : public ILimiter //works only on selected hexes
  229. {
  230. public:
  231. BattleHexArray applicableHexes;
  232. UnitOnHexLimiter(const BattleHexArray & applicableHexes = {});
  233. EDecision limit(const BonusLimitationContext &context) const override;
  234. JsonNode toJsonNode() const override;
  235. template <typename Handler> void serialize(Handler &h)
  236. {
  237. h & static_cast<ILimiter&>(*this);
  238. h & applicableHexes;
  239. }
  240. };
  241. class DLL_LINKAGE HasChargesLimiter : public ILimiter // works with bonuses that consume charges
  242. {
  243. public:
  244. uint16_t chargeCost;
  245. HasChargesLimiter(const uint16_t cost = 1);
  246. EDecision limit(const BonusLimitationContext & context) const override;
  247. template <typename Handler> void serialize(Handler &h)
  248. {
  249. h & static_cast<ILimiter&>(*this);
  250. h & chargeCost;
  251. }
  252. };
  253. VCMI_LIB_NAMESPACE_END