1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-16 10:19:47 +02:00
vcmi/server/battles/BattleActionProcessor.h
K c1e6bbddfe Reduce size of Bonus struct from 320 bytes to 296 bytes.
- Internal enums were resized to occupy single byte.
- Duration bitmask uses 16 bit integer directly instead of std::bitset<11> which consumed 8 bytes.
- Fields shuffled to minimise padding and keep the most useful data on first 2 cache lines.
2024-07-22 14:59:31 +02:00

90 lines
4.4 KiB
C++

/*
* 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
#include "bonuses/BonusList.h"
VCMI_LIB_NAMESPACE_BEGIN
struct BattleLogMessage;
struct BattleAttack;
class BattleAction;
class CBattleInfoCallback;
struct BattleHex;
class CStack;
class PlayerColor;
enum class BonusType : uint8_t;
namespace battle
{
class Unit;
struct HealInfo;
class CUnitState;
}
VCMI_LIB_NAMESPACE_END
class CGameHandler;
class BattleProcessor;
/// Processes incoming battle action queries and applies requested action(s)
class BattleActionProcessor : boost::noncopyable
{
using FireShieldInfo = std::vector<std::pair<const CStack *, int64_t>>;
BattleProcessor * owner;
CGameHandler * gameHandler;
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);
void handleAttackBeforeCasting(const CBattleInfoCallback & battle, bool ranged, const CStack * attacker, const CStack * defender);
void handleDeathStare(const CBattleInfoCallback &battle, bool ranged, const CStack *attacker, const CStack *defender);
void handleAfterAttackCasting(const CBattleInfoCallback & battle, bool ranged, const CStack * attacker, const CStack * defender);
void attackCasting(const CBattleInfoCallback & battle, bool ranged, BonusType attackMode, const battle::Unit * attacker, const CStack * defender);
std::set<SpellID> getSpellsForAttackCasting(TConstBonusListPtr spells, const CStack *defender);
// damage, drain life & fire shield; returns amount of drained life
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;
void sendGenericKilledLog(const CBattleInfoCallback & battle, const CStack * defender, int32_t killed, bool multiple);
void addGenericKilledLog(BattleLogMessage & blm, const CStack * defender, int32_t killed, bool multiple) const;
void addGenericDamageLog(BattleLogMessage& blm, const std::shared_ptr<battle::CUnitState> &attackerState, int64_t damageDealt) const;
void addGenericDrainedLifeLog(BattleLogMessage& blm, const std::shared_ptr<battle::CUnitState> &attackerState, const CStack* defender, int64_t drainedLife) const;
void addGenericResurrectedLog(BattleLogMessage& blm, const std::shared_ptr<battle::CUnitState> &attackerState, const CStack* defender, int64_t resurrected) const;
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);
public:
explicit BattleActionProcessor(BattleProcessor * owner, CGameHandler * newGameHandler);
bool makeAutomaticBattleAction(const CBattleInfoCallback & battle, const BattleAction & ba);
bool makePlayerBattleAction(const CBattleInfoCallback & battle, PlayerColor player, const BattleAction & ba);
};