2011-12-14 00:35:28 +03:00
/*
* CBattleInterface . 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
*
*/
2017-07-13 10:26:03 +02:00
# pragma once
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
# include <vcmi/spells/Magic.h>
# include "../../lib/ConstTransitivePtr.h" //may be redundant
2017-07-13 10:26:03 +02:00
# include "../../lib/GameConstants.h"
# include "CBattleAnimations.h"
# include "../../lib/spells/CSpellHandler.h" //CSpell::TAnimation
2019-05-04 05:42:55 +02:00
# include "../../lib/battle/CBattleInfoCallback.h"
2011-12-14 00:35:28 +03:00
class CLabel ;
class CCreatureSet ;
class CGHeroInstance ;
class CStack ;
class CCallback ;
2014-08-03 14:16:19 +03:00
class CButton ;
class CToggleButton ;
class CToggleGroup ;
2011-12-14 00:35:28 +03:00
struct BattleResult ;
struct BattleSpellCast ;
struct CObstacleInstance ;
template < typename T > struct CondSh ;
2012-09-15 22:16:16 +03:00
struct SetStackEffect ;
2017-07-20 06:08:49 +02:00
class BattleAction ;
2011-12-14 00:35:28 +03:00
class CGTownInstance ;
struct CatapultAttack ;
2011-12-22 16:05:19 +03:00
struct CatapultProjectileInfo ;
2011-12-14 00:35:28 +03:00
struct BattleTriggerEffect ;
class CBattleAnimation ;
class CBattleHero ;
class CBattleConsole ;
class CBattleResultWindow ;
class CStackQueue ;
2011-12-17 21:59:59 +03:00
class CPlayerInterface ;
2011-12-22 16:05:19 +03:00
class CCreatureAnimation ;
struct ProjectileInfo ;
class CClickableHex ;
struct BattleHex ;
2012-08-26 12:07:48 +03:00
struct InfoAboutHero ;
2013-06-22 17:47:20 +03:00
class CBattleGameInterface ;
2017-07-20 06:08:49 +02:00
struct CustomEffectInfo ;
2017-09-05 16:21:44 +02:00
class CAnimation ;
2017-07-20 06:08:49 +02:00
class IImage ;
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
class CSpell ;
2011-12-14 00:35:28 +03:00
2011-12-22 16:05:19 +03:00
/// Small struct which contains information about the id of the attacked stack, the damage dealt,...
struct StackAttackedInfo
{
2016-10-28 23:37:20 +02:00
const CStack * defender ; //attacked stack
2017-07-20 06:08:49 +02:00
int64_t dmg ; //damage dealt
2012-04-08 13:34:23 +03:00
unsigned int amountKilled ; //how many creatures in stack has been killed
2016-10-28 23:37:20 +02:00
const CStack * attacker ; //attacking stack
2013-08-09 20:37:41 +03:00
bool indirectAttack ; //if true, stack was attacked indirectly - spell or ranged attack
2011-12-22 16:05:19 +03:00
bool killed ; //if true, stack has been killed
bool rebirth ; //if true, play rebirth animation after all
2012-02-18 20:39:47 +03:00
bool cloneKilled ;
2011-12-22 16:05:19 +03:00
} ;
2011-12-14 00:35:28 +03:00
/// Struct for battle effect animation e.g. morale, prayer, armageddon, bless,...
2011-12-22 16:05:19 +03:00
struct BattleEffect
2011-12-14 00:35:28 +03:00
{
int x , y ; //position on the screen
2013-07-16 21:12:47 +03:00
float currentFrame ;
2017-09-05 16:21:44 +02:00
std : : shared_ptr < CAnimation > animation ;
2011-12-14 00:35:28 +03:00
int effectID ; //uniqueID equal ot ID of appropriate CSpellEffectAnim
2013-07-10 13:45:51 +03:00
BattleHex position ; //Indicates if effect which hex the effect is drawn on
2011-12-14 00:35:28 +03:00
} ;
2013-07-19 19:35:16 +03:00
struct BattleObjectsByHex
{
typedef std : : vector < int > TWallList ;
2016-10-28 23:37:20 +02:00
typedef std : : vector < const CStack * > TStackList ;
2013-07-19 19:35:16 +03:00
typedef std : : vector < const BattleEffect * > TEffectList ;
2016-10-28 23:37:20 +02:00
typedef std : : vector < std : : shared_ptr < const CObstacleInstance > > TObstacleList ;
2013-07-19 19:35:16 +03:00
struct HexData
{
TWallList walls ;
TStackList dead ;
TStackList alive ;
TEffectList effects ;
TObstacleList obstacles ;
} ;
HexData beforeAll ;
HexData afterAll ;
std : : array < HexData , GameConstants : : BFIELD_SIZE > hex ;
} ;
2011-12-14 00:35:28 +03:00
/// Small struct which is needed for drawing the parabolic trajectory of the catapult cannon
2011-12-22 16:05:19 +03:00
struct CatapultProjectileInfo
2011-12-14 00:35:28 +03:00
{
2013-04-04 21:20:25 +03:00
CatapultProjectileInfo ( Point from , Point dest ) ;
2011-12-14 00:35:28 +03:00
2013-04-04 21:20:25 +03:00
double facA , facB , facC ;
2011-12-14 00:35:28 +03:00
double calculateY ( double x ) ;
} ;
2019-05-04 05:42:55 +02:00
enum class MouseHoveredHexContext
{
UNOCCUPIED_HEX ,
OCCUPIED_HEX
} ;
2011-12-14 00:35:28 +03:00
/// Big class which handles the overall battle interface actions and it is also responsible for
/// drawing everything correctly.
2018-07-25 00:36:48 +02:00
class CBattleInterface : public WindowBase
2011-12-14 00:35:28 +03:00
{
private :
2016-10-28 23:37:20 +02:00
SDL_Surface * background , * menu , * amountNormal , * amountNegative , * amountPositive , * amountEffNeutral , * cellBorders , * backgroundWithHexes ;
2017-09-05 19:45:29 +02:00
2018-07-25 00:36:48 +02:00
std : : shared_ptr < CButton > bOptions ;
std : : shared_ptr < CButton > bSurrender ;
std : : shared_ptr < CButton > bFlee ;
std : : shared_ptr < CButton > bAutofight ;
std : : shared_ptr < CButton > bSpell ;
std : : shared_ptr < CButton > bWait ;
std : : shared_ptr < CButton > bDefence ;
std : : shared_ptr < CButton > bConsoleUp ;
std : : shared_ptr < CButton > bConsoleDown ;
std : : shared_ptr < CButton > btactNext ;
std : : shared_ptr < CButton > btactEnd ;
std : : shared_ptr < CBattleConsole > console ;
std : : shared_ptr < CBattleHero > attackingHero ;
std : : shared_ptr < CBattleHero > defendingHero ;
std : : shared_ptr < CStackQueue > queue ;
2011-12-14 00:35:28 +03:00
const CCreatureSet * army1 , * army2 ; //copy of initial armies (for result window)
2016-10-28 23:37:20 +02:00
const CGHeroInstance * attackingHeroInstance , * defendingHeroInstance ;
2018-07-25 00:36:48 +02:00
std : : map < int32_t , std : : shared_ptr < CCreatureAnimation > > creAnims ; //animations of creatures from fighting armies (order by BattleInfo's stacks' ID)
2017-09-05 19:04:17 +02:00
std : : map < int , std : : shared_ptr < CAnimation > > idToProjectile ;
2017-07-20 06:08:49 +02:00
std : : map < std : : string , std : : shared_ptr < CAnimation > > animationsCache ;
std : : map < si32 , std : : shared_ptr < CAnimation > > obstacleAnimations ;
2012-05-05 00:16:39 +03:00
2016-10-28 23:37:20 +02:00
std : : map < int , bool > creDir ; // <creatureID, if false reverse creature's animation> //TODO: move it to battle callback
2011-12-14 00:35:28 +03:00
ui8 animCount ;
2016-10-28 23:37:20 +02:00
const CStack * activeStack ; //number of active stack; nullptr - no one
const CStack * mouseHoveredStack ; // stack below mouse pointer, used for border animation
const CStack * stackToActivate ; //when animation is playing, we should wait till the end to make the next stack active; nullptr of none
const CStack * selectedStack ; //for Teleport / Sacrifice
2013-09-17 15:02:33 +03:00
void activateStack ( ) ; //sets activeStack to stackToActivate etc. //FIXME: No, it's not clear at all
2011-12-22 16:05:19 +03:00
std : : vector < BattleHex > occupyableHexes , //hexes available for active stack
2011-12-14 00:35:28 +03:00
attackableHexes ; //hexes attackable by active stack
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
std : : array < bool , GameConstants : : BFIELD_SIZE > stackCountOutsideHexes ; // hexes that when in front of a unit cause it's amount box to move back
2013-07-19 19:35:16 +03:00
BattleHex previouslyHoveredHex ; //number of hex that was hovered by the cursor a while ago
BattleHex currentlyHoveredHex ; //number of hex that is supposed to be hovered (for a while it may be inappropriately set, but will be renewed soon)
2011-12-14 00:35:28 +03:00
int attackingHex ; //hex from which the stack would perform attack with current cursor
2015-12-29 04:43:33 +02:00
std : : shared_ptr < CPlayerInterface > tacticianInterface ; //used during tactics mode, points to the interface of player with higher tactics (can be either attacker or defender in hot-seat), valid onloy for human players
2011-12-14 00:35:28 +03:00
bool tacticsMode ;
2015-03-18 23:10:41 +02:00
bool stackCanCastSpell ; //if true, active stack could possibly cast some target spell
2012-04-16 20:12:39 +03:00
bool creatureCasting ; //if true, stack currently aims to cats a spell
2012-04-18 12:01:08 +03:00
bool spellDestSelectMode ; //if true, player is choosing destination for his spell - only for GUI / console
2018-07-25 00:36:48 +02:00
std : : shared_ptr < BattleAction > spellToCast ; //spell for which player is choosing destination
2016-10-28 23:37:20 +02:00
const CSpell * sp ; //spell pointer for convenience
2012-03-31 00:36:07 +03:00
si32 creatureSpellToCast ;
2019-05-04 05:42:55 +02:00
std : : vector < PossiblePlayerBattleAction > possibleActions ; //all actions possible to call at the moment by player
std : : vector < PossiblePlayerBattleAction > localActions ; //actions possible to take on hovered hex
std : : vector < PossiblePlayerBattleAction > illegalActions ; //these actions display message in case of illegal target
PossiblePlayerBattleAction currentAction ; //action that will be performed on l-click
PossiblePlayerBattleAction selectedAction ; //last action chosen (and saved) by player
PossiblePlayerBattleAction illegalAction ; //most likely action that can't be performed here
2019-03-22 22:39:53 +02:00
bool battleActionsStarted ; //used for delaying battle actions until intro sound stops
2019-03-23 13:12:25 +02:00
int battleIntroSoundChannel ; //required as variable for disabling it via ESC key
2012-04-04 11:03:52 +03:00
2016-10-28 23:37:20 +02:00
void setActiveStack ( const CStack * stack ) ;
void setHoveredStack ( const CStack * stack ) ;
2013-07-06 19:10:20 +03:00
2013-06-23 00:47:51 +03:00
void requestAutofightingAIToTakeAction ( ) ;
2013-06-22 17:47:20 +03:00
2019-05-04 05:42:55 +02:00
std : : vector < PossiblePlayerBattleAction > getPossibleActionsForStack ( const CStack * stack ) ; //called when stack gets its turn
2011-12-14 00:35:28 +03:00
void endCastingSpell ( ) ; //ends casting spell (eg. when spell has been cast or canceled)
2019-05-04 05:42:55 +02:00
void reorderPossibleActionsPriority ( const CStack * stack , MouseHoveredHexContext context ) ;
2011-12-14 00:35:28 +03:00
2016-10-15 22:50:12 +02:00
//force active stack to cast a spell if possible
void enterCreatureCastingMode ( ) ;
2011-12-22 16:05:19 +03:00
std : : list < ProjectileInfo > projectiles ; //projectiles flying on battlefield
2017-07-20 06:08:49 +02:00
void giveCommand ( EActionType action , BattleHex tile = BattleHex ( ) , si32 additional = - 1 ) ;
void sendCommand ( BattleAction * & command , const CStack * actor = nullptr ) ;
2011-12-22 16:05:19 +03:00
bool isTileAttackable ( const BattleHex & number ) const ; //returns true if tile 'number' is neighboring any tile from active stack's range or is one of these tiles
bool isCatapultAttackable ( BattleHex hex ) const ; //returns true if given tile can be attacked by catapult
2011-12-14 00:35:28 +03:00
2011-12-22 16:05:19 +03:00
std : : list < BattleEffect > battleEffects ; //different animations to display on the screen like spell effects
2011-12-14 00:35:28 +03:00
/// Class which is responsible for drawing the wall of a siege during battle
class SiegeHelper
{
private :
SDL_Surface * walls [ 18 ] ;
2016-10-28 23:37:20 +02:00
const CBattleInterface * owner ;
2011-12-14 00:35:28 +03:00
public :
2016-10-28 23:37:20 +02:00
const CGTownInstance * town ; //besieged town
2016-03-01 07:16:02 +02:00
2017-07-17 23:04:00 +02:00
SiegeHelper ( const CGTownInstance * siegeTown , const CBattleInterface * _owner ) ;
~ SiegeHelper ( ) ;
2011-12-14 00:35:28 +03:00
2013-08-06 14:20:28 +03:00
std : : string getSiegeName ( ui16 what ) const ;
2016-02-13 16:10:14 +02:00
std : : string getSiegeName ( ui16 what , int state ) const ; // state uses EWallState enum
2016-10-28 23:37:20 +02:00
void printPartOfWall ( SDL_Surface * to , int what ) ;
2016-02-13 16:10:14 +02:00
enum EWallVisual
{
BACKGROUND = 0 ,
BACKGROUND_WALL = 1 ,
KEEP ,
BOTTOM_TOWER ,
BOTTOM_WALL ,
WALL_BELLOW_GATE ,
WALL_OVER_GATE ,
UPPER_WALL ,
UPPER_TOWER ,
2016-02-14 13:38:24 +02:00
GATE ,
2016-02-13 16:10:14 +02:00
GATE_ARCH ,
BOTTOM_STATIC_WALL ,
UPPER_STATIC_WALL ,
MOAT ,
BACKGROUND_MOAT ,
KEEP_BATTLEMENT ,
BOTTOM_BATTLEMENT ,
UPPER_BATTLEMENT
} ;
2011-12-14 00:35:28 +03:00
friend class CBattleInterface ;
2016-10-28 23:37:20 +02:00
} * siegeH ;
2011-12-14 00:35:28 +03:00
2015-12-29 04:43:33 +02:00
std : : shared_ptr < CPlayerInterface > attackerInt , defenderInt ; //because LOCPLINT is not enough in hotSeat
std : : shared_ptr < CPlayerInterface > curInt ; //current player interface
2016-10-28 23:37:20 +02:00
const CGHeroInstance * getActiveHero ( ) ; //returns hero that can currently cast a spell
2013-07-19 19:35:16 +03:00
/** Methods for displaying battle screen */
2016-10-28 23:37:20 +02:00
void showBackground ( SDL_Surface * to ) ;
2013-07-19 19:35:16 +03:00
2016-10-28 23:37:20 +02:00
void showBackgroundImage ( SDL_Surface * to ) ;
void showAbsoluteObstacles ( SDL_Surface * to ) ;
void showHighlightedHexes ( SDL_Surface * to ) ;
2017-07-17 00:15:05 +02:00
void showHighlightedHex ( SDL_Surface * to , BattleHex hex , bool darkBorder = false ) ;
2016-10-28 23:37:20 +02:00
void showInterface ( SDL_Surface * to ) ;
2013-07-19 19:35:16 +03:00
2016-10-28 23:37:20 +02:00
void showBattlefieldObjects ( SDL_Surface * to ) ;
2013-07-19 19:35:16 +03:00
2016-10-28 23:37:20 +02:00
void showAliveStacks ( SDL_Surface * to , std : : vector < const CStack * > stacks ) ;
void showStacks ( SDL_Surface * to , std : : vector < const CStack * > stacks ) ;
void showObstacles ( SDL_Surface * to , std : : vector < std : : shared_ptr < const CObstacleInstance > > & obstacles ) ;
void showPiecesOfWall ( SDL_Surface * to , std : : vector < int > pieces ) ;
2013-07-19 19:35:16 +03:00
void showBattleEffects ( SDL_Surface * to , const std : : vector < const BattleEffect * > & battleEffects ) ;
2016-10-28 23:37:20 +02:00
void showProjectiles ( SDL_Surface * to ) ;
2013-07-19 19:35:16 +03:00
BattleObjectsByHex sortObjectsByHex ( ) ;
void updateBattleAnimations ( ) ;
2018-04-07 13:34:11 +02:00
std : : shared_ptr < IImage > getObstacleImage ( const CObstacleInstance & oi ) ;
2017-07-20 06:08:49 +02:00
2018-04-07 13:34:11 +02:00
Point getObstaclePosition ( std : : shared_ptr < IImage > image , const CObstacleInstance & obstacle ) ;
2017-07-20 06:08:49 +02:00
2016-10-28 23:37:20 +02:00
void redrawBackgroundWithHexes ( const CStack * activeStack ) ;
2013-07-19 19:35:16 +03:00
/** End of battle screen blitting methods */
2017-09-27 16:35:30 +02:00
void setHeroAnimation ( ui8 side , int phase ) ;
2011-12-14 00:35:28 +03:00
public :
2017-06-14 03:53:26 +02:00
static CondSh < bool > animsAreDisplayed ; //for waiting with the end of battle for end of anims
static CondSh < BattleAction * > givenCommand ; //data != nullptr if we have i.e. moved current unit
2016-10-28 23:37:20 +02:00
std : : list < std : : pair < CBattleAnimation * , bool > > pendingAnims ; //currently displayed animations <anim, initialized>
void addNewAnim ( CBattleAnimation * anim ) ; //adds new anim to pendingAnims
2011-12-14 00:35:28 +03:00
ui32 animIDhelper ; //for giving IDs for animations
2017-06-14 03:53:26 +02:00
2011-12-14 00:35:28 +03:00
2017-07-17 23:04:00 +02:00
CBattleInterface ( const CCreatureSet * army1 , const CCreatureSet * army2 , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , const SDL_Rect & myRect , std : : shared_ptr < CPlayerInterface > att , std : : shared_ptr < CPlayerInterface > defen , std : : shared_ptr < CPlayerInterface > spectatorInt = nullptr ) ;
virtual ~ CBattleInterface ( ) ;
2011-12-14 00:35:28 +03:00
//std::vector<TimeInterested*> timeinterested; //animation handling
void setPrintCellBorders ( bool set ) ; //if true, cell borders will be printed
void setPrintStackRange ( bool set ) ; //if true,range of active stack will be printed
void setPrintMouseShadow ( bool set ) ; //if true, hex under mouse will be shaded
2013-07-06 19:10:20 +03:00
void setAnimSpeed ( int set ) ; //speed of animation; range 1..100
int getAnimSpeed ( ) const ; //speed of animation; range 1..100
2016-10-28 23:37:20 +02:00
CPlayerInterface * getCurrentPlayerInterface ( ) const ;
2011-12-14 00:35:28 +03:00
2018-07-25 00:36:48 +02:00
std : : vector < std : : shared_ptr < CClickableHex > > bfield ; //11 lines, 17 hexes on each
2016-10-28 23:37:20 +02:00
SDL_Surface * cellBorder , * cellShade ;
2017-06-14 03:53:26 +02:00
2011-12-14 00:35:28 +03:00
bool myTurn ; //if true, interface is active (commands can be ordered)
bool moveStarted ; //if true, the creature that is already moving is going to make its first step
2013-07-07 22:44:08 +03:00
int moveSoundHander ; // sound handler used when moving a unit
2011-12-14 00:35:28 +03:00
2016-10-28 23:37:20 +02:00
const BattleResult * bresult ; //result of a battle; if non-zero then display when all animations end
2013-06-23 22:35:54 +03:00
2013-07-21 13:10:38 +03:00
// block all UI elements, e.g. during enemy turn
// unlike activate/deactivate this method will correctly grey-out all elements
void blockUI ( bool on ) ;
2011-12-14 00:35:28 +03:00
//button handle funcs:
void bOptionsf ( ) ;
void bSurrenderf ( ) ;
void bFleef ( ) ;
void reallyFlee ( ) ; //performs fleeing without asking player
void reallySurrender ( ) ; //performs surrendering without asking player
void bAutofightf ( ) ;
void bSpellf ( ) ;
void bWaitf ( ) ;
void bDefencef ( ) ;
void bConsoleUpf ( ) ;
void bConsoleDownf ( ) ;
2013-06-26 14:18:27 +03:00
void bTacticNextStack ( const CStack * current = nullptr ) ;
2011-12-14 00:35:28 +03:00
void bEndTacticPhase ( ) ;
//end of button handle funcs
//napisz tu klase odpowiadajaca za wyswietlanie bitwy i obsluge uzytkownika, polecenia ma przekazywac callbackiem
2015-10-12 15:47:10 +02:00
void activate ( ) override ;
void deactivate ( ) override ;
void keyPressed ( const SDL_KeyboardEvent & key ) override ;
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) override ;
void clickRight ( tribool down , bool previousState ) override ;
void show ( SDL_Surface * to ) override ;
void showAll ( SDL_Surface * to ) override ;
2013-07-19 19:35:16 +03:00
2011-12-14 00:35:28 +03:00
//call-ins
void startAction ( const BattleAction * action ) ;
2017-07-20 06:08:49 +02:00
void unitAdded ( const CStack * stack ) ; //new stack appeared on battlefield
void stackRemoved ( uint32_t stackID ) ; //stack disappeared from batlefiled
2016-10-28 23:37:20 +02:00
void stackActivated ( const CStack * stack ) ; //active stack has been changed
void stackMoved ( const CStack * stack , std : : vector < BattleHex > destHex , int distance ) ; //stack with id number moved to destHex
2011-12-14 00:35:28 +03:00
void waitForAnims ( ) ;
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 stacksAreAttacked ( std : : vector < StackAttackedInfo > attackedInfos ) ; //called when a certain amount of stacks has been attacked
2016-10-28 23:37:20 +02:00
void stackAttacking ( const CStack * attacker , BattleHex dest , const CStack * attacked , bool shooting ) ; //called when stack with id ID is attacking something on hex dest
2011-12-14 00:35:28 +03:00
void newRoundFirst ( int round ) ;
void newRound ( int number ) ; //caled when round is ended; number is the number of round
void hexLclicked ( int whichOne ) ; //hex only call-in
void stackIsCatapulting ( const CatapultAttack & ca ) ; //called when a stack is attacking walls
void battleFinished ( const BattleResult & br ) ; //called when battle is finished - battleresult window should be printed
void displayBattleFinished ( ) ; //displays battle result
2016-10-28 23:37:20 +02:00
void spellCast ( const BattleSpellCast * sc ) ; //called when a hero casts a spell
2011-12-14 00:35:28 +03:00
void battleStacksEffectsSet ( const SetStackEffect & sse ) ; //called when a specific effect is set to stacks
2015-01-30 08:39:36 +02:00
void castThisSpell ( SpellID spellID ) ; //called when player has chosen a spell from spellbook
2017-07-20 06:08:49 +02:00
void displayBattleLog ( const std : : vector < MetaString > & battleLog ) ;
void displayCustomEffects ( const std : : vector < CustomEffectInfo > & customEffects ) ;
2017-09-05 19:45:29 +02:00
void displayEffect ( ui32 effect , BattleHex destTile ) ; //displays custom effect on the battlefield
2016-03-01 07:16:02 +02:00
2021-02-20 03:57:50 +02:00
void displaySpellAnimationQueue ( const CSpell : : TAnimationQueue & q , BattleHex destinationTile ) ;
2016-09-10 17:56:38 +02:00
void displaySpellCast ( SpellID spellID , BattleHex destinationTile ) ; //displays spell`s cast animation
void displaySpellEffect ( SpellID spellID , BattleHex destinationTile ) ; //displays spell`s affected animation
void displaySpellHit ( SpellID spellID , BattleHex destinationTile ) ; //displays spell`s affected animation
2016-03-01 07:16:02 +02:00
2011-12-14 00:35:28 +03:00
void battleTriggerEffect ( const BattleTriggerEffect & bte ) ;
2012-03-31 00:36:07 +03:00
void setBattleCursor ( const int myNumber ) ; //really complex and messy, sets attackingHex
2011-12-14 00:35:28 +03:00
void endAction ( const BattleAction * action ) ;
void hideQueue ( ) ;
void showQueue ( ) ;
2016-03-04 16:53:09 +02:00
2012-04-23 22:56:37 +03:00
Rect hexPosition ( BattleHex hex ) const ;
2012-02-17 00:19:07 +03:00
2012-03-31 00:36:07 +03:00
void handleHex ( BattleHex myNumber , int eventType ) ;
2016-10-28 23:37:20 +02:00
bool isCastingPossibleHere ( const CStack * sactive , const CStack * shere , BattleHex myNumber ) ;
bool canStackMoveHere ( const CStack * sactive , BattleHex MyNumber ) ; //TODO: move to BattleState / callback
2012-03-31 00:36:07 +03:00
BattleHex fromWhichHexAttack ( BattleHex myNumber ) ;
2012-05-05 00:16:39 +03:00
void obstaclePlaced ( const CObstacleInstance & oi ) ;
2016-02-13 16:40:31 +02:00
void gateStateChanged ( const EGateState state ) ;
2016-02-10 06:10:32 +02:00
2017-07-20 06:08:49 +02:00
void initStackProjectile ( const CStack * stack ) ;
2017-02-02 21:27:51 +02:00
2016-10-28 23:37:20 +02:00
const CGHeroInstance * currentHero ( ) const ;
2012-08-26 12:07:48 +03:00
InfoAboutHero enemyHero ( ) const ;
2011-12-14 00:35:28 +03:00
friend class CPlayerInterface ;
2014-08-03 14:16:19 +03:00
friend class CButton ;
2011-12-14 00:35:28 +03:00
friend class CInGameConsole ;
2016-03-01 07:16:02 +02:00
2011-12-14 00:35:28 +03:00
friend class CBattleResultWindow ;
friend class CBattleHero ;
2017-09-05 19:45:29 +02:00
friend class CEffectAnimation ;
2011-12-14 00:35:28 +03:00
friend class CBattleStackAnimation ;
friend class CReverseAnimation ;
friend class CDefenceAnimation ;
friend class CMovementAnimation ;
friend class CMovementStartAnimation ;
friend class CAttackAnimation ;
friend class CMeleeAttackAnimation ;
friend class CShootingAnimation ;
2017-09-08 13:25:12 +02:00
friend class CCastAnimation ;
2011-12-17 21:59:59 +03:00
friend class CClickableHex ;
2011-12-14 00:35:28 +03:00
} ;