2
0

BasicTypes.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * BasicTypes.cpp, 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. #include "StdInc.h"
  11. #include "VCMI_Lib.h"
  12. #include "GameConstants.h"
  13. #include "HeroBonus.h"
  14. #include <vcmi/Entity.h>
  15. #include <vcmi/Faction.h>
  16. #include <vcmi/FactionService.h>
  17. VCMI_LIB_NAMESPACE_BEGIN
  18. bool INativeTerrainProvider::isNativeTerrain(TerrainId terrain) const
  19. {
  20. auto native = getNativeTerrain();
  21. return native == terrain || native == ETerrainId::ANY_TERRAIN;
  22. }
  23. TerrainId IFactionMember::getNativeTerrain() const
  24. {
  25. constexpr auto any = TerrainId(ETerrainId::ANY_TERRAIN);
  26. const std::string cachingStringNoTerrainPenalty = "type_NO_TERRAIN_PENALTY_sANY";
  27. static const auto selectorNoTerrainPenalty = Selector::typeSubtype(Bonus::NO_TERRAIN_PENALTY, any);
  28. //this code is used in the CreatureTerrainLimiter::limit to setup battle bonuses
  29. //and in the CGHeroInstance::getNativeTerrain() to setup movement bonuses or/and penalties.
  30. return getBonusBearer()->hasBonus(selectorNoTerrainPenalty, cachingStringNoTerrainPenalty)
  31. ? any : VLC->factions()->getById(getFaction())->getNativeTerrain();
  32. }
  33. int32_t IFactionMember::magicResistance() const
  34. {
  35. si32 val = getBonusBearer()->valOfBonuses(Selector::type()(Bonus::MAGIC_RESISTANCE));
  36. vstd::amin (val, 100);
  37. return val;
  38. }
  39. int IFactionMember::getAttack(bool ranged) const
  40. {
  41. const std::string cachingStr = "type_PRIMARY_SKILLs_ATTACK";
  42. static const auto selector = Selector::typeSubtype(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK);
  43. return getBonusBearer()->valOfBonuses(selector, cachingStr);
  44. }
  45. int IFactionMember::getDefense(bool ranged) const
  46. {
  47. const std::string cachingStr = "type_PRIMARY_SKILLs_DEFENSE";
  48. static const auto selector = Selector::typeSubtype(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE);
  49. return getBonusBearer()->valOfBonuses(selector, cachingStr);
  50. }
  51. int IFactionMember::getMinDamage(bool ranged) const
  52. {
  53. const std::string cachingStr = "type_CREATURE_DAMAGEs_0Otype_CREATURE_DAMAGEs_1";
  54. static const auto selector = Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 0).Or(Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 1));
  55. return getBonusBearer()->valOfBonuses(selector, cachingStr);
  56. }
  57. int IFactionMember::getMaxDamage(bool ranged) const
  58. {
  59. const std::string cachingStr = "type_CREATURE_DAMAGEs_0Otype_CREATURE_DAMAGEs_2";
  60. static const auto selector = Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 0).Or(Selector::typeSubtype(Bonus::CREATURE_DAMAGE, 2));
  61. return getBonusBearer()->valOfBonuses(selector, cachingStr);
  62. }
  63. ui32 ICreature::MaxHealth() const
  64. {
  65. const std::string cachingStr = "type_STACK_HEALTH";
  66. static const auto selector = Selector::type()(Bonus::STACK_HEALTH);
  67. auto value = getBonusBearer()->valOfBonuses(selector, cachingStr);
  68. return std::max(1, value); //never 0
  69. }
  70. ui32 ICreature::Speed(int turn, bool useBind) const
  71. {
  72. //war machines cannot move
  73. if(getBonusBearer()->hasBonus(Selector::type()(Bonus::SIEGE_WEAPON).And(Selector::turns(turn))))
  74. {
  75. return 0;
  76. }
  77. //bind effect check - doesn't influence stack initiative
  78. if(useBind && getBonusBearer()->hasBonus(Selector::type()(Bonus::BIND_EFFECT).And(Selector::turns(turn))))
  79. {
  80. return 0;
  81. }
  82. return getBonusBearer()->valOfBonuses(Selector::type()(Bonus::STACKS_SPEED).And(Selector::turns(turn)));
  83. }
  84. VCMI_LIB_NAMESPACE_END