2008-02-25 01:06:27 +02:00
# include "CBattleInterface.h"
2008-02-26 20:01:26 +02:00
# include "CGameInfo.h"
2008-07-01 11:01:02 +03:00
# include "hch/CLodHandler.h"
2008-02-26 20:01:26 +02:00
# include "SDL_Extensions.h"
# include "CAdvmapInterface.h"
# include "AdventureMapButton.h"
2008-07-02 11:39:56 +03:00
# include "hch/CObjectHandler.h"
2008-07-01 11:01:02 +03:00
# include "hch/CHeroHandler.h"
# include "hch/CDefHandler.h"
2008-08-06 20:49:47 +03:00
# include "CCursorHandler.h"
2008-03-10 22:19:41 +02:00
# include "CCallback.h"
# include "CGameState.h"
2008-07-01 11:01:02 +03:00
# include "hch/CGeneralTextHandler.h"
2008-09-24 19:25:14 +03:00
# include "hch/CPreGameTextHandler.h"
2008-06-07 20:16:52 +03:00
# include "client/CCreatureAnimation.h"
2008-06-30 03:06:41 +03:00
# include "client/Graphics.h"
2008-09-12 16:06:53 +03:00
# include "client/CSpellWindow.h"
2008-03-23 19:25:38 +02:00
# include <queue>
2008-04-14 21:24:46 +03:00
# include <sstream>
2008-08-04 18:56:36 +03:00
# include "lib/CondSh.h"
2008-09-05 19:08:25 +03:00
# include "lib/NetPacks.h"
2008-09-24 19:25:14 +03:00
# include <boost/assign/list_of.hpp>
2008-08-04 12:05:52 +03:00
# ifndef __GNUC__
2008-08-02 18:08:03 +03:00
const double M_PI = 3.14159265358979323846 ;
2008-08-04 12:05:52 +03:00
# else
# define _USE_MATH_DEFINES
# include <cmath>
# endif
2008-08-02 18:08:03 +03:00
2008-03-03 21:41:10 +02:00
extern SDL_Surface * screen ;
2008-09-05 19:08:25 +03:00
extern TTF_Font * TNRB16 , * TNR , * GEOR13 , * GEORXX , * GEORM , * GEOR16 ;
2008-04-14 21:24:46 +03:00
extern SDL_Color zwykly ;
2008-02-25 01:06:27 +02:00
2008-09-09 14:25:21 +03:00
class CMP_stack2
{
public :
bool operator ( ) ( const CStack & a , const CStack & b )
{
return ( a . creature - > speed ) > ( b . creature - > speed ) ;
}
} cmpst2 ;
2008-08-02 18:08:03 +03:00
CBattleInterface : : CBattleInterface ( CCreatureSet * army1 , CCreatureSet * army2 , CGHeroInstance * hero1 , CGHeroInstance * hero2 )
2008-10-17 19:30:56 +03:00
: printCellBorders ( true ) , attackingHeroInstance ( hero1 ) , defendingHeroInstance ( hero2 ) , animCount ( 0 ) , activeStack ( - 1 ) , givenCommand ( NULL ) , attackingInfo ( NULL ) , myTurn ( false ) , resWindow ( NULL ) , showStackQueue ( false ) , animSpeed ( 2 ) , printStackRange ( true ) , printMouseShadow ( true ) , spellDestSelectMode ( false ) , spellToCast ( NULL )
2008-02-25 01:06:27 +02:00
{
2008-09-30 17:50:11 +03:00
strongInterest = true ;
2008-08-04 18:56:36 +03:00
givenCommand = new CondSh < BattleAction * > ( NULL ) ;
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-07-02 11:39:56 +03:00
std : : vector < std : : string > & backref = graphics - > battleBacks [ LOCPLINT - > cb - > battleGetBattlefieldType ( ) ] ;
2008-06-12 09:45:51 +03:00
background = BitmapHandler : : loadBitmap ( backref [ rand ( ) % backref . size ( ) ] ) ;
menu = BitmapHandler : : loadBitmap ( " CBAR.BMP " ) ;
2008-06-30 03:06:41 +03:00
graphics - > blueToPlayersAdv ( menu , hero1 - > tempOwner ) ;
2008-02-26 20:01:26 +02:00
2008-04-14 21:24:46 +03:00
//preparing graphics for displaying amounts of creatures
2008-06-12 09:45:51 +03:00
amountBasic = BitmapHandler : : loadBitmap ( " CMNUMWIN.BMP " ) ;
amountNormal = BitmapHandler : : loadBitmap ( " CMNUMWIN.BMP " ) ;
2008-04-14 21:24:46 +03:00
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-08-02 18:08:03 +03:00
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-08-02 18:08:03 +03:00
2008-03-03 21:41:10 +02:00
//loading hero animations
if ( hero1 ) // attacking hero
{
2008-10-17 19:30:56 +03:00
attackingHero = new CBattleHero ( graphics - > battleHeroes [ hero1 - > type - > heroType ] , 0 , 0 , false , hero1 - > tempOwner , hero1 - > tempOwner = = LOCPLINT - > playerID ? hero1 : NULL , this ) ;
2008-03-04 19:25:58 +02:00
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-10-17 19:30:56 +03:00
defendingHero = new CBattleHero ( graphics - > battleHeroes [ hero2 - > type - > heroType ] , 0 , 0 , true , hero2 - > tempOwner , hero2 - > tempOwner = = LOCPLINT - > playerID ? hero2 : NULL , this ) ;
2008-03-04 19:25:58 +02:00
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
2008-06-12 09:45:51 +03:00
cellBorder = BitmapHandler : : loadBitmap ( " CCELLGRD.BMP " ) ;
2008-04-20 18:56:03 +03:00
CSDL_Ext : : alphaTransform ( cellBorder ) ;
2008-06-12 09:45:51 +03:00
cellShade = BitmapHandler : : 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 ;
2008-08-02 18:08:03 +03:00
2008-03-10 22:19:41 +02:00
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-08-02 18:08:03 +03:00
//loading projectiles for units
for ( std : : map < int , CStack > : : iterator g = stacks . begin ( ) ; g ! = stacks . end ( ) ; + + g )
{
if ( g - > second . creature - > isShooting ( ) & & CGI - > creh - > idToProjectile [ g - > second . creature - > idNumber ] ! = std : : string ( ) )
{
idToProjectile [ g - > second . creature - > idNumber ] = CDefHandler : : giveDef ( CGI - > creh - > idToProjectile [ g - > second . creature - > idNumber ] ) ;
if ( idToProjectile [ g - > second . creature - > idNumber ] - > ourImages . size ( ) > 2 ) //add symmetric images
{
for ( int k = idToProjectile [ g - > second . creature - > idNumber ] - > ourImages . size ( ) - 2 ; k > 1 ; - - k )
{
Cimage ci ;
ci . bitmap = CSDL_Ext : : rotate01 ( idToProjectile [ g - > second . creature - > idNumber ] - > ourImages [ k ] . bitmap ) ;
ci . groupNumber = 0 ;
ci . imName = std : : string ( ) ;
idToProjectile [ g - > second . creature - > idNumber ] - > ourImages . push_back ( ci ) ;
}
}
for ( int s = 0 ; s < idToProjectile [ g - > second . creature - > idNumber ] - > ourImages . size ( ) ; + + s ) //alpha transforming
{
CSDL_Ext : : alphaTransform ( idToProjectile [ g - > second . creature - > idNumber ] - > ourImages [ s ] . bitmap ) ;
}
}
}
2008-08-31 20:23:40 +03:00
//prepairing graphic with cell borders
cellBorders = CSDL_Ext : : newSurface ( background - > w , background - > h , cellBorder ) ;
2008-09-05 19:08:25 +03:00
//copying palette
for ( int g = 0 ; g < cellBorder - > format - > palette - > ncolors ; + + g ) //we assume that cellBorders->format->palette->ncolors == 256
{
cellBorders - > format - > palette - > colors [ g ] = cellBorder - > format - > palette - > colors [ g ] ;
}
//palette copied
2008-08-31 20:23:40 +03:00
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 ;
for ( int cellX = 0 ; cellX < cellBorder - > w ; + + cellX )
{
for ( int cellY = 0 ; cellY < cellBorder - > h ; + + cellY )
{
if ( y + cellY < cellBorders - > h & & x + cellX < cellBorders - > w )
* ( ( Uint8 * ) cellBorders - > pixels + ( y + cellY ) * cellBorders - > pitch + ( x + cellX ) ) | = * ( ( Uint8 * ) cellBorder - > pixels + cellY * cellBorder - > pitch + cellX ) ;
}
}
}
}
2008-09-03 13:52:07 +03:00
backgroundWithHexes = CSDL_Ext : : newSurface ( background - > w , background - > h , screen ) ;
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-08-31 20:23:40 +03:00
SDL_FreeSurface ( cellBorders ) ;
2008-09-03 13:52:07 +03:00
SDL_FreeSurface ( backgroundWithHexes ) ;
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-09-05 19:08:25 +03:00
delete resWindow ;
2008-08-04 18:56:36 +03:00
delete givenCommand ;
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-08-02 18:08:03 +03:00
for ( std : : map < int , CDefHandler * > : : iterator g = idToProjectile . begin ( ) ; g ! = idToProjectile . end ( ) ; + + g )
delete g - > second ;
2008-02-26 20:01:26 +02:00
}
2008-09-24 19:25:14 +03:00
void CBattleInterface : : setPrintCellBorders ( bool set )
{
printCellBorders = set ;
redrawBackgroundWithHexes ( activeStack ) ;
}
void CBattleInterface : : setPrintStackRange ( bool set )
{
printStackRange = set ;
redrawBackgroundWithHexes ( activeStack ) ;
}
void CBattleInterface : : setPrintMouseShadow ( bool set )
{
printMouseShadow = set ;
}
2008-02-25 01:06:27 +02:00
void CBattleInterface : : activate ( )
{
2008-09-25 17:09:31 +03:00
MotionInterested : : activate ( ) ;
2008-08-30 00:41:32 +03:00
subInt = NULL ;
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-09-16 18:23:44 +03:00
if ( attackingHero )
attackingHero - > activate ( ) ;
if ( defendingHero )
defendingHero - > 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-09-25 17:09:31 +03:00
MotionInterested : : 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-09-16 18:23:44 +03:00
if ( attackingHero )
attackingHero - > deactivate ( ) ;
if ( defendingHero )
defendingHero - > 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 ;
2008-09-03 13:52:07 +03:00
//printing background and hexes
if ( activeStack ! = - 1 & & creAnims [ activeStack ] - > getType ( ) ! = 0 ) //show everything with range
2008-03-04 19:25:58 +02:00
{
2008-09-03 13:52:07 +03:00
blitAt ( backgroundWithHexes , 0 , 0 , to ) ;
}
else
{
//showing background
blitAt ( background , 0 , 0 , to ) ;
if ( printCellBorders )
{
CSDL_Ext : : blit8bppAlphaTo24bpp ( cellBorders , NULL , to , NULL ) ;
}
2008-03-04 19:25:58 +02:00
}
2008-03-10 22:19:41 +02:00
//printing hovered cell
2008-09-24 19:25:14 +03:00
if ( printMouseShadow )
2008-03-10 22:19:41 +02:00
{
2008-09-24 19:25:14 +03:00
for ( int b = 0 ; b < 187 ; + + b )
2008-03-10 22:19:41 +02:00
{
2008-09-24 19:25:14 +03:00
if ( bfield [ b ] . strictHovered & & bfield [ b ] . hovered )
{
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-10 22:19:41 +02:00
}
}
2008-09-03 13:52:07 +03:00
2008-03-29 12:59:18 +02:00
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 ) ;
2008-08-02 18:08:03 +03:00
////showing units //a lot of work...
2008-06-21 16:27:52 +03:00
std : : vector < int > stackAliveByHex [ 187 ] ;
//double loop because dead stacks should be printed first
2008-04-14 21:24:46 +03:00
for ( std : : map < int , CStack > : : iterator j = stacks . begin ( ) ; j ! = stacks . end ( ) ; + + j )
2008-03-08 17:23:04 +02:00
{
2008-09-12 11:51:46 +03:00
if ( j - > second . alive ( ) )
2008-06-21 16:27:52 +03:00
stackAliveByHex [ j - > second . position ] . push_back ( j - > second . ID ) ;
}
std : : vector < int > stackDeadByHex [ 187 ] ;
for ( std : : map < int , CStack > : : iterator j = stacks . begin ( ) ; j ! = stacks . end ( ) ; + + j )
{
2008-09-12 11:51:46 +03:00
if ( ! j - > second . alive ( ) )
2008-06-21 16:27:52 +03:00
stackDeadByHex [ j - > second . position ] . push_back ( j - > second . ID ) ;
2008-04-14 21:24:46 +03:00
}
2008-06-11 04:58:18 +03:00
attackingShowHelper ( ) ; // handle attack animation
2008-06-21 16:27:52 +03:00
for ( int b = 0 ; b < 187 ; + + b ) //showing dead stacks
{
for ( int v = 0 ; v < stackDeadByHex [ b ] . size ( ) ; + + v )
{
2008-10-04 12:27:57 +03:00
creAnims [ stackDeadByHex [ b ] [ v ] ] - > nextFrame ( to , creAnims [ stackDeadByHex [ b ] [ v ] ] - > pos . x , creAnims [ stackDeadByHex [ b ] [ v ] ] - > pos . y , creDir [ stackDeadByHex [ b ] [ v ] ] , ( animCount % ( 4 / animSpeed ) = = 0 ) & & creAnims [ stackDeadByHex [ b ] [ v ] ] - > getType ( ) ! = 5 , stackDeadByHex [ b ] [ v ] = = activeStack ) ; //increment always when moving, never if stack died
2008-06-21 16:27:52 +03:00
//printing amount
if ( stacks [ stackDeadByHex [ b ] [ v ] ] . amount > 0 ) //don't print if stack is not alive
{
2008-08-07 15:29:53 +03:00
int xAdd = stacks [ stackDeadByHex [ b ] [ v ] ] . attackerOwned ? 220 : 202 ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( amountNormal , NULL , to , & genRect ( amountNormal - > h , amountNormal - > w , creAnims [ stackDeadByHex [ b ] [ v ] ] - > pos . x + xAdd , creAnims [ stackDeadByHex [ b ] [ v ] ] - > pos . y + 260 ) ) ;
std : : stringstream ss ;
ss < < stacks [ stackDeadByHex [ b ] [ v ] ] . amount ;
CSDL_Ext : : printAtMiddleWB ( ss . str ( ) , creAnims [ stackDeadByHex [ b ] [ v ] ] - > pos . x + xAdd + 14 , creAnims [ stackDeadByHex [ b ] [ v ] ] - > pos . y + 260 + 4 , GEOR13 , 20 , zwykly , to ) ;
2008-06-21 16:27:52 +03:00
}
}
}
for ( int b = 0 ; b < 187 ; + + b ) //showing alive stacks
2008-04-14 21:24:46 +03:00
{
2008-06-21 16:27:52 +03:00
for ( int v = 0 ; v < stackAliveByHex [ b ] . size ( ) ; + + v )
2008-04-14 21:24:46 +03:00
{
2008-09-23 18:40:30 +03:00
creAnims [ stackAliveByHex [ b ] [ v ] ] - > nextFrame ( to , creAnims [ stackAliveByHex [ b ] [ v ] ] - > pos . x , creAnims [ stackAliveByHex [ b ] [ v ] ] - > pos . y , creDir [ stackAliveByHex [ b ] [ v ] ] , ( animCount % ( 4 / animSpeed ) = = 0 ) & & creAnims [ stackAliveByHex [ b ] [ v ] ] - > getType ( ) ! = 0 & & creAnims [ stackAliveByHex [ b ] [ v ] ] - > getType ( ) ! = 20 & & creAnims [ stackAliveByHex [ b ] [ v ] ] - > getType ( ) ! = 21 , stackAliveByHex [ b ] [ v ] = = activeStack ) ; //increment always when moving, never if stack died
2008-04-14 21:24:46 +03:00
//printing amount
2008-06-21 16:27:52 +03:00
if ( stacks [ stackAliveByHex [ b ] [ v ] ] . amount > 0 ) //don't print if stack is not alive
2008-04-14 21:24:46 +03:00
{
2008-08-07 15:29:53 +03:00
int xAdd = stacks [ stackAliveByHex [ b ] [ v ] ] . attackerOwned ? 220 : 202 ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( amountNormal , NULL , to , & genRect ( amountNormal - > h , amountNormal - > w , creAnims [ stackAliveByHex [ b ] [ v ] ] - > pos . x + xAdd , creAnims [ stackAliveByHex [ b ] [ v ] ] - > pos . y + 260 ) ) ;
std : : stringstream ss ;
ss < < stacks [ stackAliveByHex [ b ] [ v ] ] . amount ;
CSDL_Ext : : printAtMiddleWB ( ss . str ( ) , creAnims [ stackAliveByHex [ b ] [ v ] ] - > pos . x + xAdd + 14 , creAnims [ stackAliveByHex [ b ] [ v ] ] - > pos . y + 260 + 4 , GEOR13 , 20 , zwykly , to ) ;
2008-04-14 21:24:46 +03:00
}
}
2008-03-08 17:23:04 +02:00
}
2008-03-05 19:01:41 +02:00
//units shown
2008-08-02 18:08:03 +03:00
projectileShowHelper ( to ) ; //showing projectiles
2008-09-05 19:08:25 +03:00
2008-09-09 14:25:21 +03:00
//showing queue of stacks
if ( showStackQueue )
{
int xPos = 400 - ( stacks . size ( ) * 42 ) / 2 ;
int yPos = 10 ;
std : : vector < CStack > stacksSorted ;
for ( int v = 0 ; v < stacks . size ( ) ; + + v )
{
2008-09-20 15:33:37 +03:00
if ( stacks [ v ] . alive ( ) ) //we don't want dead stacks to be there
stacksSorted . push_back ( stacks [ v ] ) ;
2008-09-09 14:25:21 +03:00
}
std : : stable_sort ( stacksSorted . begin ( ) , stacksSorted . end ( ) , cmpst2 ) ;
int startFrom = - 1 ;
for ( int n = 0 ; n < stacksSorted . size ( ) ; + + n )
{
if ( stacksSorted [ n ] . ID = = activeStack )
{
startFrom = n ;
break ;
}
}
if ( startFrom ! = - 1 )
{
for ( int b = startFrom ; b < stacksSorted . size ( ) + startFrom ; + + b )
{
SDL_BlitSurface ( graphics - > smallImgs [ - 2 ] , NULL , to , & genRect ( 32 , 32 , xPos , yPos ) ) ;
//printing colored border
for ( int xFrom = xPos - 1 ; xFrom < xPos + 33 ; + + xFrom )
{
for ( int yFrom = yPos - 1 ; yFrom < yPos + 33 ; + + yFrom )
{
if ( xFrom = = xPos - 1 | | xFrom = = xPos + 32 | | yFrom = = yPos - 1 | | yFrom = = yPos + 32 )
{
SDL_Color pc ;
if ( stacksSorted [ b % stacksSorted . size ( ) ] . owner ! = 255 )
{
pc = graphics - > playerColors [ stacksSorted [ b % stacksSorted . size ( ) ] . owner ] ;
}
else
{
pc = * graphics - > neutralColor ;
}
CSDL_Ext : : SDL_PutPixel ( to , xFrom , yFrom , pc . r , pc . g , pc . b ) ;
}
}
}
//colored border printed
SDL_BlitSurface ( graphics - > smallImgs [ stacksSorted [ b % stacksSorted . size ( ) ] . creature - > idNumber ] , NULL , to , & genRect ( 32 , 32 , xPos , yPos ) ) ;
xPos + = 42 ;
}
}
}
2008-09-05 19:08:25 +03:00
//showing window with result of battle
if ( resWindow )
{
resWindow - > show ( to ) ;
}
2008-02-26 20:01:26 +02:00
}
2008-09-25 17:09:31 +03:00
void CBattleInterface : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
{
2008-10-17 19:30:56 +03:00
if ( activeStack > = 0 & & ! spellDestSelectMode )
2008-09-25 17:09:31 +03:00
{
int myNumber = - 1 ; //number of hovered tile
for ( int g = 0 ; g < 187 ; + + g )
{
if ( bfield [ g ] . hovered & & bfield [ g ] . strictHovered )
{
myNumber = g ;
break ;
}
}
if ( myNumber = = - 1 )
{
CGI - > curh - > changeGraphic ( 1 , 6 ) ;
}
else
{
if ( std : : find ( shadedHexes . begin ( ) , shadedHexes . end ( ) , myNumber ) = = shadedHexes . end ( ) )
{
CStack * shere = LOCPLINT - > cb - > battleGetStackByPos ( myNumber ) ;
if ( shere )
{
if ( shere - > owner = = LOCPLINT - > playerID ) //our stack
CGI - > curh - > changeGraphic ( 1 , 5 ) ;
2008-10-11 16:14:52 +03:00
else if ( LOCPLINT - > cb - > battleCanShoot ( activeStack , myNumber ) ) //we can shoot enemy
2008-09-25 17:09:31 +03:00
CGI - > curh - > changeGraphic ( 1 , 3 ) ;
else if ( isTileAttackable ( myNumber ) ) //available enemy (melee attackable)
{
int fromHex = - 1 ;
for ( int b = 0 ; b < 187 ; + + b )
if ( bfield [ b ] . hovered & & ! bfield [ b ] . strictHovered )
{
fromHex = b ;
break ;
}
2008-10-04 13:00:31 +03:00
if ( fromHex ! = - 1 & & fromHex % 17 ! = 0 & & fromHex % 17 ! = 16 & & vstd : : contains ( shadedHexes , fromHex ) )
2008-09-25 17:09:31 +03:00
{
switch ( BattleInfo : : mutualPosition ( fromHex , myNumber ) )
{
case 0 :
CGI - > curh - > changeGraphic ( 1 , 12 ) ;
break ;
case 1 :
CGI - > curh - > changeGraphic ( 1 , 7 ) ;
break ;
case 2 :
CGI - > curh - > changeGraphic ( 1 , 8 ) ;
break ;
case 3 :
CGI - > curh - > changeGraphic ( 1 , 9 ) ;
break ;
case 4 :
CGI - > curh - > changeGraphic ( 1 , 10 ) ;
break ;
case 5 :
CGI - > curh - > changeGraphic ( 1 , 11 ) ;
break ;
}
}
}
else //unavailable enemy
CGI - > curh - > changeGraphic ( 1 , 0 ) ;
}
else //empty unavailable tile
CGI - > curh - > changeGraphic ( 1 , 0 ) ;
}
else //available tile
{
if ( LOCPLINT - > cb - > battleGetStackByID ( activeStack ) - > creature - > isFlying ( ) )
CGI - > curh - > changeGraphic ( 1 , 2 ) ;
else
CGI - > curh - > changeGraphic ( 1 , 1 ) ;
}
}
}
}
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 ) ;
2008-09-24 19:25:14 +03:00
int firstFrame = creAnims [ number ] - > getFrame ( ) ;
for ( int g = 0 ; creAnims [ number ] - > getFrame ( ) ! = creAnims [ number ] - > framesInGroup ( 8 ) + firstFrame - 1 ; + + g )
2008-04-14 21:24:46 +03:00
{
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 ] ;
2008-07-02 11:39:56 +03:00
CStack curs = * LOCPLINT - > cb - > battleGetStackByID ( number ) ;
2008-04-14 21:24:46 +03:00
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 ( ) )
{
2008-08-07 03:38:44 +03:00
if ( ! creDir [ number ] )
creAnims [ number ] - > pos . x - = 44 ;
2008-05-03 18:18:48 +03:00
}
2008-04-14 21:24:46 +03:00
creAnims [ number ] - > setType ( 7 ) ;
2008-09-24 19:25:14 +03:00
firstFrame = creAnims [ number ] - > getFrame ( ) ;
for ( int g = 0 ; creAnims [ number ] - > getFrame ( ) ! = creAnims [ number ] - > framesInGroup ( 7 ) + firstFrame - 1 ; + + g )
2008-04-14 21:24:46 +03:00
{
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 ( )
{
2008-09-23 18:40:30 +03:00
CGI - > curh - > changeGraphic ( 0 , 0 ) ;
2008-09-30 17:50:11 +03:00
deactivate ( ) ;
2008-09-23 18:40:30 +03:00
2008-09-23 20:14:46 +03:00
SDL_Rect temp_rect = genRect ( 431 , 481 , 160 , 84 ) ;
CBattleOptionsWindow * optionsWin = new CBattleOptionsWindow ( temp_rect , this ) ;
2008-09-23 18:40:30 +03:00
optionsWin - > activate ( ) ;
LOCPLINT - > objsToBlit . push_back ( optionsWin ) ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bSurrenderf ( )
{
}
void CBattleInterface : : bFleef ( )
2008-09-08 14:32:16 +03:00
{
CFunctionList < void ( ) > ony = boost : : bind ( & CBattleInterface : : activate , this ) ;
ony + = boost : : bind ( & CBattleInterface : : reallyFlee , this ) ;
LOCPLINT - > showYesNoDialog ( CGI - > generaltexth - > allTexts [ 28 ] , std : : vector < SComponent * > ( ) , ony , boost : : bind ( & CBattleInterface : : activate , this ) , true , false ) ;
}
void CBattleInterface : : reallyFlee ( )
2008-02-26 20:01:26 +02:00
{
2008-08-04 18:56:36 +03:00
giveCommand ( 4 , 0 , 0 ) ;
2008-08-07 15:29:53 +03:00
CGI - > curh - > changeGraphic ( 0 , 0 ) ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bAutofightf ( )
{
}
void CBattleInterface : : bSpellf ( )
{
2008-09-12 16:06:53 +03:00
CGI - > curh - > changeGraphic ( 0 , 0 ) ;
2008-09-30 17:50:11 +03:00
deactivate ( ) ;
2008-09-12 16:06:53 +03:00
const CGHeroInstance * chi = NULL ;
if ( attackingHeroInstance - > tempOwner = = LOCPLINT - > playerID )
chi = attackingHeroInstance ;
else
chi = defendingHeroInstance ;
CSpellWindow * spellWindow = new CSpellWindow ( genRect ( 595 , 620 , 90 , 2 ) , chi ) ;
spellWindow - > activate ( ) ;
LOCPLINT - > objsToBlit . push_back ( spellWindow ) ;
2008-02-26 20:01:26 +02:00
}
void CBattleInterface : : bWaitf ( )
{
}
void CBattleInterface : : bDefencef ( )
{
2008-08-04 18:56:36 +03:00
giveCommand ( 3 , 0 , activeStack ) ;
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-08-02 18:08:03 +03:00
void CBattleInterface : : stackKilled ( int ID , int dmg , int killed , int IDby , bool byShooting )
2008-05-30 14:53:04 +03:00
{
2008-08-02 18:08:03 +03:00
if ( creAnims [ ID ] - > getType ( ) ! = 2 )
{
return ; //something went wrong
}
if ( byShooting ) //delay hit animation
{
CStack attacker = * LOCPLINT - > cb - > battleGetStackByID ( IDby ) ;
while ( true )
{
bool found = false ;
for ( std : : list < SProjectileInfo > : : const_iterator it = projectiles . begin ( ) ; it ! = projectiles . end ( ) ; + + it )
{
if ( it - > creID = = attacker . creature - > idNumber )
{
found = true ;
break ;
}
}
if ( ! found )
break ;
else
{
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
}
}
2008-06-11 04:58:18 +03:00
creAnims [ ID ] - > setType ( 5 ) ; //death
2008-09-24 19:25:14 +03:00
int firstFrame = creAnims [ ID ] - > getFrame ( ) ;
for ( int i = 0 ; creAnims [ ID ] - > getFrame ( ) ! = creAnims [ ID ] - > framesInGroup ( 5 ) + firstFrame - 1 ; + + i )
2008-06-11 04:58:18 +03:00
{
2008-09-23 18:40:30 +03:00
if ( ( animCount % ( 4 / animSpeed ) ) = = 0 )
2008-08-30 00:41:32 +03:00
creAnims [ ID ] - > incrementFrame ( ) ;
2008-06-11 04:58:18 +03:00
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
2008-08-02 18:08:03 +03:00
2008-06-11 04:58:18 +03:00
printConsoleAttacked ( ID , dmg , killed , IDby ) ;
2008-05-30 14:53:04 +03:00
}
2008-03-23 19:25:38 +02:00
void CBattleInterface : : stackActivated ( int number )
{
2008-08-04 18:56:36 +03:00
//givenCommand = NULL;
2008-03-23 19:25:38 +02:00
activeStack = number ;
2008-08-02 18:08:03 +03:00
myTurn = true ;
2008-09-24 19:25:14 +03:00
redrawBackgroundWithHexes ( number ) ;
2008-03-23 19:25:38 +02:00
}
2008-09-29 00:01:49 +03:00
void CBattleInterface : : stackMoved ( int number , int destHex , bool endMoving )
2008-03-23 19:25:38 +02:00
{
2008-09-29 00:01:49 +03:00
bool startMoving = creAnims [ number ] - > type = = 20 ;
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-09-24 19:25:14 +03:00
int steps = creAnims [ number ] - > framesInGroup ( 0 ) * getAnimSpeedMultiplier ( ) - 1 ;
2008-04-07 20:51:46 +03:00
int hexWbase = 44 , hexHbase = 42 ;
2008-08-07 03:38:44 +03:00
bool twoTiles = LOCPLINT - > cb - > battleGetCreature ( number ) . isDoubleWide ( ) ;
2008-04-14 21:24:46 +03:00
2008-09-29 13:16:02 +03:00
if ( startMoving ) //animation of starting move; some units don't have this animation (ie. halberdier)
2008-04-14 21:24:46 +03:00
{
2008-08-07 03:38:44 +03:00
CGI - > curh - > hide ( ) ;
2008-09-24 19:25:14 +03:00
for ( int i = 0 ; i < creAnims [ number ] - > framesInGroup ( 20 ) * getAnimSpeedMultiplier ( ) - 1 ; + + i )
2008-04-14 21:24:46 +03:00
{
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-09-23 18:40:30 +03:00
if ( ( animCount + 1 ) % ( 4 / animSpeed ) = = 0 )
2008-08-07 03:38:44 +03:00
creAnims [ number ] - > incrementFrame ( ) ;
2008-04-14 21:24:46 +03:00
}
}
2008-08-06 20:49:47 +03:00
int mutPos = BattleInfo : : mutualPosition ( curStackPos , destHex ) ;
2008-05-03 18:18:48 +03:00
2008-04-14 21:24:46 +03:00
{
2008-08-07 03:38:44 +03:00
switch ( mutPos ) //reverse unit if necessary
2008-05-03 18:18:48 +03:00
{
2008-08-07 03:38:44 +03:00
case 0 : case 4 : case 5 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = true )
2008-08-07 03:38:44 +03:00
reverseCreature ( number , curStackPos , twoTiles ) ;
2008-05-03 18:18:48 +03:00
break ;
2008-08-07 03:38:44 +03:00
case 1 : case 2 : case 3 :
2008-05-03 18:18:48 +03:00
if ( creDir [ number ] = = false )
2008-08-07 03:38:44 +03:00
reverseCreature ( number , curStackPos , twoTiles ) ;
2008-05-03 18:18:48 +03:00
break ;
}
//moving instructions
creAnims [ number ] - > setType ( 0 ) ;
2008-09-22 15:22:10 +03:00
float posX = creAnims [ number ] - > pos . x , posY = creAnims [ number ] - > pos . y ; // for precise calculations ;]
2008-05-03 18:18:48 +03:00
for ( int i = 0 ; i < steps ; + + i )
{
2008-08-07 03:38:44 +03:00
switch ( mutPos )
2008-05-03 18:18:48 +03:00
{
case 0 :
2008-09-22 15:22:10 +03:00
posX - = ( ( float ) hexWbase ) / ( 2.0f * steps ) ;
creAnims [ number ] - > pos . x = posX ;
posY - = ( ( float ) hexHbase ) / ( ( float ) steps ) ;
creAnims [ number ] - > pos . y = posY ;
2008-05-03 18:18:48 +03:00
break ;
case 1 :
2008-09-22 15:22:10 +03:00
posX + = ( ( float ) hexWbase ) / ( 2.0f * steps ) ;
creAnims [ number ] - > pos . x = posX ;
posY - = ( ( float ) hexHbase ) / ( ( float ) steps ) ;
creAnims [ number ] - > pos . y = posY ;
2008-05-03 18:18:48 +03:00
break ;
case 2 :
2008-09-22 15:22:10 +03:00
posX + = ( ( float ) hexWbase ) / ( ( float ) steps ) ;
creAnims [ number ] - > pos . x = posX ;
2008-05-03 18:18:48 +03:00
break ;
case 3 :
2008-09-22 15:22:10 +03:00
posX + = ( ( float ) hexWbase ) / ( 2.0f * steps ) ;
creAnims [ number ] - > pos . x = posX ;
posY + = ( ( float ) hexHbase ) / ( ( float ) steps ) ;
creAnims [ number ] - > pos . y = posY ;
2008-05-03 18:18:48 +03:00
break ;
case 4 :
2008-09-22 15:22:10 +03:00
posX - = ( ( float ) hexWbase ) / ( 2.0f * steps ) ;
creAnims [ number ] - > pos . x = posX ;
posY + = ( ( float ) hexHbase ) / ( ( float ) steps ) ;
creAnims [ number ] - > pos . y = posY ;
2008-05-03 18:18:48 +03:00
break ;
case 5 :
2008-09-22 15:22:10 +03:00
posX - = ( ( float ) hexWbase ) / ( ( float ) steps ) ;
creAnims [ number ] - > pos . x = posX ;
2008-05-03 18:18:48 +03:00
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-09-23 18:40:30 +03:00
if ( ( animCount + 1 ) % ( 4 / animSpeed ) = = 0 )
2008-08-07 03:38:44 +03:00
creAnims [ number ] - > incrementFrame ( ) ;
2008-05-03 18:18:48 +03:00
}
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
{
2008-09-22 15:22:10 +03:00
if ( creAnims [ number ] - > framesInGroup ( 21 ) ! = 0 ) // some units don't have this animation (ie. halberdier)
2008-04-14 21:24:46 +03:00
{
2008-09-22 15:22:10 +03:00
creAnims [ number ] - > setType ( 21 ) ;
2008-09-24 19:25:14 +03:00
for ( int i = 0 ; i < creAnims [ number ] - > framesInGroup ( 21 ) * getAnimSpeedMultiplier ( ) - 1 ; + + i )
2008-09-22 15:22:10 +03:00
{
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
2008-09-23 18:40:30 +03:00
if ( ( animCount + 1 ) % ( 4 / animSpeed ) = = 0 )
2008-09-22 15:22:10 +03:00
creAnims [ number ] - > incrementFrame ( ) ;
}
2008-04-14 21:24:46 +03:00
}
2008-08-06 20:49:47 +03:00
creAnims [ number ] - > setType ( 2 ) ; //resetting to default
2008-08-07 03:38:44 +03:00
CGI - > curh - > show ( ) ;
2008-04-14 21:24:46 +03:00
}
2008-05-03 18:18:48 +03:00
2008-07-02 11:39:56 +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 ) )
2008-08-07 03:38:44 +03:00
reverseCreature ( number , destHex , twoTiles ) ;
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 ;
2008-08-07 03:38:44 +03:00
if ( ! endMoving & & twoTiles & & ( creDir [ number ] ! = ( curs . owner = = attackingHeroInstance - > tempOwner ) ) ) //big creature is reversed
creAnims [ number ] - > pos . x - = 44 ;
2008-04-07 20:51:46 +03:00
creAnims [ number ] - > pos . y = coords . second ;
}
2008-08-02 18:08:03 +03:00
void CBattleInterface : : stackIsAttacked ( int ID , int dmg , int killed , int IDby , bool byShooting )
2008-05-27 16:16:35 +03:00
{
2008-09-12 16:06:53 +03:00
while ( creAnims [ ID ] - > getType ( ) ! = 2 | | ( attackingInfo & & attackingInfo - > IDby = = IDby ) )
2008-08-02 18:08:03 +03:00
{
2008-09-12 16:06:53 +03:00
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
2008-08-02 18:08:03 +03:00
}
if ( byShooting ) //delay hit animation
{
CStack attacker = * LOCPLINT - > cb - > battleGetStackByID ( IDby ) ;
while ( true )
{
bool found = false ;
for ( std : : list < SProjectileInfo > : : const_iterator it = projectiles . begin ( ) ; it ! = projectiles . end ( ) ; + + it )
{
if ( it - > creID = = attacker . creature - > idNumber )
{
found = true ;
break ;
}
}
if ( ! found )
break ;
else
{
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
}
}
}
2008-06-11 04:58:18 +03:00
creAnims [ ID ] - > setType ( 3 ) ; //getting hit
2008-09-24 19:25:14 +03:00
int firstFrame = creAnims [ ID ] - > getFrame ( ) ;
for ( int i = 0 ; creAnims [ ID ] - > getFrame ( ) ! = creAnims [ ID ] - > framesInGroup ( 3 ) + firstFrame - 1 ; + + i )
2008-06-11 04:58:18 +03:00
{
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
2008-09-23 18:40:30 +03:00
/*if((animCount+1)%(4/animSpeed)==0)
2008-09-22 15:22:10 +03:00
creAnims [ ID ] - > incrementFrame ( ) ; */
2008-06-11 04:58:18 +03:00
}
creAnims [ ID ] - > setType ( 2 ) ;
printConsoleAttacked ( ID , dmg , killed , IDby ) ;
2008-05-27 16:16:35 +03:00
}
2008-04-07 20:51:46 +03:00
void CBattleInterface : : stackAttacking ( int ID , int dest )
{
2008-09-22 15:22:10 +03:00
while ( attackingInfo ! = NULL | | creAnims [ ID ] - > getType ( ) ! = 2 )
2008-08-02 18:08:03 +03:00
{
2008-09-12 16:06:53 +03:00
show ( ) ;
CSDL_Ext : : update ( ) ;
SDL_framerateDelay ( LOCPLINT - > mainFPSmng ) ;
2008-08-02 18:08:03 +03:00
}
2008-07-02 11:39:56 +03:00
CStack aStack = * LOCPLINT - > cb - > battleGetStackByID ( ID ) ; //attacking stack
2008-09-12 16:06:53 +03:00
if ( aStack . attackerOwned )
2008-05-27 16:16:35 +03:00
{
2008-09-12 16:06:53 +03:00
if ( aStack . creature - > isDoubleWide ( ) )
2008-05-27 16:16:35 +03:00
{
2008-09-12 16:06:53 +03:00
switch ( BattleInfo : : 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 ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( BattleInfo : : 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-05-27 16:16:35 +03:00
}
}
2008-09-12 16:06:53 +03:00
else //if(aStack.attackerOwned)
2008-05-27 16:16:35 +03:00
{
2008-09-12 16:06:53 +03:00
if ( aStack . creature - > isDoubleWide ( ) )
2008-05-27 16:16:35 +03:00
{
2008-09-12 16:06:53 +03:00
switch ( BattleInfo : : mutualPosition ( aStack . position , dest ) ) //attack direction
{
case 0 :
//reverseCreature(ID, aStack.position, true);
break ;
case 1 :
break ;
case 2 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
case 3 :
break ;
case 4 :
//reverseCreature(ID, aStack.position, true);
break ;
case 5 :
//reverseCreature(ID, aStack.position, true);
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( BattleInfo : : mutualPosition ( aStack . position , dest ) ) //attack direction
{
case 0 :
//reverseCreature(ID, aStack.position, true);
break ;
case 1 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
case 2 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
case 3 :
reverseCreature ( ID , aStack . position , true ) ;
break ;
case 4 :
//reverseCreature(ID, aStack.position, true);
break ;
case 5 :
//reverseCreature(ID, aStack.position, true);
break ;
}
2008-05-27 16:16:35 +03:00
}
2008-06-11 04:58:18 +03:00
}
attackingInfo = new CAttHelper ;
attackingInfo - > dest = dest ;
attackingInfo - > frame = 0 ;
2008-09-22 15:22:10 +03:00
attackingInfo - > hitCount = 0 ;
2008-06-11 04:58:18 +03:00
attackingInfo - > ID = ID ;
2008-09-12 16:06:53 +03:00
attackingInfo - > IDby = LOCPLINT - > cb - > battleGetStackByPos ( dest ) - > ID ;
2008-06-11 04:58:18 +03:00
attackingInfo - > reversing = false ;
2008-08-02 18:08:03 +03:00
attackingInfo - > shooting = false ;
2008-06-11 04:58:18 +03:00
2008-08-06 20:49:47 +03:00
switch ( BattleInfo : : mutualPosition ( aStack . position , dest ) ) //attack direction
2008-06-11 04:58:18 +03:00
{
2008-08-02 18:08:03 +03:00
case 0 :
2008-08-09 02:02:32 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 11 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 1 :
2008-08-09 02:02:32 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 11 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 2 :
2008-08-09 02:02:32 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 12 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 3 :
2008-08-09 02:02:32 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 13 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 4 :
2008-08-09 02:02:32 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 13 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 5 :
2008-08-09 02:02:32 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( 12 ) ;
2008-08-02 18:08:03 +03:00
break ;
2008-10-04 12:27:57 +03:00
default :
tlog1 < < " Critical Error! Wrong dest in stackAttacking! " < < std : : endl ;
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-08-09 02:02:32 +03:00
void CBattleInterface : : giveCommand ( ui8 action , ui16 tile , ui32 stack , si32 additional )
2008-08-04 18:56:36 +03:00
{
2008-08-09 02:02:32 +03:00
BattleAction * ba = new BattleAction ( ) ; //is deleted in CPlayerInterface::activeStack()
2008-08-04 18:56:36 +03:00
ba - > actionType = action ;
ba - > destinationTile = tile ;
ba - > stackNumber = stack ;
2008-08-09 02:02:32 +03:00
ba - > additionalInfo = additional ;
2008-08-04 18:56:36 +03:00
givenCommand - > setn ( ba ) ;
myTurn = false ;
2008-08-06 20:49:47 +03:00
activeStack = - 1 ;
2008-08-04 18:56:36 +03:00
}
2008-09-25 17:09:31 +03:00
bool CBattleInterface : : isTileAttackable ( int number )
{
for ( int b = 0 ; b < shadedHexes . size ( ) ; + + b )
{
if ( BattleInfo : : mutualPosition ( shadedHexes [ b ] , number ) ! = - 1 | | shadedHexes [ b ] = = number )
return true ;
}
return false ;
}
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-08-02 18:08:03 +03:00
if ( ! myTurn )
return ; //we are not permit to do anything
2008-10-17 19:30:56 +03:00
if ( spellDestSelectMode )
2008-08-02 18:08:03 +03:00
{
2008-10-17 19:30:56 +03:00
spellToCast - > destinationTile = whichOne ;
LOCPLINT - > cb - > battleMakeAction ( spellToCast ) ;
spellToCast = NULL ;
spellDestSelectMode = false ;
CGI - > curh - > changeGraphic ( 1 , 6 ) ;
2008-08-02 18:08:03 +03:00
}
2008-10-17 19:30:56 +03:00
else
2008-05-27 16:16:35 +03:00
{
2008-10-17 19:30:56 +03:00
CStack * dest = LOCPLINT - > cb - > battleGetStackByPos ( whichOne ) ; //creature at destination tile; -1 if there is no one
if ( ! dest | | ! dest - > alive ( ) ) //no creature at that tile
2008-08-09 02:02:32 +03:00
{
2008-10-17 19:30:56 +03:00
if ( std : : find ( shadedHexes . begin ( ) , shadedHexes . end ( ) , whichOne ) ! = shadedHexes . end ( ) ) // and it's in our range
giveCommand ( 2 , whichOne , activeStack ) ;
}
else if ( dest - > owner ! = attackingHeroInstance - > tempOwner
& & LOCPLINT - > cb - > battleCanShoot ( activeStack , whichOne )
& & BattleInfo : : mutualPosition ( LOCPLINT - > cb - > battleGetPos ( activeStack ) , whichOne ) < 0 ) //shooting
{
giveCommand ( 7 , whichOne , activeStack ) ;
}
else if ( dest - > owner ! = attackingHeroInstance - > tempOwner ) //attacking
{
//std::vector<int> n = BattleInfo::neighbouringTiles(whichOne);
//for(int i=0;i<n.size();i++)
//{
// //TODO: now we are using first available tile, but in the future we should add possibility of choosing from which tile we want to attack
// if(vstd::contains(shadedHexes,n[i]))
// {
// giveCommand(6,n[i],activeStack,whichOne);
// return;
// }
//}
switch ( CGI - > curh - > number )
{
case 12 :
giveCommand ( 6 , whichOne + ( ( whichOne / 17 ) % 2 ? 17 : 18 ) , activeStack , whichOne ) ;
break ;
case 7 :
giveCommand ( 6 , whichOne + ( ( whichOne / 17 ) % 2 ? 16 : 17 ) , activeStack , whichOne ) ;
break ;
case 8 :
giveCommand ( 6 , whichOne - 1 , activeStack , whichOne ) ;
break ;
case 9 :
giveCommand ( 6 , whichOne - ( ( whichOne / 17 ) % 2 ? 18 : 17 ) , activeStack , whichOne ) ;
break ;
case 10 :
giveCommand ( 6 , whichOne - ( ( whichOne / 17 ) % 2 ? 17 : 16 ) , activeStack , whichOne ) ;
break ;
case 11 :
giveCommand ( 6 , whichOne + 1 , activeStack , whichOne ) ;
break ;
}
2008-08-09 02:02:32 +03:00
}
2008-05-27 16:16:35 +03:00
}
2008-03-29 12:59:18 +02:00
}
2008-03-24 21:04:30 +02:00
}
2008-08-02 18:08:03 +03:00
void CBattleInterface : : stackIsShooting ( int ID , int dest )
{
if ( attackingInfo ! = NULL )
{
return ; //something went wrong
}
//projectile
float projectileAngle ; //in radians; if positive, projectiles goes up
float straightAngle = 0.2f ; //maximal angle in radians between straight horizontal line and shooting line for which shot is considered to be straight (absoulte value)
int fromHex = LOCPLINT - > cb - > battleGetPos ( ID ) ;
projectileAngle = atan2 ( float ( abs ( dest - fromHex ) / 17 ) , float ( abs ( dest - fromHex ) % 17 ) ) ;
if ( fromHex < dest )
projectileAngle = - projectileAngle ;
SProjectileInfo spi ;
spi . creID = LOCPLINT - > cb - > battleGetStackByID ( ID ) - > creature - > idNumber ;
spi . step = 0 ;
spi . frameNum = 0 ;
spi . spin = CGI - > creh - > idToProjectileSpin [ spi . creID ] ;
std : : pair < int , int > xycoord = CBattleHex : : getXYUnitAnim ( LOCPLINT - > cb - > battleGetPos ( ID ) , true , & LOCPLINT - > cb - > battleGetCreature ( ID ) ) ;
std : : pair < int , int > destcoord = CBattleHex : : getXYUnitAnim ( dest , false , & LOCPLINT - > cb - > battleGetCreature ( ID ) ) ;
destcoord . first + = 250 ; destcoord . second + = 210 ; //TODO: find a better place to shoot
if ( projectileAngle > straightAngle ) //upper shot
{
spi . x = xycoord . first + 200 + LOCPLINT - > cb - > battleGetCreature ( ID ) . upperRightMissleOffsetX ;
2008-09-22 15:22:10 +03:00
spi . y = xycoord . second + 100 - LOCPLINT - > cb - > battleGetCreature ( ID ) . upperRightMissleOffsetY ;
2008-08-02 18:08:03 +03:00
}
else if ( projectileAngle < - straightAngle ) //lower shot
{
spi . x = xycoord . first + 200 + LOCPLINT - > cb - > battleGetCreature ( ID ) . lowerRightMissleOffsetX ;
spi . y = xycoord . second + 150 - LOCPLINT - > cb - > battleGetCreature ( ID ) . lowerRightMissleOffsetY ;
}
else //straight shot
{
spi . x = xycoord . first + 200 + LOCPLINT - > cb - > battleGetCreature ( ID ) . rightMissleOffsetX ;
2008-09-22 15:22:10 +03:00
spi . y = xycoord . second + 125 - LOCPLINT - > cb - > battleGetCreature ( ID ) . rightMissleOffsetY ;
2008-08-02 18:08:03 +03:00
}
spi . lastStep = sqrt ( ( float ) ( ( destcoord . first - spi . x ) * ( destcoord . first - spi . x ) + ( destcoord . second - spi . y ) * ( destcoord . second - spi . y ) ) ) / 40 ;
2008-10-04 13:00:31 +03:00
if ( spi . lastStep = = 0 )
spi . lastStep = 1 ;
2008-08-02 18:08:03 +03:00
spi . dx = ( destcoord . first - spi . x ) / spi . lastStep ;
spi . dy = ( destcoord . second - spi . y ) / spi . lastStep ;
//set starting frame
if ( spi . spin )
{
spi . frameNum = 0 ;
}
else
{
spi . frameNum = ( ( M_PI / 2.0f - projectileAngle ) / ( 2.0f * M_PI ) + 1 / ( ( float ) ( 2 * ( idToProjectile [ spi . creID ] - > ourImages . size ( ) - 1 ) ) ) ) * ( idToProjectile [ spi . creID ] - > ourImages . size ( ) - 1 ) ;
}
//set delay
spi . animStartDelay = CGI - > creh - > creatures [ spi . creID ] . attackClimaxFrame ;
projectiles . push_back ( spi ) ;
//attack aniamtion
attackingInfo = new CAttHelper ;
attackingInfo - > dest = dest ;
attackingInfo - > frame = 0 ;
2008-09-22 15:22:10 +03:00
attackingInfo - > hitCount = 0 ;
2008-08-02 18:08:03 +03:00
attackingInfo - > ID = ID ;
attackingInfo - > reversing = false ;
attackingInfo - > shooting = true ;
if ( projectileAngle > straightAngle ) //upper shot
attackingInfo - > shootingGroup = 14 ;
else if ( projectileAngle < - straightAngle ) //lower shot
attackingInfo - > shootingGroup = 16 ;
2008-09-22 15:22:10 +03:00
else //straight shot
attackingInfo - > shootingGroup = 15 ;
2008-08-02 18:08:03 +03:00
attackingInfo - > maxframe = creAnims [ ID ] - > framesInGroup ( attackingInfo - > shootingGroup ) ;
}
2008-09-05 19:08:25 +03:00
void CBattleInterface : : battleFinished ( const BattleResult & br )
{
deactivate ( ) ;
2008-09-09 14:25:21 +03:00
CGI - > curh - > changeGraphic ( 0 , 0 ) ;
2008-09-29 13:16:02 +03:00
2008-09-07 15:13:51 +03:00
SDL_Rect temp_rect = genRect ( 561 , 470 , 165 , 19 ) ;
resWindow = new CBattleReslutWindow ( br , temp_rect , this ) ;
2008-09-05 19:08:25 +03:00
resWindow - > activate ( ) ;
}
2008-10-17 19:30:56 +03:00
void CBattleInterface : : castThisSpell ( int spellID )
{
BattleAction * ba = new BattleAction ;
ba - > actionType = 1 ;
ba - > additionalInfo = spellID ; //spell number
ba - > destinationTile = - 1 ;
ba - > side = defendingHeroInstance ? ( LOCPLINT - > playerID = = defendingHeroInstance - > tempOwner ) : false ;
spellToCast = ba ;
spellDestSelectMode = true ;
CGI - > curh - > changeGraphic ( 3 , 0 ) ;
}
2008-09-24 19:25:14 +03:00
void CBattleInterface : : setAnimSpeed ( int set )
2008-03-23 19:25:38 +02:00
{
2008-09-24 19:25:14 +03:00
animSpeed = set ;
2008-03-23 19:25:38 +02:00
}
2008-09-24 19:25:14 +03:00
int CBattleInterface : : getAnimSpeed ( ) const
{
return animSpeed ;
}
float CBattleInterface : : getAnimSpeedMultiplier ( ) const
{
switch ( animSpeed )
{
case 1 :
return 3.5f ;
case 2 :
return 2.2f ;
case 4 :
return 1.0f ;
2008-09-25 17:09:31 +03:00
default :
return 0.0f ;
2008-09-24 19:25:14 +03:00
}
}
2008-06-11 04:58:18 +03:00
void CBattleInterface : : attackingShowHelper ( )
{
if ( attackingInfo & & ! attackingInfo - > reversing )
{
if ( attackingInfo - > frame = = 0 )
{
2008-07-02 11:39:56 +03:00
CStack aStack = * LOCPLINT - > cb - > battleGetStackByID ( attackingInfo - > ID ) ; //attacking stack
2008-08-02 18:08:03 +03:00
if ( attackingInfo - > shooting )
2008-06-11 04:58:18 +03:00
{
2008-08-02 18:08:03 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( attackingInfo - > shootingGroup ) ;
2008-06-11 04:58:18 +03:00
}
2008-08-02 18:08:03 +03:00
else
2008-06-11 04:58:18 +03:00
{
2008-08-02 18:08:03 +03:00
if ( aStack . creature - > isDoubleWide ( ) )
2008-06-11 04:58:18 +03:00
{
2008-08-06 20:49:47 +03:00
switch ( BattleInfo : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
2008-08-02 18:08:03 +03:00
{
case 0 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 1 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 2 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 3 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 13 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 4 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 13 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 5 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
2008-08-02 18:08:03 +03:00
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
2008-08-06 20:49:47 +03:00
switch ( BattleInfo : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
2008-08-02 18:08:03 +03:00
{
case 0 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 1 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 11 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 2 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 3 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 13 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 4 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 13 ) ;
2008-08-02 18:08:03 +03:00
break ;
case 5 :
2008-09-22 15:22:10 +03:00
creAnims [ attackingInfo - > ID ] - > setType ( 12 ) ;
2008-08-02 18:08:03 +03:00
break ;
}
2008-06-11 04:58:18 +03:00
}
}
}
else if ( attackingInfo - > frame = = ( attackingInfo - > maxframe - 1 ) )
{
attackingInfo - > reversing = true ;
2008-09-12 16:06:53 +03:00
CStack * aStackp = LOCPLINT - > cb - > battleGetStackByID ( attackingInfo - > ID ) ; //attacking stack
if ( aStackp = = NULL )
return ;
CStack aStack = * aStackp ;
if ( aStack . attackerOwned )
2008-06-11 04:58:18 +03:00
{
2008-09-12 16:06:53 +03:00
if ( aStack . creature - > isDoubleWide ( ) )
2008-06-11 04:58:18 +03:00
{
2008-09-12 16:06:53 +03:00
switch ( BattleInfo : : 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 ( BattleInfo : : 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 ;
}
2008-06-11 04:58:18 +03:00
}
}
2008-09-12 16:06:53 +03:00
else //if(aStack.attackerOwned)
2008-06-11 04:58:18 +03:00
{
2008-09-12 16:06:53 +03:00
if ( aStack . creature - > isDoubleWide ( ) )
2008-06-11 04:58:18 +03:00
{
2008-09-12 16:06:53 +03:00
switch ( BattleInfo : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
{
case 0 :
//reverseCreature(ID, aStack.position, true);
break ;
case 1 :
break ;
case 2 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
case 3 :
break ;
case 4 :
//reverseCreature(ID, aStack.position, true);
break ;
case 5 :
//reverseCreature(ID, aStack.position, true);
break ;
}
}
else //else for if(aStack.creature->isDoubleWide())
{
switch ( BattleInfo : : mutualPosition ( aStack . position , attackingInfo - > dest ) ) //attack direction
{
case 0 :
//reverseCreature(ID, aStack.position, true);
break ;
case 1 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
case 2 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
case 3 :
reverseCreature ( attackingInfo - > ID , aStack . position , true ) ;
break ;
case 4 :
//reverseCreature(ID, aStack.position, true);
break ;
case 5 :
//reverseCreature(ID, aStack.position, true);
break ;
}
2008-06-11 04:58:18 +03:00
}
}
attackingInfo - > reversing = false ;
creAnims [ attackingInfo - > ID ] - > setType ( 2 ) ;
delete attackingInfo ;
attackingInfo = NULL ;
}
if ( attackingInfo )
{
2008-09-22 15:22:10 +03:00
attackingInfo - > hitCount + + ;
2008-09-23 18:40:30 +03:00
if ( attackingInfo - > hitCount % ( 4 / animSpeed ) = = 0 )
2008-09-22 15:22:10 +03:00
attackingInfo - > frame + + ;
2008-06-11 04:58:18 +03:00
}
}
}
2008-09-24 19:25:14 +03:00
void CBattleInterface : : redrawBackgroundWithHexes ( int activeStack )
{
shadedHexes = LOCPLINT - > cb - > battleGetAvailableHexes ( activeStack ) ;
//preparating background graphic with hexes and shaded hexes
blitAt ( background , 0 , 0 , backgroundWithHexes ) ;
if ( printCellBorders )
CSDL_Ext : : blit8bppAlphaTo24bpp ( cellBorders , NULL , backgroundWithHexes , NULL ) ;
if ( printStackRange )
{
for ( int m = 0 ; m < shadedHexes . size ( ) ; + + m ) //rows
{
int i = shadedHexes [ m ] / 17 ; //row
int j = shadedHexes [ m ] % 17 - 1 ; //column
int x = 58 + ( i % 2 = = 0 ? 22 : 0 ) + 44 * j ;
int y = 86 + 42 * i ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( cellShade , NULL , backgroundWithHexes , & genRect ( cellShade - > h , cellShade - > w , x , y ) ) ;
}
}
}
2008-06-11 04:58:18 +03:00
void CBattleInterface : : printConsoleAttacked ( int ID , int dmg , int killed , int IDby )
{
char tabh [ 200 ] ;
2008-07-02 11:39:56 +03:00
CStack attacker = * LOCPLINT - > cb - > battleGetStackByID ( IDby ) ;
CStack defender = * LOCPLINT - > cb - > battleGetStackByID ( ID ) ;
2008-06-11 04:58:18 +03:00
int end = sprintf ( tabh , CGI - > generaltexth - > allTexts [ attacker . amount > 1 ? 377 : 376 ] . c_str ( ) ,
( attacker . amount > 1 ? attacker . creature - > namePl . c_str ( ) : attacker . creature - > nameSing . c_str ( ) ) ,
dmg ) ;
if ( killed > 0 )
{
if ( killed > 1 )
{
sprintf ( tabh + end , CGI - > generaltexth - > allTexts [ 379 ] . c_str ( ) , killed , defender . creature - > namePl . c_str ( ) ) ;
}
else //killed == 1
{
sprintf ( tabh + end , CGI - > generaltexth - > allTexts [ 378 ] . c_str ( ) , defender . creature - > nameSing . c_str ( ) ) ;
}
}
console - > addText ( std : : string ( tabh ) ) ;
}
2008-08-02 18:08:03 +03:00
void CBattleInterface : : projectileShowHelper ( SDL_Surface * to )
{
if ( to = = NULL )
to = screen ;
std : : list < std : : list < SProjectileInfo > : : iterator > toBeDeleted ;
for ( std : : list < SProjectileInfo > : : iterator it = projectiles . begin ( ) ; it ! = projectiles . end ( ) ; + + it )
{
if ( it - > animStartDelay > 0 )
{
- - ( it - > animStartDelay ) ;
continue ;
}
SDL_Rect dst ;
dst . h = idToProjectile [ it - > creID ] - > ourImages [ it - > frameNum ] . bitmap - > h ;
dst . w = idToProjectile [ it - > creID ] - > ourImages [ it - > frameNum ] . bitmap - > w ;
dst . x = it - > x ;
dst . y = it - > y ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( idToProjectile [ it - > creID ] - > ourImages [ it - > frameNum ] . bitmap , NULL , to , & dst ) ;
//actualizing projectile
+ + it - > step ;
if ( it - > step = = it - > lastStep )
{
toBeDeleted . insert ( toBeDeleted . end ( ) , it ) ;
}
else
{
it - > x + = it - > dx ;
it - > y + = it - > dy ;
if ( it - > spin )
{
+ + ( it - > frameNum ) ;
it - > frameNum % = idToProjectile [ it - > creID ] - > ourImages . size ( ) ;
}
}
}
for ( std : : list < std : : list < SProjectileInfo > : : iterator > : : iterator it = toBeDeleted . begin ( ) ; it ! = toBeDeleted . end ( ) ; + + it )
{
projectiles . erase ( * it ) ;
}
}
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 ) ) ;
}
2008-09-24 19:25:14 +03:00
+ + flagAnimCount ;
if ( flagAnimCount % 4 = = 0 )
2008-04-14 21:24:46 +03:00
{
+ + 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
}
2008-09-16 18:23:44 +03:00
void CBattleHero : : activate ( )
{
ClickableL : : activate ( ) ;
}
void CBattleHero : : deactivate ( )
{
ClickableL : : deactivate ( ) ;
}
void CBattleHero : : clickLeft ( boost : : logic : : tribool down )
{
if ( ! down & & myHero )
{
2008-10-17 19:30:56 +03:00
for ( int it = 0 ; it < 187 ; + + it ) //do nothing when any hex is hovered - hero's animation overlaps battlefield
{
if ( myOwner - > bfield [ it ] . hovered & & myOwner - > bfield [ it ] . strictHovered )
return ;
}
2008-09-16 18:23:44 +03:00
CGI - > curh - > changeGraphic ( 0 , 0 ) ;
LOCPLINT - > curint - > deactivate ( ) ;
CSpellWindow * spellWindow = new CSpellWindow ( genRect ( 595 , 620 , 90 , 2 ) , myHero ) ;
spellWindow - > activate ( ) ;
LOCPLINT - > objsToBlit . push_back ( spellWindow ) ;
}
}
2008-10-17 19:30:56 +03:00
CBattleHero : : CBattleHero ( const std : : string & defName , int phaseG , int imageG , bool flipG , unsigned char player , const CGHeroInstance * hero , const CBattleInterface * owner ) : phase ( phaseG ) , image ( imageG ) , flip ( flipG ) , flagAnim ( 0 ) , myHero ( hero ) , myOwner ( owner )
2008-03-04 19:25:58 +02:00
{
2008-06-12 09:45:51 +03:00
dh = CDefHandler : : giveDef ( defName ) ;
2008-03-04 19:25:58 +02:00
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 ) ;
2008-08-02 18:08:03 +03:00
SDL_FreeSurface ( dh - > ourImages [ i ] . bitmap ) ;
2008-04-20 18:56:03 +03:00
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 )
2008-06-12 09:45:51 +03:00
flag = CDefHandler : : giveDef ( " CMFLAGR.DEF " ) ;
2008-03-04 19:25:58 +02:00
else
2008-06-12 09:45:51 +03:00
flag = CDefHandler : : giveDef ( " CMFLAGL.DEF " ) ;
2008-03-04 19:25:58 +02:00
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 ) ;
2008-06-30 03:06:41 +03:00
graphics - > blueToPlayersAdv ( flag - > ourImages [ i ] . bitmap , player ) ;
2008-03-04 19:25:58 +02:00
}
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-09-24 19:25:14 +03:00
std : : pair < int , int > CBattleHex : : getXYUnitAnim ( const int & hexNum , const bool & attacker , const 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 ;
}
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-06-11 04:58:18 +03:00
if ( ! on & & setAlterText )
{
myInterface - > console - > alterTxt = std : : string ( ) ;
setAlterText = false ;
}
2008-03-10 22:19:41 +02:00
}
2008-06-11 04:58:18 +03:00
CBattleHex : : CBattleHex ( ) : myNumber ( - 1 ) , accesible ( true ) , hovered ( false ) , strictHovered ( false ) , myInterface ( NULL ) , setAlterText ( false )
2008-03-10 22:19:41 +02:00
{
}
2008-03-15 19:48:05 +02:00
2008-09-25 17:09:31 +03:00
void CBattleHex : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
2008-03-15 19:48:05 +02:00
{
2008-09-05 19:08:25 +03:00
if ( myInterface - > cellShade )
2008-03-15 19:48:05 +02:00
{
2008-09-05 19:08:25 +03:00
if ( CSDL_Ext : : SDL_GetPixel ( myInterface - > cellShade , sEvent . x - pos . x , sEvent . y - pos . y ) = = 0 ) //hovered pixel is outside hex
2008-03-15 19:48:05 +02:00
{
strictHovered = false ;
}
else //hovered pixel is inside hex
{
strictHovered = true ;
}
}
2008-06-11 04:58:18 +03:00
if ( hovered & & strictHovered ) //print attacked creature to console
{
if ( myInterface - > console - > alterTxt . size ( ) = = 0 & & LOCPLINT - > cb - > battleGetStack ( myNumber ) ! = - 1 & &
2008-07-02 11:39:56 +03:00
LOCPLINT - > cb - > battleGetStackByPos ( myNumber ) - > owner ! = LOCPLINT - > playerID & &
2008-09-12 11:51:46 +03:00
LOCPLINT - > cb - > battleGetStackByPos ( myNumber ) - > alive ( ) )
2008-06-11 04:58:18 +03:00
{
char tabh [ 160 ] ;
2008-07-02 11:39:56 +03:00
CStack attackedStack = * LOCPLINT - > cb - > battleGetStackByPos ( myNumber ) ;
2008-09-25 17:09:31 +03:00
const std : : string & attackedName = attackedStack . amount = = 1 ? attackedStack . creature - > nameSing : attackedStack . creature - > namePl ;
2008-06-11 04:58:18 +03:00
sprintf ( tabh , CGI - > generaltexth - > allTexts [ 220 ] . c_str ( ) , attackedName . c_str ( ) ) ;
myInterface - > console - > alterTxt = std : : string ( tabh ) ;
setAlterText = true ;
}
}
else if ( setAlterText )
{
myInterface - > console - > alterTxt = std : : string ( ) ;
setAlterText = false ;
}
2008-03-15 19:48:05 +02:00
}
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 )
{
2008-07-02 11:39:56 +03:00
CStack myst = * LOCPLINT - > cb - > battleGetStackByID ( stID ) ; //stack info
2008-09-12 11:51:46 +03:00
if ( ! myst . alive ( ) ) return ;
2008-05-27 16:16:35 +03:00
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-08-09 02:02:32 +03:00
pom - > currentHealth = myst . firstHPleft ;
2008-06-04 16:00:56 +03:00
}
2008-08-16 11:47:41 +03:00
( new CCreInfoWindow ( myst . creature - > idNumber , 0 , myst . amount , pom , boost : : function < void ( ) > ( ) , boost : : function < void ( ) > ( ) , NULL ) )
2008-05-27 16:16:35 +03:00
- > activate ( ) ;
}
delete pom ;
}
}
2008-06-11 04:58:18 +03:00
CBattleConsole : : CBattleConsole ( ) : lastShown ( - 1 ) , alterTxt ( " " )
2008-04-16 20:21:02 +03:00
{
}
CBattleConsole : : ~ CBattleConsole ( )
{
texts . clear ( ) ;
}
void CBattleConsole : : show ( SDL_Surface * to )
{
2008-06-11 04:58:18 +03:00
if ( alterTxt . size ( ) )
{
CSDL_Ext : : printAtMiddleWB ( alterTxt , pos . x + pos . w / 2 , pos . y + 10 , GEOR13 , 80 , zwykly , to ) ;
}
else if ( texts . size ( ) )
2008-04-16 20:21:02 +03:00
{
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 ) ;
}
}
}
2008-09-25 17:09:31 +03:00
bool CBattleConsole : : addText ( const std : : string & text )
2008-04-16 20:21:02 +03:00
{
if ( text . size ( ) > 70 )
return false ; //text too long!
2008-06-11 04:58:18 +03:00
int firstInToken = 0 ;
for ( int i = 0 ; i < text . size ( ) ; + + i ) //tokenize
{
if ( text [ i ] = = 10 )
{
texts . push_back ( text . substr ( firstInToken , i - firstInToken ) ) ;
firstInToken = i + 1 ;
}
}
texts . push_back ( text . substr ( firstInToken , text . size ( ) ) ) ;
2008-06-21 16:27:52 +03:00
lastShown = texts . size ( ) - 1 ;
2008-04-16 20:21:02 +03:00
return true ;
}
void CBattleConsole : : eraseText ( unsigned int pos )
{
if ( pos < texts . size ( ) )
{
texts . erase ( texts . begin ( ) + pos ) ;
if ( lastShown = = texts . size ( ) )
- - lastShown ;
}
}
2008-09-25 17:09:31 +03:00
void CBattleConsole : : changeTextAt ( const std : : string & text , unsigned int pos )
2008-04-16 20:21:02 +03:00
{
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 ;
}
2008-09-05 19:08:25 +03:00
2008-09-24 19:25:14 +03:00
CBattleReslutWindow : : CBattleReslutWindow ( const BattleResult & br , const SDL_Rect & pos , const CBattleInterface * owner )
2008-09-05 19:08:25 +03:00
{
this - > pos = pos ;
background = BitmapHandler : : loadBitmap ( " CPRESULT.BMP " , true ) ;
graphics - > blueToPlayersAdv ( background , LOCPLINT - > playerID ) ;
SDL_Surface * pom = SDL_ConvertSurface ( background , screen - > format , screen - > flags ) ;
SDL_FreeSurface ( background ) ;
background = pom ;
exit = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CBattleReslutWindow : : bExitf , this ) , 549 , 524 , " iok6432.def " , false , NULL , false ) ;
if ( br . winner = = 0 ) //attacker won
{
2008-09-07 18:39:19 +03:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 410 ] , 60 , 122 , GEOR13 , zwykly , background ) ;
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 411 ] , 410 , 122 , GEOR13 , zwykly , background ) ;
2008-09-05 19:08:25 +03:00
}
else //if(br.winner==1)
{
2008-09-07 18:39:19 +03:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 411 ] , 60 , 122 , GEOR13 , zwykly , background ) ;
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 410 ] , 410 , 122 , GEOR13 , zwykly , background ) ;
2008-09-05 19:08:25 +03:00
}
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 407 ] , 235 , 299 , GEOR16 , tytulowy , background ) ;
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 408 ] , 235 , 329 , GEOR16 , zwykly , background ) ;
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 409 ] , 235 , 426 , GEOR16 , zwykly , background ) ;
std : : string attackerName , defenderName ;
if ( owner - > attackingHeroInstance ) //a hero attacked
{
SDL_BlitSurface ( graphics - > portraitLarge [ owner - > attackingHeroInstance - > portrait ] , NULL , background , & genRect ( 64 , 58 , 21 , 38 ) ) ;
//setting attackerName
attackerName = owner - > attackingHeroInstance - > name ;
}
else //a monster attacked
{
int bestMonsterID = - 1 ;
int bestPower = 0 ;
for ( std : : map < si32 , std : : pair < ui32 , si32 > > : : const_iterator it = owner - > army1 - > slots . begin ( ) ; it ! = owner - > army1 - > slots . end ( ) ; + + it )
{
if ( CGI - > creh - > creatures [ it - > first ] . AIValue > bestPower )
{
bestPower = CGI - > creh - > creatures [ it - > first ] . AIValue ;
bestMonsterID = it - > first ;
}
}
SDL_BlitSurface ( graphics - > bigImgs [ bestMonsterID ] , NULL , background , & genRect ( 64 , 58 , 21 , 38 ) ) ;
//setting attackerName
attackerName = CGI - > creh - > creatures [ bestMonsterID ] . namePl ;
}
if ( owner - > defendingHeroInstance ) //a hero defended
{
SDL_BlitSurface ( graphics - > portraitLarge [ owner - > defendingHeroInstance - > portrait ] , NULL , background , & genRect ( 64 , 58 , 391 , 38 ) ) ;
//setting defenderName
defenderName = owner - > defendingHeroInstance - > name ;
}
else //a monster defended
{
int bestMonsterID = - 1 ;
int bestPower = 0 ;
for ( std : : map < si32 , std : : pair < ui32 , si32 > > : : const_iterator it = owner - > army2 - > slots . begin ( ) ; it ! = owner - > army2 - > slots . end ( ) ; + + it )
{
2008-09-09 10:05:02 +03:00
if ( CGI - > creh - > creatures [ it - > second . first ] . AIValue > bestPower )
2008-09-05 19:08:25 +03:00
{
2008-09-09 10:05:02 +03:00
bestPower = CGI - > creh - > creatures [ it - > second . first ] . AIValue ;
bestMonsterID = it - > second . first ;
2008-09-05 19:08:25 +03:00
}
}
SDL_BlitSurface ( graphics - > bigImgs [ bestMonsterID ] , NULL , background , & genRect ( 64 , 58 , 391 , 38 ) ) ;
//setting defenderName
defenderName = CGI - > creh - > creatures [ bestMonsterID ] . namePl ;
}
//printing attacker and defender's names
CSDL_Ext : : printAtMiddle ( attackerName , 156 , 44 , GEOR16 , zwykly , background ) ;
CSDL_Ext : : printAtMiddle ( defenderName , 314 , 44 , GEOR16 , zwykly , background ) ;
2008-09-07 18:39:19 +03:00
//printing casualities
2008-09-08 14:32:16 +03:00
for ( int step = 0 ; step < 2 ; + + step )
2008-09-07 18:39:19 +03:00
{
2008-09-08 14:32:16 +03:00
if ( br . casualties [ step ] . size ( ) = = 0 )
2008-09-07 18:39:19 +03:00
{
2008-09-08 14:32:16 +03:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 523 ] , 235 , 360 + 97 * step , GEOR16 , zwykly , background ) ;
}
else
{
int xPos = 235 - ( br . casualties [ step ] . size ( ) * 32 + ( br . casualties [ step ] . size ( ) - 1 ) * 10 ) / 2 ; //increment by 42 with each picture
int yPos = 344 + step * 97 ;
for ( std : : set < std : : pair < ui32 , si32 > > : : const_iterator it = br . casualties [ step ] . begin ( ) ; it ! = br . casualties [ step ] . end ( ) ; + + it )
{
blitAt ( graphics - > smallImgs [ it - > first ] , xPos , yPos , background ) ;
std : : stringstream amount ;
amount < < it - > second ;
CSDL_Ext : : printAtMiddle ( amount . str ( ) , xPos + 16 , yPos + 42 , GEOR13 , zwykly , background ) ;
xPos + = 42 ;
}
2008-09-07 18:39:19 +03:00
}
}
2008-09-08 14:32:16 +03:00
//printing result description
bool weAreAttacker = ( LOCPLINT - > playerID = = owner - > attackingHeroInstance - > tempOwner ) ;
switch ( br . result )
2008-09-07 18:39:19 +03:00
{
2008-09-08 14:32:16 +03:00
case 0 : //normal victory
if ( ( br . winner = = 0 & & weAreAttacker ) | | ( br . winner = = 1 & & ! weAreAttacker ) ) //we've won
2008-09-07 18:39:19 +03:00
{
2008-09-08 14:32:16 +03:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 304 ] , 235 , 235 , GEOR13 , zwykly , background ) ;
2008-09-07 18:39:19 +03:00
}
2008-09-08 14:32:16 +03:00
else
{
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 311 ] , 235 , 235 , GEOR13 , zwykly , background ) ;
}
break ;
case 1 : //flee
if ( ( br . winner = = 0 & & weAreAttacker ) | | ( br . winner = = 1 & & ! weAreAttacker ) ) //we've won
{
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 303 ] , 235 , 235 , GEOR13 , zwykly , background ) ;
}
else
{
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 310 ] , 235 , 235 , GEOR13 , zwykly , background ) ;
}
break ;
case 2 : //surrender
if ( ( br . winner = = 0 & & weAreAttacker ) | | ( br . winner = = 1 & & ! weAreAttacker ) ) //we've won
{
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 302 ] , 235 , 235 , GEOR13 , zwykly , background ) ;
}
else
{
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 309 ] , 235 , 235 , GEOR13 , zwykly , background ) ;
}
break ;
2008-09-07 18:39:19 +03:00
}
2008-09-05 19:08:25 +03:00
}
CBattleReslutWindow : : ~ CBattleReslutWindow ( )
{
SDL_FreeSurface ( background ) ;
}
void CBattleReslutWindow : : activate ( )
{
2008-09-29 13:16:02 +03:00
LOCPLINT - > showingDialog - > set ( true ) ;
2008-09-05 19:08:25 +03:00
exit - > activate ( ) ;
}
void CBattleReslutWindow : : deactivate ( )
{
exit - > deactivate ( ) ;
}
void CBattleReslutWindow : : show ( SDL_Surface * to )
{
//evaluating to
if ( ! to )
to = screen ;
SDL_BlitSurface ( background , NULL , to , & pos ) ;
exit - > show ( to ) ;
}
void CBattleReslutWindow : : bExitf ( )
{
LOCPLINT - > battleResultQuited ( ) ;
}
2008-09-23 18:40:30 +03:00
2008-09-24 19:25:14 +03:00
CBattleOptionsWindow : : CBattleOptionsWindow ( const SDL_Rect & position , CBattleInterface * owner ) : myInt ( owner )
2008-09-23 18:40:30 +03:00
{
pos = position ;
background = BitmapHandler : : loadBitmap ( " comopbck.bmp " , true ) ;
graphics - > blueToPlayersAdv ( background , LOCPLINT - > playerID ) ;
2008-09-24 19:25:14 +03:00
viewGrid = new CHighlightableButton ( boost : : bind ( & CBattleInterface : : setPrintCellBorders , owner , true ) , boost : : bind ( & CBattleInterface : : setPrintCellBorders , owner , false ) , boost : : assign : : map_list_of ( 0 , CGI - > preth - > zelp [ 427 ] . first ) ( 3 , CGI - > preth - > zelp [ 427 ] . first ) , CGI - > preth - > zelp [ 427 ] . second , false , " sysopchk.def " , NULL , 185 , 140 , false ) ;
viewGrid - > select ( owner - > printCellBorders ) ;
movementShadow = new CHighlightableButton ( boost : : bind ( & CBattleInterface : : setPrintStackRange , owner , true ) , boost : : bind ( & CBattleInterface : : setPrintStackRange , owner , false ) , boost : : assign : : map_list_of ( 0 , CGI - > preth - > zelp [ 428 ] . first ) ( 3 , CGI - > preth - > zelp [ 428 ] . first ) , CGI - > preth - > zelp [ 428 ] . second , false , " sysopchk.def " , NULL , 185 , 173 , false ) ;
movementShadow - > select ( owner - > printStackRange ) ;
mouseShadow = new CHighlightableButton ( boost : : bind ( & CBattleInterface : : setPrintMouseShadow , owner , true ) , boost : : bind ( & CBattleInterface : : setPrintMouseShadow , owner , false ) , boost : : assign : : map_list_of ( 0 , CGI - > preth - > zelp [ 429 ] . first ) ( 3 , CGI - > preth - > zelp [ 429 ] . first ) , CGI - > preth - > zelp [ 429 ] . second , false , " sysopchk.def " , NULL , 185 , 207 , false ) ;
mouseShadow - > select ( owner - > printMouseShadow ) ;
animSpeeds = new CHighlightableButtonsGroup ( 0 ) ;
animSpeeds - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > preth - > zelp [ 422 ] . first ) , CGI - > preth - > zelp [ 422 ] . second , " sysopb9.def " , 188 , 309 , 1 ) ;
animSpeeds - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > preth - > zelp [ 423 ] . first ) , CGI - > preth - > zelp [ 423 ] . second , " sysob10.def " , 252 , 309 , 2 ) ;
animSpeeds - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > preth - > zelp [ 424 ] . first ) , CGI - > preth - > zelp [ 424 ] . second , " sysob11.def " , 315 , 309 , 4 ) ;
animSpeeds - > select ( owner - > getAnimSpeed ( ) , 1 ) ;
animSpeeds - > onChange = boost : : bind ( & CBattleInterface : : setAnimSpeed , owner , _1 ) ;
setToDefault = new AdventureMapButton ( CGI - > preth - > zelp [ 392 ] . first , CGI - > preth - > zelp [ 392 ] . second , boost : : bind ( & CBattleOptionsWindow : : bDefaultf , this ) , 405 , 443 , " codefaul.def " , false , NULL , false ) ;
2008-09-23 18:40:30 +03:00
std : : swap ( setToDefault - > imgs [ 0 ] [ 0 ] , setToDefault - > imgs [ 0 ] [ 1 ] ) ;
2008-09-24 19:25:14 +03:00
exit = new AdventureMapButton ( CGI - > preth - > zelp [ 393 ] . first , CGI - > preth - > zelp [ 393 ] . second , boost : : bind ( & CBattleOptionsWindow : : bExitf , this ) , 516 , 443 , " soretrn.def " , false , NULL , false ) ;
2008-09-23 18:40:30 +03:00
std : : swap ( exit - > imgs [ 0 ] [ 0 ] , exit - > imgs [ 0 ] [ 1 ] ) ;
//printing texts to background
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 392 ] , 240 , 32 , GEOR16 , tytulowy , background ) ; //window title
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 393 ] , 122 , 211 , GEOR16 , tytulowy , background ) ; //animation speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 394 ] , 122 , 292 , GEOR16 , tytulowy , background ) ; //music volume
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 395 ] , 122 , 358 , GEOR16 , tytulowy , background ) ; //effects' volume
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 396 ] , 353 , 64 , GEOR16 , tytulowy , background ) ; //auto - combat options
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 397 ] , 353 , 264 , GEOR16 , tytulowy , background ) ; //creature info
//auto - combat options
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 398 ] , 283 , 87 , GEOR16 , zwykly , background ) ; //creatures
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 399 ] , 283 , 117 , GEOR16 , zwykly , background ) ; //spells
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 400 ] , 283 , 147 , GEOR16 , zwykly , background ) ; //catapult
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 151 ] , 283 , 177 , GEOR16 , zwykly , background ) ; //ballista
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 401 ] , 283 , 207 , GEOR16 , zwykly , background ) ; //first aid tent
//creature info
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 402 ] , 283 , 286 , GEOR16 , zwykly , background ) ; //all stats
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 403 ] , 283 , 316 , GEOR16 , zwykly , background ) ; //spells only
//general options
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 404 ] , 61 , 58 , GEOR16 , zwykly , background ) ; //hex grid
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 405 ] , 61 , 91 , GEOR16 , zwykly , background ) ; //movement shadow
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 406 ] , 61 , 124 , GEOR16 , zwykly , background ) ; //cursor shadow
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 577 ] , 61 , 157 , GEOR16 , zwykly , background ) ; //spellbook animation
//texts printed
}
CBattleOptionsWindow : : ~ CBattleOptionsWindow ( )
{
SDL_FreeSurface ( background ) ;
delete setToDefault ;
delete exit ;
2008-09-24 19:25:14 +03:00
delete viewGrid ;
delete movementShadow ;
delete animSpeeds ;
delete mouseShadow ;
2008-09-23 18:40:30 +03:00
}
void CBattleOptionsWindow : : activate ( )
{
setToDefault - > activate ( ) ;
exit - > activate ( ) ;
2008-09-24 19:25:14 +03:00
viewGrid - > activate ( ) ;
movementShadow - > activate ( ) ;
animSpeeds - > activate ( ) ;
mouseShadow - > activate ( ) ;
2008-09-23 18:40:30 +03:00
}
void CBattleOptionsWindow : : deactivate ( )
{
setToDefault - > deactivate ( ) ;
exit - > deactivate ( ) ;
2008-09-24 19:25:14 +03:00
viewGrid - > deactivate ( ) ;
movementShadow - > deactivate ( ) ;
animSpeeds - > deactivate ( ) ;
mouseShadow - > deactivate ( ) ;
2008-09-23 18:40:30 +03:00
}
void CBattleOptionsWindow : : show ( SDL_Surface * to )
{
if ( ! to ) //"evaluating" to
to = screen ;
SDL_BlitSurface ( background , NULL , to , & pos ) ;
setToDefault - > show ( to ) ;
exit - > show ( to ) ;
2008-09-24 19:25:14 +03:00
viewGrid - > show ( to ) ;
movementShadow - > show ( to ) ;
animSpeeds - > show ( to ) ;
mouseShadow - > show ( to ) ;
2008-09-23 18:40:30 +03:00
}
void CBattleOptionsWindow : : bDefaultf ( )
{
}
void CBattleOptionsWindow : : bExitf ( )
{
deactivate ( ) ;
for ( int g = 0 ; g < LOCPLINT - > objsToBlit . size ( ) ; + + g )
{
if ( dynamic_cast < CBattleOptionsWindow * > ( LOCPLINT - > objsToBlit [ g ] ) )
{
LOCPLINT - > objsToBlit . erase ( LOCPLINT - > objsToBlit . begin ( ) + g ) ;
break ;
}
}
delete this ;
LOCPLINT - > curint - > activate ( ) ;
}