2008-02-25 01:06:27 +02:00
# pragma once
# include "global.h"
# include "CPlayerInterface.h"
2008-08-02 18:08:03 +03:00
# include <list>
2008-02-26 20:01:26 +02:00
2008-02-25 01:06:27 +02:00
class CCreatureSet ;
class CGHeroInstance ;
2008-03-03 21:41:10 +02:00
class CDefHandler ;
2008-03-04 19:25:58 +02:00
class CStack ;
2008-03-10 22:19:41 +02:00
class CCallback ;
2008-05-18 20:33:39 +03:00
class AdventureMapButton ;
2008-09-24 19:25:14 +03:00
class CHighlightableButton ;
class CHighlightableButtonsGroup ;
2008-09-05 19:08:25 +03:00
struct BattleResult ;
2008-10-18 16:50:18 +03:00
struct SpellCasted ;
2008-08-04 18:56:36 +03:00
template < typename T > struct CondSh ;
2008-02-26 20:01:26 +02:00
2008-10-17 19:30:56 +03:00
class CBattleInterface ;
2008-09-16 18:23:44 +03:00
class CBattleHero : public IShowable , public ClickableL
2008-03-03 21:41:10 +02:00
{
public :
2008-03-04 19:25:58 +02:00
bool flip ; //false if it's attacking hero, true otherwise
CDefHandler * dh , * flag ; //animation and flag
2008-09-16 18:23:44 +03:00
const CGHeroInstance * myHero ; //this animation's hero instance
2008-10-17 19:30:56 +03:00
const CBattleInterface * myOwner ; //battle interface to which this animation is assigned
2008-03-04 19:25:58 +02:00
int phase ; //stage of animation
int image ; //frame of animation
unsigned char flagAnim , flagAnimCount ; //for flag animation
void show ( SDL_Surface * to ) ; //prints next frame of animation to to
2008-09-16 18:23:44 +03:00
void activate ( ) ;
void deactivate ( ) ;
void clickLeft ( boost : : logic : : tribool down ) ;
2008-10-17 19:30:56 +03:00
CBattleHero ( const std : : string & defName , int phaseG , int imageG , bool filpG , unsigned char player , const CGHeroInstance * hero , const CBattleInterface * owner ) ; //c-tor
2008-03-03 21:41:10 +02:00
~ CBattleHero ( ) ; //d-tor
} ;
2008-05-27 16:16:35 +03:00
class CBattleHex : public Hoverable , public MotionInterested , public ClickableL , public ClickableR
2008-03-04 19:25:58 +02:00
{
2008-06-11 04:58:18 +03:00
private :
bool setAlterText ; //if true, this hex has set alternative text in console and will clean it
2008-03-10 22:19:41 +02:00
public :
2008-03-04 19:25:58 +02:00
unsigned int myNumber ;
bool accesible ;
2008-03-10 22:19:41 +02:00
//CStack * ourStack;
2008-03-15 19:48:05 +02:00
bool hovered , strictHovered ;
2008-03-24 21:04:30 +02:00
CBattleInterface * myInterface ; //interface that owns me
2008-09-24 19:25:14 +03:00
static std : : pair < int , int > getXYUnitAnim ( const int & hexNum , const bool & attacker , const CCreature * creature ) ; //returns (x, y) of left top corner of animation
2008-03-10 22:19:41 +02:00
//for user interactions
void hover ( bool on ) ;
void activate ( ) ;
void deactivate ( ) ;
2008-09-25 17:09:31 +03:00
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) ;
2008-03-24 15:25:11 +02:00
void clickLeft ( boost : : logic : : tribool down ) ;
2008-05-27 16:16:35 +03:00
void clickRight ( boost : : logic : : tribool down ) ;
2008-03-10 22:19:41 +02:00
CBattleHex ( ) ;
2008-03-04 19:25:58 +02:00
} ;
class CBattleObstacle
{
std : : vector < int > lockedHexes ;
} ;
2008-04-16 20:21:02 +03:00
class CBattleConsole : public IShowable , public CIntObject
{
private :
std : : vector < std : : string > texts ; //a place where texts are stored
2008-06-11 04:58:18 +03:00
int lastShown ; //last shown line of text
2008-04-16 20:21:02 +03:00
public :
2008-06-11 04:58:18 +03:00
std : : string alterTxt ; //if it's not empty, this text is displayed
2008-04-16 20:21:02 +03:00
CBattleConsole ( ) ; //c-tor
~ CBattleConsole ( ) ; //d-tor
void show ( SDL_Surface * to = 0 ) ;
2008-09-25 17:09:31 +03:00
bool addText ( const std : : string & text ) ; //adds text at the last position; returns false if failed (e.g. text longer than 70 characters)
2008-04-16 20:21:02 +03:00
void eraseText ( unsigned int pos ) ; //erases added text at position pos
2008-09-25 17:09:31 +03:00
void changeTextAt ( const std : : string & text , unsigned int pos ) ; //if we have more than pos texts, pos-th is changed to given one
2008-04-16 20:21:02 +03:00
void scrollUp ( unsigned int by = 1 ) ; //scrolls console up by 'by' positions
void scrollDown ( unsigned int by = 1 ) ; //scrolls console up by 'by' positions
} ;
2008-09-05 19:08:25 +03:00
class CBattleReslutWindow : public IShowable , public CIntObject , public IActivable
{
private :
SDL_Surface * background ;
AdventureMapButton * exit ;
public :
2008-09-24 19:25:14 +03:00
CBattleReslutWindow ( const BattleResult & br , const SDL_Rect & pos , const CBattleInterface * owner ) ; //c-tor
2008-09-05 19:08:25 +03:00
~ CBattleReslutWindow ( ) ; //d-tor
void bExitf ( ) ;
void activate ( ) ;
void deactivate ( ) ;
void show ( SDL_Surface * to = 0 ) ;
} ;
2008-09-23 18:40:30 +03:00
class CBattleOptionsWindow : public IShowable , public CIntObject , public IActivable
{
private :
CBattleInterface * myInt ;
SDL_Surface * background ;
AdventureMapButton * setToDefault , * exit ;
2008-09-24 19:25:14 +03:00
CHighlightableButton * viewGrid , * movementShadow , * mouseShadow ;
CHighlightableButtonsGroup * animSpeeds ;
2008-09-23 18:40:30 +03:00
public :
2008-09-24 19:25:14 +03:00
CBattleOptionsWindow ( const SDL_Rect & position , CBattleInterface * owner ) ; //c-tor
2008-09-23 18:40:30 +03:00
~ CBattleOptionsWindow ( ) ; //d-tor
void bDefaultf ( ) ;
void bExitf ( ) ;
void activate ( ) ;
void deactivate ( ) ;
void show ( SDL_Surface * to = 0 ) ;
} ;
2008-09-25 17:09:31 +03:00
class CBattleInterface : public CMainInterface , public MotionInterested
2008-02-25 01:06:27 +02:00
{
2008-02-26 20:01:26 +02:00
private :
2008-09-03 13:52:07 +03:00
SDL_Surface * background , * menu , * amountBasic , * amountNormal , * cellBorders , * backgroundWithHexes ;
2008-05-18 20:33:39 +03:00
AdventureMapButton * bOptions , * bSurrender , * bFlee , * bAutofight , * bSpell ,
2008-02-26 20:01:26 +02:00
* bWait , * bDefence , * bConsoleUp , * bConsoleDown ;
2008-04-16 20:21:02 +03:00
CBattleConsole * console ;
2008-03-03 21:41:10 +02:00
CBattleHero * attackingHero , * defendingHero ;
2008-03-05 19:01:41 +02:00
CCreatureSet * army1 , * army2 ; //fighting armies
2008-03-10 22:19:41 +02:00
CGHeroInstance * attackingHeroInstance , * defendingHeroInstance ;
2008-03-29 12:59:18 +02:00
std : : map < int , CCreatureAnimation * > creAnims ; //animations of creatures from fighting armies (order by BattleInfo's stacks' ID)
2008-08-02 18:08:03 +03:00
std : : map < int , CDefHandler * > idToProjectile ; //projectiles of creaures (creatureID, defhandler)
2008-04-14 21:24:46 +03:00
std : : map < int , bool > creDir ; // <creatureID, if false reverse creature's animation>
2008-03-15 19:48:05 +02:00
unsigned char animCount ;
2008-03-23 19:25:38 +02:00
int activeStack ; //number of active stack; -1 - no one
2008-08-02 18:08:03 +03:00
std : : vector < int > shadedHexes ; //hexes available for active stack
2008-09-23 18:40:30 +03:00
int animSpeed ; //speed of animation; 1 - slowest, 2 - medium, 4 - fastest
2008-09-24 19:25:14 +03:00
float getAnimSpeedMultiplier ( ) const ; //returns multiplier for number of frames in a group
2008-03-10 22:19:41 +02:00
2008-10-17 19:30:56 +03:00
bool spellDestSelectMode ; //if true, player is choosing destination for his spell
BattleAction * spellToCast ; //spell for which player is choosing destination
2008-06-11 04:58:18 +03:00
class CAttHelper
{
public :
int ID ; //attacking stack
2008-09-12 16:06:53 +03:00
int IDby ; //attacked stack
2008-06-11 04:58:18 +03:00
int dest ; //atacked hex
int frame , maxframe ; //frame of animation, number of frames of animation
2008-09-22 15:22:10 +03:00
int hitCount ; //for delaying animation
2008-06-11 04:58:18 +03:00
bool reversing ;
2008-08-02 18:08:03 +03:00
bool shooting ;
int shootingGroup ; //if shooting is true, print this animation group
2008-06-11 04:58:18 +03:00
} * attackingInfo ;
void attackingShowHelper ( ) ;
2008-09-24 19:25:14 +03:00
void redrawBackgroundWithHexes ( int activeStack ) ;
2008-06-11 04:58:18 +03:00
void printConsoleAttacked ( int ID , int dmg , int killed , int IDby ) ;
2008-08-02 18:08:03 +03:00
struct SProjectileInfo
{
int x , y ; //position on the screen
int dx , dy ; //change in position in one step
int step , lastStep ; //to know when finish showing this projectile
int creID ; //ID of creature that shot this projectile
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)
} ;
std : : list < SProjectileInfo > projectiles ;
void projectileShowHelper ( SDL_Surface * to = NULL ) ; //prints projectiles present on the battlefield
2008-08-09 02:02:32 +03:00
void giveCommand ( ui8 action , ui16 tile , ui32 stack , si32 additional = - 1 ) ;
2008-09-25 17:09:31 +03:00
bool isTileAttackable ( int number ) ; //returns true if tile 'number' is neighbouring any tile from active stack's range or is one of these tiles
2008-02-25 01:06:27 +02:00
public :
2008-03-14 20:24:37 +02:00
CBattleInterface ( CCreatureSet * army1 , CCreatureSet * army2 , CGHeroInstance * hero1 , CGHeroInstance * hero2 ) ; //c-tor
2008-03-04 19:25:58 +02:00
~ CBattleInterface ( ) ; //d-tor
2008-02-26 20:01:26 +02:00
2008-03-03 21:41:10 +02:00
//std::vector<TimeInterested*> timeinterested; //animation handling
2008-03-04 19:25:58 +02:00
bool printCellBorders ; //if true, cell borders will be printed
2008-09-24 19:25:14 +03:00
void setPrintCellBorders ( bool set ) ; //set for above member
bool printStackRange ; //if true,range of active stack will be printed
void setPrintStackRange ( bool set ) ; //set for above member
bool printMouseShadow ; //if true, hex under mouse will be shaded
void setPrintMouseShadow ( bool set ) ; //set for above member
void setAnimSpeed ( int set ) ; //set for animSpeed
int getAnimSpeed ( ) const ; //get for animSpeed
2008-03-04 19:25:58 +02:00
CBattleHex bfield [ 187 ] ; //11 lines, 17 hexes on each
std : : vector < CBattleObstacle * > obstacles ; //vector of obstacles on the battlefield
2008-09-05 19:08:25 +03:00
SDL_Surface * cellBorder , * cellShade ;
2008-08-04 18:56:36 +03:00
CondSh < BattleAction * > * givenCommand ; //data != NULL if we have i.e. moved current unit
2008-08-02 18:08:03 +03:00
bool myTurn ; //if true, interface is active (commands can be ordered
2008-09-05 19:08:25 +03:00
CBattleReslutWindow * resWindow ; //window of end of battle
2008-09-09 14:25:21 +03:00
bool showStackQueue ; //if true, queue of stacks will be shown
2008-03-03 21:41:10 +02:00
2008-02-26 20:01:26 +02:00
//button handle funcs:
void bOptionsf ( ) ;
void bSurrenderf ( ) ;
void bFleef ( ) ;
2008-09-08 14:32:16 +03:00
void reallyFlee ( ) ; //performs fleeing without asking player
2008-02-26 20:01:26 +02:00
void bAutofightf ( ) ;
void bSpellf ( ) ;
void bWaitf ( ) ;
void bDefencef ( ) ;
void bConsoleUpf ( ) ;
void bConsoleDownf ( ) ;
//end of button handle funcs
2008-02-25 01:06:27 +02:00
//napisz tu klase odpowiadajaca za wyswietlanie bitwy i obsluge uzytkownika, polecenia ma przekazywac callbackiem
void activate ( ) ;
void deactivate ( ) ;
2008-04-07 20:51:46 +03:00
void show ( SDL_Surface * to = NULL ) ;
2008-09-25 17:09:31 +03:00
void mouseMoved ( const SDL_MouseMotionEvent & sEvent ) ;
2008-05-03 18:18:48 +03:00
bool reverseCreature ( int number , int hex , bool wideTrick = false ) ; //reverses animation of given creature playing animation of reversing
2008-03-14 20:24:37 +02:00
//call-ins
2008-03-23 19:25:38 +02:00
void newStack ( CStack stack ) ; //new stack appeared on battlefield
void stackRemoved ( CStack stack ) ; //stack disappeared from batlefiled
2008-10-18 16:50:18 +03:00
void stackKilled ( int ID , int dmg , int killed , int IDby , bool byShooting , ui32 effects = 0 ) ; //stack has been killed (but corpses remain); effects - additional optional spell effect (AC format)
2008-03-23 19:25:38 +02:00
void stackActivated ( int number ) ; //active stack has been changed
2008-09-29 00:01:49 +03:00
void stackMoved ( int number , int destHex , bool endMoving ) ; //stack with id number moved to destHex
2008-10-18 16:50:18 +03:00
void stackIsAttacked ( int ID , int dmg , int killed , int IDby , bool byShooting , ui32 effects = 0 ) ; //called when stack id attacked by stack with id IDby; effects - additional optional spell effect (AC format)
2008-04-07 20:51:46 +03:00
void stackAttacking ( int ID , int dest ) ; //called when stack with id ID is attacking something on hex dest
2008-04-19 20:10:57 +03:00
void newRound ( int number ) ; //caled when round is ended; number is the number of round
2008-03-24 21:04:30 +02:00
void hexLclicked ( int whichOne ) ; //hex only call-in
2008-08-02 18:08:03 +03:00
void stackIsShooting ( int ID , int dest ) ; //called when stack with id ID is shooting to hex dest
2008-09-05 19:08:25 +03:00
void battleFinished ( const BattleResult & br ) ; //called when battle is finished - battleresult window should be printed
2008-10-18 16:50:18 +03:00
void spellCasted ( SpellCasted * sc ) ; //called when a hero casts a spell
2008-10-17 19:30:56 +03:00
void castThisSpell ( int spellID ) ; //called when player has chosen a spell from spellbook
2008-05-27 16:16:35 +03:00
2008-08-02 18:08:03 +03:00
friend class CBattleHex ;
2008-09-05 19:08:25 +03:00
friend class CBattleReslutWindow ;
2008-09-29 13:16:02 +03:00
friend class CPlayerInterface ;
2008-03-04 19:25:58 +02:00
} ;