2023-08-14 18:46:42 +02:00
|
|
|
/*
|
|
|
|
* BattleActionProcessor.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
|
2024-01-07 22:05:55 +02:00
|
|
|
#include "bonuses/BonusList.h"
|
2023-08-14 18:46:42 +02:00
|
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
struct BattleLogMessage;
|
|
|
|
struct BattleAttack;
|
|
|
|
class BattleAction;
|
2023-08-28 16:43:57 +02:00
|
|
|
class CBattleInfoCallback;
|
2023-08-14 18:46:42 +02:00
|
|
|
struct BattleHex;
|
|
|
|
class CStack;
|
2023-08-17 18:18:14 +02:00
|
|
|
class PlayerColor;
|
2023-08-14 18:46:42 +02:00
|
|
|
enum class BonusType;
|
|
|
|
|
2023-08-17 13:56:24 +02:00
|
|
|
namespace battle
|
|
|
|
{
|
2023-08-14 18:46:42 +02:00
|
|
|
class Unit;
|
|
|
|
class CUnitState;
|
|
|
|
}
|
|
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_END
|
|
|
|
|
|
|
|
class CGameHandler;
|
2023-08-16 23:51:50 +02:00
|
|
|
class BattleProcessor;
|
2023-08-14 18:46:42 +02:00
|
|
|
|
2023-08-17 13:56:24 +02:00
|
|
|
/// Processes incoming battle action queries and applies requested action(s)
|
2023-08-14 18:46:42 +02:00
|
|
|
class BattleActionProcessor : boost::noncopyable
|
|
|
|
{
|
|
|
|
using FireShieldInfo = std::vector<std::pair<const CStack *, int64_t>>;
|
|
|
|
|
|
|
|
BattleProcessor * owner;
|
|
|
|
CGameHandler * gameHandler;
|
|
|
|
|
2023-08-28 16:43:57 +02:00
|
|
|
int moveStack(const CBattleInfoCallback & battle, int stack, BattleHex dest); //returned value - travelled distance
|
|
|
|
void makeAttack(const CBattleInfoCallback & battle, const CStack * attacker, const CStack * defender, int distance, BattleHex targetHex, bool first, bool ranged, bool counter);
|
2023-08-14 18:46:42 +02:00
|
|
|
|
2023-08-28 16:43:57 +02:00
|
|
|
void handleAttackBeforeCasting(const CBattleInfoCallback & battle, bool ranged, const CStack * attacker, const CStack * defender);
|
|
|
|
void handleAfterAttackCasting(const CBattleInfoCallback & battle, bool ranged, const CStack * attacker, const CStack * defender);
|
2024-01-07 20:20:32 +02:00
|
|
|
void attackCasting(const CBattleInfoCallback & battle, bool ranged, BonusType attackMode, const battle::Unit * attacker, const CStack * defender);
|
2024-01-07 22:22:10 +02:00
|
|
|
|
2024-01-07 22:05:55 +02:00
|
|
|
std::set<SpellID> getSpellsForAttackCasting(TConstBonusListPtr spells, const CStack *defender);
|
2023-08-14 18:46:42 +02:00
|
|
|
|
|
|
|
// damage, drain life & fire shield; returns amount of drained life
|
2023-08-28 16:43:57 +02:00
|
|
|
int64_t applyBattleEffects(const CBattleInfoCallback & battle, BattleAttack & bat, std::shared_ptr<battle::CUnitState> attackerState, FireShieldInfo & fireShield, const CStack * def, int distance, bool secondary);
|
2023-08-14 18:46:42 +02:00
|
|
|
|
2023-08-31 17:45:52 +02:00
|
|
|
void sendGenericKilledLog(const CBattleInfoCallback & battle, const CStack * defender, int32_t killed, bool multiple);
|
2023-08-14 18:46:42 +02:00
|
|
|
void addGenericKilledLog(BattleLogMessage & blm, const CStack * defender, int32_t killed, bool multiple);
|
|
|
|
|
2023-08-28 16:43:57 +02:00
|
|
|
bool canStackAct(const CBattleInfoCallback & battle, const CStack * stack);
|
|
|
|
|
|
|
|
bool doEmptyAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doEndTacticsAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doRetreatAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doSurrenderAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doHeroSpellAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doWalkAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doWaitAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doDefendAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doAttackAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doShootAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doCatapultAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doUnitSpellAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool doHealAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
|
|
|
|
bool dispatchBattleAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool makeBattleActionImpl(const CBattleInfoCallback & battle, const BattleAction & ba);
|
2023-08-16 23:51:50 +02:00
|
|
|
|
2023-08-14 18:46:42 +02:00
|
|
|
public:
|
2023-08-16 23:51:50 +02:00
|
|
|
explicit BattleActionProcessor(BattleProcessor * owner);
|
2023-08-14 18:46:42 +02:00
|
|
|
void setGameHandler(CGameHandler * newGameHandler);
|
|
|
|
|
2023-08-28 16:43:57 +02:00
|
|
|
bool makeAutomaticBattleAction(const CBattleInfoCallback & battle, const BattleAction & ba);
|
|
|
|
bool makePlayerBattleAction(const CBattleInfoCallback & battle, PlayerColor player, const BattleAction & ba);
|
2023-08-14 18:46:42 +02:00
|
|
|
};
|