BattleActionProcessor.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * BattleActionProcessor.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 "bonuses/Bonus.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. struct BattleLogMessage;
  14. struct BattleAttack;
  15. class BattleAction;
  16. class CBattleInfoCallback;
  17. class BattleHex;
  18. class CStack;
  19. class PlayerColor;
  20. enum class BonusType : uint16_t;
  21. namespace battle
  22. {
  23. class Unit;
  24. struct HealInfo;
  25. class CUnitState;
  26. }
  27. VCMI_LIB_NAMESPACE_END
  28. class CGameHandler;
  29. class BattleProcessor;
  30. /// Processes incoming battle action queries and applies requested action(s)
  31. class BattleActionProcessor : boost::noncopyable
  32. {
  33. struct MovementResult
  34. {
  35. /// number of tiles unit moved through, unset for flying units
  36. int16_t distance;
  37. /// Unit failed to complete movement due to stepping into obstacle
  38. bool obstacleHit;
  39. /// Unit was unable to move to destination, e.g. invalid request
  40. bool invalidRequest;
  41. };
  42. using FireShieldInfo = std::vector<std::pair<const CStack *, int64_t>>;
  43. BattleProcessor * owner;
  44. CGameHandler * gameHandler;
  45. MovementResult moveStack(const CBattleInfoCallback & battle, int stack, BattleHex dest); //returned value - travelled distance
  46. void makeAttack(const CBattleInfoCallback & battle, const CStack * attacker, const CStack * defender, int distance, const BattleHex & targetHex, bool first, bool ranged, bool counter);
  47. void handleAttackBeforeCasting(const CBattleInfoCallback & battle, bool ranged, const CStack * attacker, const CStack * defender);
  48. void handleDeathStare(const CBattleInfoCallback &battle, bool ranged, const CStack *attacker, const CStack *defender);
  49. void handleAfterAttackCasting(const CBattleInfoCallback & battle, bool ranged, const CStack * attacker, const CStack * defender);
  50. void attackCasting(const CBattleInfoCallback & battle, bool ranged, BonusType attackMode, const battle::Unit * attacker, const CStack * defender);
  51. std::set<SpellID> getSpellsForAttackCasting(const TConstBonusListPtr & spells, const CStack *defender);
  52. // damage, drain life & fire shield; returns amount of drained life
  53. void applyBattleEffects(const CBattleInfoCallback & battle, BattleAttack & bat, std::shared_ptr<battle::CUnitState> attackerState, FireShieldInfo & fireShield, const CStack * def, battle::HealInfo & healInfo, int distance, bool secondary) const;
  54. void sendGenericKilledLog(const CBattleInfoCallback & battle, const CStack * defender, int32_t killed, bool multiple);
  55. void addGenericKilledLog(BattleLogMessage & blm, const CStack * defender, int32_t killed, bool multiple) const;
  56. void addGenericDamageLog(BattleLogMessage& blm, const std::shared_ptr<battle::CUnitState> &attackerState, int64_t damageDealt) const;
  57. void addGenericDrainedLifeLog(BattleLogMessage& blm, const std::shared_ptr<battle::CUnitState> &attackerState, const CStack* defender, int64_t drainedLife) const;
  58. void addGenericResurrectedLog(BattleLogMessage& blm, const std::shared_ptr<battle::CUnitState> &attackerState, const CStack* defender, int64_t resurrected) const;
  59. bool canStackAct(const CBattleInfoCallback & battle, const CStack * stack);
  60. bool doEmptyAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  61. bool doEndTacticsAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  62. bool doRetreatAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  63. bool doSurrenderAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  64. bool doHeroSpellAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  65. bool doWalkAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  66. bool doWaitAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  67. bool doDefendAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  68. bool doAttackAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  69. bool doShootAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  70. bool doCatapultAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  71. bool doUnitSpellAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  72. bool doHealAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  73. bool dispatchBattleAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  74. bool makeBattleActionImpl(const CBattleInfoCallback & battle, const BattleAction & ba);
  75. public:
  76. explicit BattleActionProcessor(BattleProcessor * owner, CGameHandler * newGameHandler);
  77. bool makeAutomaticBattleAction(const CBattleInfoCallback & battle, const BattleAction & ba);
  78. bool makePlayerBattleAction(const CBattleInfoCallback & battle, PlayerColor player, const BattleAction & ba);
  79. };