123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /*
- * CampaignBonus.h, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #pragma once
- #include "CampaignConstants.h"
- #include "../constants/EntityIdentifiers.h"
- VCMI_LIB_NAMESPACE_BEGIN
- class CBinaryReader;
- class MapIdentifiersH3M;
- class JsonNode;
- struct CampaignBonusSpell
- {
- HeroTypeID hero;
- SpellID spell;
- template <typename Handler> void serialize(Handler &h)
- {
- h & hero;
- h & spell;
- }
- };
- struct CampaignBonusCreatures
- {
- HeroTypeID hero;
- CreatureID creature;
- int32_t amount = 0;
- template <typename Handler> void serialize(Handler &h)
- {
- h & hero;
- h & creature;
- h & amount;
- }
- };
- struct CampaignBonusBuilding
- {
- BuildingID buildingH3M;
- BuildingID buildingDecoded;
- template <typename Handler> void serialize(Handler &h)
- {
- h & buildingH3M;
- h & buildingDecoded;
- }
- };
- struct CampaignBonusArtifact
- {
- HeroTypeID hero;
- ArtifactID artifact;
- template <typename Handler> void serialize(Handler &h)
- {
- h & hero;
- h & artifact;
- }
- };
- struct CampaignBonusSpellScroll
- {
- HeroTypeID hero;
- SpellID spell;
- template <typename Handler> void serialize(Handler &h)
- {
- h & hero;
- h & spell;
- }
- };
- struct CampaignBonusPrimarySkill
- {
- HeroTypeID hero;
- std::array<uint8_t, 4> amounts = {};
- template <typename Handler> void serialize(Handler &h)
- {
- h & hero;
- h & amounts;
- }
- };
- struct CampaignBonusSecondarySkill
- {
- HeroTypeID hero;
- SecondarySkill skill;
- int32_t mastery = 0;
- template <typename Handler> void serialize(Handler &h)
- {
- h & hero;
- h & skill;
- h & mastery;
- }
- };
- struct CampaignBonusStartingResources
- {
- GameResID resource;
- int32_t amount = 0;
- template <typename Handler> void serialize(Handler &h)
- {
- h & resource;
- h & amount;
- }
- };
- struct CampaignBonusHeroesFromScenario
- {
- PlayerColor startingPlayer;
- CampaignScenarioID scenario;
- template <typename Handler> void serialize(Handler &h)
- {
- h & startingPlayer;
- h & scenario;
- }
- };
- struct CampaignBonusStartingHero
- {
- PlayerColor startingPlayer;
- HeroTypeID hero;
- template <typename Handler> void serialize(Handler &h)
- {
- h & startingPlayer;
- h & hero;
- }
- };
- class CampaignBonus
- {
- using Variant = std::variant<
- CampaignBonusSpell, // UNTESTED
- CampaignBonusCreatures,
- CampaignBonusBuilding, // UNTESTED - broken, Long Live the King, Liberation last
- CampaignBonusArtifact,
- CampaignBonusSpellScroll,
- CampaignBonusPrimarySkill,
- CampaignBonusSecondarySkill,
- CampaignBonusStartingResources,
- CampaignBonusHeroesFromScenario,
- CampaignBonusStartingHero>;
- Variant data;
- template<typename T, typename = void>
- struct HasHero : std::false_type { };
- template<typename T>
- struct HasHero<T, decltype(std::declval<T>().hero, void())> : std::true_type { };
- public:
- CampaignBonus() = default;
- template<typename BonusType>
- CampaignBonus(const BonusType & value)
- :data(value)
- {}
- DLL_LINKAGE CampaignBonus(CBinaryReader & reader, const MapIdentifiersH3M & remapper, CampaignStartOptions mode);
- DLL_LINKAGE CampaignBonus(const JsonNode & json, CampaignStartOptions mode);
- template<typename T>
- const T & getValue() const
- {
- return std::get<T>(data);
- }
- HeroTypeID getTargetedHero() const
- {
- HeroTypeID result;
- std::visit([&result](const auto & bonusValue){
- if constexpr (HasHero<decltype(bonusValue)>::value)
- {
- result = bonusValue.hero;
- }
- else
- throw std::runtime_error("Attempt to get targeted hero on invalid type!");
- }, data);
- return result;
- }
- bool isBonusForHero() const
- {
- auto type = getType();
- return type == CampaignBonusType::SPELL ||
- type == CampaignBonusType::MONSTER ||
- type == CampaignBonusType::ARTIFACT ||
- type == CampaignBonusType::SPELL_SCROLL ||
- type == CampaignBonusType::PRIMARY_SKILL ||
- type == CampaignBonusType::SECONDARY_SKILL;
- }
- CampaignBonusType getType() const
- {
- return static_cast<CampaignBonusType>(data.index());
- }
- DLL_LINKAGE JsonNode toJson() const;
- template <typename Handler> void serialize(Handler &h)
- {
- h & data;
- }
- };
- VCMI_LIB_NAMESPACE_END
|