2017-03-17 17:48:44 +02:00
/*
* BattleInfo . 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
2017-07-20 06:08:49 +02:00
# include "../int3.h"
2017-06-28 23:09:35 +02:00
# include "../HeroBonus.h"
# include "CBattleInfoCallback.h"
2017-07-20 06:08:49 +02:00
# include "IBattleState.h"
# include "SiegeInfo.h"
# include "SideInBattle.h"
2017-03-17 17:48:44 +02:00
class CStack ;
class CStackInstance ;
class CStackBasicDescriptor ;
2017-07-20 06:08:49 +02:00
class DLL_LINKAGE BattleInfo : public CBonusSystemNode , public CBattleInfoCallback , public IBattleState
2017-03-17 17:48:44 +02:00
{
2017-07-20 06:08:49 +02:00
public :
2021-02-03 19:19:56 +02:00
enum BattleSide
{
ATTACKER = 0 ,
DEFENDER
} ;
2017-03-17 17:48:44 +02:00
std : : array < SideInBattle , 2 > sides ; //sides[0] - attacker, sides[1] - defender
2017-07-20 06:08:49 +02:00
si32 round , activeStack ;
2017-03-17 17:48:44 +02:00
const CGTownInstance * town ; //used during town siege, nullptr if this is not a siege (note that fortless town IS also a siege)
int3 tile ; //for background and bonuses
std : : vector < CStack * > stacks ;
std : : vector < std : : shared_ptr < CObstacleInstance > > obstacles ;
SiegeInfo si ;
BFieldType battlefieldType ; //like !!BA:B
ETerrainType terrainType ; //used for some stack nativity checks (not the bonus limiters though that have their own copy)
ui8 tacticsSide ; //which side is requested to play tactics phase
ui8 tacticDistance ; //how many hexes we can go forward (1 = only hexes adjacent to margin line)
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & sides ;
2017-07-31 15:35:42 +02:00
h & round ;
h & activeStack ;
h & town ;
h & tile ;
h & stacks ;
h & obstacles ;
h & si ;
h & battlefieldType ;
h & terrainType ;
h & tacticsSide ;
h & tacticDistance ;
2017-03-17 17:48:44 +02:00
h & static_cast < CBonusSystemNode & > ( * this ) ;
}
//////////////////////////////////////////////////////////////////////////
BattleInfo ( ) ;
2017-07-20 06:08:49 +02:00
virtual ~ BattleInfo ( ) ;
//////////////////////////////////////////////////////////////////////////
// IBattleInfo
int32_t getActiveStackID ( ) const override ;
TStacks getStacksIf ( TStackFilter predicate ) const override ;
battle : : Units getUnitsIf ( battle : : UnitFilter predicate ) const override ;
BFieldType getBattlefieldType ( ) const override ;
ETerrainType getTerrainType ( ) const override ;
ObstacleCList getAllObstacles ( ) const override ;
PlayerColor getSidePlayer ( ui8 side ) const override ;
const CArmedInstance * getSideArmy ( ui8 side ) const override ;
const CGHeroInstance * getSideHero ( ui8 side ) const override ;
ui8 getTacticDist ( ) const override ;
ui8 getTacticsSide ( ) const override ;
const CGTownInstance * getDefendedTown ( ) const override ;
si8 getWallState ( int partOfWall ) const override ;
EGateState getGateState ( ) const override ;
uint32_t getCastSpells ( ui8 side ) const override ;
int32_t getEnchanterCounter ( ui8 side ) const override ;
const IBonusBearer * asBearer ( ) const override ;
uint32_t nextUnitId ( ) const override ;
int64_t getActualDamage ( const TDmgRange & damage , int32_t attackerCount , vstd : : RNG & rng ) const override ;
//////////////////////////////////////////////////////////////////////////
// IBattleState
void nextRound ( int32_t roundNr ) override ;
void nextTurn ( uint32_t unitId ) override ;
void addUnit ( uint32_t id , const JsonNode & data ) override ;
void moveUnit ( uint32_t id , BattleHex destination ) override ;
void setUnitState ( uint32_t id , const JsonNode & data , int64_t healthDelta ) override ;
void removeUnit ( uint32_t id ) override ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 16:58:30 +02:00
void updateUnit ( uint32_t id , const JsonNode & data ) override ;
2017-07-20 06:08:49 +02:00
void addUnitBonus ( uint32_t id , const std : : vector < Bonus > & bonus ) override ;
void updateUnitBonus ( uint32_t id , const std : : vector < Bonus > & bonus ) override ;
void removeUnitBonus ( uint32_t id , const std : : vector < Bonus > & bonus ) override ;
void setWallState ( int partOfWall , si8 state ) override ;
void addObstacle ( const ObstacleChanges & changes ) override ;
2020-02-12 19:12:12 +02:00
void updateObstacle ( const ObstacleChanges & changes ) override ;
2017-07-20 06:08:49 +02:00
void removeObstacle ( uint32_t id ) override ;
void addOrUpdateUnitBonus ( CStack * sta , const Bonus & value , bool forceAdd ) ;
2017-03-17 17:48:44 +02:00
//////////////////////////////////////////////////////////////////////////
CStack * getStack ( int stackID , bool onlyAlive = true ) ;
using CBattleInfoEssentials : : battleGetArmyObject ;
CArmedInstance * battleGetArmyObject ( ui8 side ) const ;
using CBattleInfoEssentials : : battleGetFightingHero ;
CGHeroInstance * battleGetFightingHero ( ui8 side ) const ;
2017-06-26 18:50:35 +02:00
std : : pair < std : : vector < BattleHex > , int > getPath ( BattleHex start , BattleHex dest , const CStack * stack ) ; //returned value: pair<path, length>; length may be different than number of elements in path since flying vreatures jump between distant hexes
2017-03-17 17:48:44 +02:00
2017-06-26 18:50:35 +02:00
void calculateCasualties ( std : : map < ui32 , si32 > * casualties ) const ; //casualties are array of maps size 2 (attacker, defeneder), maps are (crid => amount)
2017-03-17 17:48:44 +02:00
2017-07-20 06:08:49 +02:00
CStack * generateNewStack ( uint32_t id , const CStackInstance & base , ui8 side , SlotID slot , BattleHex position ) ;
CStack * generateNewStack ( uint32_t id , const CStackBasicDescriptor & base , ui8 side , SlotID slot , BattleHex position ) ;
2017-03-17 17:48:44 +02:00
const CGHeroInstance * getHero ( PlayerColor player ) const ; //returns fighting hero that belongs to given player
void localInit ( ) ;
2017-06-26 18:50:35 +02:00
static BattleInfo * setupBattle ( int3 tile , ETerrainType terrain , BFieldType battlefieldType , const CArmedInstance * armies [ 2 ] , const CGHeroInstance * heroes [ 2 ] , bool creatureBank , const CGTownInstance * town ) ;
2017-03-17 17:48:44 +02:00
ui8 whatSide ( PlayerColor player ) const ;
static BattlefieldBI : : BattlefieldBI battlefieldTypeToBI ( BFieldType bfieldType ) ; //converts above to ERM BI format
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 16:58:30 +02:00
protected :
scripting : : Pool * getContextPool ( ) const override ;
2017-03-17 17:48:44 +02:00
} ;
class DLL_LINKAGE CMP_stack
{
int phase ; //rules of which phase will be used
int turn ;
2019-05-17 10:34:59 +02:00
uint8_t side ;
2017-03-17 17:48:44 +02:00
public :
2017-07-20 06:08:49 +02:00
bool operator ( ) ( const battle : : Unit * a , const battle : : Unit * b ) ;
2019-05-17 10:34:59 +02:00
CMP_stack ( int Phase = 1 , int Turn = 0 , uint8_t Side = BattleSide : : ATTACKER ) ;
2017-03-17 17:48:44 +02:00
} ;