BattleSpellMechanics.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * BattleSpellMechanics.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 "CDefaultSpellMechanics.h"
  12. class CObstacleInstance;
  13. class SpellCreatedObstacle;
  14. class DLL_LINKAGE HealingSpellMechanics : public DefaultSpellMechanics
  15. {
  16. public:
  17. HealingSpellMechanics(const CSpell * s);
  18. protected:
  19. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  20. virtual int calculateHealedHP(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const;
  21. virtual EHealLevel getHealLevel(int effectLevel) const = 0;
  22. virtual EHealPower getHealPower(int effectLevel) const = 0;
  23. };
  24. class DLL_LINKAGE AntimagicMechanics : public DefaultSpellMechanics
  25. {
  26. public:
  27. AntimagicMechanics(const CSpell * s);
  28. void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
  29. };
  30. class DLL_LINKAGE ChainLightningMechanics : public DefaultSpellMechanics
  31. {
  32. public:
  33. ChainLightningMechanics(const CSpell * s);
  34. protected:
  35. std::vector<const CStack *> calculateAffectedStacks(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const override;
  36. };
  37. class DLL_LINKAGE CloneMechanics : public DefaultSpellMechanics
  38. {
  39. public:
  40. CloneMechanics(const CSpell * s);
  41. ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
  42. protected:
  43. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  44. };
  45. class DLL_LINKAGE CureMechanics : public HealingSpellMechanics
  46. {
  47. public:
  48. CureMechanics(const CSpell * s);
  49. void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
  50. ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
  51. EHealLevel getHealLevel(int effectLevel) const override final;
  52. EHealPower getHealPower(int effectLevel) const override final;
  53. private:
  54. static bool dispellSelector(const Bonus * b);
  55. };
  56. class DLL_LINKAGE DispellMechanics : public DefaultSpellMechanics
  57. {
  58. public:
  59. DispellMechanics(const CSpell * s);
  60. ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
  61. void applyBattle(BattleInfo * battle, const BattleSpellCast * packet) const override final;
  62. protected:
  63. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  64. };
  65. class DLL_LINKAGE EarthquakeMechanics : public SpecialSpellMechanics
  66. {
  67. public:
  68. EarthquakeMechanics(const CSpell * s);
  69. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const override;
  70. bool requiresCreatureTarget() const override;
  71. protected:
  72. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  73. };
  74. class DLL_LINKAGE HypnotizeMechanics : public DefaultSpellMechanics
  75. {
  76. public:
  77. HypnotizeMechanics(const CSpell * s);
  78. ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
  79. };
  80. class DLL_LINKAGE ObstacleMechanics : public SpecialSpellMechanics
  81. {
  82. public:
  83. ObstacleMechanics(const CSpell * s);
  84. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const override;
  85. protected:
  86. static bool isHexAviable(const CBattleInfoCallback * cb, const BattleHex & hex, const bool mustBeClear);
  87. void placeObstacle(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, const BattleHex & pos) const;
  88. virtual void setupObstacle(SpellCreatedObstacle * obstacle) const = 0;
  89. };
  90. class PatchObstacleMechanics : public ObstacleMechanics
  91. {
  92. public:
  93. PatchObstacleMechanics(const CSpell * s);
  94. protected:
  95. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  96. };
  97. class DLL_LINKAGE LandMineMechanics : public PatchObstacleMechanics
  98. {
  99. public:
  100. LandMineMechanics(const CSpell * s);
  101. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const override;
  102. bool requiresCreatureTarget() const override;
  103. protected:
  104. void setupObstacle(SpellCreatedObstacle * obstacle) const override;
  105. };
  106. class DLL_LINKAGE QuicksandMechanics : public PatchObstacleMechanics
  107. {
  108. public:
  109. QuicksandMechanics(const CSpell * s);
  110. bool requiresCreatureTarget() const override;
  111. protected:
  112. void setupObstacle(SpellCreatedObstacle * obstacle) const override;
  113. };
  114. class DLL_LINKAGE WallMechanics : public ObstacleMechanics
  115. {
  116. public:
  117. WallMechanics(const CSpell * s);
  118. std::vector<BattleHex> rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes = nullptr) const override;
  119. };
  120. class DLL_LINKAGE FireWallMechanics : public WallMechanics
  121. {
  122. public:
  123. FireWallMechanics(const CSpell * s);
  124. bool requiresCreatureTarget() const override;
  125. protected:
  126. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  127. void setupObstacle(SpellCreatedObstacle * obstacle) const override;
  128. };
  129. class DLL_LINKAGE ForceFieldMechanics : public WallMechanics
  130. {
  131. public:
  132. ForceFieldMechanics(const CSpell * s);
  133. bool requiresCreatureTarget() const override;
  134. protected:
  135. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  136. void setupObstacle(SpellCreatedObstacle * obstacle) const override;
  137. };
  138. class DLL_LINKAGE RemoveObstacleMechanics : public SpecialSpellMechanics
  139. {
  140. public:
  141. RemoveObstacleMechanics(const CSpell * s);
  142. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const override;
  143. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const override;
  144. bool requiresCreatureTarget() const override;
  145. protected:
  146. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  147. private:
  148. bool canRemove(const CObstacleInstance * obstacle, const int spellLevel) const;
  149. };
  150. ///all rising spells
  151. class DLL_LINKAGE RisingSpellMechanics : public HealingSpellMechanics
  152. {
  153. public:
  154. RisingSpellMechanics(const CSpell * s);
  155. EHealLevel getHealLevel(int effectLevel) const override final;
  156. EHealPower getHealPower(int effectLevel) const override final;
  157. };
  158. class DLL_LINKAGE SacrificeMechanics : public RisingSpellMechanics
  159. {
  160. public:
  161. SacrificeMechanics(const CSpell * s);
  162. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const override;
  163. bool requiresCreatureTarget() const override;
  164. protected:
  165. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  166. int calculateHealedHP(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  167. };
  168. ///ANIMATE_DEAD and RESURRECTION
  169. class DLL_LINKAGE SpecialRisingSpellMechanics : public RisingSpellMechanics
  170. {
  171. public:
  172. SpecialRisingSpellMechanics(const CSpell * s);
  173. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const override;
  174. ESpellCastProblem::ESpellCastProblem isImmuneByStack(const ISpellCaster * caster, const CStack * obj) const override;
  175. };
  176. class DLL_LINKAGE SummonMechanics : public SpecialSpellMechanics
  177. {
  178. public:
  179. SummonMechanics(const CSpell * s, CreatureID cre);
  180. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const override;
  181. bool requiresCreatureTarget() const override;
  182. protected:
  183. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  184. private:
  185. CreatureID creatureToSummon;
  186. };
  187. class DLL_LINKAGE TeleportMechanics: public DefaultSpellMechanics
  188. {
  189. public:
  190. TeleportMechanics(const CSpell * s);
  191. ESpellCastProblem::ESpellCastProblem canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const override;
  192. protected:
  193. void applyBattleEffects(const SpellCastEnvironment * env, const BattleSpellCastParameters & parameters, SpellCastContext & ctx) const override;
  194. };