CampaignBonus.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * CampaignBonus.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 "CampaignConstants.h"
  12. #include "../constants/EntityIdentifiers.h"
  13. VCMI_LIB_NAMESPACE_BEGIN
  14. class CBinaryReader;
  15. class MapIdentifiersH3M;
  16. class JsonNode;
  17. struct CampaignBonusSpell
  18. {
  19. HeroTypeID hero;
  20. SpellID spell;
  21. template <typename Handler> void serialize(Handler &h)
  22. {
  23. h & hero;
  24. h & spell;
  25. }
  26. };
  27. struct CampaignBonusCreatures
  28. {
  29. HeroTypeID hero;
  30. CreatureID creature;
  31. int32_t amount = 0;
  32. template <typename Handler> void serialize(Handler &h)
  33. {
  34. h & hero;
  35. h & creature;
  36. h & amount;
  37. }
  38. };
  39. struct CampaignBonusBuilding
  40. {
  41. BuildingID building;
  42. template <typename Handler> void serialize(Handler &h)
  43. {
  44. h & building;
  45. }
  46. };
  47. struct CampaignBonusArtifact
  48. {
  49. HeroTypeID hero;
  50. ArtifactID artifact;
  51. template <typename Handler> void serialize(Handler &h)
  52. {
  53. h & hero;
  54. h & artifact;
  55. }
  56. };
  57. struct CampaignBonusSpellScroll
  58. {
  59. HeroTypeID hero;
  60. SpellID spell;
  61. template <typename Handler> void serialize(Handler &h)
  62. {
  63. h & hero;
  64. h & spell;
  65. }
  66. };
  67. struct CampaignBonusPrimarySkill
  68. {
  69. HeroTypeID hero;
  70. std::array<uint8_t, 4> amounts = {};
  71. template <typename Handler> void serialize(Handler &h)
  72. {
  73. h & hero;
  74. h & amounts;
  75. }
  76. };
  77. struct CampaignBonusSecondarySkill
  78. {
  79. HeroTypeID hero;
  80. SecondarySkill skill;
  81. int32_t mastery = 0;
  82. template <typename Handler> void serialize(Handler &h)
  83. {
  84. h & hero;
  85. h & skill;
  86. h & mastery;
  87. }
  88. };
  89. struct CampaignBonusStartingResources
  90. {
  91. GameResID resource;
  92. int32_t amount = 0;
  93. template <typename Handler> void serialize(Handler &h)
  94. {
  95. h & resource;
  96. h & amount;
  97. }
  98. };
  99. struct CampaignBonusHeroesFromScenario
  100. {
  101. PlayerColor startingPlayer;
  102. CampaignScenarioID scenario;
  103. template <typename Handler> void serialize(Handler &h)
  104. {
  105. h & startingPlayer;
  106. h & scenario;
  107. }
  108. };
  109. struct CampaignBonusStartingHero
  110. {
  111. PlayerColor startingPlayer;
  112. HeroTypeID hero;
  113. template <typename Handler> void serialize(Handler &h)
  114. {
  115. h & startingPlayer;
  116. h & hero;
  117. }
  118. };
  119. class CampaignBonus
  120. {
  121. using Variant = std::variant<
  122. CampaignBonusSpell,
  123. CampaignBonusCreatures,
  124. CampaignBonusBuilding,
  125. CampaignBonusArtifact,
  126. CampaignBonusSpellScroll,
  127. CampaignBonusPrimarySkill,
  128. CampaignBonusSecondarySkill,
  129. CampaignBonusStartingResources,
  130. CampaignBonusHeroesFromScenario,
  131. CampaignBonusStartingHero>;
  132. Variant data;
  133. template<typename T, typename = void>
  134. struct HasHero : std::false_type { };
  135. template<typename T>
  136. struct HasHero<T, decltype(std::declval<T>().hero, void())> : std::true_type { };
  137. public:
  138. CampaignBonus() = default;
  139. template<typename BonusType>
  140. CampaignBonus(const BonusType & value)
  141. :data(value)
  142. {}
  143. DLL_LINKAGE CampaignBonus(CBinaryReader & reader, const MapIdentifiersH3M & remapper, CampaignStartOptions mode);
  144. DLL_LINKAGE CampaignBonus(const JsonNode & json, CampaignStartOptions mode);
  145. template<typename T>
  146. const T & getValue() const
  147. {
  148. return std::get<T>(data);
  149. }
  150. HeroTypeID getTargetedHero() const
  151. {
  152. HeroTypeID result;
  153. std::visit([&result](const auto & bonusValue){
  154. if constexpr (HasHero<decltype(bonusValue)>::value)
  155. {
  156. result = bonusValue.hero;
  157. }
  158. throw std::runtime_error("Attempt to get targeted hero on invalid type!");
  159. }, data);
  160. return result;
  161. }
  162. bool isBonusForHero() const
  163. {
  164. auto type = getType();
  165. return type == CampaignBonusType::SPELL ||
  166. type == CampaignBonusType::MONSTER ||
  167. type == CampaignBonusType::ARTIFACT ||
  168. type == CampaignBonusType::SPELL_SCROLL ||
  169. type == CampaignBonusType::PRIMARY_SKILL ||
  170. type == CampaignBonusType::SECONDARY_SKILL;
  171. }
  172. CampaignBonusType getType() const
  173. {
  174. return static_cast<CampaignBonusType>(data.index());
  175. }
  176. DLL_LINKAGE JsonNode toJson() const;
  177. template <typename Handler> void serialize(Handler &h)
  178. {
  179. h & data;
  180. }
  181. };
  182. VCMI_LIB_NAMESPACE_END