2022-11-20 19:11:34 +02:00
/*
2022-12-11 23:16:23 +02:00
* BattleStacksController . h , part of VCMI engine
2022-11-20 19:11:34 +02:00
*
* 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
2022-11-27 02:26:02 +02:00
# include "../gui/Geometries.h"
2022-11-29 02:00:08 +02:00
VCMI_LIB_NAMESPACE_BEGIN
2022-11-20 19:11:34 +02:00
struct BattleHex ;
2022-11-29 02:00:08 +02:00
class BattleAction ;
class CStack ;
class SpellID ;
VCMI_LIB_NAMESPACE_END
2022-11-20 19:11:34 +02:00
struct StackAttackedInfo ;
2022-12-11 22:09:57 +02:00
class Canvas ;
2022-12-09 13:26:17 +02:00
class BattleInterface ;
2022-11-20 19:11:34 +02:00
class CBattleAnimation ;
2022-12-09 13:26:17 +02:00
class CreatureAnimation ;
2022-11-20 19:11:34 +02:00
class CBattleAnimation ;
2022-12-09 13:26:17 +02:00
class BattleRenderer ;
2022-11-25 00:26:14 +02:00
class IImage ;
2022-11-20 19:11:34 +02:00
2022-12-11 23:16:23 +02:00
/// Class responsible for handling stacks in battle
/// Handles ordering of stacks animation
/// As well as rendering of stacks, their amount boxes
/// And any other effect applied to stacks
2022-12-09 13:26:17 +02:00
class BattleStacksController
2022-11-20 19:11:34 +02:00
{
2022-12-13 13:58:16 +02:00
BattleInterface & owner ;
2022-11-20 19:11:34 +02:00
2022-11-25 00:26:14 +02:00
std : : shared_ptr < IImage > amountNormal ;
std : : shared_ptr < IImage > amountNegative ;
std : : shared_ptr < IImage > amountPositive ;
std : : shared_ptr < IImage > amountEffNeutral ;
2022-11-20 19:11:34 +02:00
2022-12-11 23:16:23 +02:00
/// currently displayed animations <anim, initialized>
std : : vector < CBattleAnimation * > currentAnimations ;
2022-11-20 19:11:34 +02:00
2022-12-11 23:16:23 +02:00
/// animations of creatures from fighting armies (order by BattleInfo's stacks' ID)
std : : map < int32_t , std : : shared_ptr < CreatureAnimation > > stackAnimation ;
2022-11-20 19:11:34 +02:00
2022-12-11 23:16:23 +02:00
/// <creatureID, if false reverse creature's animation> //TODO: move it to battle callback
std : : map < int , bool > stackFacingRight ;
/// number of active stack; nullptr - no one
const CStack * activeStack ;
/// stack below mouse pointer, used for border animation
const CStack * mouseHoveredStack ;
///when animation is playing, we should wait till the end to make the next stack active; nullptr of none
const CStack * stackToActivate ;
/// stack that was selected for multi-target spells - Teleport / Sacrifice
const CStack * selectedStack ;
/// if true, active stack could possibly cast some target spell
bool stackCanCastSpell ;
2022-11-20 19:11:34 +02:00
si32 creatureSpellToCast ;
2022-12-11 23:16:23 +02:00
/// for giving IDs for animations
ui32 animIDhelper ;
2022-11-25 00:26:14 +02:00
2022-12-13 15:10:31 +02:00
bool stackNeedsAmountBox ( const CStack * stack ) const ;
2022-12-11 22:09:57 +02:00
void showStackAmountBox ( Canvas & canvas , const CStack * stack ) ;
2022-12-13 15:10:31 +02:00
BattleHex getStackCurrentPosition ( const CStack * stack ) const ;
2022-11-26 23:12:20 +02:00
std : : shared_ptr < IImage > getStackAmountBox ( const CStack * stack ) ;
2022-11-25 00:26:14 +02:00
2022-11-20 19:11:34 +02:00
public :
2022-12-13 13:58:16 +02:00
BattleStacksController ( BattleInterface & owner ) ;
2022-11-20 19:11:34 +02:00
2022-12-11 23:16:23 +02:00
bool shouldRotate ( const CStack * stack , const BattleHex & oldPos , const BattleHex & nextHex ) const ;
bool facingRight ( const CStack * stack ) const ;
2022-11-20 19:11:34 +02:00
void stackReset ( const CStack * stack ) ;
void stackAdded ( const CStack * stack ) ; //new stack appeared on battlefield
void stackRemoved ( uint32_t stackID ) ; //stack disappeared from batlefiled
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
void stacksAreAttacked ( std : : vector < StackAttackedInfo > attackedInfos ) ; //called when a certain amount of stacks has been attacked
void stackAttacking ( const CStack * attacker , BattleHex dest , const CStack * attacked , bool shooting ) ; //called when stack with id ID is attacking something on hex dest
void startAction ( const BattleAction * action ) ;
void endAction ( const BattleAction * action ) ;
bool activeStackSpellcaster ( ) ;
SpellID activeStackSpellToCast ( ) ;
void activateStack ( ) ; //sets activeStack to stackToActivate etc. //FIXME: No, it's not clear at all
void setActiveStack ( const CStack * stack ) ;
void setHoveredStack ( const CStack * stack ) ;
void setSelectedStack ( const CStack * stack ) ;
2022-12-11 22:09:57 +02:00
void showAliveStack ( Canvas & canvas , const CStack * stack ) ;
void showStack ( Canvas & canvas , const CStack * stack ) ;
2022-11-25 00:26:14 +02:00
2022-12-09 13:26:17 +02:00
void collectRenderableObjects ( BattleRenderer & renderer ) ;
2022-11-20 19:11:34 +02:00
void addNewAnim ( CBattleAnimation * anim ) ; //adds new anim to pendingAnims
void updateBattleAnimations ( ) ;
2022-12-11 23:16:23 +02:00
const CStack * getActiveStack ( ) const ;
const CStack * getSelectedStack ( ) const ;
2022-11-20 19:11:34 +02:00
2022-11-27 02:26:02 +02:00
/// returns position of animation needed to place stack in specific hex
2022-12-11 23:16:23 +02:00
Point getStackPositionAtHex ( BattleHex hexNum , const CStack * creature ) const ;
2022-11-27 02:26:02 +02:00
2022-11-20 19:11:34 +02:00
friend class CBattleAnimation ; // for exposing pendingAnims/creAnims/creDir to animations
} ;