2008-02-25 01:06:27 +02:00
# include "CBattleInterface.h"
2008-02-26 20:01:26 +02:00
# include "CGameInfo.h"
# include "hch\CLodHandler.h"
# include "SDL_Extensions.h"
# include "CAdvmapInterface.h"
# include "AdventureMapButton.h"
2008-03-03 21:41:10 +02:00
# include "hch\CHeroHandler.h"
# include "hch\CDefHandler.h"
2008-03-10 22:19:41 +02:00
# include "CCallback.h"
# include "CGameState.h"
2008-04-19 20:10:57 +03:00
# include "hch\CGeneralTextHandler.h"
2008-03-23 19:25:38 +02:00
# include <queue>
2008-04-14 21:24:46 +03:00
# include <sstream>
2008-03-03 21:41:10 +02:00
extern SDL_Surface * screen ;
2008-04-14 21:24:46 +03:00
extern TTF_Font * GEOR13 ;
extern SDL_Color zwykly ;
2008-03-14 20:24:37 +02:00
SDL_Surface * CBattleInterface : : cellBorder , * CBattleInterface : : cellShade ;
2008-02-25 01:06:27 +02:00
2008-03-14 20:24:37 +02:00
CBattleInterface : : CBattleInterface ( CCreatureSet * army1 , CCreatureSet * army2 , CGHeroInstance * hero1 , CGHeroInstance * hero2 )
2008-06-06 16:53:33 +03:00
: printCellBorders ( true ) , attackingHeroInstance ( hero1 ) , defendingHeroInstance ( hero2 ) , animCount ( 0 ) , activeStack ( - 1 ) , givenCommand ( NULL ) , attackingInfo ( NULL )
2008-02-25 01:06:27 +02:00
{
2008-03-05 19:01:41 +02:00
//initializing armies
this - > army1 = army1 ;
this - > army2 = army2 ;
2008-03-14 20:24:37 +02:00
std : : map < int , CStack > stacks = LOCPLINT - > cb - > battleGetStacks ( ) ;
for ( std : : map < int , CStack > : : iterator b = stacks . begin ( ) ; b ! = stacks . end ( ) ; + + b )
2008-03-05 19:01:41 +02:00
{
2008-04-14 21:24:46 +03:00
std : : pair < int , int > coords = CBattleHex : : getXYUnitAnim ( b - > second . position , b - > second . owner = = attackingHeroInstance - > tempOwner , b - > second . creature ) ;
2008-03-14 20:24:37 +02:00
creAnims [ b - > second . ID ] = ( new CCreatureAnimation ( b - > second . creature - > animDefName ) ) ;
creAnims [ b - > second . ID ] - > setType ( 2 ) ;
2008-04-07 20:51:46 +03:00
creAnims [ b - > second . ID ] - > pos = genRect ( creAnims [ b - > second . ID ] - > fullHeight , creAnims [ b - > second . ID ] - > fullWidth , coords . first , coords . second ) ;
2008-04-14 21:24:46 +03:00
creDir [ b - > second . ID ] = b - > second . owner = = attackingHeroInstance - > tempOwner ;
2008-03-05 19:01:41 +02:00
}
2008-03-03 21:41:10 +02:00
//preparing menu background and terrain
2008-03-14 20:24:37 +02:00
std : : vector < std : : string > & backref = CGI - > mh - > battleBacks [ LOCPLINT - > cb - > battleGetBattlefieldType ( ) ] ;
2008-02-26 20:01:26 +02:00
background = CGI - > bitmaph - > loadBitmap ( backref [ rand ( ) % backref . size ( ) ] ) ;
menu = CGI - > bitmaph - > loadBitmap ( " CBAR.BMP " ) ;
CSDL_Ext : : blueToPlayersAdv ( menu , hero1 - > tempOwner ) ;
2008-04-14 21:24:46 +03:00
//preparing graphics for displaying amounts of creatures
amountBasic = CGI - > bitmaph - > loadBitmap ( " CMNUMWIN.BMP " ) ;
amountNormal = CGI - > bitmaph - > loadBitmap ( " CMNUMWIN.BMP " ) ;
CSDL_Ext : : alphaTransform ( amountNormal ) ;
for ( int g = 0 ; g < amountNormal - > format - > palette - > ncolors ; + + g )
{
if ( ( amountNormal - > format - > palette - > colors + g ) - > b ! = 132 & &
( amountNormal - > format - > palette - > colors + g ) - > g ! = 231 & &
( amountNormal - > format - > palette - > colors + g ) - > r ! = 255 ) //it's not yellow border
{
( amountNormal - > format - > palette - > colors + g ) - > r = ( float ) ( ( amountNormal - > format - > palette - > colors + g ) - > r ) * 0.54f ;
( amountNormal - > format - > palette - > colors + g ) - > g = ( float ) ( ( amountNormal - > format - > palette - > colors + g ) - > g ) * 0.19f ;
( amountNormal - > format - > palette - > colors + g ) - > b = ( float ) ( ( amountNormal - > format - > palette - > colors + g ) - > b ) * 0.93f ;
}
}
2008-04-20 18:56:03 +03:00
////blitting menu background and terrain
2008-02-26 20:01:26 +02:00
blitAt ( background , 0 , 0 ) ;
blitAt ( menu , 0 , 556 ) ;
CSDL_Ext : : update ( ) ;
2008-04-16 20:21:02 +03:00
//preparing buttons and console
2008-05-18 20:33:39 +03:00
bOptions = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bOptionsf , this ) , 3 , 561 , " icm003.def " , false , NULL , false ) ;
bSurrender = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bSurrenderf , this ) , 54 , 561 , " icm001.def " , false , NULL , false ) ;
bFlee = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bFleef , this ) , 105 , 561 , " icm002.def " , false , NULL , false ) ;
bAutofight = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bAutofightf , this ) , 157 , 561 , " icm004.def " , false , NULL , false ) ;
bSpell = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bSpellf , this ) , 645 , 561 , " icm005.def " , false , NULL , false ) ;
bWait = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bWaitf , this ) , 696 , 561 , " icm006.def " , false , NULL , false ) ;
bDefence = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bDefencef , this ) , 747 , 561 , " icm007.def " , false , NULL , false ) ;
bConsoleUp = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bConsoleUpf , this ) , 624 , 561 , " ComSlide.def " , false , NULL , false ) ;
bConsoleDown = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleInterface : : bConsoleDownf , this ) , 624 , 580 , " ComSlide.def " , false , NULL , false ) ;
2008-03-03 21:41:10 +02:00
bConsoleDown - > bitmapOffset = 2 ;
2008-04-16 20:21:02 +03:00
console = new CBattleConsole ( ) ;
console - > pos . x = 211 ;
console - > pos . y = 560 ;
console - > pos . w = 406 ;
console - > pos . h = 38 ;
2008-03-03 21:41:10 +02:00
//loading hero animations
if ( hero1 ) // attacking hero
{
2008-03-04 19:25:58 +02:00
attackingHero = new CBattleHero ( CGI - > mh - > battleHeroes [ hero1 - > type - > heroType ] , 0 , 0 , false , hero1 - > tempOwner ) ;
attackingHero - > pos = genRect ( attackingHero - > dh - > ourImages [ 0 ] . bitmap - > h , attackingHero - > dh - > ourImages [ 0 ] . bitmap - > w , - 40 , 0 ) ;
2008-03-03 21:41:10 +02:00
}
else
{
attackingHero = NULL ;
}
if ( hero2 ) // defending hero
{
2008-03-04 19:25:58 +02:00
defendingHero = new CBattleHero ( CGI - > mh - > battleHeroes [ hero2 - > type - > heroType ] , 0 , 0 , true , hero2 - > tempOwner ) ;
defendingHero - > pos = genRect ( defendingHero - > dh - > ourImages [ 0 ] . bitmap - > h , defendingHero - > dh - > ourImages [ 0 ] . bitmap - > w , 690 , 0 ) ;
2008-03-03 21:41:10 +02:00
}
else
{
defendingHero = NULL ;
}
2008-03-04 19:25:58 +02:00
//preparing cells and hexes
cellBorder = CGI - > bitmaph - > loadBitmap ( " CCELLGRD.BMP " ) ;
2008-04-20 18:56:03 +03:00
CSDL_Ext : : alphaTransform ( cellBorder ) ;
2008-03-04 19:25:58 +02:00
cellShade = CGI - > bitmaph - > loadBitmap ( " CCELLSHD.BMP " ) ;
2008-04-20 18:56:03 +03:00
CSDL_Ext : : alphaTransform ( cellShade ) ;
2008-03-10 22:19:41 +02:00
for ( int h = 0 ; h < 187 ; + + h )
{
bfield [ h ] . myNumber = h ;
int x = 14 + ( ( h / 17 ) % 2 = = 0 ? 22 : 0 ) + 44 * ( h % 17 ) ;
int y = 86 + 42 * ( h / 17 ) ;
bfield [ h ] . pos = genRect ( cellShade - > h , cellShade - > w , x , y ) ;
2008-03-23 19:25:38 +02:00
bfield [ h ] . accesible = true ;
2008-03-24 21:04:30 +02:00
bfield [ h ] . myInterface = this ;
2008-03-10 22:19:41 +02:00
}
2008-03-23 19:25:38 +02:00
//locking occupied positions on batlefield
for ( std : : map < int , CStack > : : iterator it = stacks . begin ( ) ; it ! = stacks . end ( ) ; + + it ) //stacks gained at top of this function
{
bfield [ it - > second . position ] . accesible = false ;
}
2008-02-25 01:06:27 +02:00
}
2008-02-26 20:01:26 +02:00
CBattleInterface : : ~ CBattleInterface ( )
{
SDL_FreeSurface ( background ) ;
SDL_FreeSurface ( menu ) ;
2008-04-15 19:52:31 +03:00
SDL_FreeSurface ( amountBasic ) ;
SDL_FreeSurface ( amountNormal ) ;
2008-03-01 13:49:25 +02:00
delete bOptions ;
delete bSurrender ;
delete bFlee ;
delete bAutofight ;
delete bSpell ;
delete bWait ;
delete bDefence ;
2008-03-03 21:41:10 +02:00
delete bConsoleUp ;
delete bConsoleDown ;
2008-04-16 20:21:02 +03:00
delete console ;
2008-03-03 21:41:10 +02:00
delete attackingHero ;
delete defendingHero ;
2008-03-04 19:25:58 +02:00
SDL_FreeSurface ( cellBorder ) ;
SDL_FreeSurface ( cellShade ) ;
2008-03-05 19:01:41 +02:00
2008-04-20 18:56:03 +03:00
for ( std : : map < int , CCreatureAnimation * > : : iterator g = creAnims . begin ( ) ; g ! = creAnims . end ( ) ; + + g )
delete g - > second ;
2008-02-26 20:01:26 +02:00
}
2008-02-25 01:06:27 +02:00
void CBattleInterface : : activate ( )
{
2008-02-26 20:01:26 +02:00
bOptions - > activate ( ) ;
2008-03-01 13:49:25 +02:00
bSurrender - > activate ( ) ;
bFlee - > activate ( ) ;
bAutofight - > activate ( ) ;
bSpell - > activate ( ) ;
bWait - > activate ( ) ;
bDefence - > activate ( ) ;
2008-03-03 21:41:10 +02:00
bConsoleUp - > activate ( ) ;
bConsoleDown - > activate ( ) ;
2008-03-10 22:19:41 +02:00
for ( int b = 0 ; b < 187 ; + + b )
{
bfield [ b ] . activate ( ) ;
}
2008-02-25 01:06:27 +02:00
}
2008-02-26 20:01:26 +02:00
2008-02-25 01:06:27 +02:00
void CBattleInterface : : deactivate ( )
{
2008-02-26 20:01:26 +02:00
bOptions - > deactivate ( ) ;
2008-03-01 13:49:25 +02:00
bSurrender - > deactivate ( ) ;
bFlee - > deactivate ( ) ;
bAutofight - > deactivate ( ) ;
bSpell - > deactivate ( ) ;
bWait - > deactivate ( ) ;
bDefence - > deactivate ( ) ;
2008-03-03 21:41:10 +02:00
bConsoleUp - > deactivate ( ) ;
bConsoleDown - > deactivate ( ) ;
2008-03-10 22:19:41 +02:00
for ( int b = 0 ; b < 187 ; + + b )
{
bfield [ b ] . deactivate ( ) ;
}
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : show ( SDL_Surface * to )
{
2008-03-23 19:25:38 +02:00
std : : map < int , CStack > stacks = LOCPLINT - > cb - > battleGetStacks ( ) ; //used in a few places
2008-03-15 19:48:05 +02:00
+ + animCount ;
2008-03-03 21:41:10 +02:00
if ( ! to ) //"evaluating" to
to = screen ;
//showing background
2008-02-26 20:01:26 +02:00
blitAt ( background , 0 , 0 , to ) ;
2008-03-04 19:25:58 +02:00
if ( printCellBorders ) //printing cell borders
{
for ( int i = 0 ; i < 11 ; + + i ) //rows
{
for ( int j = 0 ; j < 15 ; + + j ) //columns
{
int x = 58 + ( i % 2 = = 0 ? 22 : 0 ) + 44 * j ;
int y = 86 + 42 * i ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( cellBorder , NULL , to , & genRect ( cellBorder - > h , cellBorder - > w , x , y ) ) ;
}
}
}
2008-03-10 22:19:41 +02:00
//printing hovered cell
for ( int b = 0 ; b < 187 ; + + b )
{
2008-03-15 19:48:05 +02:00
if ( bfield [ b ] . strictHovered & & bfield [ b ] . hovered )
2008-03-10 22:19:41 +02:00
{
int x = 14 + ( ( b / 17 ) % 2 = = 0 ? 22 : 0 ) + 44 * ( b % 17 ) ;
int y = 86 + 42 * ( b / 17 ) ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( cellShade , NULL , to , & genRect ( cellShade - > h , cellShade - > w , x , y ) ) ;
}
}
2008-03-23 19:25:38 +02:00
//showing selected unit's range
2008-03-29 12:59:18 +02:00
showRange ( to , activeStack ) ;
2008-04-16 20:21:02 +03:00
//showing menu background and console
2008-03-04 19:25:58 +02:00
blitAt ( menu , 0 , 556 , to ) ;
2008-04-16 20:21:02 +03:00
console - > show ( to ) ;
2008-03-03 21:41:10 +02:00
//showing buttons
2008-02-26 20:01:26 +02:00
bOptions - > show ( to ) ;
2008-03-03 21:41:10 +02:00
bSurrender - > show ( to ) ;
bFlee - > show ( to ) ;
bAutofight - > show ( to ) ;
bSpell - > show ( to ) ;
bWait - > show ( to ) ;
bDefence - > show ( to ) ;
bConsoleUp - > show ( to ) ;
bConsoleDown - > show ( to ) ;
//showing hero animations
2008-03-05 19:01:41 +02:00
if ( attackingHero )
attackingHero - > show ( to ) ;
if ( defendingHero )
defendingHero - > show ( to ) ;
//showing units //a lot of work...
2008-04-14 21:24:46 +03:00
int stackByHex [ 187 ] ;
for ( int b = 0 ; b < 187 ; + + b )
stackByHex [ b ] = - 1 ;
for ( std : : map < int , CStack > : : iterator j = stacks . begin ( ) ; j ! = stacks . end ( ) ; + + j )
2008-03-08 17:23:04 +02:00
{
2008-04-14 21:24:46 +03:00
stackByHex [ j - > second . position ] = j - > second . ID ;
}
2008-06-06 16:53:33 +03:00
attackingShowHelper ( ) ; // handle attack animation
2008-04-14 21:24:46 +03:00
for ( int b = 0 ; b < 187 ; + + b )
{
if ( stackByHex [ b ] ! = - 1 )
{
creAnims [ stackByHex [ b ] ] - > nextFrame ( to , creAnims [ stackByHex [ b ] ] - > pos . x , creAnims [ stackByHex [ b ] ] - > pos . y , creDir [ stackByHex [ b ] ] , animCount % 2 = = 0 | | creAnims [ stackByHex [ b ] ] - > getType ( ) = = 0 , stackByHex [ b ] = = activeStack ) ; //increment always when moving
//printing amount
if ( stacks [ stackByHex [ b ] ] . attackerOwned )
{
CSDL_Ext : : blit8bppAlphaTo24bpp ( amountNormal , NULL , to , & genRect ( amountNormal - > h , amountNormal - > w , creAnims [ stackByHex [ b ] ] - > pos . x + 220 , creAnims [ stackByHex [ b ] ] - > pos . y + 260 ) ) ;
std : : stringstream ss ;
ss < < stacks [ stackByHex [ b ] ] . amount ;
CSDL_Ext : : printAtMiddleWB ( ss . str ( ) , creAnims [ stackByHex [ b ] ] - > pos . x + 220 + 14 , creAnims [ stackByHex [ b ] ] - > pos . y + 260 + 4 , GEOR13 , 20 , zwykly , to ) ;
}
else
{
CSDL_Ext : : blit8bppAlphaTo24bpp ( amountNormal , NULL , to , & genRect ( amountNormal - > h , amountNormal - > w , creAnims [ stackByHex [ b ] ] - > pos . x + 202 , creAnims [ stackByHex [ b ] ] - > pos . y + 260 ) ) ;
std : : stringstream ss ;
ss < < stacks [ stackByHex [ b ] ] . amount ;
CSDL_Ext : : printAtMiddleWB ( ss . str ( ) , creAnims [ stackByHex [ b ] ] - > pos . x + 202 + 14 , creAnims [ stackByHex [ b ] ] - > pos . y + 260 + 4 , GEOR13 , 20 , zwykly , to ) ;
}
}
2008-03-08 17:23:04 +02:00
}
2008-03-05 19:01:41 +02:00
//units shown
2008-02-26 20:01:26 +02:00
}
2008-05-03 18:18:48 +03:00
bool CBattleInterface : : reverseCreature ( int number , int hex , bool wideTrick )
2008-04-14 21:24:46 +03:00
{
if ( creAnims [ number ] = = NULL )
return false ; //there is no such creature
creAnims [ number ] - > setType ( 8 ) ;
for ( int g = 0 ; g < creAnims [ number ] - > framesInGroup ( 8 ) ; + + g )
{
show ( ) ;
2008-05-27 16:16:35 +03:00
CSDL_Ext : : update ( ) ;
2008-04-14 21:24:46 +03:00
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
creDir [ number ] = ! creDir [ number ] ;
CStack curs = LOCPLINT - > cb - > battleGetStackByID ( number ) ;
std : : pair < int , int > coords = CBattleHex : : getXYUnitAnim ( hex , creDir [ number ] , curs . creature ) ;
creAnims [ number ] - > pos . x = coords . first ;
2008-05-03 18:18:48 +03:00
//creAnims[number]->pos.y = coords.second;
if ( wideTrick & & curs . creature - > isDoubleWide ( ) )
{
creAnims [ number ] - > pos . x - = 44 ;
}
2008-04-14 21:24:46 +03:00
creAnims [ number ] - > setType ( 7 ) ;
for ( int g = 0 ; g < creAnims [ number ] - > framesInGroup ( 7 ) ; + + g )
{
show ( ) ;
2008-05-27 16:16:35 +03:00
CSDL_Ext : : update ( ) ;
2008-04-14 21:24:46 +03:00
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
creAnims [ number ] - > setType ( 2 ) ;
return true ;
}
2008-02-26 20:01:26 +02:00
void CBattleInterface : : bOptionsf ( )
{
}
void CBattleInterface : : bSurrenderf ( )
{
}
void CBattleInterface : : bFleef ( )
{
2008-04-15 19:52:31 +03:00
BattleAction * ba = new BattleAction ;
ba - > actionType = 4 ;
givenCommand = ba ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bAutofightf ( )
{
}
void CBattleInterface : : bSpellf ( )
{
}
void CBattleInterface : : bWaitf ( )
{
}
void CBattleInterface : : bDefencef ( )
{
2008-04-07 20:51:46 +03:00
BattleAction * ba = new BattleAction ;
ba - > actionType = 3 ;
ba - > stackNumber = activeStack ;
2008-04-15 19:52:31 +03:00
givenCommand = ba ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bConsoleUpf ( )
{
2008-04-16 20:21:02 +03:00
console - > scrollUp ( ) ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bConsoleDownf ( )
{
2008-04-16 20:21:02 +03:00
console - > scrollDown ( ) ;
2008-02-26 20:01:26 +02:00
}
2008-03-03 21:41:10 +02:00
2008-03-14 20:24:37 +02:00
void CBattleInterface : : newStack ( CStack stack )
{
creAnims [ stack . ID ] = new CCreatureAnimation ( stack . creature - > animDefName ) ;
creAnims [ stack . ID ] - > setType ( 2 ) ;
2008-04-14 21:24:46 +03:00
creDir [ stack . ID ] = stack . owner = = attackingHeroInstance - > tempOwner ;
2008-03-14 20:24:37 +02:00
}
void CBattleInterface : : stackRemoved ( CStack stack )
{
delete creAnims [ stack . ID ] ;
creAnims . erase ( stack . ID ) ;
}
2008-05-30 14:53:04 +03:00
void CBattleInterface : : stackKilled ( int ID )
{
}
2008-03-23 19:25:38 +02:00
void CBattleInterface : : stackActivated ( int number )
{
2008-04-15 19:52:31 +03:00
givenCommand = NULL ;
2008-03-23 19:25:38 +02:00
activeStack = number ;
}
2008-04-14 21:24:46 +03:00
void CBattleInterface : : stackMoved ( int number , int destHex , bool startMoving , bool endMoving )
2008-03-23 19:25:38 +02:00
{
2008-05-03 18:18:48 +03:00
//a few useful variables
2008-03-29 12:59:18 +02:00
int curStackPos = LOCPLINT - > cb - > battleGetPos ( number ) ;
2008-04-14 21:24:46 +03:00
int steps = creAnims [ number ] - > framesInGroup ( 0 ) ;
2008-04-07 20:51:46 +03:00
int hexWbase = 44 , hexHbase = 42 ;
2008-04-14 21:24:46 +03:00
if ( startMoving ) //animation of starting move
{
for ( int i = 0 ; i < creAnims [ number ] - > framesInGroup ( 20 ) ; + + i )
{
show ( ) ;
2008-05-27 16:16:35 +03:00
CSDL_Ext : : update ( ) ;
2008-04-14 21:24:46 +03:00
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
}
2008-05-03 18:18:48 +03:00
int mutPos = CBattleHex : : mutualPosition ( curStackPos , destHex ) ;
if ( LOCPLINT - > cb - > battleGetCreature ( number ) . isDoubleWide ( ) & &
( ( creDir [ number ] & & mutPos = = 5 ) | | ( creDir [ number ] & & mutPos = = 0 ) | | ( creDir [ number ] & & mutPos = = 4 ) ) ) //for special cases
2008-04-14 21:24:46 +03:00
{
2008-05-03 18:18:48 +03:00
switch ( CBattleHex : : mutualPosition ( curStackPos , destHex ) ) //reverse unit if necessary
{
case 0 :
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos , true ) ;
break ;
case 1 :
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos , true ) ;
break ;
case 2 :
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos , true ) ;
break ;
case 3 :
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos , true ) ;
break ;
case 4 :
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos , true ) ;
break ;
case 5 :
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos , true ) ;
break ;
}
//moving instructions
creAnims [ number ] - > setType ( 0 ) ;
for ( int i = 0 ; i < steps ; + + i )
{
switch ( CBattleHex : : mutualPosition ( curStackPos , destHex ) )
{
case 0 :
creAnims [ number ] - > pos . x - = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y - = hexHbase / steps ;
break ;
case 1 :
creAnims [ number ] - > pos . x + = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y - = hexHbase / steps ;
break ;
case 2 :
creAnims [ number ] - > pos . x + = hexWbase / steps ;
break ;
case 3 :
creAnims [ number ] - > pos . x + = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y + = hexHbase / steps ;
break ;
case 4 :
creAnims [ number ] - > pos . x - = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y + = hexHbase / steps ;
break ;
case 5 :
creAnims [ number ] - > pos . x - = hexWbase / steps ;
break ;
}
show ( ) ;
2008-05-27 16:16:35 +03:00
CSDL_Ext : : update ( ) ;
2008-05-03 18:18:48 +03:00
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
if ( ( LOCPLINT - > cb - > battleGetStackByID ( number ) . owner = = attackingHeroInstance - > tempOwner ) ! = creDir [ number ] )
{
reverseCreature ( number , curStackPos , true ) ;
}
2008-04-14 21:24:46 +03:00
}
2008-05-03 18:18:48 +03:00
else //normal move instructions
2008-03-29 12:59:18 +02:00
{
2008-05-03 18:18:48 +03:00
switch ( CBattleHex : : mutualPosition ( curStackPos , destHex ) ) //reverse unit if necessary
2008-04-07 20:51:46 +03:00
{
case 0 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos ) ;
2008-04-07 20:51:46 +03:00
break ;
case 1 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos ) ;
2008-04-07 20:51:46 +03:00
break ;
case 2 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos ) ;
2008-04-07 20:51:46 +03:00
break ;
case 3 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos ) ;
2008-04-07 20:51:46 +03:00
break ;
case 4 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos ) ;
2008-04-07 20:51:46 +03:00
break ;
case 5 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos ) ;
2008-04-07 20:51:46 +03:00
break ;
}
2008-05-03 18:18:48 +03:00
//moving instructions
creAnims [ number ] - > setType ( 0 ) ;
for ( int i = 0 ; i < steps ; + + i )
{
switch ( CBattleHex : : mutualPosition ( curStackPos , destHex ) )
{
case 0 :
creAnims [ number ] - > pos . x - = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y - = hexHbase / steps ;
break ;
case 1 :
creAnims [ number ] - > pos . x + = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y - = hexHbase / steps ;
break ;
case 2 :
creAnims [ number ] - > pos . x + = hexWbase / steps ;
break ;
case 3 :
creAnims [ number ] - > pos . x + = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y + = hexHbase / steps ;
break ;
case 4 :
creAnims [ number ] - > pos . x - = hexWbase / ( 2 * steps ) ;
creAnims [ number ] - > pos . y + = hexHbase / steps ;
break ;
case 5 :
creAnims [ number ] - > pos . x - = hexWbase / steps ;
break ;
}
show ( ) ;
2008-05-27 16:16:35 +03:00
CSDL_Ext : : update ( ) ;
2008-05-03 18:18:48 +03:00
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
2008-03-29 12:59:18 +02:00
}
2008-04-14 21:24:46 +03:00
2008-05-03 18:18:48 +03:00
if ( endMoving ) //animation of ending move
2008-04-14 21:24:46 +03:00
{
for ( int i = 0 ; i < creAnims [ number ] - > framesInGroup ( 21 ) ; + + i )
{
show ( ) ;
2008-05-27 16:16:35 +03:00
CSDL_Ext : : update ( ) ;
2008-04-14 21:24:46 +03:00
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
}
2008-05-03 18:18:48 +03:00
2008-04-14 21:24:46 +03:00
creAnims [ number ] - > setType ( 2 ) ; //resetting to default
2008-04-07 20:51:46 +03:00
CStack curs = LOCPLINT - > cb - > battleGetStackByID ( number ) ;
2008-04-14 21:24:46 +03:00
if ( endMoving ) //resetting to default
{
if ( creDir [ number ] ! = ( curs . owner = = attackingHeroInstance - > tempOwner ) )
reverseCreature ( number , destHex ) ;
//creDir[number] = (curs.owner == attackingHeroInstance->tempOwner);
}
2008-04-07 20:51:46 +03:00
2008-04-14 21:24:46 +03:00
std : : pair < int , int > coords = CBattleHex : : getXYUnitAnim ( destHex , creDir [ number ] , curs . creature ) ;
2008-04-07 20:51:46 +03:00
creAnims [ number ] - > pos . x = coords . first ;
creAnims [ number ] - > pos . y = coords . second ;
}
2008-05-27 16:16:35 +03:00
void CBattleInterface : : stackIsAttacked ( int ID )
{
}
2008-04-07 20:51:46 +03:00
void CBattleInterface : : stackAttacking ( int ID , int dest )
{
2008-05-27 16:16:35 +03:00
CStack aStack = LOCPLINT - > cb - > battleGetStackByID ( ID ) ; //attacking stack
if ( aStack . creature - > isDoubleWide ( ) )
{
switch ( CBattleHex : : mutualPosition ( aStack . position , dest ) ) //attack direction
{
case 0 :
2008-05-31 23:37:54 +03:00
//reverseCreature(ID, aStack.position, true);
2008-05-27 16:16:35 +03:00
break ;
case 1 :
break ;
case 2 :
break ;
case 3 :
break ;
case 4 :
2008-05-31 23:37:54 +03:00
//reverseCreature(ID, aStack.position, true);
2008-05-27 16:16:35 +03:00
break ;
case 5 :
2008-05-31 23:37:54 +03:00
reverseCreature ( ID , aStack . position , true ) ;
2008-05-27 16:16:35 +03:00
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( CBattleHex : : mutualPosition ( aStack . position , dest ) ) //attack direction
{
case 0 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
case 1 :
break ;
case 2 :
break ;
case 3 :
break ;
case 4 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
case 5 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
}
2008-06-06 16:53:33 +03:00
}
attackingInfo = new CAttHelper ;
attackingInfo - > dest = dest ;
attackingInfo - > frame = 0 ;
attackingInfo - > ID = ID ;
attackingInfo - > reversing = false ;
if ( aStack . creature - > isDoubleWide ( ) )
{
switch ( CBattleHex : : mutualPosition ( aStack . position , dest ) ) //attack direction
{
case 0 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 10 ) ;
break ;
case 1 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 10 ) ;
break ;
case 2 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 11 ) ;
break ;
case 3 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 12 ) ;
break ;
case 4 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 12 ) ;
break ;
case 5 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 11 ) ;
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( CBattleHex : : mutualPosition ( aStack . position , dest ) ) //attack direction
{
case 0 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 10 ) ;
break ;
case 1 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 10 ) ;
break ;
case 2 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 11 ) ;
break ;
case 3 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 12 ) ;
break ;
case 4 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 12 ) ;
break ;
case 5 :
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 11 ) ;
break ;
}
2008-05-27 16:16:35 +03:00
}
2008-03-23 19:25:38 +02:00
}
2008-04-19 20:10:57 +03:00
void CBattleInterface : : newRound ( int number )
{
console - > addText ( CGI - > generaltexth - > allTexts [ 412 ] ) ;
}
2008-03-24 21:04:30 +02:00
void CBattleInterface : : hexLclicked ( int whichOne )
{
2008-04-15 19:52:31 +03:00
if ( ( whichOne % 17 ) ! = 0 & & ( whichOne % 17 ) ! = 16 ) //if player is trying to attack enemey unit or move creature stack
2008-04-07 20:51:46 +03:00
{
2008-05-27 16:16:35 +03:00
int atCre = LOCPLINT - > cb - > battleGetStack ( whichOne ) ; //creature at destination tile; -1 if there is no one
//LOCPLINT->cb->battleGetCreature();
if ( atCre = = - 1 ) //normal move action
{
BattleAction * ba = new BattleAction ( ) ; //to be deleted by engine
ba - > actionType = 2 ;
ba - > destinationTile = whichOne ;
ba - > stackNumber = activeStack ;
givenCommand = ba ;
}
else if ( LOCPLINT - > cb - > battleGetStackByID ( atCre ) . owner ! = attackingHeroInstance - > tempOwner ) //attacking
{
BattleAction * ba = new BattleAction ( ) ; //to be deleted by engine
ba - > actionType = 6 ;
ba - > destinationTile = whichOne ;
ba - > stackNumber = activeStack ;
givenCommand = ba ;
}
2008-03-29 12:59:18 +02:00
}
2008-03-24 21:04:30 +02:00
}
2008-03-29 12:59:18 +02:00
void CBattleInterface : : showRange ( SDL_Surface * to , int ID )
2008-03-23 19:25:38 +02:00
{
2008-03-29 12:59:18 +02:00
std : : vector < int > shadedHexes = LOCPLINT - > cb - > battleGetAvailableHexes ( ID ) ;
for ( int i = 0 ; i < shadedHexes . size ( ) ; + + i )
2008-03-23 19:25:38 +02:00
{
2008-03-29 12:59:18 +02:00
CSDL_Ext : : blit8bppAlphaTo24bpp ( CBattleInterface : : cellShade , NULL , to , & bfield [ shadedHexes [ i ] ] . pos ) ;
2008-03-23 19:25:38 +02:00
}
}
2008-06-06 16:53:33 +03:00
void CBattleInterface : : attackingShowHelper ( )
{
if ( attackingInfo & & ! attackingInfo - > reversing )
{
if ( attackingInfo - > frame = = 0 )
{
CStack aStack = LOCPLINT - > cb - > battleGetStackByID ( attackingInfo - > ID ) ; //attacking stack
if ( aStack . creature - > isDoubleWide ( ) )
{
switch ( CBattleHex : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
{
case 0 :
creAnims [ attackingInfo - > ID ] - > setType ( 10 ) ;
break ;
case 1 :
creAnims [ attackingInfo - > ID ] - > setType ( 10 ) ;
break ;
case 2 :
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
break ;
case 3 :
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
break ;
case 4 :
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
break ;
case 5 :
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( CBattleHex : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
{
case 0 :
creAnims [ attackingInfo - > ID ] - > setType ( 10 ) ;
break ;
case 1 :
creAnims [ attackingInfo - > ID ] - > setType ( 10 ) ;
break ;
case 2 :
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
break ;
case 3 :
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
break ;
case 4 :
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
break ;
case 5 :
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
break ;
}
}
}
else if ( attackingInfo - > frame = = ( attackingInfo - > maxframe - 1 ) )
{
attackingInfo - > reversing = true ;
CStack aStack = LOCPLINT - > cb - > battleGetStackByID ( attackingInfo - > ID ) ; //attacking stack
if ( aStack . creature - > isDoubleWide ( ) )
{
switch ( CBattleHex : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
{
case 0 :
//reverseCreature(ID, aStack.position, true);
break ;
case 1 :
break ;
case 2 :
break ;
case 3 :
break ;
case 4 :
//reverseCreature(ID, aStack.position, true);
break ;
case 5 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( CBattleHex : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
{
case 0 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
case 1 :
break ;
case 2 :
break ;
case 3 :
break ;
case 4 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
case 5 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
}
}
attackingInfo - > reversing = false ;
creAnims [ attackingInfo - > ID ] - > setType ( 2 ) ;
delete attackingInfo ;
attackingInfo = NULL ;
}
if ( attackingInfo )
{
attackingInfo - > frame + + ;
}
}
}
2008-03-03 21:41:10 +02:00
void CBattleHero : : show ( SDL_Surface * to )
{
2008-04-14 21:24:46 +03:00
//animation of flag
if ( flip )
{
CSDL_Ext : : blit8bppAlphaTo24bpp ( flag - > ourImages [ flagAnim ] . bitmap , NULL , screen , & genRect ( flag - > ourImages [ flagAnim ] . bitmap - > h , flag - > ourImages [ flagAnim ] . bitmap - > w , 752 , 39 ) ) ;
}
else
{
CSDL_Ext : : blit8bppAlphaTo24bpp ( flag - > ourImages [ flagAnim ] . bitmap , NULL , screen , & genRect ( flag - > ourImages [ flagAnim ] . bitmap - > h , flag - > ourImages [ flagAnim ] . bitmap - > w , 31 , 39 ) ) ;
}
{
+ + flagAnim ;
flagAnim % = flag - > ourImages . size ( ) ;
}
//animation of hero
2008-03-03 21:41:10 +02:00
int tick = - 1 ;
for ( int i = 0 ; i < dh - > ourImages . size ( ) ; + + i )
{
if ( dh - > ourImages [ i ] . groupNumber = = phase )
+ + tick ;
if ( tick = = image )
{
2008-03-04 19:25:58 +02:00
SDL_Rect posb = pos ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( dh - > ourImages [ i ] . bitmap , NULL , to , & posb ) ;
2008-03-03 21:41:10 +02:00
+ + image ;
if ( dh - > ourImages [ i + 1 ] . groupNumber ! = phase ) //back to appropriate frame
{
image = 0 ;
}
break ;
}
}
2008-03-04 19:25:58 +02:00
}
CBattleHero : : CBattleHero ( std : : string defName , int phaseG , int imageG , bool flipG , unsigned char player ) : phase ( phaseG ) , image ( imageG ) , flip ( flipG ) , flagAnim ( 0 )
{
dh = CGI - > spriteh - > giveDef ( defName ) ;
for ( int i = 0 ; i < dh - > ourImages . size ( ) ; + + i ) //transforming images
{
if ( flip )
2008-04-20 18:56:03 +03:00
{
SDL_Surface * hlp = CSDL_Ext : : rotate01 ( dh - > ourImages [ i ] . bitmap ) ;
SDL_FreeSurface ( dh - > ourImages [ i ] . bitmap ) ;
dh - > ourImages [ i ] . bitmap = hlp ;
}
2008-03-04 19:25:58 +02:00
dh - > ourImages [ i ] . bitmap = CSDL_Ext : : alphaTransform ( dh - > ourImages [ i ] . bitmap ) ;
}
dh - > alphaTransformed = true ;
if ( flip )
flag = CGI - > spriteh - > giveDef ( " CMFLAGR.DEF " ) ;
else
flag = CGI - > spriteh - > giveDef ( " CMFLAGL.DEF " ) ;
2008-03-10 22:19:41 +02:00
//coloring flag and adding transparency
2008-03-04 19:25:58 +02:00
for ( int i = 0 ; i < flag - > ourImages . size ( ) ; + + i )
{
flag - > ourImages [ i ] . bitmap = CSDL_Ext : : alphaTransform ( flag - > ourImages [ i ] . bitmap ) ;
CSDL_Ext : : blueToPlayersAdv ( flag - > ourImages [ i ] . bitmap , player ) ;
}
2008-03-03 21:41:10 +02:00
}
CBattleHero : : ~ CBattleHero ( )
{
delete dh ;
2008-03-04 19:25:58 +02:00
delete flag ;
2008-03-03 21:41:10 +02:00
}
2008-03-10 22:19:41 +02:00
2008-04-14 21:24:46 +03:00
std : : pair < int , int > CBattleHex : : getXYUnitAnim ( int hexNum , bool attacker , CCreature * creature )
2008-03-10 22:19:41 +02:00
{
std : : pair < int , int > ret = std : : make_pair ( - 500 , - 500 ) ; //returned value
ret . second = - 139 + 42 * ( hexNum / 17 ) ; //counting y
//counting x
if ( attacker )
{
ret . first = - 160 + 22 * ( ( ( hexNum / 17 ) + 1 ) % 2 ) + 44 * ( hexNum % 17 ) ;
}
else
{
ret . first = - 219 + 22 * ( ( ( hexNum / 17 ) + 1 ) % 2 ) + 44 * ( hexNum % 17 ) ;
}
2008-04-14 21:24:46 +03:00
//shifting position for double - hex creatures
if ( creature - > isDoubleWide ( ) )
{
if ( attacker )
{
ret . first - = 42 ;
}
else
{
ret . first + = 42 ;
}
}
2008-03-10 22:19:41 +02:00
//returning
return ret ;
}
2008-04-07 20:51:46 +03:00
signed char CBattleHex : : mutualPosition ( int hex1 , int hex2 )
{
if ( hex2 = = hex1 - ( ( hex1 / 17 ) % 2 ? 18 : 17 ) ) //top left
return 0 ;
if ( hex2 = = hex1 - ( ( hex1 / 17 ) % 2 ? 17 : 16 ) ) //top right
return 1 ;
if ( hex2 = = hex1 - 1 & & hex1 % 17 ! = 0 ) //left
return 5 ;
if ( hex2 = = hex1 + 1 & & hex1 % 17 ! = 16 ) //right
return 2 ;
if ( hex2 = = hex1 + ( ( hex1 / 17 ) % 2 ? 16 : 17 ) ) //bottom left
return 4 ;
if ( hex2 = = hex1 + ( ( hex1 / 17 ) % 2 ? 17 : 18 ) ) //bottom right
return 3 ;
return - 1 ;
}
2008-03-10 22:19:41 +02:00
void CBattleHex : : activate ( )
{
Hoverable : : activate ( ) ;
2008-03-15 19:48:05 +02:00
MotionInterested : : activate ( ) ;
2008-03-24 15:25:11 +02:00
ClickableL : : activate ( ) ;
2008-05-27 16:16:35 +03:00
ClickableR : : activate ( ) ;
2008-03-10 22:19:41 +02:00
}
void CBattleHex : : deactivate ( )
{
2008-03-15 19:48:05 +02:00
Hoverable : : deactivate ( ) ;
MotionInterested : : deactivate ( ) ;
2008-03-24 15:25:11 +02:00
ClickableL : : deactivate ( ) ;
2008-05-27 16:16:35 +03:00
ClickableR : : deactivate ( ) ;
2008-03-10 22:19:41 +02:00
}
void CBattleHex : : hover ( bool on )
{
hovered = on ;
Hoverable : : hover ( on ) ;
}
2008-03-24 21:04:30 +02:00
CBattleHex : : CBattleHex ( ) : myNumber ( - 1 ) , accesible ( true ) , hovered ( false ) , strictHovered ( false ) , myInterface ( NULL )
2008-03-10 22:19:41 +02:00
{
}
2008-03-15 19:48:05 +02:00
void CBattleHex : : mouseMoved ( SDL_MouseMotionEvent & sEvent )
{
if ( CBattleInterface : : cellShade )
{
if ( CSDL_Ext : : SDL_GetPixel ( CBattleInterface : : cellShade , sEvent . x - pos . x , sEvent . y - pos . y ) = = 0 ) //hovered pixel is outside hex
{
strictHovered = false ;
}
else //hovered pixel is inside hex
{
strictHovered = true ;
}
}
}
2008-03-24 15:25:11 +02:00
void CBattleHex : : clickLeft ( boost : : logic : : tribool down )
{
2008-03-24 21:04:30 +02:00
if ( ! down & & hovered & & strictHovered ) //we've been really clicked!
{
myInterface - > hexLclicked ( myNumber ) ;
}
2008-03-24 15:25:11 +02:00
}
2008-04-16 20:21:02 +03:00
2008-05-27 16:16:35 +03:00
void CBattleHex : : clickRight ( boost : : logic : : tribool down )
{
int stID = LOCPLINT - > cb - > battleGetStack ( myNumber ) ; //id of stack being on this tile
if ( hovered & & strictHovered & & stID ! = - 1 )
{
CStack myst = LOCPLINT - > cb - > battleGetStackByID ( stID ) ; //stack info
StackState * pom = NULL ;
if ( down )
{
pom = new StackState ( ) ;
const CGHeroInstance * h = myst . owner = = myInterface - > attackingHeroInstance - > tempOwner ? myInterface - > attackingHeroInstance : myInterface - > defendingHeroInstance ;
2008-06-04 16:00:56 +03:00
if ( h )
{
pom - > attackBonus = h - > primSkills [ 0 ] ;
pom - > defenseBonus = h - > primSkills [ 1 ] ;
pom - > luck = h - > getCurrentLuck ( ) ;
pom - > morale = h - > getCurrentMorale ( ) ;
}
2008-05-27 16:16:35 +03:00
( new CCreInfoWindow ( myst . creature - > idNumber , 0 , pom , boost : : function < void ( ) > ( ) , boost : : function < void ( ) > ( ) ) )
- > activate ( ) ;
}
delete pom ;
}
}
2008-04-16 20:21:02 +03:00
CBattleConsole : : CBattleConsole ( ) : lastShown ( - 1 )
{
}
CBattleConsole : : ~ CBattleConsole ( )
{
texts . clear ( ) ;
}
void CBattleConsole : : show ( SDL_Surface * to )
{
if ( texts . size ( ) )
{
if ( texts . size ( ) = = 1 )
{
CSDL_Ext : : printAtMiddleWB ( texts [ 0 ] , pos . x + pos . w / 2 , pos . y + 10 , GEOR13 , 80 , zwykly , to ) ;
}
else
{
CSDL_Ext : : printAtMiddleWB ( texts [ lastShown - 1 ] , pos . x + pos . w / 2 , pos . y + 10 , GEOR13 , 80 , zwykly , to ) ;
CSDL_Ext : : printAtMiddleWB ( texts [ lastShown ] , pos . x + pos . w / 2 , pos . y + 26 , GEOR13 , 80 , zwykly , to ) ;
}
}
}
bool CBattleConsole : : addText ( std : : string text )
{
if ( text . size ( ) > 70 )
return false ; //text too long!
texts . push_back ( text ) ;
lastShown + + ;
return true ;
}
void CBattleConsole : : eraseText ( unsigned int pos )
{
if ( pos < texts . size ( ) )
{
texts . erase ( texts . begin ( ) + pos ) ;
if ( lastShown = = texts . size ( ) )
- - lastShown ;
}
}
void CBattleConsole : : changeTextAt ( std : : string text , unsigned int pos )
{
if ( pos > = texts . size ( ) ) //no such pos
return ;
texts [ pos ] = text ;
}
void CBattleConsole : : scrollUp ( unsigned int by )
{
if ( lastShown > by )
lastShown - = by ;
}
void CBattleConsole : : scrollDown ( unsigned int by )
{
if ( lastShown + by < texts . size ( ) )
lastShown + = by ;
}