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-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-03-29 12:59:18 +02:00
: printCellBorders ( true ) , attackingHeroInstance ( hero1 ) , defendingHeroInstance ( hero2 ) , animCount ( 0 ) , activeStack ( - 1 ) , curStackActed ( false )
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-03-03 21:41:10 +02: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-03-03 21:41:10 +02:00
//preparing buttons
2008-02-26 20:01:26 +02:00
bOptions = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bOptionsf , 3 , 561 , " icm003.def " , this , false , NULL , false ) ;
2008-03-01 13:49:25 +02:00
bSurrender = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bSurrenderf , 54 , 561 , " icm001.def " , this , false , NULL , false ) ;
bFlee = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bFleef , 105 , 561 , " icm002.def " , this , false , NULL , false ) ;
bAutofight = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bAutofightf , 157 , 561 , " icm004.def " , this , false , NULL , false ) ;
bSpell = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bSpellf , 645 , 561 , " icm005.def " , this , false , NULL , false ) ;
bWait = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bWaitf , 696 , 561 , " icm006.def " , this , false , NULL , false ) ;
bDefence = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bDefencef , 747 , 561 , " icm007.def " , this , false , NULL , false ) ;
2008-03-03 21:41:10 +02:00
bConsoleUp = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bConsoleUpf , 624 , 561 , " ComSlide.def " , this , false , NULL , false ) ;
bConsoleDown = new AdventureMapButton < CBattleInterface > ( std : : string ( ) , std : : string ( ) , & CBattleInterface : : bConsoleDownf , 624 , 580 , " ComSlide.def " , this , false , NULL , false ) ;
bConsoleDown - > bitmapOffset = 2 ;
//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 " ) ;
cellBorder = CSDL_Ext : : alphaTransform ( cellBorder ) ;
cellShade = CGI - > bitmaph - > loadBitmap ( " CCELLSHD.BMP " ) ;
cellShade = 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-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 ;
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-03-10 22:19:41 +02:00
for ( int g = 0 ; g < creAnims . size ( ) ; + + g )
delete creAnims [ g ] ;
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-03-04 19:25:58 +02:00
//showing menu background
blitAt ( menu , 0 , 556 , 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 ;
}
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-03-03 21:41:10 +02:00
CSDL_Ext : : update ( ) ;
2008-02-26 20:01:26 +02:00
}
2008-04-14 21:24:46 +03:00
bool CBattleInterface : : reverseCreature ( int number , int hex )
{
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 ( ) ;
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 ;
creAnims [ number ] - > pos . y = coords . second ;
creAnims [ number ] - > setType ( 7 ) ;
for ( int g = 0 ; g < creAnims [ number ] - > framesInGroup ( 7 ) ; + + g )
{
show ( ) ;
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-03-06 18:42:34 +02:00
for ( int i = 0 ; i < LOCPLINT - > objsToBlit . size ( ) ; + + i )
{
if ( dynamic_cast < CBattleInterface * > ( LOCPLINT - > objsToBlit [ i ] ) )
{
LOCPLINT - > objsToBlit . erase ( LOCPLINT - > objsToBlit . begin ( ) + i ) ;
}
}
deactivate ( ) ;
LOCPLINT - > adventureInt - > activate ( ) ;
delete this ;
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 ;
LOCPLINT - > cb - > battleMakeAction ( ba ) ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bConsoleUpf ( )
{
}
void CBattleInterface : : bConsoleDownf ( )
{
}
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-03-23 19:25:38 +02:00
void CBattleInterface : : stackActivated ( int number )
{
2008-03-29 12:59:18 +02:00
curStackActed = false ;
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-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 ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
}
switch ( CBattleHex : : mutualPosition ( curStackPos , destHex ) ) //reverse unit if necessary
{
case 0 :
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos ) ;
break ;
case 1 :
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos ) ;
break ;
case 2 :
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos ) ;
break ;
case 3 :
if ( creDir [ number ] = = false )
reverseCreature ( number , curStackPos ) ;
break ;
case 4 :
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos ) ;
break ;
case 5 :
if ( creDir [ number ] = = true )
reverseCreature ( number , curStackPos ) ;
break ;
}
//moving instructions
2008-04-07 20:51:46 +03:00
creAnims [ number ] - > setType ( 0 ) ;
for ( int i = 0 ; i < steps ; + + i )
2008-03-29 12:59:18 +02:00
{
2008-04-07 20:51:46 +03:00
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 ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
2008-03-29 12:59:18 +02:00
}
2008-04-14 21:24:46 +03:00
if ( endMoving ) //animation of starting move
{
for ( int i = 0 ; i < creAnims [ number ] - > framesInGroup ( 21 ) ; + + i )
{
show ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
}
2008-04-07 20:51:46 +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 ;
}
void CBattleInterface : : stackAttacking ( int ID , int dest )
{
2008-03-23 19:25:38 +02:00
}
2008-03-24 21:04:30 +02:00
void CBattleInterface : : hexLclicked ( int whichOne )
{
2008-04-07 20:51:46 +03:00
if ( ! LOCPLINT - > cb - > battleIsStackMine ( LOCPLINT - > cb - > battleGetStack ( whichOne ) ) ) //if player is trying to attack eney unit
{
BattleAction * ba = new BattleAction ( ) ; //to be deleted by engine
ba - > actionType = 6 ;
ba - > destinationTile = whichOne ;
ba - > stackNumber = activeStack ;
LOCPLINT - > cb - > battleMakeAction ( ba ) ;
}
2008-03-24 21:04:30 +02:00
if ( ( whichOne % 17 ) ! = 0 & & ( whichOne % 17 ) ! = 16 )
2008-03-29 12:59:18 +02:00
{
2008-03-24 21:04:30 +02:00
LOCPLINT - > cb - > battleMoveCreature ( activeStack , whichOne ) ;
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-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 )
dh - > ourImages [ i ] . bitmap = CSDL_Ext : : rotate01 ( dh - > ourImages [ i ] . bitmap ) ;
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-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-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
}