BonusParams.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. * BonusParams.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 "BonusParams.h"
  12. #include "BonusSelector.h"
  13. #include "../ResourceSet.h"
  14. VCMI_LIB_NAMESPACE_BEGIN
  15. BonusParams::BonusParams(std::string deprecatedTypeStr, std::string deprecatedSubtypeStr, int deprecatedSubtype):
  16. isConverted(true)
  17. {
  18. if(deprecatedTypeStr == "SECONDARY_SKILL_PREMY" || deprecatedTypeStr == "SPECIAL_SECONDARY_SKILL")
  19. {
  20. if(deprecatedSubtype == SecondarySkill::PATHFINDING || deprecatedSubtypeStr == "skill.pathfinding")
  21. type = Bonus::ROUGH_TERRAIN_DISCOUNT;
  22. else if(deprecatedSubtype == SecondarySkill::DIPLOMACY || deprecatedSubtypeStr == "skill.diplomacy")
  23. type = Bonus::WANDERING_CREATURES_JOIN_BONUS;
  24. else if(deprecatedSubtype == SecondarySkill::WISDOM || deprecatedSubtypeStr == "skill.wisdom")
  25. type = Bonus::MAX_LEARNABLE_SPELL_LEVEL;
  26. else if(deprecatedSubtype == SecondarySkill::MYSTICISM || deprecatedSubtypeStr == "skill.mysticism")
  27. type = Bonus::MANA_REGENERATION;
  28. else if(deprecatedSubtype == SecondarySkill::NECROMANCY || deprecatedSubtypeStr == "skill.necromancy")
  29. type = Bonus::UNDEAD_RAISE_PERCENTAGE;
  30. else if(deprecatedSubtype == SecondarySkill::LEARNING || deprecatedSubtypeStr == "skill.learning")
  31. type = Bonus::HERO_EXPERIENCE_GAIN_PERCENT;
  32. else if(deprecatedSubtype == SecondarySkill::RESISTANCE || deprecatedSubtypeStr == "skill.resistance")
  33. type = Bonus::MAGIC_RESISTANCE;
  34. else if(deprecatedSubtype == SecondarySkill::EAGLE_EYE || deprecatedSubtypeStr == "skill.eagleEye")
  35. type = Bonus::LEARN_BATTLE_SPELL_CHANCE;
  36. else if(deprecatedSubtype == SecondarySkill::SCOUTING || deprecatedSubtypeStr == "skill.scouting")
  37. type = Bonus::SIGHT_RADIUS;
  38. else if(deprecatedSubtype == SecondarySkill::INTELLIGENCE || deprecatedSubtypeStr == "skill.intelligence")
  39. {
  40. type = Bonus::MANA_PER_KNOWLEDGE;
  41. valueType = Bonus::PERCENT_TO_BASE;
  42. valueTypeRelevant = true;
  43. }
  44. else if(deprecatedSubtype == SecondarySkill::SORCERY || deprecatedSubtypeStr == "skill.sorcery")
  45. type = Bonus::SPELL_DAMAGE;
  46. else if(deprecatedSubtype == SecondarySkill::SCHOLAR || deprecatedSubtypeStr == "skill.scholar")
  47. type = Bonus::LEARN_MEETING_SPELL_LIMIT;
  48. else if(deprecatedSubtype == SecondarySkill::ARCHERY|| deprecatedSubtypeStr == "skill.archery")
  49. {
  50. subtype = 1;
  51. subtypeRelevant = true;
  52. type = Bonus::PERCENTAGE_DAMAGE_BOOST;
  53. }
  54. else if(deprecatedSubtype == SecondarySkill::OFFENCE || deprecatedSubtypeStr == "skill.offence")
  55. {
  56. subtype = 0;
  57. subtypeRelevant = true;
  58. type = Bonus::PERCENTAGE_DAMAGE_BOOST;
  59. }
  60. else if(deprecatedSubtype == SecondarySkill::ARMORER || deprecatedSubtypeStr == "skill.armorer")
  61. {
  62. subtype = -1;
  63. subtypeRelevant = true;
  64. type = Bonus::GENERAL_DAMAGE_REDUCTION;
  65. }
  66. else if(deprecatedSubtype == SecondarySkill::NAVIGATION || deprecatedSubtypeStr == "skill.navigation")
  67. {
  68. subtype = 0;
  69. subtypeRelevant = true;
  70. valueType = Bonus::PERCENT_TO_BASE;
  71. valueTypeRelevant = true;
  72. type = Bonus::MOVEMENT;
  73. }
  74. else if(deprecatedSubtype == SecondarySkill::LOGISTICS || deprecatedSubtypeStr == "skill.logistics")
  75. {
  76. subtype = 1;
  77. subtypeRelevant = true;
  78. valueType = Bonus::PERCENT_TO_BASE;
  79. valueTypeRelevant = true;
  80. type = Bonus::MOVEMENT;
  81. }
  82. else if(deprecatedSubtype == SecondarySkill::ESTATES || deprecatedSubtypeStr == "skill.estates")
  83. {
  84. type = Bonus::GENERATE_RESOURCE;
  85. subtype = GameResID(EGameResID::GOLD);
  86. subtypeRelevant = true;
  87. }
  88. else if(deprecatedSubtype == SecondarySkill::AIR_MAGIC || deprecatedSubtypeStr == "skill.airMagic")
  89. {
  90. type = Bonus::MAGIC_SCHOOL_SKILL;
  91. subtypeRelevant = true;
  92. subtype = 4;
  93. }
  94. else if(deprecatedSubtype == SecondarySkill::WATER_MAGIC || deprecatedSubtypeStr == "skill.waterMagic")
  95. {
  96. type = Bonus::MAGIC_SCHOOL_SKILL;
  97. subtypeRelevant = true;
  98. subtype = 1;
  99. }
  100. else if(deprecatedSubtype == SecondarySkill::FIRE_MAGIC || deprecatedSubtypeStr == "skill.fireMagic")
  101. {
  102. type = Bonus::MAGIC_SCHOOL_SKILL;
  103. subtypeRelevant = true;
  104. subtype = 2;
  105. }
  106. else if(deprecatedSubtype == SecondarySkill::EARTH_MAGIC || deprecatedSubtypeStr == "skill.earthMagic")
  107. {
  108. type = Bonus::MAGIC_SCHOOL_SKILL;
  109. subtypeRelevant = true;
  110. subtype = 8;
  111. }
  112. else if (deprecatedSubtype == SecondarySkill::ARTILLERY || deprecatedSubtypeStr == "skill.artillery")
  113. {
  114. type = Bonus::BONUS_DAMAGE_CHANCE;
  115. subtypeRelevant = true;
  116. subtypeStr = "core:creature.ballista";
  117. }
  118. else if (deprecatedSubtype == SecondarySkill::FIRST_AID || deprecatedSubtypeStr == "skill.firstAid")
  119. {
  120. type = Bonus::SPECIFIC_SPELL_POWER;
  121. subtypeRelevant = true;
  122. subtypeStr = "core:spell.firstAid";
  123. }
  124. else if (deprecatedSubtype == SecondarySkill::BALLISTICS || deprecatedSubtypeStr == "skill.ballistics")
  125. {
  126. type = Bonus::CATAPULT_EXTRA_SHOTS;
  127. subtypeRelevant = true;
  128. subtypeStr = "core:spell.catapultShot";
  129. }
  130. else
  131. isConverted = false;
  132. }
  133. else if (deprecatedTypeStr == "SECONDARY_SKILL_VAL2")
  134. {
  135. if(deprecatedSubtype == SecondarySkill::EAGLE_EYE || deprecatedSubtypeStr == "skill.eagleEye")
  136. type = Bonus::LEARN_BATTLE_SPELL_LEVEL_LIMIT;
  137. else if (deprecatedSubtype == SecondarySkill::ARTILLERY || deprecatedSubtypeStr == "skill.artillery")
  138. {
  139. type = Bonus::HERO_GRANTS_ATTACKS;
  140. subtypeRelevant = true;
  141. subtypeStr = "core:creature.ballista";
  142. }
  143. else
  144. isConverted = false;
  145. }
  146. else if (deprecatedTypeStr == "SEA_MOVEMENT")
  147. {
  148. subtype = 0;
  149. subtypeRelevant = true;
  150. valueType = Bonus::ADDITIVE_VALUE;
  151. valueTypeRelevant = true;
  152. type = Bonus::MOVEMENT;
  153. }
  154. else if (deprecatedTypeStr == "LAND_MOVEMENT")
  155. {
  156. subtype = 1;
  157. subtypeRelevant = true;
  158. valueType = Bonus::ADDITIVE_VALUE;
  159. valueTypeRelevant = true;
  160. type = Bonus::MOVEMENT;
  161. }
  162. else if (deprecatedTypeStr == "MAXED_SPELL")
  163. {
  164. type = Bonus::SPELL;
  165. subtypeStr = deprecatedSubtypeStr;
  166. subtypeRelevant = true;
  167. valueType = Bonus::INDEPENDENT_MAX;
  168. valueTypeRelevant = true;
  169. val = 3;
  170. valRelevant = true;
  171. }
  172. else if (deprecatedTypeStr == "FULL_HP_REGENERATION")
  173. {
  174. type = Bonus::HP_REGENERATION;
  175. val = 100000; //very high value to always chose stack health
  176. valRelevant = true;
  177. }
  178. else if (deprecatedTypeStr == "KING1")
  179. {
  180. type = Bonus::KING;
  181. val = 0;
  182. valRelevant = true;
  183. }
  184. else if (deprecatedTypeStr == "KING2")
  185. {
  186. type = Bonus::KING;
  187. val = 2;
  188. valRelevant = true;
  189. }
  190. else if (deprecatedTypeStr == "KING3")
  191. {
  192. type = Bonus::KING;
  193. val = 3;
  194. valRelevant = true;
  195. }
  196. else if (deprecatedTypeStr == "SIGHT_RADIOUS")
  197. type = Bonus::SIGHT_RADIUS;
  198. else if (deprecatedTypeStr == "SELF_MORALE")
  199. {
  200. type = Bonus::MORALE;
  201. val = 1;
  202. valRelevant = true;
  203. valueType = Bonus::INDEPENDENT_MAX;
  204. valueTypeRelevant = true;
  205. }
  206. else if (deprecatedTypeStr == "SELF_LUCK")
  207. {
  208. type = Bonus::LUCK;
  209. val = 1;
  210. valRelevant = true;
  211. valueType = Bonus::INDEPENDENT_MAX;
  212. valueTypeRelevant = true;
  213. }
  214. else
  215. isConverted = false;
  216. }
  217. const JsonNode & BonusParams::toJson()
  218. {
  219. assert(isConverted);
  220. if(ret.isNull())
  221. {
  222. ret["type"].String() = vstd::findKey(bonusNameMap, type);
  223. if(subtypeRelevant && !subtypeStr.empty())
  224. ret["subtype"].String() = subtypeStr;
  225. else if(subtypeRelevant)
  226. ret["subtype"].Integer() = subtype;
  227. if(valueTypeRelevant)
  228. ret["valueType"].String() = vstd::findKey(bonusValueMap, valueType);
  229. if(valRelevant)
  230. ret["val"].Float() = val;
  231. if(targetTypeRelevant)
  232. ret["targetSourceType"].String() = vstd::findKey(bonusSourceMap, targetType);
  233. jsonCreated = true;
  234. }
  235. return ret;
  236. };
  237. CSelector BonusParams::toSelector()
  238. {
  239. assert(isConverted);
  240. if(subtypeRelevant && !subtypeStr.empty())
  241. JsonUtils::resolveIdentifier(subtype, toJson(), "subtype");
  242. auto ret = Selector::type()(type);
  243. if(subtypeRelevant)
  244. ret = ret.And(Selector::subtype()(subtype));
  245. if(valueTypeRelevant)
  246. ret = ret.And(Selector::valueType(valueType));
  247. if(targetTypeRelevant)
  248. ret = ret.And(Selector::targetSourceType()(targetType));
  249. return ret;
  250. }
  251. VCMI_LIB_NAMESPACE_END