2009-04-03 18:55:26 +03:00
# ifndef __CBATTLEINTERFACE_H__
# define __CBATTLEINTERFACE_H__
2009-03-28 20:46:20 +02:00
2009-05-20 13:08:56 +03:00
# include "../global.h"
2009-04-03 18:55:26 +03:00
# include <list>
2009-05-20 13:08:56 +03:00
# include "GUIBase.h"
2010-05-03 02:36:08 +03:00
# include "../lib/CCreatureSet.h"
2011-02-09 15:56:30 +02:00
# include "CAnimation.h"
2009-04-03 18:55:26 +03:00
2009-04-15 17:03:31 +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
*
*/
2011-08-31 15:11:34 +03:00
class CLabel ;
2009-04-03 18:55:26 +03:00
class CCreatureSet ;
class CGHeroInstance ;
class CDefHandler ;
class CStack ;
class CCallback ;
class AdventureMapButton ;
class CHighlightableButton ;
class CHighlightableButtonsGroup ;
struct BattleResult ;
2010-05-16 16:42:19 +03:00
struct BattleSpellCast ;
2011-05-15 20:18:36 +03:00
struct CObstacleInstance ;
2009-04-03 18:55:26 +03:00
template < typename T > struct CondSh ;
2009-05-20 12:02:50 +03:00
struct SetStackEffect ; ;
struct BattleAction ;
2009-08-24 15:55:05 +03:00
class CGTownInstance ;
2009-09-24 16:44:55 +03:00
struct CatapultAttack ;
2009-04-03 18:55:26 +03:00
class CBattleInterface ;
2011-05-30 17:16:34 +03:00
struct CatapultProjectileInfo ;
2009-04-03 18:55:26 +03:00
2011-02-22 13:52:36 +02:00
/// Small struct which contains information about the id of the attacked stack, the damage dealt,...
2009-09-10 14:28:34 +03:00
struct SStackAttackedInfo
{
2010-12-24 23:44:48 +02:00
const CStack * defender ; //attacked stack
2009-09-10 14:28:34 +03:00
int dmg ; //damage dealt
int amountKilled ; //how many creatures in stack has been killed
2010-12-24 23:44:48 +02:00
const CStack * attacker ; //attacking stack
2009-09-10 14:28:34 +03:00
bool byShooting ; //if true, stack has been attacked by shooting
bool killed ; //if true, stack has been killed
2011-07-08 17:54:20 +03:00
bool rebirth ; //if true, play rebirth animation after all
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Small struct which contains information about the position and the velocity of a projectile
2009-09-10 14:28:34 +03:00
struct SProjectileInfo
{
2011-07-13 21:39:02 +03:00
double x , y ; //position on the screen
double dx , dy ; //change in position in one step
2009-09-10 14:28:34 +03:00
int step , lastStep ; //to know when finish showing this projectile
int creID ; //ID of creature that shot this projectile
2011-05-26 17:47:45 +03:00
int stackID ; //ID of stack
2009-09-10 14:28:34 +03:00
int frameNum ; //frame to display form projectile animation
bool spin ; //if true, frameNum will be increased
int animStartDelay ; //how many times projectile must be attempted to be shown till it's really show (decremented after hit)
bool reverse ; //if true, projectile will be flipped by vertical asix
2011-05-30 17:16:34 +03:00
CatapultProjectileInfo * catapultInfo ; // holds info about the parabolic trajectory of the cannon
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Base class of battle animations
2009-09-10 14:28:34 +03:00
class CBattleAnimation
{
protected :
CBattleInterface * owner ;
public :
virtual bool init ( ) = 0 ; //to be called - if returned false, call again until returns true
virtual void nextFrame ( ) = 0 ; //call every new frame
virtual void endAnim ( ) ; //to be called mostly internally; in this class it removes animation from pendingAnims list
2009-09-11 15:46:26 +03:00
bool isEarliest ( bool perStackConcurrency ) ; //determines if this animation is earlies of all
2009-09-10 14:28:34 +03:00
unsigned int ID ; //unique identifier
CBattleAnimation ( CBattleInterface * _owner ) ;
} ;
2010-01-28 19:23:01 +02:00
class CDummyAnim : public CBattleAnimation
{
private :
int counter ;
int howMany ;
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
CDummyAnim ( CBattleInterface * _owner , int howManyFrames ) ;
} ;
2011-02-22 13:52:36 +02:00
/// This class manages a spell effect animation
2009-09-17 15:59:04 +03:00
class CSpellEffectAnim : public CBattleAnimation
{
private :
ui32 effect ;
2010-12-23 22:18:10 +02:00
THex destTile ;
2009-09-17 15:59:04 +03:00
std : : string customAnim ;
int x , y , dx , dy ;
2010-07-15 20:13:17 +03:00
bool Vflip ;
2009-09-17 15:59:04 +03:00
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
2010-12-23 22:18:10 +02:00
CSpellEffectAnim ( CBattleInterface * _owner , ui32 _effect , THex _destTile , int _dx = 0 , int _dy = 0 , bool _Vflip = false ) ;
2010-07-15 20:13:17 +03:00
CSpellEffectAnim ( CBattleInterface * _owner , std : : string _customAnim , int _x , int _y , int _dx = 0 , int _dy = 0 , bool _Vflip = false ) ;
2009-09-17 15:59:04 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Sub-class which is responsible for managing the battle stack animation.
2009-09-10 14:28:34 +03:00
class CBattleStackAnimation : public CBattleAnimation
{
public :
2010-12-24 23:44:48 +02:00
const CStack * stack ; //id of stack whose animation it is
2009-09-10 14:28:34 +03:00
2010-12-24 23:44:48 +02:00
CBattleStackAnimation ( CBattleInterface * _owner , const CStack * _stack ) ;
2010-12-23 22:18:10 +02:00
static bool isToReverseHlp ( THex hexFrom , THex hexTo , bool curDir ) ; //helper for isToReverse
static bool isToReverse ( THex hexFrom , THex hexTo , bool curDir /*if true, creature is in attacker's direction*/ , bool toDoubleWide , bool toDir ) ; //determines if creature should be reversed (it stands on hexFrom and should 'see' hexTo)
2011-09-01 06:12:54 +03:00
CCreatureAnimation * myAnim ( ) ; //animation for our stack
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Class responsible for animation of stack chaning direction (left <-> right)
2009-09-10 14:28:34 +03:00
class CReverseAnim : public CBattleStackAnimation
{
private :
int partOfAnim ; //1 - first, 2 - second
bool secondPartSetup ;
2010-12-23 22:18:10 +02:00
THex hex ;
2009-09-10 14:28:34 +03:00
public :
2009-09-14 15:00:23 +03:00
bool priority ; //true - high, false - low
2009-09-10 14:28:34 +03:00
bool init ( ) ;
void nextFrame ( ) ;
2011-09-01 06:12:54 +03:00
void setupSecondPart ( ) ;
2009-09-10 14:28:34 +03:00
void endAnim ( ) ;
2010-12-24 23:44:48 +02:00
CReverseAnim ( CBattleInterface * _owner , const CStack * stack , THex dest , bool _priority ) ;
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Animation of a defending unit
2009-09-10 14:28:34 +03:00
class CDefenceAnim : public CBattleStackAnimation
{
private :
//std::vector<SStackAttackedInfo> attackedInfos;
int dmg ; //damage dealt
int amountKilled ; //how many creatures in stack has been killed
2010-12-24 23:44:48 +02:00
const CStack * attacker ; //attacking stack
2009-09-10 14:28:34 +03:00
bool byShooting ; //if true, stack has been attacked by shooting
bool killed ; //if true, stack has been killed
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
CDefenceAnim ( SStackAttackedInfo _attackedInfo , CBattleInterface * _owner ) ;
} ;
2011-02-22 13:52:36 +02:00
/// Move animation of a creature
2009-09-10 14:28:34 +03:00
class CBattleStackMoved : public CBattleStackAnimation
{
private :
2011-08-01 20:36:18 +03:00
std : : vector < THex > destTiles ; //destination
THex nextHex ;
int nextPos ;
2009-09-10 14:28:34 +03:00
int distance ;
float stepX , stepY ; //how far stack is moved in one frame
float posX , posY ;
int steps , whichStep ;
int curStackPos ; //position of stack before move
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
2011-08-01 20:36:18 +03:00
CBattleStackMoved ( CBattleInterface * _owner , const CStack * _stack , std : : vector < THex > _destTiles , int _distance ) ;
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Move start animation of a creature
2009-09-10 14:28:34 +03:00
class CBattleMoveStart : public CBattleStackAnimation
{
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
2010-12-24 23:44:48 +02:00
CBattleMoveStart ( CBattleInterface * _owner , const CStack * _stack ) ;
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Move end animation of a creature
2009-09-10 14:28:34 +03:00
class CBattleMoveEnd : public CBattleStackAnimation
{
private :
2010-12-23 22:18:10 +02:00
THex destinationTile ;
2009-09-10 14:28:34 +03:00
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
2010-12-24 23:44:48 +02:00
CBattleMoveEnd ( CBattleInterface * _owner , const CStack * _stack , THex destTile ) ;
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// This class is responsible for managing the battle attack animation
2009-09-10 14:28:34 +03:00
class CBattleAttack : public CBattleStackAnimation
{
protected :
2010-12-23 22:18:10 +02:00
THex dest ; //atacked hex
2009-09-10 14:28:34 +03:00
bool shooting ;
2011-02-09 15:56:30 +02:00
CCreatureAnim : : EAnimType group ; //if shooting is true, print this animation group
2009-09-16 13:09:08 +03:00
const CStack * attackedStack ;
2009-09-16 13:59:56 +03:00
const CStack * attackingStack ;
int attackingStackPosBeforeReturn ; //for stacks with return_after_strike feature
2009-09-10 14:28:34 +03:00
public :
void nextFrame ( ) ;
bool checkInitialConditions ( ) ;
2009-09-24 16:44:55 +03:00
2010-12-24 23:44:48 +02:00
CBattleAttack ( CBattleInterface * _owner , const CStack * attacker , THex _dest , const CStack * defender ) ;
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Hand-to-hand attack
2009-09-10 14:28:34 +03:00
class CMeleeAttack : public CBattleAttack
{
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
2010-12-24 23:44:48 +02:00
CMeleeAttack ( CBattleInterface * _owner , const CStack * attacker , THex _dest , const CStack * _attacked ) ;
2009-09-10 14:28:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Shooting attack
2009-09-10 14:28:34 +03:00
class CShootingAnim : public CBattleAttack
{
2009-09-24 16:44:55 +03:00
private :
int catapultDamage ;
bool catapult ;
2009-09-10 14:28:34 +03:00
public :
bool init ( ) ;
void nextFrame ( ) ;
void endAnim ( ) ;
2010-12-24 23:44:48 +02:00
CShootingAnim ( CBattleInterface * _owner , const CStack * attacker , THex _dest , const CStack * _attacked , bool _catapult = false , int _catapultDmg = 0 ) ; //last param only for catapult attacks
2009-09-10 14:28:34 +03:00
} ;
//end of battle animation handlers
2011-02-22 13:52:36 +02:00
/// Hero battle animation
2009-08-11 19:05:33 +03:00
class CBattleHero : public CIntObject
2009-04-03 18:55:26 +03:00
{
public :
bool flip ; //false if it's attacking hero, true otherwise
CDefHandler * dh , * flag ; //animation and flag
const CGHeroInstance * myHero ; //this animation's hero instance
const CBattleInterface * myOwner ; //battle interface to which this animation is assigned
int phase ; //stage of animation
int nextPhase ; //stage of animation to be set after current phase is fully displayed
int image ; //frame of animation
unsigned char flagAnim , flagAnimCount ; //for flag animation
void show ( SDL_Surface * to ) ; //prints next frame of animation to to
void activate ( ) ;
void deactivate ( ) ;
void setPhase ( int newPhase ) ; //sets phase of hero animation
2009-08-11 19:05:33 +03:00
void clickLeft ( tribool down , bool previousState ) ; //call-in
2009-04-03 18:55:26 +03:00
CBattleHero ( const std : : string & defName , int phaseG , int imageG , bool filpG , unsigned char player , const CGHeroInstance * hero , const CBattleInterface * owner ) ; //c-tor
~ CBattleHero ( ) ; //d-tor
} ;
2011-02-22 13:52:36 +02:00
/// Class which stands for a single hex field on a battlefield
2009-08-11 19:05:33 +03:00
class CBattleHex : public CIntObject
2009-04-03 18:55:26 +03:00
{
private :
bool setAlterText ; //if true, this hex has set alternative text in console and will clean it
public :
unsigned int myNumber ; //number of hex in commonly used format
2009-10-16 05:09:58 +03:00
bool accessible ; //if true, this hex is accessible for units
2009-04-03 18:55:26 +03:00
//CStack * ourStack;
bool hovered , strictHovered ; //for determining if hex is hovered by mouse (this is different problem than hex's graphic hovering)
CBattleInterface * myInterface ; //interface that owns me
2009-09-21 11:29:41 +03:00
static Point getXYUnitAnim ( const int & hexNum , const bool & attacker , const CStack * creature , const CBattleInterface * cbi ) ; //returns (x, y) of left top corner of animation
2009-04-03 18:55:26 +03:00
//for user interactions
void hover ( bool on ) ;
void activate ( ) ;
void deactivate ( ) ;
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) ;
2009-08-11 19:05:33 +03:00
void clickLeft ( tribool down , bool previousState ) ;
void clickRight ( tribool down , bool previousState ) ;
2009-04-03 18:55:26 +03:00
CBattleHex ( ) ;
} ;
2011-02-22 13:52:36 +02:00
/// Class which manages the locked hex fields that are blocked e.g. by obstacles
2009-04-03 18:55:26 +03:00
class CBattleObstacle
{
std : : vector < int > lockedHexes ;
} ;
2011-02-22 13:52:36 +02:00
/// Class which shows the console at the bottom of the battle screen and manages the text of the console
2009-08-11 19:05:33 +03:00
class CBattleConsole : public CIntObject
2009-04-03 18:55:26 +03:00
{
private :
std : : vector < std : : string > texts ; //a place where texts are stored
int lastShown ; //last shown line of text
public :
std : : string alterTxt ; //if it's not empty, this text is displayed
std : : string ingcAlter ; //alternative text set by in-game console - very important!
int whoSetAlter ; //who set alter text; 0 - battle interface or none, 1 - button
CBattleConsole ( ) ; //c-tor
~ CBattleConsole ( ) ; //d-tor
void show ( SDL_Surface * to = 0 ) ;
bool addText ( const std : : string & text ) ; //adds text at the last position; returns false if failed (e.g. text longer than 70 characters)
void eraseText ( unsigned int pos ) ; //erases added text at position pos
void changeTextAt ( const std : : string & text , unsigned int pos ) ; //if we have more than pos texts, pos-th is changed to given one
void scrollUp ( unsigned int by = 1 ) ; //scrolls console up by 'by' positions
void scrollDown ( unsigned int by = 1 ) ; //scrolls console up by 'by' positions
} ;
2011-02-22 13:52:36 +02:00
/// Class which is responsible for showing the battle result window
2009-08-11 19:05:33 +03:00
class CBattleResultWindow : public CIntObject
2009-04-03 18:55:26 +03:00
{
private :
SDL_Surface * background ;
AdventureMapButton * exit ;
2010-02-19 18:02:34 +02:00
CBattleInterface * owner ;
2009-04-03 18:55:26 +03:00
public :
2010-02-19 18:02:34 +02:00
CBattleResultWindow ( const BattleResult & br , const SDL_Rect & pos , CBattleInterface * _owner ) ; //c-tor
2009-06-01 06:36:13 +03:00
~ CBattleResultWindow ( ) ; //d-tor
2009-04-03 18:55:26 +03:00
void bExitf ( ) ; //exit button callback
void activate ( ) ;
void deactivate ( ) ;
void show ( SDL_Surface * to = 0 ) ;
} ;
2011-02-22 13:52:36 +02:00
/// Class which manages the battle options window
2009-08-11 19:05:33 +03:00
class CBattleOptionsWindow : public CIntObject
2009-04-03 18:55:26 +03:00
{
private :
CBattleInterface * myInt ;
2011-08-31 15:11:34 +03:00
CPicture * background ;
2009-04-03 18:55:26 +03:00
AdventureMapButton * setToDefault , * exit ;
CHighlightableButton * viewGrid , * movementShadow , * mouseShadow ;
CHighlightableButtonsGroup * animSpeeds ;
2011-08-31 15:11:34 +03:00
std : : vector < CLabel * > labels ;
2009-04-03 18:55:26 +03:00
public :
CBattleOptionsWindow ( const SDL_Rect & position , CBattleInterface * owner ) ; //c-tor
void bDefaultf ( ) ; //dafault button callback
void bExitf ( ) ; //exit button callback
} ;
2011-02-22 13:52:36 +02:00
/// Struct for battle effect animation e.g. morale, prayer, armageddon, bless,...
2009-09-17 15:59:04 +03:00
struct SBattleEffect
{
int x , y ; //position on the screen
int frame , maxFrame ;
CDefHandler * anim ; //animation to display
int effectID ; //uniqueID equal ot ID of appropriate CSpellEffectAnim
} ;
2011-02-22 13:52:36 +02:00
/// Shows the stack queue
2009-09-20 15:47:40 +03:00
class CStackQueue : public CIntObject
{
class StackBox : public CIntObject
{
public :
const CStack * my ;
SDL_Surface * bg ;
void hover ( bool on ) ;
void showAll ( SDL_Surface * to ) ;
void setStack ( const CStack * nStack ) ;
StackBox ( SDL_Surface * BG ) ;
~ StackBox ( ) ;
} ;
public :
static const int QUEUE_SIZE = 10 ;
const bool embedded ;
std : : vector < const CStack * > stacksSorted ;
std : : vector < StackBox * > stackBoxes ;
SDL_Surface * box ;
SDL_Surface * bg ;
2010-02-19 18:02:34 +02:00
CBattleInterface * owner ;
2009-09-20 15:47:40 +03:00
void showAll ( SDL_Surface * to ) ;
2010-02-19 18:02:34 +02:00
CStackQueue ( bool Embedded , CBattleInterface * _owner ) ;
2009-09-20 15:47:40 +03:00
~ CStackQueue ( ) ;
void update ( ) ;
2009-09-21 11:29:41 +03:00
void blitBg ( SDL_Surface * to ) ;
2009-09-20 15:47:40 +03:00
//void showAll(SDL_Surface *to);
} ;
2011-05-30 17:16:34 +03:00
/// Small struct which is needed for drawing the parabolic trajectory of the catapult cannon
struct CatapultProjectileInfo
{
const double facA , facB , facC ;
const int fromX , toX ;
CatapultProjectileInfo ( ) : facA ( 0 ) , facB ( 0 ) , facC ( 0 ) , fromX ( 0 ) , toX ( 0 ) { } ;
CatapultProjectileInfo ( double factorA , double factorB , double factorC , int fromXX , int toXX ) : facA ( factorA ) , facB ( factorB ) , facC ( factorC ) ,
fromX ( fromXX ) , toX ( toXX ) { } ;
2011-07-13 21:39:02 +03:00
double calculateY ( double x ) ;
2011-05-30 17:16:34 +03:00
} ;
2011-02-22 13:52:36 +02:00
/// Big class which handles the overall battle interface actions and it is also responsible for
/// drawing everything correctly.
2009-08-11 19:05:33 +03:00
class CBattleInterface : public CIntObject
2009-04-03 18:55:26 +03:00
{
private :
SDL_Surface * background , * menu , * amountNormal , * amountNegative , * amountPositive , * amountEffNeutral , * cellBorders , * backgroundWithHexes ;
AdventureMapButton * bOptions , * bSurrender , * bFlee , * bAutofight , * bSpell ,
2011-02-12 18:12:48 +02:00
* bWait , * bDefence , * bConsoleUp , * bConsoleDown , * btactNext , * btactEnd ;
2009-04-03 18:55:26 +03:00
CBattleConsole * console ;
CBattleHero * attackingHero , * defendingHero ; //fighting heroes
2009-09-20 15:47:40 +03:00
CStackQueue * queue ;
2010-12-06 01:10:02 +02:00
const CCreatureSet * army1 , * army2 ; //copy of initial armies (for result window)
2010-10-31 23:29:39 +02:00
const CGHeroInstance * attackingHeroInstance , * defendingHeroInstance ;
2009-04-03 18:55:26 +03:00
std : : map < int , CCreatureAnimation * > creAnims ; //animations of creatures from fighting armies (order by BattleInfo's stacks' ID)
2010-02-19 18:02:34 +02:00
std : : map < int , CDefHandler * > idToProjectile ; //projectiles of creatures (creatureID, defhandler)
2009-04-03 18:55:26 +03:00
std : : map < int , CDefHandler * > idToObstacle ; //obstacles located on the battlefield
std : : map < int , bool > creDir ; // <creatureID, if false reverse creature's animation>
unsigned char animCount ;
2010-12-24 23:44:48 +02:00
const CStack * activeStack ; //number of active stack; NULL - no one
const CStack * stackToActivate ; //when animation is playing, we should wait till the end to make the next stack active; NULL of none
2009-09-15 15:20:11 +03:00
void activateStack ( ) ; //sets activeStack to stackToActivate etc.
2009-04-03 18:55:26 +03:00
int mouseHoveredStack ; //stack hovered by mouse; if -1 -> none
2011-02-26 19:32:56 +02:00
std : : vector < THex > occupyableHexes , //hexes available for active stack
attackableHexes ; //hexes attackable by active stack
2009-04-03 18:55:26 +03:00
int previouslyHoveredHex ; //number of hex that was hovered by the cursor a while ago
int currentlyHoveredHex ; //number of hex that is supposed to be hovered (for a while it may be inappropriately set, but will be renewed soon)
float getAnimSpeedMultiplier ( ) const ; //returns multiplier for number of frames in a group
std : : map < int , int > standingFrame ; //number of frame in standing animation by stack ID, helps in showing 'random moves'
2011-05-25 02:17:57 +03:00
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-02-14 00:46:04 +02:00
bool tacticsMode ;
2009-04-03 18:55:26 +03:00
bool spellDestSelectMode ; //if true, player is choosing destination for his spell
2010-05-07 17:05:48 +03:00
int spellSelMode ; //0 - any location, 1 - any friendly creature, 2 - any hostile creature, 3 - any creature,
//4 - obstacle, 5 - teleport -1 - no location
2009-04-03 18:55:26 +03:00
BattleAction * spellToCast ; //spell for which player is choosing destination
2010-02-19 18:02:34 +02:00
void endCastingSpell ( ) ; //ends casting spell (eg. when spell has been cast or canceled)
2009-04-03 18:55:26 +03:00
2010-12-06 01:10:02 +02:00
void showAliveStack ( const CStack * stack , SDL_Surface * to ) ; //helper function for function show
2011-05-15 20:18:36 +03:00
void showAliveStacks ( std : : vector < const CStack * > * aliveStacks , int hex , std : : vector < const CStack * > * flyingStacks , SDL_Surface * to ) ; // loops through all stacks at a given hex position
2010-12-06 01:10:02 +02:00
void showPieceOfWall ( SDL_Surface * to , int hex , const std : : vector < const CStack * > & stacks ) ; //helper function for show
2011-05-15 20:18:36 +03:00
void showObstacles ( std : : multimap < THex , int > * hexToObstacle , std : : vector < CObstacleInstance > & obstacles , int hex , SDL_Surface * to ) ; // show all obstacles at a given hex position
2010-12-24 23:44:48 +02:00
void redrawBackgroundWithHexes ( const CStack * activeStack ) ;
2011-08-12 22:38:30 +03:00
void printConsoleAttacked ( const CStack * defender , int dmg , int killed , const CStack * attacker , bool Multiple ) ;
2009-04-03 18:55:26 +03:00
std : : list < SProjectileInfo > projectiles ; //projectiles flying on battlefield
2009-04-14 15:47:09 +03:00
void projectileShowHelper ( SDL_Surface * to ) ; //prints projectiles present on the battlefield
2011-02-09 17:19:53 +02:00
void giveCommand ( ui8 action , THex tile , ui32 stack , si32 additional = - 1 ) ;
bool isTileAttackable ( const THex & number ) const ; //returns true if tile 'number' is neighboring any tile from active stack's range or is one of these tiles
bool blockedByObstacle ( THex hex ) const ;
2011-08-30 10:08:11 +03:00
bool isHexAccessible ( THex nextPos ) ;
2011-02-09 17:19:53 +02:00
bool isCatapultAttackable ( THex hex ) const ; //returns true if given tile can be attacked by catapult
2009-04-03 18:55:26 +03:00
std : : list < SBattleEffect > battleEffects ; //different animations to display on the screen like spell effects
2009-08-24 15:55:05 +03:00
2011-05-30 17:16:34 +03:00
/// Class which is responsible for drawing the wall of a siege during battle
2009-08-24 15:55:05 +03:00
class SiegeHelper
{
private :
static std : : string townTypeInfixes [ F_NUMBER ] ; //for internal use only - to build filenames
2009-09-04 17:11:42 +03:00
SDL_Surface * walls [ 18 ] ;
2009-08-26 17:09:55 +03:00
const CBattleInterface * owner ;
2009-08-24 15:55:05 +03:00
public :
const CGTownInstance * town ; //besieged town
2011-05-30 17:16:34 +03:00
2009-08-26 17:09:55 +03:00
SiegeHelper ( const CGTownInstance * siegeTown , const CBattleInterface * _owner ) ; //c-tor
~ SiegeHelper ( ) ; //d-tor
2009-08-24 15:55:05 +03:00
//filename getters
2009-09-04 17:11:42 +03:00
std : : string getSiegeName ( ui16 what , ui16 additInfo = 1 ) const ; //what: 0 - background, 1 - background wall, 2 - keep, 3 - bottom tower, 4 - bottom wall, 5 - below gate, 6 - over gate, 7 - upper wall, 8 - uppert tower, 9 - gate, 10 - gate arch, 11 - bottom static wall, 12 - upper static wall, 13 - moat, 14 - mlip, 15 - keep creature cover, 16 - bottom turret creature cover, 17 - upper turret creature cover; additInfo: 1 - intact, 2 - damaged, 3 - destroyed
2009-08-26 17:09:55 +03:00
2009-09-04 17:11:42 +03:00
void printPartOfWall ( SDL_Surface * to , int what ) ; //what: 1 - background wall, 2 - keep, 3 - bottom tower, 4 - bottom wall, 5 - below gate, 6 - over gate, 7 - upper wall, 8 - uppert tower, 9 - gate, 10 - gate arch, 11 - bottom static wall, 12 - upper static wall, 15 - keep creature cover, 16 - bottom turret creature cover, 17 - upper turret creature cover
2009-09-01 16:54:13 +03:00
2009-09-24 16:44:55 +03:00
friend class CBattleInterface ;
2009-08-24 15:55:05 +03:00
} * siegeH ;
2010-02-19 18:02:34 +02:00
CPlayerInterface * attackerInt , * defenderInt ; //because LOCPLINT is not enough in hotSeat
2010-05-07 17:05:48 +03:00
const CGHeroInstance * getActiveHero ( ) ; //returns hero that can currently cast a spell
2009-04-03 18:55:26 +03:00
public :
2010-02-19 18:02:34 +02:00
CPlayerInterface * curInt ; //current player interface
2009-09-10 14:28:34 +03:00
std : : list < std : : pair < CBattleAnimation * , bool > > pendingAnims ; //currently displayed animations <anim, initialized>
2009-09-16 13:36:50 +03:00
void addNewAnim ( CBattleAnimation * anim ) ; //adds new anim to pendingAnims
2009-09-10 14:28:34 +03:00
unsigned int animIDhelper ; //for giving IDs for animations
2009-09-16 13:36:50 +03:00
static CondSh < bool > animsAreDisplayed ; //for waiting with the end of battle for end of anims
2009-09-10 14:28:34 +03:00
2010-05-02 21:20:26 +03:00
CBattleInterface ( const CCreatureSet * army1 , const CCreatureSet * army2 , CGHeroInstance * hero1 , CGHeroInstance * hero2 , const SDL_Rect & myRect , CPlayerInterface * att , CPlayerInterface * defen ) ; //c-tor
2009-04-03 18:55:26 +03:00
~ CBattleInterface ( ) ; //d-tor
//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
void setAnimSpeed ( int set ) ; //speed of animation; 1 - slowest, 2 - medium, 4 - fastest
int getAnimSpeed ( ) const ; //speed of animation; 1 - slowest, 2 - medium, 4 - fastest
CBattleHex bfield [ BFIELD_SIZE ] ; //11 lines, 17 hexes on each
2009-08-19 13:59:42 +03:00
//std::vector< CBattleObstacle * > obstacles; //vector of obstacles on the battlefield
2009-04-03 18:55:26 +03:00
SDL_Surface * cellBorder , * cellShade ;
CondSh < BattleAction * > * givenCommand ; //data != NULL if we have i.e. moved current unit
bool myTurn ; //if true, interface is active (commands can be ordered
2009-06-01 06:36:13 +03:00
CBattleResultWindow * resWindow ; //window of end of battle
2009-04-03 18:55:26 +03:00
bool moveStarted ; //if true, the creature that is already moving is going to make its first step
2009-04-26 02:31:39 +03:00
int moveSh ; // sound handler used when moving a unit
2009-04-03 18:55:26 +03:00
//button handle funcs:
void bOptionsf ( ) ;
void bSurrenderf ( ) ;
void bFleef ( ) ;
void reallyFlee ( ) ; //performs fleeing without asking player
2011-03-05 18:38:22 +02:00
void reallySurrender ( ) ; //performs surrendering without asking player
2009-04-03 18:55:26 +03:00
void bAutofightf ( ) ;
void bSpellf ( ) ;
void bWaitf ( ) ;
void bDefencef ( ) ;
void bConsoleUpf ( ) ;
void bConsoleDownf ( ) ;
2011-02-12 18:12:48 +02:00
void bTacticNextStack ( ) ;
void bEndTacticPhase ( ) ;
2009-04-03 18:55:26 +03:00
//end of button handle funcs
//napisz tu klase odpowiadajaca za wyswietlanie bitwy i obsluge uzytkownika, polecenia ma przekazywac callbackiem
void activate ( ) ;
void deactivate ( ) ;
2009-04-14 15:47:09 +03:00
void show ( SDL_Surface * to ) ;
2009-04-03 18:55:26 +03:00
void keyPressed ( const SDL_KeyboardEvent & key ) ;
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) ;
2009-08-11 19:05:33 +03:00
void clickRight ( tribool down , bool previousState ) ;
2009-04-16 17:01:27 +03:00
2009-04-03 18:55:26 +03:00
//call-ins
2009-09-24 16:23:52 +03:00
void startAction ( const BattleAction * action ) ;
2010-12-23 22:18:10 +02:00
void newStack ( const CStack * stack ) ; //new stack appeared on battlefield
2011-05-30 02:49:25 +03:00
void stackRemoved ( int stackID ) ; //stack disappeared from batlefiled
2010-12-23 22:18:10 +02:00
void stackActivated ( const CStack * stack ) ; //active stack has been changed
2011-08-01 20:36:18 +03:00
void stackMoved ( const CStack * stack , std : : vector < THex > destHex , int distance ) ; //stack with id number moved to destHex
2011-01-08 21:38:42 +02:00
void waitForAnims ( ) ;
2009-04-03 18:55:26 +03:00
void stacksAreAttacked ( std : : vector < SStackAttackedInfo > attackedInfos ) ; //called when a certain amount of stacks has been attacked
2010-12-23 22:18:10 +02:00
void stackAttacking ( const CStack * attacker , THex dest , const CStack * attacked , bool shooting ) ; //called when stack with id ID is attacking something on hex dest
2010-05-07 15:29:41 +03:00
void newRoundFirst ( int round ) ;
2009-04-03 18:55:26 +03:00
void newRound ( int number ) ; //caled when round is ended; number is the number of round
void hexLclicked ( int whichOne ) ; //hex only call-in
2009-09-24 16:44:55 +03:00
void stackIsCatapulting ( const CatapultAttack & ca ) ; //called when a stack is attacking walls
2009-04-03 18:55:26 +03:00
void battleFinished ( const BattleResult & br ) ; //called when battle is finished - battleresult window should be printed
2009-09-15 15:20:11 +03:00
const BattleResult * bresult ; //result of a battle; if non-zero then display when all animations end
void displayBattleFinished ( ) ; //displays battle result
2010-12-04 21:44:23 +02:00
void spellCast ( const BattleSpellCast * sc ) ; //called when a hero casts a spell
2009-04-03 18:55:26 +03:00
void battleStacksEffectsSet ( const SetStackEffect & sse ) ; //called when a specific effect is set to stacks
void castThisSpell ( int spellID ) ; //called when player has chosen a spell from spellbook
void displayEffect ( ui32 effect , int destTile ) ; //displays effect of a spell on the battlefield; affected: true - attacker. false - defender
2009-09-20 15:47:40 +03:00
void endAction ( const BattleAction * action ) ;
void hideQueue ( ) ;
void showQueue ( ) ;
2009-04-03 18:55:26 +03:00
friend class CBattleHex ;
2009-06-01 06:36:13 +03:00
friend class CBattleResultWindow ;
2009-04-03 18:55:26 +03:00
friend class CPlayerInterface ;
friend class AdventureMapButton ;
friend class CInGameConsole ;
2009-09-10 14:28:34 +03:00
friend class CReverseAnim ;
2011-09-01 06:12:54 +03:00
friend class CBattleStackAnimation ;
2009-09-10 14:28:34 +03:00
friend class CBattleAnimation ;
friend class CDefenceAnim ;
friend class CBattleStackMoved ;
friend class CBattleMoveStart ;
friend class CBattleMoveEnd ;
friend class CBattleAttack ;
friend class CMeleeAttack ;
friend class CShootingAnim ;
2009-09-17 15:59:04 +03:00
friend class CSpellEffectAnim ;
2009-09-19 12:57:37 +03:00
friend class CBattleHero ;
2009-04-03 18:55:26 +03:00
} ;
# endif // __CBATTLEINTERFACE_H__