2007-11-19 00:58:28 +02:00
# include "stdafx.h"
2008-07-27 20:07:37 +03:00
# include <queue>
2007-11-19 00:58:28 +02:00
# include "CPlayerInterface.h"
2008-03-16 02:09:43 +02:00
# include "CAdvmapInterface.h"
2007-11-19 00:58:28 +02:00
# include "CMessage.h"
# include "mapHandler.h"
# include "SDL_Extensions.h"
# include "SDL_framerate.h"
# include "CCursorHandler.h"
# include "CCallback.h"
# include "SDL_Extensions.h"
# include "hch/CLodHandler.h"
# include "CPathfinder.h"
# include <sstream>
2008-06-08 03:58:29 +03:00
# include "hch/CAbilityHandler.h"
2007-11-19 00:58:28 +02:00
# include "hch/CHeroHandler.h"
2008-01-29 15:00:45 +02:00
# include "hch/CTownHandler.h"
2007-11-19 00:58:28 +02:00
# include "SDL_framerate.h"
2007-11-24 00:33:55 +02:00
# include "hch/CGeneralTextHandler.h"
2008-01-09 19:21:31 +02:00
# include "CCastleInterface.h"
2008-01-19 15:19:58 +02:00
# include "CHeroWindow.h"
2008-01-20 18:24:03 +02:00
# include "timeHandler.h"
2008-07-27 20:07:37 +03:00
# include <boost/thread.hpp>
2008-01-29 15:00:45 +02:00
# include <boost/algorithm/string.hpp>
# include <boost/algorithm/string/replace.hpp>
2008-07-01 11:01:02 +03:00
# include "hch/CPreGameTextHandler.h"
2008-07-02 11:39:56 +03:00
# include "hch/CObjectHandler.h"
2008-02-25 01:06:27 +02:00
# include "CBattleInterface.h"
2008-07-02 11:39:56 +03:00
# include "CGameInfo.h"
2008-05-18 20:33:39 +03:00
# include "CLua.h"
2008-05-23 22:50:11 +03:00
# include <cmath>
2008-06-07 20:16:52 +03:00
# include "client/CCreatureAnimation.h"
2008-06-13 11:16:51 +03:00
# include "client/Graphics.h"
2008-07-02 11:39:56 +03:00
# include "map.h"
2008-07-31 00:27:15 +03:00
# include "lib/NetPacks.h"
2008-08-04 18:56:36 +03:00
# include "lib/CondSh.h"
2007-11-19 00:58:28 +02:00
using namespace CSDL_Ext ;
2008-01-30 16:19:35 +02:00
extern TTF_Font * GEOR16 ;
2008-06-21 16:27:52 +03:00
extern bool continueReadingConsole ;
2008-07-27 20:07:37 +03:00
CPlayerInterface * LOCPLINT ;
extern std : : queue < SDL_Event > events ;
extern boost : : mutex eventsM ;
2008-01-30 16:19:35 +02:00
2008-07-31 00:27:15 +03:00
2007-11-19 00:58:28 +02:00
class OCM_HLP_CGIN
{
public :
2008-07-29 12:53:27 +03:00
bool operator ( ) ( const std : : pair < const CGObjectInstance * , SDL_Rect > & a , const std : : pair < const CGObjectInstance * , SDL_Rect > & b ) const
2007-11-19 00:58:28 +02:00
{
return ( * a . first ) < ( * b . first ) ;
}
} ocmptwo_cgin ;
2008-01-26 21:36:31 +02:00
void CGarrisonSlot : : hover ( bool on )
{
2008-01-29 15:00:45 +02:00
Hoverable : : hover ( on ) ;
2008-01-28 22:58:19 +02:00
if ( on )
{
2008-01-29 15:00:45 +02:00
std : : string temp ;
2008-01-28 22:58:19 +02:00
if ( creature )
{
2008-01-29 15:00:45 +02:00
if ( owner - > highlighted )
{
if ( owner - > highlighted = = this )
{
temp = CGI - > townh - > tcommands [ 4 ] ;
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
else if ( owner - > highlighted - > creature = = creature )
{
temp = CGI - > townh - > tcommands [ 2 ] ;
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
2008-04-13 14:05:39 +03:00
else if ( owner - > highlighted - > creature )
2008-01-29 15:00:45 +02:00
{
temp = CGI - > townh - > tcommands [ 7 ] ;
boost : : algorithm : : replace_first ( temp , " %s " , owner - > highlighted - > creature - > nameSing ) ;
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
2008-04-13 14:05:39 +03:00
else
{
std : : cout < < " Warning - shouldn't be - highlighted void slot " < < owner - > highlighted < < std : : endl ;
std : : cout < < " Highlighted set to NULL " < < std : : endl ;
owner - > highlighted = NULL ;
}
2008-01-29 15:00:45 +02:00
}
else
{
if ( upg )
{
temp = CGI - > townh - > tcommands [ 32 ] ;
}
else
{
temp = CGI - > townh - > tcommands [ 12 ] ;
}
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
} ;
2008-01-28 22:58:19 +02:00
}
2008-01-29 15:00:45 +02:00
else
{
if ( owner - > highlighted )
{
temp = CGI - > townh - > tcommands [ 6 ] ;
boost : : algorithm : : replace_first ( temp , " %s " , owner - > highlighted - > creature - > nameSing ) ;
}
else
{
temp = CGI - > townh - > tcommands [ 11 ] ;
}
}
LOCPLINT - > statusbar - > print ( temp ) ;
2008-01-28 22:58:19 +02:00
}
else
{
LOCPLINT - > statusbar - > clear ( ) ;
}
2008-01-26 21:36:31 +02:00
}
2008-05-23 22:50:11 +03:00
2008-05-31 23:37:54 +03:00
const CArmedInstance * CGarrisonSlot : : getObj ( )
2008-05-23 22:50:11 +03:00
{
return ( ! upg ) ? ( owner - > oup ) : ( owner - > odown ) ;
}
2008-01-26 21:36:31 +02:00
void CGarrisonSlot : : clickRight ( tribool down )
{
2008-05-23 22:50:11 +03:00
StackState * pom = NULL ;
if ( down & & creature )
{
if ( getObj ( ) - > ID = = 34 )
{
pom = new StackState ( ) ;
const CGHeroInstance * h = static_cast < const CGHeroInstance * > ( getObj ( ) ) ;
pom - > attackBonus = h - > primSkills [ 0 ] ;
pom - > defenseBonus = h - > primSkills [ 1 ] ;
pom - > luck = h - > getCurrentLuck ( ) ;
pom - > morale = h - > getCurrentMorale ( ) ;
}
( new CCreInfoWindow ( creature - > idNumber , 0 , pom , boost : : function < void ( ) > ( ) , boost : : function < void ( ) > ( ) ) )
- > activate ( ) ;
}
delete pom ;
2008-01-26 21:36:31 +02:00
}
void CGarrisonSlot : : clickLeft ( tribool down )
{
if ( owner - > ignoreEvent )
{
owner - > ignoreEvent = false ;
return ;
}
if ( down )
{
2008-05-18 20:33:39 +03:00
bool refr = false ;
2008-01-26 21:36:31 +02:00
if ( owner - > highlighted )
{
2008-05-18 20:33:39 +03:00
if ( owner - > highlighted = = this ) //view info
2008-04-13 14:05:39 +03:00
{
2008-05-31 23:37:54 +03:00
UpgradeInfo pom = LOCPLINT - > cb - > getUpgradeInfo ( getObj ( ) , ID ) ;
( new CCreInfoWindow
( creature - > idNumber , 1 , NULL ,
( pom . oldID > = 0 ) ? ( boost : : bind ( & CCallback : : upgradeCreature , LOCPLINT - > cb , getObj ( ) , ID , - 1 ) ) : ( boost : : function < void ( ) > ( ) ) , //if upgrade is possible we'll bind proper function in callback
boost : : bind ( & CCallback : : dismissCreature , LOCPLINT - > cb , getObj ( ) , ID ) ) )
- > activate ( ) ;
2008-04-13 14:05:39 +03:00
owner - > highlighted = NULL ;
show ( ) ;
2008-05-18 20:33:39 +03:00
refr = true ;
2008-04-13 14:05:39 +03:00
}
2008-04-19 19:15:04 +03:00
else if ( ! creature & & owner - > splitting ) //split
{
owner - > p2 = ID ;
owner - > pb = upg ;
owner - > splitting = false ;
LOCPLINT - > curint - > deactivate ( ) ;
CSplitWindow * spw = new CSplitWindow ( owner - > highlighted - > creature - > idNumber , owner - > highlighted - > count , owner ) ;
spw - > activate ( ) ;
2008-05-18 20:33:39 +03:00
refr = true ;
2008-04-19 19:15:04 +03:00
}
2008-04-13 14:05:39 +03:00
else if ( creature ! = owner - > highlighted - > creature ) //swap
{
LOCPLINT - > cb - > swapCreatures (
( ! upg ) ? ( owner - > oup ) : ( owner - > odown ) ,
( ! owner - > highlighted - > upg ) ? ( owner - > oup ) : ( owner - > odown ) ,
ID , owner - > highlighted - > ID ) ;
}
2008-05-18 20:33:39 +03:00
else //merge
2008-04-13 14:05:39 +03:00
{
LOCPLINT - > cb - > mergeStacks (
( ! owner - > highlighted - > upg ) ? ( owner - > oup ) : ( owner - > odown ) ,
( ! upg ) ? ( owner - > oup ) : ( owner - > odown ) ,
owner - > highlighted - > ID , ID ) ;
}
2008-01-26 21:36:31 +02:00
}
2008-05-18 20:33:39 +03:00
else //highlight
2008-01-26 21:36:31 +02:00
{
2008-01-29 15:00:45 +02:00
if ( creature )
owner - > highlighted = this ;
2008-02-23 00:26:31 +02:00
show ( ) ;
2008-05-18 20:33:39 +03:00
refr = true ;
2008-01-26 21:36:31 +02:00
}
2008-05-18 20:33:39 +03:00
if ( refr ) { hover ( false ) ; hover ( true ) ; } //to refresh statusbar
2008-01-26 21:36:31 +02:00
}
}
void CGarrisonSlot : : activate ( )
{
2008-04-11 20:41:02 +03:00
if ( ! active ) active = true ;
else return ;
2008-01-26 21:36:31 +02:00
ClickableL : : activate ( ) ;
ClickableR : : activate ( ) ;
Hoverable : : activate ( ) ;
}
void CGarrisonSlot : : deactivate ( )
{
2008-04-11 20:41:02 +03:00
if ( active ) active = false ;
else return ;
2008-01-26 21:36:31 +02:00
ClickableL : : deactivate ( ) ;
ClickableR : : deactivate ( ) ;
Hoverable : : deactivate ( ) ;
}
2008-01-28 16:01:09 +02:00
CGarrisonSlot : : CGarrisonSlot ( CGarrisonInt * Owner , int x , int y , int IID , int Upg , const CCreature * Creature , int Count )
2008-01-26 21:36:31 +02:00
{
2008-04-11 20:41:02 +03:00
active = false ;
2008-01-28 16:01:09 +02:00
upg = Upg ;
2008-01-26 21:36:31 +02:00
count = Count ;
ID = IID ;
creature = Creature ;
pos . x = x ;
pos . y = y ;
pos . w = 58 ;
pos . h = 64 ;
owner = Owner ;
}
2008-04-11 20:41:02 +03:00
CGarrisonSlot : : ~ CGarrisonSlot ( )
{
if ( active )
deactivate ( ) ;
}
2008-01-26 21:36:31 +02:00
void CGarrisonSlot : : show ( )
{
if ( creature )
{
2008-01-26 23:50:51 +02:00
char * buf = new char [ 15 ] ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( count , buf , 10 ) ;
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > bigImgs [ creature - > idNumber ] , pos ) ;
2008-01-30 16:19:35 +02:00
printTo ( buf , pos . x + 56 , pos . y + 62 , GEOR16 , zwykly ) ;
2008-01-26 23:50:51 +02:00
if ( owner - > highlighted = = this )
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > bigImgs [ - 1 ] , pos ) ;
2008-01-31 23:35:30 +02:00
if ( owner - > update )
2008-04-25 12:25:59 +03:00
updateRect ( & pos , screen ) ;
2008-01-26 23:50:51 +02:00
delete [ ] buf ;
2008-01-26 21:36:31 +02:00
}
else
{
2008-01-26 23:50:51 +02:00
SDL_Rect jakis1 = genRect ( pos . h , pos . w , owner - > offx + ID * ( pos . w + owner - > interx ) , owner - > offy + upg * ( pos . h + owner - > intery ) ) , jakis2 = pos ;
2008-04-25 12:25:59 +03:00
SDL_BlitSurface ( owner - > sur , & jakis1 , screen , & jakis2 ) ;
2008-04-19 19:15:04 +03:00
if ( owner - > splitting )
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > bigImgs [ - 1 ] , pos ) ;
2008-01-31 23:35:30 +02:00
if ( owner - > update )
2008-04-25 12:25:59 +03:00
SDL_UpdateRect ( screen , pos . x , pos . y , pos . w , pos . h ) ;
2008-01-26 21:36:31 +02:00
}
}
CGarrisonInt : : ~ CGarrisonInt ( )
{
if ( sup )
{
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
delete ( * sup ) [ i ] ;
delete sup ;
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
delete ( * sdown ) [ i ] ;
delete sdown ;
}
}
void CGarrisonInt : : show ( )
{
if ( sup )
{
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
if ( ( * sup ) [ i ] )
( * sup ) [ i ] - > show ( ) ;
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
if ( ( * sdown ) [ i ] )
( * sdown ) [ i ] - > show ( ) ;
}
}
void CGarrisonInt : : deactiveteSlots ( )
{
if ( sup )
{
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
{
if ( ( * sup ) [ i ] )
{
( * sup ) [ i ] - > deactivate ( ) ;
}
}
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
{
if ( ( * sdown ) [ i ] )
{
( * sdown ) [ i ] - > deactivate ( ) ;
}
}
}
}
void CGarrisonInt : : activeteSlots ( )
{
if ( sup )
{
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
{
if ( ( * sup ) [ i ] )
{
( * sup ) [ i ] - > activate ( ) ;
}
}
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
{
if ( ( * sdown ) [ i ] )
{
( * sdown ) [ i ] - > activate ( ) ;
}
}
}
}
void CGarrisonInt : : createSlots ( )
{
if ( set1 )
{
sup = new std : : vector < CGarrisonSlot * > ( 7 , ( CGarrisonSlot * ) ( NULL ) ) ;
for
2008-07-31 16:21:42 +03:00
( std : : map < si32 , std : : pair < ui32 , si32 > > : : const_iterator i = set1 - > slots . begin ( ) ;
2008-01-26 21:36:31 +02:00
i ! = set1 - > slots . end ( ) ; i + + )
{
2008-08-02 18:08:03 +03:00
( * sup ) [ i - > first ] =
2008-07-31 16:21:42 +03:00
new CGarrisonSlot ( this , pos . x + ( i - > first * ( 58 + interx ) ) , pos . y , i - > first , 0 , & CGI - > creh - > creatures [ i - > second . first ] , i - > second . second ) ;
2008-01-26 21:36:31 +02:00
}
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
if ( ( * sup ) [ i ] = = NULL )
2008-01-28 16:01:09 +02:00
( * sup ) [ i ] = new CGarrisonSlot ( this , pos . x + ( i * ( 58 + interx ) ) , pos . y , i , 0 , NULL , 0 ) ;
2008-01-26 21:36:31 +02:00
}
if ( set2 )
2008-08-02 18:08:03 +03:00
{
2008-01-26 21:36:31 +02:00
sdown = new std : : vector < CGarrisonSlot * > ( 7 , ( CGarrisonSlot * ) ( NULL ) ) ;
for
2008-07-31 16:21:42 +03:00
( std : : map < si32 , std : : pair < ui32 , si32 > > : : const_iterator i = set2 - > slots . begin ( ) ;
2008-01-26 21:36:31 +02:00
i ! = set2 - > slots . end ( ) ; i + + )
{
2008-08-02 18:08:03 +03:00
( * sdown ) [ i - > first ] =
2008-07-31 16:21:42 +03:00
new CGarrisonSlot ( this , pos . x + ( i - > first * ( 58 + interx ) ) , pos . y + 64 + intery , i - > first , 1 , & CGI - > creh - > creatures [ i - > second . first ] , i - > second . second ) ;
2008-01-26 21:36:31 +02:00
}
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
if ( ( * sdown ) [ i ] = = NULL )
2008-01-28 16:01:09 +02:00
( * sdown ) [ i ] = new CGarrisonSlot ( this , pos . x + ( i * ( 58 + interx ) ) , pos . y + 64 + intery , i , 1 , NULL , 0 ) ;
2008-01-26 21:36:31 +02:00
}
}
void CGarrisonInt : : deleteSlots ( )
{
if ( sup )
{
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
{
if ( ( * sup ) [ i ] )
{
delete ( * sup ) [ i ] ;
}
}
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
{
if ( ( * sdown ) [ i ] )
{
delete ( * sdown ) [ i ] ;
}
}
}
}
void CGarrisonInt : : recreateSlots ( )
{
2008-04-19 19:15:04 +03:00
splitting = false ;
2008-04-19 22:29:00 +03:00
highlighted = NULL ;
2008-01-26 21:36:31 +02:00
deactiveteSlots ( ) ;
deleteSlots ( ) ;
createSlots ( ) ;
2008-01-26 23:50:51 +02:00
ignoreEvent = true ;
2008-01-26 21:36:31 +02:00
activeteSlots ( ) ;
show ( ) ;
}
2008-04-19 19:15:04 +03:00
void CGarrisonInt : : splitClick ( )
{
if ( ! highlighted )
return ;
splitting = ! splitting ;
show ( ) ;
}
void CGarrisonInt : : splitStacks ( int am2 )
{
LOCPLINT - > cb - > splitStack (
( highlighted - > upg ) ? ( odown ) : ( oup ) ,
( pb ) ? ( odown ) : ( oup ) ,
highlighted - > ID ,
p2 ,
am2 ) ;
}
2008-05-31 23:37:54 +03:00
CGarrisonInt : : CGarrisonInt ( int x , int y , int inx , int iny , SDL_Surface * pomsur , int OX , int OY , const CArmedInstance * s1 , const CArmedInstance * s2 )
2008-01-28 16:01:09 +02:00
: interx ( inx ) , intery ( iny ) , sur ( pomsur ) , highlighted ( NULL ) , sup ( NULL ) , sdown ( NULL ) , oup ( s1 ) , odown ( s2 ) ,
2008-01-26 21:36:31 +02:00
offx ( OX ) , offy ( OY )
{
2008-04-19 19:15:04 +03:00
splitting = false ;
2008-01-28 16:01:09 +02:00
set1 = LOCPLINT - > cb - > getGarrison ( s1 ) ;
set2 = LOCPLINT - > cb - > getGarrison ( s2 ) ;
2008-01-26 21:36:31 +02:00
ignoreEvent = false ;
2008-01-31 23:35:30 +02:00
update = true ;
2008-01-26 21:36:31 +02:00
pos . x = ( x ) ;
pos . y = ( y ) ;
pos . w = ( 58 ) ;
pos . h = ( 64 ) ;
createSlots ( ) ;
}
void CGarrisonInt : : activate ( )
{
if ( sup )
{
for ( int i = 0 ; i < sup - > size ( ) ; i + + )
if ( ( * sup ) [ i ] )
( * sup ) [ i ] - > activate ( ) ;
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
if ( ( * sdown ) [ i ] )
( * sdown ) [ i ] - > activate ( ) ;
}
}
void CGarrisonInt : : deactivate ( )
{
deactiveteSlots ( ) ;
}
2007-11-24 00:33:55 +02:00
CInfoWindow : : CInfoWindow ( )
: okb ( NMessage : : ok , NULL , & CInfoWindow : : okClicked )
{
okb . ourObj = this ;
okb . delg = this ;
2008-01-27 16:07:51 +02:00
okb . notFreeButton = true ;
2007-11-24 00:33:55 +02:00
}
void CInfoWindow : : okClicked ( tribool down )
{
if ( ! down )
close ( ) ;
}
void CInfoWindow : : close ( )
{
for ( int i = 0 ; i < components . size ( ) ; i + + )
2007-11-24 16:17:57 +02:00
{
components [ i ] - > deactivate ( ) ;
2007-11-24 00:33:55 +02:00
delete components [ i ] ;
2007-11-24 16:17:57 +02:00
}
components . clear ( ) ;
2007-11-24 00:33:55 +02:00
okb . deactivate ( ) ;
2007-12-25 18:25:53 +02:00
SDL_FreeSurface ( bitmap ) ;
bitmap = NULL ;
2007-11-24 00:33:55 +02:00
LOCPLINT - > removeObjToBlit ( this ) ;
2008-01-20 14:34:39 +02:00
LOCPLINT - > curint - > activate ( ) ;
2007-12-28 01:43:36 +02:00
delete this ;
2007-11-24 00:33:55 +02:00
}
CInfoWindow : : ~ CInfoWindow ( )
{
}
2008-02-23 00:26:31 +02:00
2008-03-06 20:54:35 +02:00
void CRClickPopup : : clickRight ( tribool down )
2008-02-23 00:26:31 +02:00
{
2008-03-06 20:54:35 +02:00
if ( down )
return ;
close ( ) ;
2008-02-23 00:26:31 +02:00
}
2008-03-06 20:54:35 +02:00
void CRClickPopup : : activate ( )
2008-02-23 00:26:31 +02:00
{
ClickableR : : activate ( ) ;
LOCPLINT - > objsToBlit . push_back ( this ) ;
}
2008-03-06 20:54:35 +02:00
void CRClickPopup : : deactivate ( )
2008-02-23 00:26:31 +02:00
{
ClickableR : : deactivate ( ) ;
LOCPLINT - > objsToBlit . erase ( std : : find ( LOCPLINT - > objsToBlit . begin ( ) , LOCPLINT - > objsToBlit . end ( ) , this ) ) ;
}
2008-03-06 20:54:35 +02:00
CInfoPopup : : CInfoPopup ( SDL_Surface * Bitmap , int x , int y , bool Free )
: bitmap ( Bitmap ) , free ( Free )
{
pos . x = x ;
pos . y = y ;
pos . h = bitmap - > h ;
pos . w = bitmap - > w ;
}
2008-02-23 00:26:31 +02:00
void CInfoPopup : : close ( )
{
deactivate ( ) ;
if ( free )
SDL_FreeSurface ( bitmap ) ;
delete this ;
if ( LOCPLINT - > curint = = LOCPLINT - > adventureInt )
LOCPLINT - > adventureInt - > show ( ) ;
else if ( LOCPLINT - > curint = = LOCPLINT - > castleInt )
LOCPLINT - > castleInt - > showAll ( ) ;
}
void CInfoPopup : : show ( SDL_Surface * to )
{
2008-04-25 12:25:59 +03:00
blitAt ( bitmap , pos . x , pos . y , ( to ) ? ( to ) : ( screen ) ) ;
2008-02-23 00:26:31 +02:00
}
2008-07-31 13:35:22 +03:00
void SComponent : : init ( Etype Type , int Subtype , int Val )
2007-11-24 00:33:55 +02:00
{
std : : ostringstream oss ;
switch ( Type )
{
case primskill :
description = CGI - > generaltexth - > arraytxt [ 2 + Subtype ] ;
oss < < ( ( Val > 0 ) ? ( " + " ) : ( " - " ) ) < < Val < < " " < < CGI - > heroh - > pskillsn [ Subtype ] ;
subtitle = oss . str ( ) ;
break ;
case resource :
2007-11-25 15:16:45 +02:00
description = CGI - > generaltexth - > allTexts [ 242 ] ;
2007-11-24 00:33:55 +02:00
oss < < Val ;
subtitle = oss . str ( ) ;
break ;
2007-12-25 18:25:53 +02:00
case experience :
description = CGI - > generaltexth - > allTexts [ 241 ] ;
oss < < Val ;
subtitle = oss . str ( ) ;
break ;
2007-11-24 00:33:55 +02:00
}
type = Type ;
subtype = Subtype ;
val = Val ;
SDL_Surface * temp = getImg ( ) ;
pos . w = temp - > w ;
pos . h = temp - > h ;
}
2008-07-31 13:35:22 +03:00
SComponent : : SComponent ( Etype Type , int Subtype , int Val )
{
init ( Type , Subtype , Val ) ;
}
2007-11-24 00:33:55 +02:00
2008-07-31 13:35:22 +03:00
SComponent : : SComponent ( const Component & c )
{
2008-08-04 18:56:36 +03:00
if ( c . id = = 0 & & c . subtype = = 4 )
init ( experience , 0 , c . val ) ;
else
init ( ( Etype ) c . id , c . subtype , c . val ) ;
2008-07-31 13:35:22 +03:00
switch ( c . id )
{
case resource :
2008-08-02 13:25:58 +03:00
if ( c . when = = - 1 )
2008-07-31 13:35:22 +03:00
subtitle + = CGI - > generaltexth - > allTexts [ 3 ] . substr ( 2 , CGI - > generaltexth - > allTexts [ 3 ] . length ( ) - 2 ) ;
break ;
}
}
2007-11-24 00:33:55 +02:00
SDL_Surface * SComponent : : getImg ( )
{
switch ( type )
{
case primskill :
2008-06-13 11:16:51 +03:00
return graphics - > pskillsb - > ourImages [ subtype ] . bitmap ;
2007-11-24 00:33:55 +02:00
break ;
2008-01-28 14:28:18 +02:00
case secskill :
2008-01-29 15:55:14 +02:00
return CGI - > abilh - > abils82 - > ourImages [ subtype * 3 + 3 + val ] . bitmap ;
2008-01-28 14:28:18 +02:00
break ;
2007-11-24 00:33:55 +02:00
case resource :
2008-06-13 11:16:51 +03:00
return graphics - > resources - > ourImages [ subtype ] . bitmap ;
2007-11-24 00:33:55 +02:00
break ;
2007-12-25 18:25:53 +02:00
case experience :
2008-06-13 11:16:51 +03:00
return graphics - > pskillsb - > ourImages [ 4 ] . bitmap ;
2007-12-25 18:25:53 +02:00
break ;
2007-11-24 00:33:55 +02:00
}
return NULL ;
}
void SComponent : : clickRight ( tribool down )
{
LOCPLINT - > adventureInt - > handleRightClick ( description , down , this ) ;
}
void SComponent : : activate ( )
{
ClickableR : : activate ( ) ;
}
void SComponent : : deactivate ( )
{
ClickableR : : deactivate ( ) ;
}
2007-12-19 02:06:51 +02:00
void CSelectableComponent : : clickLeft ( tribool down )
{
if ( down )
{
select ( true ) ;
2007-12-25 18:25:53 +02:00
owner - > selectionChange ( this ) ;
2007-12-19 02:06:51 +02:00
}
}
2007-12-25 18:25:53 +02:00
CSelectableComponent : : CSelectableComponent ( Etype Type , int Sub , int Val , CSelWindow * Owner , SDL_Surface * Border )
2007-12-23 18:25:14 +02:00
: SComponent ( Type , Sub , Val ) , owner ( Owner )
2007-12-19 02:06:51 +02:00
{
2007-12-27 02:11:46 +02:00
SDL_Surface * symb = SComponent : : getImg ( ) ;
2008-04-25 12:25:59 +03:00
myBitmap = CSDL_Ext : : newSurface ( symb - > w + 2 , symb - > h + 2 , screen ) ;
2008-08-02 18:08:03 +03:00
SDL_SetColorKey ( myBitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( myBitmap - > format , 0 , 255 , 255 ) ) ;
2007-12-27 02:11:46 +02:00
blitAt ( symb , 1 , 1 , myBitmap ) ;
2007-12-19 02:06:51 +02:00
if ( Border ) //use custom border
{
border = Border ;
2007-12-27 02:11:46 +02:00
customB = true ;
2007-12-19 02:06:51 +02:00
}
else //we need to draw border
{
2007-12-27 02:11:46 +02:00
customB = false ;
2008-04-25 12:25:59 +03:00
border = CSDL_Ext : : newSurface ( symb - > w + 2 , symb - > h + 2 , screen ) ;
2007-12-19 02:06:51 +02:00
SDL_FillRect ( border , NULL , 0x00FFFF ) ;
for ( int i = 0 ; i < border - > w ; i + + )
{
SDL_PutPixel ( border , i , 0 , 239 , 215 , 123 ) ;
SDL_PutPixel ( border , i , ( border - > h ) - 1 , 239 , 215 , 123 ) ;
}
for ( int i = 0 ; i < border - > h ; i + + )
{
SDL_PutPixel ( border , 0 , i , 239 , 215 , 123 ) ;
SDL_PutPixel ( border , ( border - > w ) - 1 , i , 239 , 215 , 123 ) ;
}
2008-08-02 18:08:03 +03:00
SDL_SetColorKey ( border , SDL_SRCCOLORKEY , SDL_MapRGB ( border - > format , 0 , 255 , 255 ) ) ;
2007-12-19 02:06:51 +02:00
}
selected = false ;
}
2007-12-27 02:11:46 +02:00
CSelectableComponent : : ~ CSelectableComponent ( )
{
SDL_FreeSurface ( myBitmap ) ;
if ( ! customB )
SDL_FreeSurface ( border ) ;
}
2007-12-19 02:06:51 +02:00
void CSelectableComponent : : activate ( )
{
SComponent : : activate ( ) ;
ClickableL : : activate ( ) ;
}
void CSelectableComponent : : deactivate ( )
{
SComponent : : deactivate ( ) ;
ClickableL : : deactivate ( ) ;
}
SDL_Surface * CSelectableComponent : : getImg ( )
{
return myBitmap ;
}
void CSelectableComponent : : select ( bool on )
{
if ( on ! = selected )
{
2007-12-27 02:11:46 +02:00
SDL_FillRect ( myBitmap , NULL , 0x000000 ) ;
2007-12-19 02:06:51 +02:00
blitAt ( SComponent : : getImg ( ) , 1 , 1 , myBitmap ) ;
if ( on )
{
2007-12-23 18:25:14 +02:00
blitAt ( border , 0 , 0 , myBitmap ) ;
2007-12-19 02:06:51 +02:00
}
selected = on ;
return ;
}
2008-08-02 18:08:03 +03:00
else
2007-12-19 02:06:51 +02:00
{
return ;
}
}
2007-12-01 14:50:33 +02:00
void CSimpleWindow : : show ( SDL_Surface * to )
{
if ( ! to )
2008-04-25 12:25:59 +03:00
to = screen ;
2007-12-01 14:50:33 +02:00
blitAt ( bitmap , pos . x , pos . y , to ) ;
}
2007-11-19 00:58:28 +02:00
CSimpleWindow : : ~ CSimpleWindow ( )
{
if ( bitmap )
2007-11-24 00:33:55 +02:00
{
2007-11-19 00:58:28 +02:00
SDL_FreeSurface ( bitmap ) ;
2007-11-24 00:33:55 +02:00
bitmap = NULL ;
}
}
2007-12-28 01:43:36 +02:00
void CSelWindow : : selectionChange ( CSelectableComponent * to )
2007-12-19 02:06:51 +02:00
{
2007-12-27 02:11:46 +02:00
blitAt ( to - > getImg ( ) , to - > pos . x - pos . x , to - > pos . y - pos . y , bitmap ) ;
2007-12-19 02:06:51 +02:00
for ( int i = 0 ; i < components . size ( ) ; i + + )
{
if ( components [ i ] = = to )
2007-12-27 02:11:46 +02:00
{
2007-12-28 01:43:36 +02:00
if ( to - > selected )
continue ;
else
to - > select ( true ) ;
2007-12-27 02:11:46 +02:00
}
2007-12-19 02:06:51 +02:00
CSelectableComponent * pom = dynamic_cast < CSelectableComponent * > ( components [ i ] ) ;
if ( ! pom )
continue ;
pom - > select ( false ) ;
2007-12-27 02:11:46 +02:00
blitAt ( pom - > getImg ( ) , pom - > pos . x - pos . x , pom - > pos . y - pos . y , bitmap ) ;
2007-12-19 02:06:51 +02:00
}
}
void CSelWindow : : okClicked ( tribool down )
{
if ( ! down )
close ( ) ;
}
void CSelWindow : : close ( )
{
2007-12-28 01:43:36 +02:00
int ret = - 1 ;
for ( int i = 0 ; i < components . size ( ) ; i + + )
{
if ( dynamic_cast < CSelectableComponent * > ( components [ i ] ) - > selected )
{
ret = i ;
}
components [ i ] - > deactivate ( ) ;
2008-08-02 18:08:03 +03:00
}
2007-12-28 01:43:36 +02:00
components . clear ( ) ;
okb . deactivate ( ) ;
SDL_FreeSurface ( bitmap ) ;
bitmap = NULL ;
LOCPLINT - > removeObjToBlit ( this ) ;
2008-01-20 14:34:39 +02:00
LOCPLINT - > curint - > activate ( ) ;
2007-12-28 01:43:36 +02:00
LOCPLINT - > cb - > selectionMade ( ret , ID ) ;
delete this ;
2007-12-19 02:06:51 +02:00
//call owner with selection result
}
2007-11-24 00:33:55 +02:00
template < typename T > CSCButton < T > : : CSCButton ( CDefHandler * img , CIntObject * obj , void ( T : : * poin ) ( tribool ) , T * Delg )
{
ourObj = obj ;
delg = Delg ;
func = poin ;
imgs . resize ( 1 ) ;
for ( int i = 0 ; i < img - > ourImages . size ( ) ; i + + )
{
imgs [ 0 ] . push_back ( img - > ourImages [ i ] . bitmap ) ;
}
pos . w = imgs [ 0 ] [ 0 ] - > w ;
pos . h = imgs [ 0 ] [ 0 ] - > h ;
state = 0 ;
}
template < typename T > void CSCButton < T > : : clickLeft ( tribool down )
{
if ( down )
{
state = 1 ;
}
2008-08-02 18:08:03 +03:00
else
2007-11-24 00:33:55 +02:00
{
state = 0 ;
}
2007-12-28 01:43:36 +02:00
pressedL = state ;
2007-11-24 00:33:55 +02:00
show ( ) ;
if ( delg )
( delg - > * func ) ( down ) ;
}
2008-08-02 18:08:03 +03:00
template < typename T > void CSCButton < T > : : activate ( )
2007-11-24 00:33:55 +02:00
{
ClickableL : : activate ( ) ;
}
2008-08-02 18:08:03 +03:00
template < typename T > void CSCButton < T > : : deactivate ( )
2007-11-24 00:33:55 +02:00
{
ClickableL : : deactivate ( ) ;
}
2008-08-02 18:08:03 +03:00
template < typename T > void CSCButton < T > : : show ( SDL_Surface * to )
2007-11-24 00:33:55 +02:00
{
2007-12-01 14:50:33 +02:00
if ( delg ) //we blit on our owner's bitmap
2007-11-24 00:33:55 +02:00
{
blitAt ( imgs [ curimg ] [ state ] , posr . x , posr . y , delg - > bitmap ) ;
2007-12-09 14:42:45 +02:00
//updateRect(&genRect(pos.h,pos.w,posr.x,posr.y),delg->bitmap);
2007-11-24 00:33:55 +02:00
}
else
{
2007-12-01 14:50:33 +02:00
CButtonBase : : show ( to ) ;
2007-11-24 00:33:55 +02:00
}
2007-11-19 00:58:28 +02:00
}
CButtonBase : : CButtonBase ( )
{
2008-01-09 19:21:31 +02:00
bitmapOffset = 0 ;
2007-11-19 00:58:28 +02:00
curimg = 0 ;
type = - 1 ;
abs = false ;
active = false ;
2008-01-27 16:07:51 +02:00
notFreeButton = false ;
2007-11-19 00:58:28 +02:00
ourObj = NULL ;
state = 0 ;
}
2008-01-21 20:22:51 +02:00
CButtonBase : : ~ CButtonBase ( )
{
2008-01-27 16:07:51 +02:00
if ( notFreeButton )
return ;
2008-01-21 20:22:51 +02:00
for ( int i = 0 ; i < imgs . size ( ) ; i + + )
for ( int j = 0 ; j < imgs [ i ] . size ( ) ; j + + )
SDL_FreeSurface ( imgs [ i ] [ j ] ) ;
}
2007-12-01 14:50:33 +02:00
void CButtonBase : : show ( SDL_Surface * to )
2007-11-19 00:58:28 +02:00
{
2007-12-01 14:50:33 +02:00
if ( ! to )
2008-04-25 12:25:59 +03:00
to = screen ;
2007-11-19 00:58:28 +02:00
if ( abs )
{
2008-04-04 20:30:53 +03:00
blitAt ( imgs [ curimg ]
2008-08-02 18:08:03 +03:00
[ ( ( state + bitmapOffset ) < ( imgs [ curimg ] . size ( ) ) ) ?
2008-04-04 20:30:53 +03:00
( state + bitmapOffset ) :
( imgs [ curimg ] . size ( ) - 1 ) ]
, pos . x , pos . y , to ) ;
2007-12-09 14:42:45 +02:00
//updateRect(&pos,to);
2007-11-19 00:58:28 +02:00
}
else
{
2008-04-04 20:30:53 +03:00
blitAt ( imgs [ curimg ]
2008-08-02 18:08:03 +03:00
[ ( ( state + bitmapOffset ) < ( imgs [ curimg ] . size ( ) ) ) ?
2008-04-04 20:30:53 +03:00
( state + bitmapOffset ) :
( imgs [ curimg ] . size ( ) - 1 ) ] , pos . x + ourObj - > pos . x , pos . y + ourObj - > pos . y , to ) ;
2007-12-09 14:42:45 +02:00
//updateRect(&genRect(pos.h,pos.w,pos.x+ourObj->pos.x,pos.y+ourObj->pos.y),to);
2008-08-02 18:08:03 +03:00
2007-11-19 00:58:28 +02:00
}
}
ClickableL : : ClickableL ( )
{
pressedL = false ;
}
void ClickableL : : clickLeft ( tribool down )
{
if ( down )
pressedL = true ;
else
pressedL = false ;
}
void ClickableL : : activate ( )
{
LOCPLINT - > lclickable . push_back ( this ) ;
}
void ClickableL : : deactivate ( )
{
LOCPLINT - > lclickable . erase
( std : : find ( LOCPLINT - > lclickable . begin ( ) , LOCPLINT - > lclickable . end ( ) , this ) ) ;
}
ClickableR : : ClickableR ( )
{
pressedR = false ;
}
2008-03-21 02:03:31 +02:00
void ClickableR : : clickRight ( tribool down )
{
if ( down )
pressedR = true ;
else
pressedR = false ;
}
2007-11-19 00:58:28 +02:00
void ClickableR : : activate ( )
{
LOCPLINT - > rclickable . push_back ( this ) ;
}
void ClickableR : : deactivate ( )
{
LOCPLINT - > rclickable . erase ( std : : find ( LOCPLINT - > rclickable . begin ( ) , LOCPLINT - > rclickable . end ( ) , this ) ) ;
}
void Hoverable : : activate ( )
{
LOCPLINT - > hoverable . push_back ( this ) ;
}
void Hoverable : : deactivate ( )
{
LOCPLINT - > hoverable . erase ( std : : find ( LOCPLINT - > hoverable . begin ( ) , LOCPLINT - > hoverable . end ( ) , this ) ) ;
}
void Hoverable : : hover ( bool on )
{
hovered = on ;
}
void KeyInterested : : activate ( )
{
LOCPLINT - > keyinterested . push_back ( this ) ;
}
void KeyInterested : : deactivate ( )
{
LOCPLINT - >
keyinterested . erase ( std : : find ( LOCPLINT - > keyinterested . begin ( ) , LOCPLINT - > keyinterested . end ( ) , this ) ) ;
}
void MotionInterested : : activate ( )
{
LOCPLINT - > motioninterested . push_back ( this ) ;
}
void MotionInterested : : deactivate ( )
{
LOCPLINT - >
motioninterested . erase ( std : : find ( LOCPLINT - > motioninterested . begin ( ) , LOCPLINT - > motioninterested . end ( ) , this ) ) ;
}
2007-12-19 02:06:51 +02:00
void TimeInterested : : activate ( )
{
LOCPLINT - > timeinterested . push_back ( this ) ;
}
void TimeInterested : : deactivate ( )
{
LOCPLINT - >
timeinterested . erase ( std : : find ( LOCPLINT - > timeinterested . begin ( ) , LOCPLINT - > timeinterested . end ( ) , this ) ) ;
}
2008-06-12 09:45:51 +03:00
CPlayerInterface : : CPlayerInterface ( int Player , int serial )
{
2008-07-27 20:07:37 +03:00
LOCPLINT = this ;
2008-06-12 09:45:51 +03:00
playerID = Player ;
serialID = serial ;
human = true ;
2008-08-01 14:21:15 +03:00
pim = new boost : : mutex ;
}
CPlayerInterface : : ~ CPlayerInterface ( )
{
delete pim ;
2007-11-19 00:58:28 +02:00
}
2007-12-06 20:32:06 +02:00
void CPlayerInterface : : init ( ICallback * CB )
2007-11-19 00:58:28 +02:00
{
2007-12-06 20:32:06 +02:00
cb = dynamic_cast < CCallback * > ( CB ) ;
2007-11-19 00:58:28 +02:00
adventureInt = new CAdvMapInt ( playerID ) ;
2008-01-09 19:21:31 +02:00
castleInt = NULL ;
2007-12-19 02:06:51 +02:00
std : : vector < const CGHeroInstance * > hh = cb - > getHeroesInfo ( false ) ;
for ( int i = 0 ; i < hh . size ( ) ; i + + )
{
SDL_Surface * pom = infoWin ( hh [ i ] ) ;
2008-06-13 11:16:51 +03:00
graphics - > heroWins . insert ( std : : pair < int , SDL_Surface * > ( hh [ i ] - > subID , pom ) ) ;
2007-12-19 02:06:51 +02:00
}
2008-02-18 23:14:28 +02:00
std : : vector < const CGTownInstance * > tt = cb - > getTownsInfo ( false ) ;
for ( int i = 0 ; i < tt . size ( ) ; i + + )
{
SDL_Surface * pom = infoWin ( tt [ i ] ) ;
2008-06-13 11:16:51 +03:00
graphics - > townWins . insert ( std : : pair < int , SDL_Surface * > ( tt [ i ] - > identifier , pom ) ) ;
2008-02-18 23:14:28 +02:00
}
2007-11-19 00:58:28 +02:00
}
void CPlayerInterface : : yourTurn ( )
{
2008-07-27 20:07:37 +03:00
LOCPLINT = this ;
2007-11-19 00:58:28 +02:00
makingTurn = true ;
unsigned char & animVal = LOCPLINT - > adventureInt - > anim ; //for animations handling
2008-01-08 15:31:44 +02:00
unsigned char & heroAnimVal = LOCPLINT - > adventureInt - > heroAnim ;
2007-12-19 02:06:51 +02:00
adventureInt - > infoBar . newDay ( cb - > getDate ( 1 ) ) ;
2008-02-23 00:26:31 +02:00
adventureInt - > activate ( ) ;
2007-11-19 00:58:28 +02:00
//show rest of things
//initializing framerate keeper
mainFPSmng = new FPSmanager ;
SDL_initFramerate ( mainFPSmng ) ;
2008-08-01 21:13:33 +03:00
SDL_setFramerate ( mainFPSmng , 48 ) ;
2007-11-19 00:58:28 +02:00
SDL_Event sEvent ;
//framerate keeper initialized
2007-12-19 02:06:51 +02:00
timeHandler th ;
th . getDif ( ) ;
2007-11-19 00:58:28 +02:00
for ( ; makingTurn ; ) // main loop
{
2008-02-22 19:47:14 +02:00
//updating water tiles
2008-02-23 21:20:41 +02:00
//int wnumber = -1;
//for(int s=0; s<CGI->mh->reader->defs.size(); ++s)
//{
// if(CGI->mh->reader->defs[s]->defName==std::string("WATRTL.DEF"))
// {
// wnumber = s;
// break;
// }
//}
//if(wnumber>=0)
//{
// for(int g=0; g<CGI->mh->reader->defs[wnumber]->ourImages.size(); ++g)
// {
// SDL_Color tab[32];
// for(int i=0; i<32; ++i)
// {
// tab[i] = CGI->mh->reader->defs[wnumber]->ourImages[g].bitmap->format->palette->colors[160 + (i+1)%32];
// }
// //SDL_SaveBMP(CGI->mh->reader->defs[wnumber]->ourImages[g].bitmap,"t1.bmp");
// for(int i=0; i<32; ++i)
// {
// CGI->mh->reader->defs[wnumber]->ourImages[g].bitmap->format->palette->colors[160 + i] = tab[i];
// }
// //SDL_SaveBMP(CGI->mh->reader->defs[wnumber]->ourImages[g].bitmap,"t2.bmp");
2008-08-02 18:08:03 +03:00
// CSDL_Ext::update(CGI->mh->reader->defs[wnumber]->ourImages[g].bitmap);
2008-02-23 21:20:41 +02:00
// }
//}
2008-02-22 19:47:14 +02:00
//water tiles updated
2008-08-01 21:13:33 +03:00
//CGI->screenh->updateScreen();
2008-08-01 14:21:15 +03:00
pim - > lock ( ) ;
2007-12-19 02:06:51 +02:00
int tv = th . getDif ( ) ;
for ( int i = 0 ; i < timeinterested . size ( ) ; i + + )
{
if ( timeinterested [ i ] - > toNextTick > = 0 )
timeinterested [ i ] - > toNextTick - = tv ;
if ( timeinterested [ i ] - > toNextTick < 0 )
timeinterested [ i ] - > tick ( ) ;
}
2007-11-19 00:58:28 +02:00
LOCPLINT - > adventureInt - > updateScreen = false ;
2008-07-27 20:07:37 +03:00
eventsM . lock ( ) ;
while ( ! events . empty ( ) )
2007-11-19 00:58:28 +02:00
{
2008-07-27 20:07:37 +03:00
handleEvent ( & events . front ( ) ) ;
events . pop ( ) ;
2007-11-19 00:58:28 +02:00
}
2008-07-27 20:07:37 +03:00
eventsM . unlock ( ) ;
2008-01-09 19:21:31 +02:00
if ( ! castleInt ) //stuff for advMapInt
2007-11-19 00:58:28 +02:00
{
2008-01-09 19:21:31 +02:00
+ + LOCPLINT - > adventureInt - > animValHitCount ; //for animations
2008-08-01 21:13:33 +03:00
if ( LOCPLINT - > adventureInt - > animValHitCount = = 8 )
2007-11-19 00:58:28 +02:00
{
2008-01-09 19:21:31 +02:00
LOCPLINT - > adventureInt - > animValHitCount = 0 ;
+ + animVal ;
2007-11-19 00:58:28 +02:00
LOCPLINT - > adventureInt - > updateScreen = true ;
2008-01-09 19:21:31 +02:00
2007-11-19 00:58:28 +02:00
}
2008-01-09 19:21:31 +02:00
+ + heroAnimVal ;
if ( LOCPLINT - > adventureInt - > scrollingLeft )
2007-11-19 00:58:28 +02:00
{
2008-01-09 19:21:31 +02:00
if ( LOCPLINT - > adventureInt - > position . x > - Woff )
{
LOCPLINT - > adventureInt - > position . x - - ;
LOCPLINT - > adventureInt - > updateScreen = true ;
adventureInt - > updateMinimap = true ;
}
2007-11-19 00:58:28 +02:00
}
2008-01-09 19:21:31 +02:00
if ( LOCPLINT - > adventureInt - > scrollingRight )
2007-11-19 00:58:28 +02:00
{
2008-06-12 09:45:51 +03:00
if ( LOCPLINT - > adventureInt - > position . x < CGI - > mh - > map - > width - 19 + 4 )
2008-01-09 19:21:31 +02:00
{
LOCPLINT - > adventureInt - > position . x + + ;
LOCPLINT - > adventureInt - > updateScreen = true ;
adventureInt - > updateMinimap = true ;
}
2007-11-19 00:58:28 +02:00
}
2008-01-09 19:21:31 +02:00
if ( LOCPLINT - > adventureInt - > scrollingUp )
2007-11-19 00:58:28 +02:00
{
2008-01-09 19:21:31 +02:00
if ( LOCPLINT - > adventureInt - > position . y > - Hoff )
{
LOCPLINT - > adventureInt - > position . y - - ;
LOCPLINT - > adventureInt - > updateScreen = true ;
adventureInt - > updateMinimap = true ;
}
}
if ( LOCPLINT - > adventureInt - > scrollingDown )
{
2008-06-12 09:45:51 +03:00
if ( LOCPLINT - > adventureInt - > position . y < CGI - > mh - > map - > height - 18 + 4 )
2008-01-09 19:21:31 +02:00
{
LOCPLINT - > adventureInt - > position . y + + ;
LOCPLINT - > adventureInt - > updateScreen = true ;
adventureInt - > updateMinimap = true ;
}
}
if ( LOCPLINT - > adventureInt - > updateScreen )
{
adventureInt - > update ( ) ;
adventureInt - > updateScreen = false ;
}
if ( LOCPLINT - > adventureInt - > updateMinimap )
{
adventureInt - > minimap . draw ( ) ;
adventureInt - > updateMinimap = false ;
2007-11-19 00:58:28 +02:00
}
}
for ( int i = 0 ; i < objsToBlit . size ( ) ; i + + )
2007-12-01 14:50:33 +02:00
objsToBlit [ i ] - > show ( ) ;
2008-08-01 14:21:15 +03:00
pim - > unlock ( ) ;
2008-08-01 21:13:33 +03:00
CGI - > curh - > draw1 ( ) ;
2008-04-25 12:25:59 +03:00
CSDL_Ext : : update ( screen ) ;
2008-08-01 21:13:33 +03:00
CGI - > curh - > draw2 ( ) ;
2007-11-19 00:58:28 +02:00
SDL_framerateDelay ( mainFPSmng ) ;
}
adventureInt - > hide ( ) ;
2008-07-27 20:07:37 +03:00
cb - > endTurn ( ) ;
2007-11-19 00:58:28 +02:00
}
2008-08-02 18:08:03 +03:00
inline void subRect ( const int & x , const int & y , const int & z , const SDL_Rect & r , const int & hid )
2007-11-19 00:58:28 +02:00
{
2007-12-06 20:55:58 +02:00
TerrainTile2 & hlp = CGI - > mh - > ttiles [ x ] [ y ] [ z ] ;
for ( int h = 0 ; h < hlp . objects . size ( ) ; + + h )
if ( hlp . objects [ h ] . first - > id = = hid )
2007-11-19 00:58:28 +02:00
{
2008-02-10 19:44:51 +02:00
hlp . objects [ h ] . second = r ;
2007-12-06 20:55:58 +02:00
return ;
2007-11-19 00:58:28 +02:00
}
}
inline void delObjRect ( const int & x , const int & y , const int & z , const int & hid )
{
2007-12-06 20:55:58 +02:00
TerrainTile2 & hlp = CGI - > mh - > ttiles [ x ] [ y ] [ z ] ;
for ( int h = 0 ; h < hlp . objects . size ( ) ; + + h )
if ( hlp . objects [ h ] . first - > id = = hid )
2007-11-19 00:58:28 +02:00
{
2007-12-06 20:55:58 +02:00
hlp . objects . erase ( hlp . objects . begin ( ) + h ) ;
return ;
2007-11-19 00:58:28 +02:00
}
}
2007-11-25 15:16:45 +02:00
int getDir ( int3 src , int3 dst )
2008-08-02 18:08:03 +03:00
{
2007-11-25 15:16:45 +02:00
int ret = - 1 ;
if ( dst . x + 1 = = src . x & & dst . y + 1 = = src . y ) //tl
{
ret = 1 ;
}
else if ( dst . x = = src . x & & dst . y + 1 = = src . y ) //t
{
ret = 2 ;
}
else if ( dst . x - 1 = = src . x & & dst . y + 1 = = src . y ) //tr
{
ret = 3 ;
}
else if ( dst . x - 1 = = src . x & & dst . y = = src . y ) //r
{
ret = 4 ;
}
else if ( dst . x - 1 = = src . x & & dst . y - 1 = = src . y ) //br
{
ret = 5 ;
}
else if ( dst . x = = src . x & & dst . y - 1 = = src . y ) //b
{
ret = 6 ;
}
else if ( dst . x + 1 = = src . x & & dst . y - 1 = = src . y ) //bl
{
ret = 7 ;
}
else if ( dst . x + 1 = = src . x & & dst . y = = src . y ) //l
{
ret = 8 ;
}
return ret ;
}
2007-11-19 00:58:28 +02:00
void CPlayerInterface : : heroMoved ( const HeroMoveDetails & details )
{
2008-08-04 18:56:36 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2007-11-19 00:58:28 +02:00
//initializing objects and performing first step of move
CGHeroInstance * ho = details . ho ; //object representing this hero
int3 hp = details . src ;
2007-11-25 15:16:45 +02:00
if ( ! details . successful )
{
ho - > moveDir = getDir ( details . src , details . dst ) ;
ho - > isStanding = true ;
adventureInt - > heroList . draw ( ) ;
if ( adventureInt - > terrain . currentPath )
{
delete adventureInt - > terrain . currentPath ;
adventureInt - > terrain . currentPath = NULL ;
}
return ;
}
2007-11-19 00:58:28 +02:00
if ( adventureInt - > terrain . currentPath ) //&& hero is moving
{
adventureInt - > terrain . currentPath - > nodes . erase ( adventureInt - > terrain . currentPath - > nodes . end ( ) - 1 ) ;
}
int3 buff = details . ho - > pos ;
buff . x - = 11 ;
buff . y - = 9 ;
buff = repairScreenPos ( buff ) ;
LOCPLINT - > adventureInt - > position = buff ; //actualizing screen pos
if ( details . dst . x + 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tl
{
ho - > moveDir = 1 ;
ho - > isStanding = false ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 1 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 33 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 65 , - 31 ) ) ) ;
2007-11-19 00:58:28 +02:00
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , 1 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 1 , 1 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 33 , 1 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 65 , 1 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , 33 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 1 , 33 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 33 , 33 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 65 , 33 ) , ho - > id ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x = = details . src . x & & details . dst . y + 1 = = details . src . y ) //t
{
ho - > moveDir = 2 ;
ho - > isStanding = false ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 0 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 32 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 64 , - 31 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 0 , 1 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 32 , 1 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 64 , 1 ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 0 , 33 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 32 , 33 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 64 , 33 ) , ho - > id ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tr
{
ho - > moveDir = 3 ;
ho - > isStanding = false ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 1 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 31 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 63 , - 31 ) ) ) ;
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 2 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , - 31 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 1 , 1 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 31 , 1 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 63 , 1 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , 1 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , - 1 , 33 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 31 , 33 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 63 , 33 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , 33 ) ) ) ;
2007-11-19 00:58:28 +02:00
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 2 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 2 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y = = details . src . y ) //r
{
ho - > moveDir = 4 ;
ho - > isStanding = false ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 1 , 0 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 31 , 0 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 63 , 0 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , 0 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , - 1 , 32 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 31 , 32 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 63 , 32 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , 32 ) ) ) ;
2007-11-19 00:58:28 +02:00
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y - 1 = = details . src . y ) //br
{
ho - > moveDir = 5 ;
ho - > isStanding = false ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 1 , - 1 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 31 , - 1 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 63 , - 1 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , - 1 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , - 1 , 31 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 31 , 31 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 63 , 31 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , 31 ) ) ) ;
2007-11-19 00:58:28 +02:00
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 1 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 31 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 63 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 95 , 63 ) ) ) ;
2007-11-19 00:58:28 +02:00
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y - 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x + 1 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x = = details . src . x & & details . dst . y - 1 = = details . src . y ) //b
{
ho - > moveDir = 6 ;
ho - > isStanding = false ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 0 , - 1 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 32 , - 1 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 64 , - 1 ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 0 , 31 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 32 , 31 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 64 , 31 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 0 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 32 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 64 , 63 ) ) ) ;
2007-11-19 00:58:28 +02:00
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x + 1 = = details . src . x & & details . dst . y - 1 = = details . src . y ) //bl
{
ho - > moveDir = 7 ;
ho - > isStanding = false ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , - 1 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 1 , - 1 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 33 , - 1 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 65 , - 1 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , 31 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 1 , 31 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 33 , 31 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 65 , 31 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 1 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 33 , 63 ) ) ) ;
CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , 65 , 63 ) ) ) ;
2007-11-19 00:58:28 +02:00
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 2 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 1 ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x ] [ hp . y + 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
else if ( details . dst . x + 1 = = details . src . x & & details . dst . y = = details . src . y ) //l
{
ho - > moveDir = 8 ;
ho - > isStanding = false ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , 0 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 1 , 0 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 33 , 0 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 65 , 0 ) , ho - > id ) ;
2008-02-10 19:44:51 +02:00
CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . push_back ( std : : make_pair ( ho , genRect ( 32 , 32 , - 31 , 32 ) ) ) ;
2007-11-19 00:58:28 +02:00
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 1 , 32 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 33 , 32 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 65 , 32 ) , ho - > id ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y - 1 ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ hp . x - 3 ] [ hp . y ] [ hp . z ] . objects . end ( ) , ocmptwo_cgin ) ;
}
//first initializing done
SDL_framerateDelay ( mainFPSmng ) ; // after first move
//main moving
for ( int i = 1 ; i < 32 ; i + = 4 )
{
if ( details . dst . x + 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tl
{
subRect ( hp . x - 3 , hp . y - 2 , hp . z , genRect ( 32 , 32 , - 31 + i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y - 2 , hp . z , genRect ( 32 , 32 , 1 + i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 2 , hp . z , genRect ( 32 , 32 , 33 + i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 2 , hp . z , genRect ( 32 , 32 , 65 + i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 3 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 31 + i , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 1 + i , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 33 + i , 1 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 65 + i , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 3 , hp . y , hp . z , genRect ( 32 , 32 , - 31 + i , 33 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 1 + i , 33 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 33 + i , 33 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 65 + i , 33 + i ) , ho - > id ) ;
}
else if ( details . dst . x = = details . src . x & & details . dst . y + 1 = = details . src . y ) //t
{
subRect ( hp . x - 2 , hp . y - 2 , hp . z , genRect ( 32 , 32 , 0 , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 2 , hp . z , genRect ( 32 , 32 , 32 , - 31 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 2 , hp . z , genRect ( 32 , 32 , 64 , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 0 , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 32 , 1 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 64 , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 0 , 33 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 32 , 33 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 64 , 33 + i ) , ho - > id ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tr
{
subRect ( hp . x - 2 , hp . y - 2 , hp . z , genRect ( 32 , 32 , - 1 - i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 2 , hp . z , genRect ( 32 , 32 , 31 - i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 2 , hp . z , genRect ( 32 , 32 , 63 - i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y - 2 , hp . z , genRect ( 32 , 32 , 95 - i , - 31 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 1 - i , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 31 - i , 1 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 63 - i , 1 + i ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 95 - i , 1 + i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , - 1 - i , 33 + i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 31 - i , 33 + i ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 63 - i , 33 + i ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y , hp . z , genRect ( 32 , 32 , 95 - i , 33 + i ) , ho - > id ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y = = details . src . y ) //r
{
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 1 - i , 0 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 31 - i , 0 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 63 - i , 0 ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 95 - i , 0 ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , - 1 - i , 32 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 31 - i , 32 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 63 - i , 32 ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y , hp . z , genRect ( 32 , 32 , 95 - i , 32 ) , ho - > id ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y - 1 = = details . src . y ) //br
{
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 1 - i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 31 - i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 63 - i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 95 - i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , - 1 - i , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 31 - i , 31 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 63 - i , 31 - i ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y , hp . z , genRect ( 32 , 32 , 95 - i , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y + 1 , hp . z , genRect ( 32 , 32 , - 1 - i , 63 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y + 1 , hp . z , genRect ( 32 , 32 , 31 - i , 63 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y + 1 , hp . z , genRect ( 32 , 32 , 63 - i , 63 - i ) , ho - > id ) ;
subRect ( hp . x + 1 , hp . y + 1 , hp . z , genRect ( 32 , 32 , 95 - i , 63 - i ) , ho - > id ) ;
}
else if ( details . dst . x = = details . src . x & & details . dst . y - 1 = = details . src . y ) //b
{
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 0 , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 32 , - 1 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 64 , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 0 , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 32 , 31 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 64 , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y + 1 , hp . z , genRect ( 32 , 32 , 0 , 63 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y + 1 , hp . z , genRect ( 32 , 32 , 32 , 63 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y + 1 , hp . z , genRect ( 32 , 32 , 64 , 63 - i ) , ho - > id ) ;
}
else if ( details . dst . x + 1 = = details . src . x & & details . dst . y - 1 = = details . src . y ) //bl
{
subRect ( hp . x - 3 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 31 + i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 1 + i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 33 + i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 65 + i , - 1 - i ) , ho - > id ) ;
subRect ( hp . x - 3 , hp . y , hp . z , genRect ( 32 , 32 , - 31 + i , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 1 + i , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 33 + i , 31 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 65 + i , 31 - i ) , ho - > id ) ;
subRect ( hp . x - 3 , hp . y + 1 , hp . z , genRect ( 32 , 32 , - 31 + i , 63 - i ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y + 1 , hp . z , genRect ( 32 , 32 , 1 + i , 63 - i ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y + 1 , hp . z , genRect ( 32 , 32 , 33 + i , 63 - i ) , ho - > id ) ;
subRect ( hp . x , hp . y + 1 , hp . z , genRect ( 32 , 32 , 65 + i , 63 - i ) , ho - > id ) ;
}
else if ( details . dst . x + 1 = = details . src . x & & details . dst . y = = details . src . y ) //l
{
subRect ( hp . x - 3 , hp . y - 1 , hp . z , genRect ( 32 , 32 , - 31 + i , 0 ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 1 + i , 0 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y - 1 , hp . z , genRect ( 32 , 32 , 33 + i , 0 ) , ho - > id ) ;
subRect ( hp . x , hp . y - 1 , hp . z , genRect ( 32 , 32 , 65 + i , 0 ) , ho - > id ) ;
subRect ( hp . x - 3 , hp . y , hp . z , genRect ( 32 , 32 , - 31 + i , 32 ) , ho - > id ) ;
subRect ( hp . x - 2 , hp . y , hp . z , genRect ( 32 , 32 , 1 + i , 32 ) , ho - > id ) ;
subRect ( hp . x - 1 , hp . y , hp . z , genRect ( 32 , 32 , 33 + i , 32 ) , ho - > id ) ;
subRect ( hp . x , hp . y , hp . z , genRect ( 32 , 32 , 65 + i , 32 ) , ho - > id ) ;
}
LOCPLINT - > adventureInt - > update ( ) ; //updating screen
2008-04-25 12:25:59 +03:00
CSDL_Ext : : update ( screen ) ;
2008-08-01 21:13:33 +03:00
//CGI->screenh->updateScreen();
2008-01-07 20:24:05 +02:00
+ + LOCPLINT - > adventureInt - > animValHitCount ; //for animations
2008-08-04 18:56:36 +03:00
if ( LOCPLINT - > adventureInt - > animValHitCount = = 8 )
2008-01-07 20:24:05 +02:00
{
LOCPLINT - > adventureInt - > animValHitCount = 0 ;
+ + LOCPLINT - > adventureInt - > anim ;
LOCPLINT - > adventureInt - > updateScreen = true ;
}
2008-01-08 15:31:44 +02:00
+ + LOCPLINT - > adventureInt - > heroAnim ;
2008-01-07 20:24:05 +02:00
2008-02-11 20:40:10 +02:00
SDL_Delay ( 5 ) ;
2007-11-19 00:58:28 +02:00
SDL_framerateDelay ( mainFPSmng ) ; //for animation purposes
} //for(int i=1; i<32; i+=4)
//main moving done
//finishing move
if ( details . dst . x + 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tl
{
delObjRect ( hp . x , hp . y - 2 , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 1 , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 3 , hp . y , hp . z , ho - > id ) ;
}
else if ( details . dst . x = = details . src . x & & details . dst . y + 1 = = details . src . y ) //t
{
delObjRect ( hp . x , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 1 , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y , hp . z , ho - > id ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tr
{
delObjRect ( hp . x - 2 , hp . y - 2 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x + 1 , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 1 , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y , hp . z , ho - > id ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y = = details . src . y ) //r
{
delObjRect ( hp . x - 2 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y , hp . z , ho - > id ) ;
}
else if ( details . dst . x - 1 = = details . src . x & & details . dst . y - 1 = = details . src . y ) //br
{
delObjRect ( hp . x - 2 , hp . y + 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x + 1 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 1 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y - 1 , hp . z , ho - > id ) ;
}
else if ( details . dst . x = = details . src . x & & details . dst . y - 1 = = details . src . y ) //b
{
delObjRect ( hp . x , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 1 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y - 1 , hp . z , ho - > id ) ;
}
else if ( details . dst . x + 1 = = details . src . x & & details . dst . y - 1 = = details . src . y ) //bl
{
delObjRect ( hp . x , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 1 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 2 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x - 3 , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y + 1 , hp . z , ho - > id ) ;
}
else if ( details . dst . x + 1 = = details . src . x & & details . dst . y = = details . src . y ) //l
{
delObjRect ( hp . x , hp . y - 1 , hp . z , ho - > id ) ;
delObjRect ( hp . x , hp . y , hp . z , ho - > id ) ;
}
ho - > pos = details . dst ; //copy of hero's position
//ho->moveDir = 0; //move ended
ho - > isStanding = true ;
//move finished
2007-11-29 20:45:47 +02:00
CGI - > mh - > recalculateHideVisPosUnderObj ( details . ho , true ) ;
2007-12-01 14:50:33 +02:00
adventureInt - > minimap . draw ( ) ;
2007-12-06 21:19:25 +02:00
adventureInt - > heroList . updateMove ( ho ) ;
2007-11-19 00:58:28 +02:00
}
2007-12-19 02:06:51 +02:00
void CPlayerInterface : : heroKilled ( const CGHeroInstance * hero )
2007-11-19 00:58:28 +02:00
{
2008-08-02 00:41:38 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2008-06-13 11:16:51 +03:00
graphics - > heroWins . erase ( hero - > ID ) ;
2008-08-02 00:41:38 +03:00
adventureInt - > heroList . updateHList ( ) ;
2007-11-19 00:58:28 +02:00
}
void CPlayerInterface : : heroCreated ( const CGHeroInstance * hero )
{
2008-06-13 11:16:51 +03:00
if ( graphics - > heroWins . find ( hero - > subID ) = = graphics - > heroWins . end ( ) )
graphics - > heroWins . insert ( std : : pair < int , SDL_Surface * > ( hero - > subID , infoWin ( hero ) ) ) ;
2007-12-19 02:06:51 +02:00
}
2008-01-09 19:21:31 +02:00
void CPlayerInterface : : openTownWindow ( const CGTownInstance * town )
{
adventureInt - > hide ( ) ;
2008-02-02 02:51:49 +02:00
//timeHandler t;
//t.getDif();
2008-01-09 19:21:31 +02:00
castleInt = new CCastleInterface ( town , true ) ;
2008-02-02 02:51:49 +02:00
//std::cout << "Loading town screen: " << t.getDif() <<std::endl;
2008-01-09 19:21:31 +02:00
}
2007-12-19 02:06:51 +02:00
SDL_Surface * CPlayerInterface : : infoWin ( const CGObjectInstance * specific ) //specific=0 => draws info about selected town/hero
2007-11-19 00:58:28 +02:00
{
if ( specific )
2007-12-19 02:06:51 +02:00
{
switch ( specific - > ID )
{
case 34 :
2008-06-13 11:16:51 +03:00
return graphics - > drawHeroInfoWin ( dynamic_cast < const CGHeroInstance * > ( specific ) ) ;
2007-12-19 02:06:51 +02:00
break ;
2008-02-18 23:14:28 +02:00
case 98 :
2008-06-13 11:16:51 +03:00
return graphics - > drawTownInfoWin ( dynamic_cast < const CGTownInstance * > ( specific ) ) ;
2008-02-18 23:14:28 +02:00
break ;
2007-12-19 02:06:51 +02:00
default :
return NULL ;
break ;
}
}
2007-11-19 00:58:28 +02:00
else
{
2007-12-22 16:40:27 +02:00
switch ( adventureInt - > selection . type )
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
case HEROI_TYPE :
{
const CGHeroInstance * curh = ( const CGHeroInstance * ) adventureInt - > selection . selected ;
2008-06-13 11:16:51 +03:00
return graphics - > drawHeroInfoWin ( curh ) ;
2007-12-22 16:40:27 +02:00
}
case TOWNI_TYPE :
{
2008-06-13 11:16:51 +03:00
return graphics - > drawTownInfoWin ( ( const CGTownInstance * ) adventureInt - > selection . selected ) ;
2007-12-22 16:40:27 +02:00
}
default :
2007-11-19 00:58:28 +02:00
return NULL ;
2007-12-22 16:40:27 +02:00
}
2007-11-19 00:58:28 +02:00
}
return NULL ;
}
2007-12-22 16:40:27 +02:00
void CPlayerInterface : : handleMouseMotion ( SDL_Event * sEvent )
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
for ( int i = 0 ; i < hoverable . size ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
if ( isItIn ( & hoverable [ i ] - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
{
if ( ! hoverable [ i ] - > hovered )
hoverable [ i ] - > hover ( true ) ;
}
else if ( hoverable [ i ] - > hovered )
{
hoverable [ i ] - > hover ( false ) ;
}
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
for ( int i = 0 ; i < motioninterested . size ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-04-04 20:30:53 +03:00
if ( motioninterested [ i ] - > strongInterest | | isItIn ( & motioninterested [ i ] - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
motioninterested [ i ] - > mouseMoved ( sEvent - > motion ) ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
}
if ( sEvent - > motion . x < 15 )
{
LOCPLINT - > adventureInt - > scrollingLeft = true ;
}
else
{
LOCPLINT - > adventureInt - > scrollingLeft = false ;
}
2008-04-25 12:25:59 +03:00
if ( sEvent - > motion . x > screen - > w - 15 )
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingRight = true ;
}
else
{
LOCPLINT - > adventureInt - > scrollingRight = false ;
}
if ( sEvent - > motion . y < 15 )
{
LOCPLINT - > adventureInt - > scrollingUp = true ;
}
else
{
LOCPLINT - > adventureInt - > scrollingUp = false ;
}
2008-04-25 12:25:59 +03:00
if ( sEvent - > motion . y > screen - > h - 15 )
2007-12-22 16:40:27 +02:00
{
LOCPLINT - > adventureInt - > scrollingDown = true ;
}
else
{
LOCPLINT - > adventureInt - > scrollingDown = false ;
}
}
void CPlayerInterface : : handleKeyUp ( SDL_Event * sEvent )
{
switch ( sEvent - > key . keysym . sym )
{
case SDLK_LEFT :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingLeft = false ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_RIGHT ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingRight = false ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_UP ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingUp = false ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_DOWN ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingDown = false ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_u ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
adventureInt - > underground . clickLeft ( false ) ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_m ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
adventureInt - > moveHero . clickLeft ( false ) ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_e ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
adventureInt - > endTurn . clickLeft ( false ) ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
}
}
void CPlayerInterface : : handleKeyDown ( SDL_Event * sEvent )
{
switch ( sEvent - > key . keysym . sym )
{
case SDLK_LEFT :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingLeft = true ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_RIGHT ) :
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
LOCPLINT - > adventureInt - > scrollingRight = true ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_UP ) :
{
LOCPLINT - > adventureInt - > scrollingUp = true ;
break ;
}
case ( SDLK_DOWN ) :
2007-11-19 00:58:28 +02:00
{
LOCPLINT - > adventureInt - > scrollingDown = true ;
2007-12-22 16:40:27 +02:00
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_q ) :
2007-11-19 00:58:28 +02:00
{
2008-06-21 16:27:52 +03:00
continueReadingConsole = false ;
2007-12-22 16:40:27 +02:00
exit ( 0 ) ;
break ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
case ( SDLK_u ) :
{
adventureInt - > underground . clickLeft ( true ) ;
break ;
}
case ( SDLK_m ) :
{
adventureInt - > moveHero . clickLeft ( true ) ;
break ;
}
case ( SDLK_e ) :
{
adventureInt - > endTurn . clickLeft ( true ) ;
break ;
}
}
}
void CPlayerInterface : : handleEvent ( SDL_Event * sEvent )
{
current = sEvent ;
if ( sEvent - > type = = SDL_MOUSEMOTION )
{
CGI - > curh - > cursorMove ( sEvent - > motion . x , sEvent - > motion . y ) ;
}
2008-08-02 18:08:03 +03:00
if ( sEvent - > type = = SDL_QUIT )
2007-12-22 16:40:27 +02:00
exit ( 0 ) ;
else if ( sEvent - > type = = SDL_KEYDOWN )
{
handleKeyDown ( sEvent ) ;
} //keydown end
2008-08-02 18:08:03 +03:00
else if ( sEvent - > type = = SDL_KEYUP )
2007-12-22 16:40:27 +02:00
{
handleKeyUp ( sEvent ) ;
} //keyup end
else if ( sEvent - > type = = SDL_MOUSEMOTION )
{
handleMouseMotion ( sEvent ) ;
2007-11-19 00:58:28 +02:00
} //mousemotion end
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONDOWN ) & & ( sEvent - > button . button = = SDL_BUTTON_LEFT ) )
{
for ( int i = 0 ; i < lclickable . size ( ) ; i + + )
{
if ( isItIn ( & lclickable [ i ] - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
{
lclickable [ i ] - > clickLeft ( true ) ;
}
}
}
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONUP ) & & ( sEvent - > button . button = = SDL_BUTTON_LEFT ) )
{
for ( int i = 0 ; i < lclickable . size ( ) ; i + + )
{
if ( isItIn ( & lclickable [ i ] - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
{
lclickable [ i ] - > clickLeft ( false ) ;
}
else
lclickable [ i ] - > clickLeft ( boost : : logic : : indeterminate ) ;
}
}
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONDOWN ) & & ( sEvent - > button . button = = SDL_BUTTON_RIGHT ) )
{
for ( int i = 0 ; i < rclickable . size ( ) ; i + + )
{
if ( isItIn ( & rclickable [ i ] - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
{
rclickable [ i ] - > clickRight ( true ) ;
}
}
}
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONUP ) & & ( sEvent - > button . button = = SDL_BUTTON_RIGHT ) )
{
for ( int i = 0 ; i < rclickable . size ( ) ; i + + )
{
if ( isItIn ( & rclickable [ i ] - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
{
rclickable [ i ] - > clickRight ( false ) ;
}
else
rclickable [ i ] - > clickRight ( boost : : logic : : indeterminate ) ;
}
}
current = NULL ;
} //event end
int3 CPlayerInterface : : repairScreenPos ( int3 pos )
{
if ( pos . x < = - Woff )
pos . x = - Woff + 1 ;
if ( pos . y < = - Hoff )
pos . y = - Hoff + 1 ;
2008-06-11 04:53:57 +03:00
if ( pos . x > CGI - > mh - > map - > width - this - > adventureInt - > terrain . tilesw + Woff )
pos . x = CGI - > mh - > map - > width - this - > adventureInt - > terrain . tilesw + Woff ;
if ( pos . y > CGI - > mh - > map - > height - this - > adventureInt - > terrain . tilesh + Hoff )
pos . y = CGI - > mh - > map - > height - this - > adventureInt - > terrain . tilesh + Hoff ;
2007-11-19 00:58:28 +02:00
return pos ;
}
void CPlayerInterface : : heroPrimarySkillChanged ( const CGHeroInstance * hero , int which , int val )
{
2008-08-02 00:41:38 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2008-06-13 11:16:51 +03:00
SDL_FreeSurface ( graphics - > heroWins [ hero - > subID ] ) ; //TODO: moznaby zmieniac jedynie fragment bitmapy zwiazany z dana umiejetnoscia
graphics - > heroWins [ hero - > subID ] = infoWin ( hero ) ; //a nie przerysowywac calosc. Troche roboty, obecnie chyba nie wartej swieczki.
2007-11-19 00:58:28 +02:00
if ( adventureInt - > selection . selected = = hero )
adventureInt - > infoBar . draw ( ) ;
return ;
}
2007-11-25 15:16:45 +02:00
void CPlayerInterface : : receivedResource ( int type , int val )
{
adventureInt - > resdatabar . draw ( ) ;
}
2007-12-22 16:40:27 +02:00
2007-12-27 02:11:46 +02:00
void CPlayerInterface : : showSelDialog ( std : : string text , std : : vector < CSelectableComponent * > & components , int askID )
2007-12-25 18:25:53 +02:00
{
2007-12-27 02:11:46 +02:00
adventureInt - > hide ( ) ; //dezaktywacja starego interfejsu
CSelWindow * temp = CMessage : : genSelWindow ( text , LOCPLINT - > playerID , 35 , components , playerID ) ;
LOCPLINT - > objsToBlit . push_back ( temp ) ;
temp - > pos . x = 300 - ( temp - > pos . w / 2 ) ;
temp - > pos . y = 300 - ( temp - > pos . h / 2 ) ;
temp - > okb . pos . x = temp - > okb . posr . x + temp - > pos . x ;
temp - > okb . pos . y = temp - > okb . posr . y + temp - > pos . y ;
temp - > okb . activate ( ) ;
for ( int i = 0 ; i < temp - > components . size ( ) ; i + + )
{
temp - > components [ i ] - > activate ( ) ;
temp - > components [ i ] - > pos . x + = temp - > pos . x ;
temp - > components [ i ] - > pos . y + = temp - > pos . y ;
}
2007-12-28 01:43:36 +02:00
temp - > ID = askID ;
components [ 0 ] - > clickLeft ( true ) ;
2007-12-25 18:25:53 +02:00
}
2008-01-28 16:01:09 +02:00
void CPlayerInterface : : heroVisitsTown ( const CGHeroInstance * hero , const CGTownInstance * town )
{
openTownWindow ( town ) ;
}
void CPlayerInterface : : garrisonChanged ( const CGObjectInstance * obj )
{
2008-08-01 14:21:15 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2008-01-28 16:01:09 +02:00
if ( obj - > ID = = 34 ) //hero
{
const CGHeroInstance * hh ;
if ( hh = dynamic_cast < const CGHeroInstance * > ( obj ) )
{
2008-06-13 11:16:51 +03:00
SDL_FreeSurface ( graphics - > heroWins [ hh - > subID ] ) ;
graphics - > heroWins [ hh - > subID ] = infoWin ( hh ) ;
2008-01-28 16:01:09 +02:00
}
2008-04-19 22:29:00 +03:00
CHeroWindow * hw = dynamic_cast < CHeroWindow * > ( curint ) ;
if ( hw )
{
hw - > garInt - > recreateSlots ( ) ;
hw - > garInt - > show ( ) ;
}
2008-08-02 18:08:03 +03:00
else if ( castleInt = = curint ) //opened town window - redraw town garrsion slots (change is within hero garr)
2008-04-13 14:05:39 +03:00
{
castleInt - > garr - > highlighted = NULL ;
castleInt - > garr - > recreateSlots ( ) ;
}
2008-08-02 18:08:03 +03:00
2008-01-28 16:01:09 +02:00
}
else if ( obj - > ID = = 98 ) //town
{
2008-02-18 23:14:28 +02:00
const CGTownInstance * tt ;
if ( tt = dynamic_cast < const CGTownInstance * > ( obj ) )
{
2008-06-13 11:16:51 +03:00
SDL_FreeSurface ( graphics - > townWins [ tt - > identifier ] ) ;
graphics - > townWins [ tt - > identifier ] = infoWin ( tt ) ;
2008-04-11 20:41:02 +03:00
}
2008-08-02 18:08:03 +03:00
2008-04-11 20:41:02 +03:00
const CCastleInterface * ci = dynamic_cast < CCastleInterface * > ( curint ) ;
if ( ci )
{
ci - > garr - > highlighted = NULL ;
ci - > garr - > recreateSlots ( ) ;
2008-02-18 23:14:28 +02:00
}
2008-01-28 16:01:09 +02:00
}
}
2008-03-23 03:01:17 +02:00
void CPlayerInterface : : buildChanged ( const CGTownInstance * town , int buildingID , int what ) //what: 1 - built, 2 - demolished
{
if ( curint ! = castleInt )
return ;
if ( castleInt - > town ! = town )
return ;
2008-08-01 14:21:15 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2008-03-23 03:01:17 +02:00
switch ( what )
{
case 1 :
castleInt - > addBuilding ( buildingID ) ;
break ;
case 2 :
castleInt - > removeBuilding ( buildingID ) ;
break ;
}
}
2008-02-25 01:06:27 +02:00
2008-08-04 18:56:36 +03:00
void CPlayerInterface : : battleStart ( CCreatureSet * army1 , CCreatureSet * army2 , int3 tile , CGHeroInstance * hero1 , CGHeroInstance * hero2 , bool side ) //called by engine when battle starts; side=0 - left, side=1 - right
2008-04-20 18:56:03 +03:00
{
2008-08-04 18:56:36 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2008-02-25 01:06:27 +02:00
curint - > deactivate ( ) ;
2008-03-14 20:24:37 +02:00
curint = new CBattleInterface ( army1 , army2 , hero1 , hero2 ) ;
2008-02-26 20:01:26 +02:00
curint - > activate ( ) ;
LOCPLINT - > objsToBlit . push_back ( dynamic_cast < IShowable * > ( curint ) ) ;
2008-02-25 01:06:27 +02:00
}
void CPlayerInterface : : battlefieldPrepared ( int battlefieldType , std : : vector < CObstacle * > obstacles ) //called when battlefield is prepared, prior the battle beginning
{
}
void CPlayerInterface : : battleNewRound ( int round ) //called at the beggining of each turn, round=-1 is the tactic phase, round=0 is the first "normal" turn
{
2008-04-19 20:10:57 +03:00
dynamic_cast < CBattleInterface * > ( curint ) - > newRound ( round ) ;
2008-02-25 01:06:27 +02:00
}
2008-03-29 12:59:18 +02:00
void CPlayerInterface : : actionStarted ( BattleAction action ) //occurs BEFORE every action taken by any stack or by the hero
2008-02-25 01:06:27 +02:00
{
}
2008-03-29 12:59:18 +02:00
void CPlayerInterface : : actionFinished ( BattleAction action ) //occurs AFTER every action taken by any stack or by the hero
2008-02-25 01:06:27 +02:00
{
2008-04-15 19:52:31 +03:00
//dynamic_cast<CBattleInterface*>(curint)->givenCommand = -1;
2008-02-25 01:06:27 +02:00
}
2008-04-15 19:52:31 +03:00
BattleAction CPlayerInterface : : activeStack ( int stackID ) //called when it's turn of that stack
2008-02-25 01:06:27 +02:00
{
2008-08-04 18:56:36 +03:00
CBattleInterface * b = dynamic_cast < CBattleInterface * > ( curint ) ;
2008-03-01 00:14:53 +02:00
{
2008-08-04 18:56:36 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
b - > stackActivated ( stackID ) ;
}
//wait till BattleInterface sets its command
boost : : unique_lock < boost : : mutex > lock ( b - > givenCommand - > mx ) ;
while ( ! b - > givenCommand - > data )
b - > givenCommand - > cond . wait ( lock ) ;
2008-08-02 18:08:03 +03:00
2008-08-04 18:56:36 +03:00
//tidy up
BattleAction ret = * ( b - > givenCommand - > data ) ;
delete b - > givenCommand - > data ;
2008-03-03 21:41:10 +02:00
2008-08-04 18:56:36 +03:00
//return command
2008-04-15 19:52:31 +03:00
return ret ;
2008-02-25 01:06:27 +02:00
}
2008-08-04 18:56:36 +03:00
void CPlayerInterface : : battleEnd ( BattleResult * br )
2008-02-25 01:06:27 +02:00
{
2008-08-04 18:56:36 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2008-04-15 19:52:31 +03:00
dynamic_cast < CBattleInterface * > ( curint ) - > deactivate ( ) ;
2008-04-15 20:12:21 +03:00
LOCPLINT - > objsToBlit . erase ( std : : find ( LOCPLINT - > objsToBlit . begin ( ) , LOCPLINT - > objsToBlit . end ( ) , dynamic_cast < IShowable * > ( curint ) ) ) ;
2008-04-15 19:52:31 +03:00
delete dynamic_cast < CBattleInterface * > ( curint ) ;
2008-04-15 20:12:21 +03:00
curint = adventureInt ;
adventureInt - > activate ( ) ;
2008-02-25 01:06:27 +02:00
}
2008-04-14 21:24:46 +03:00
void CPlayerInterface : : battleStackMoved ( int ID , int dest , bool startMoving , bool endMoving )
2008-03-23 19:25:38 +02:00
{
2008-04-14 21:24:46 +03:00
dynamic_cast < CBattleInterface * > ( curint ) - > stackMoved ( ID , dest , startMoving , endMoving ) ;
2008-03-23 19:25:38 +02:00
}
2008-04-07 20:51:46 +03:00
void CPlayerInterface : : battleStackAttacking ( int ID , int dest )
{
dynamic_cast < CBattleInterface * > ( curint ) - > stackAttacking ( ID , dest ) ;
}
2008-08-02 18:08:03 +03:00
void CPlayerInterface : : battleStackIsAttacked ( int ID , int dmg , int killed , int IDby , bool byShooting )
{
dynamic_cast < CBattleInterface * > ( curint ) - > stackIsAttacked ( ID , dmg , killed , IDby , byShooting ) ;
}
void CPlayerInterface : : battleStackKilled ( int ID , int dmg , int killed , int IDby , bool byShooting )
2008-05-27 16:16:35 +03:00
{
2008-08-02 18:08:03 +03:00
dynamic_cast < CBattleInterface * > ( curint ) - > stackKilled ( ID , dmg , killed , IDby , byShooting ) ;
2008-05-27 16:16:35 +03:00
}
2008-08-02 18:08:03 +03:00
void CPlayerInterface : : battleStackIsShooting ( int ID , int dest )
2008-05-30 14:53:04 +03:00
{
2008-08-02 18:08:03 +03:00
dynamic_cast < CBattleInterface * > ( curint ) - > stackIsShooting ( ID , dest ) ;
2008-05-30 14:53:04 +03:00
}
2007-12-22 16:40:27 +02:00
void CPlayerInterface : : showComp ( SComponent comp )
{
2008-08-04 18:56:36 +03:00
boost : : unique_lock < boost : : mutex > un ( * pim ) ;
2007-12-22 20:04:34 +02:00
adventureInt - > infoBar . showComp ( & comp , 4000 ) ;
2007-12-22 16:40:27 +02:00
}
2008-07-31 00:27:15 +03:00
void CPlayerInterface : : showInfoDialog ( std : : string text , std : : vector < Component * > & components )
{
curint - > deactivate ( ) ; //dezaktywacja starego interfejsu
std : : vector < SComponent * > intComps ;
2008-07-31 13:35:22 +03:00
for ( int i = 0 ; i < components . size ( ) ; i + + )
intComps . push_back ( new SComponent ( * components [ i ] ) ) ;
2008-07-31 00:27:15 +03:00
CInfoWindow * temp = CMessage : : genIWindow ( text , LOCPLINT - > playerID , 32 , intComps ) ;
LOCPLINT - > objsToBlit . push_back ( temp ) ;
temp - > pos . x = 300 - ( temp - > pos . w / 2 ) ;
temp - > pos . y = 300 - ( temp - > pos . h / 2 ) ;
temp - > okb . pos . x = temp - > okb . posr . x + temp - > pos . x ;
temp - > okb . pos . y = temp - > okb . posr . y + temp - > pos . y ;
temp - > okb . activate ( ) ;
for ( int i = 0 ; i < temp - > components . size ( ) ; i + + )
{
temp - > components [ i ] - > activate ( ) ;
temp - > components [ i ] - > pos . x + = temp - > pos . x ;
temp - > components [ i ] - > pos . y + = temp - > pos . y ;
}
}
2007-11-24 00:33:55 +02:00
void CPlayerInterface : : showInfoDialog ( std : : string text , std : : vector < SComponent * > & components )
{
2008-01-20 14:34:39 +02:00
curint - > deactivate ( ) ; //dezaktywacja starego interfejsu
2007-11-24 00:33:55 +02:00
CInfoWindow * temp = CMessage : : genIWindow ( text , LOCPLINT - > playerID , 32 , components ) ;
LOCPLINT - > objsToBlit . push_back ( temp ) ;
temp - > pos . x = 300 - ( temp - > pos . w / 2 ) ;
temp - > pos . y = 300 - ( temp - > pos . h / 2 ) ;
temp - > okb . pos . x = temp - > okb . posr . x + temp - > pos . x ;
temp - > okb . pos . y = temp - > okb . posr . y + temp - > pos . y ;
temp - > okb . activate ( ) ;
2007-11-24 16:17:57 +02:00
for ( int i = 0 ; i < temp - > components . size ( ) ; i + + )
{
temp - > components [ i ] - > activate ( ) ;
temp - > components [ i ] - > pos . x + = temp - > pos . x ;
temp - > components [ i ] - > pos . y + = temp - > pos . y ;
}
2007-11-24 00:33:55 +02:00
}
2007-12-01 14:50:33 +02:00
void CPlayerInterface : : removeObjToBlit ( IShowable * obj )
2007-11-19 00:58:28 +02:00
{
2007-11-24 00:33:55 +02:00
objsToBlit . erase
( std : : find ( objsToBlit . begin ( ) , objsToBlit . end ( ) , obj ) ) ;
//delete obj;
2007-12-06 20:55:58 +02:00
}
void CPlayerInterface : : tileRevealed ( int3 pos )
{
2007-12-06 21:54:31 +02:00
adventureInt - > minimap . showTile ( pos ) ;
2007-12-06 20:55:58 +02:00
}
void CPlayerInterface : : tileHidden ( int3 pos )
{
2007-12-06 21:54:31 +02:00
adventureInt - > minimap . hideTile ( pos ) ;
2007-12-06 20:55:58 +02:00
}
2008-01-10 21:01:25 +02:00
void CPlayerInterface : : openHeroWindow ( const CGHeroInstance * hero )
{
2008-01-11 20:56:39 +02:00
adventureInt - > heroWindow - > setHero ( hero ) ;
this - > objsToBlit . push_back ( adventureInt - > heroWindow ) ;
adventureInt - > hide ( ) ;
2008-01-26 21:36:31 +02:00
adventureInt - > heroWindow - > activate ( ) ;
2008-01-27 22:37:10 +02:00
}
CStatusBar : : CStatusBar ( int x , int y , std : : string name , int maxw )
{
2008-06-12 09:45:51 +03:00
bg = BitmapHandler : : loadBitmap ( name ) ;
2008-01-27 22:37:10 +02:00
SDL_SetColorKey ( bg , SDL_SRCCOLORKEY , SDL_MapRGB ( bg - > format , 0 , 255 , 255 ) ) ;
pos . x = x ;
pos . y = y ;
if ( maxw > = 0 )
2008-07-27 20:07:37 +03:00
pos . w = min ( bg - > w , maxw ) ;
2008-01-27 22:37:10 +02:00
else
pos . w = bg - > w ;
pos . h = bg - > h ;
middlex = ( pos . w / 2 ) + x ;
middley = ( bg - > h / 2 ) + y ;
}
CStatusBar : : ~ CStatusBar ( )
{
SDL_FreeSurface ( bg ) ;
}
void CStatusBar : : clear ( )
{
current = " " ;
SDL_Rect pom = genRect ( pos . h , pos . w , pos . x , pos . y ) ;
2008-04-25 12:25:59 +03:00
SDL_BlitSurface ( bg , & genRect ( pos . h , pos . w , 0 , 0 ) , screen , & pom ) ;
2008-01-27 22:37:10 +02:00
}
void CStatusBar : : print ( std : : string text )
{
current = text ;
SDL_Rect pom = genRect ( pos . h , pos . w , pos . x , pos . y ) ;
2008-04-25 12:25:59 +03:00
SDL_BlitSurface ( bg , & genRect ( pos . h , pos . w , 0 , 0 ) , screen , & pom ) ;
2008-01-27 22:37:10 +02:00
printAtMiddle ( current , middlex , middley , GEOR13 , zwykly ) ;
}
void CStatusBar : : show ( )
{
SDL_Rect pom = genRect ( pos . h , pos . w , pos . x , pos . y ) ;
2008-04-25 12:25:59 +03:00
SDL_BlitSurface ( bg , & genRect ( pos . h , pos . w , 0 , 0 ) , screen , & pom ) ;
2008-01-27 22:37:10 +02:00
printAtMiddle ( current , middlex , middley , GEOR13 , zwykly ) ;
}
std : : string CStatusBar : : getCurrent ( )
{
return current ;
2008-01-31 23:35:30 +02:00
}
void CList : : activate ( )
{
ClickableL : : activate ( ) ;
ClickableR : : activate ( ) ;
Hoverable : : activate ( ) ;
KeyInterested : : activate ( ) ;
MotionInterested : : activate ( ) ;
2008-08-02 18:08:03 +03:00
} ;
2008-01-31 23:35:30 +02:00
void CList : : deactivate ( )
{
ClickableL : : deactivate ( ) ;
ClickableR : : deactivate ( ) ;
Hoverable : : deactivate ( ) ;
KeyInterested : : deactivate ( ) ;
MotionInterested : : deactivate ( ) ;
2008-08-02 18:08:03 +03:00
} ;
2008-01-31 23:35:30 +02:00
void CList : : clickLeft ( tribool down )
{
} ;
CList : : CList ( int Size )
: SIZE ( Size )
{
}
CHeroList : : CHeroList ( int Size )
: CList ( Size )
{
pos = genRect ( 192 , 64 , 609 , 196 ) ;
2008-08-02 18:08:03 +03:00
2008-01-31 23:35:30 +02:00
arrupp = genRect ( 16 , 64 , 609 , 196 ) ;
arrdop = genRect ( 16 , 64 , 609 , 372 ) ;
//32px per hero
posmobx = 610 ;
posmoby = 213 ;
posporx = 617 ;
pospory = 212 ;
posmanx = 666 ;
posmany = 213 ;
2008-08-02 18:08:03 +03:00
2008-06-12 09:45:51 +03:00
arrup = CDefHandler : : giveDef ( " IAM012.DEF " ) ;
arrdo = CDefHandler : : giveDef ( " IAM013.DEF " ) ;
mobile = CDefHandler : : giveDef ( " IMOBIL.DEF " ) ;
mana = CDefHandler : : giveDef ( " IMANA.DEF " ) ;
empty = BitmapHandler : : loadBitmap ( " HPSXXX.bmp " ) ;
selection = BitmapHandler : : loadBitmap ( " HPSYYY.bmp " ) ;
2008-01-31 23:35:30 +02:00
SDL_SetColorKey ( selection , SDL_SRCCOLORKEY , SDL_MapRGB ( selection - > format , 0 , 255 , 255 ) ) ;
from = 0 ;
pressed = indeterminate ;
}
void CHeroList : : init ( )
{
2008-04-25 12:25:59 +03:00
bg = CSDL_Ext : : newSurface ( 68 , 193 , screen ) ;
2008-01-31 23:35:30 +02:00
SDL_BlitSurface ( LOCPLINT - > adventureInt - > bg , & genRect ( 193 , 68 , 607 , 196 ) , bg , & genRect ( 193 , 68 , 0 , 0 ) ) ;
}
void CHeroList : : genList ( )
{
int howMany = LOCPLINT - > cb - > howManyHeroes ( ) ;
for ( int i = 0 ; i < howMany ; i + + )
{
items . push_back ( std : : pair < const CGHeroInstance * , CPath * > ( LOCPLINT - > cb - > getHeroInfo ( LOCPLINT - > playerID , i , 0 ) , NULL ) ) ;
}
}
void CHeroList : : select ( int which )
{
2008-02-15 20:40:58 +02:00
if ( which < 0 )
{
selected = which ;
LOCPLINT - > adventureInt - > selection . selected = LOCPLINT - > adventureInt - > terrain . currentPath = NULL ;
draw ( ) ;
LOCPLINT - > adventureInt - > infoBar . draw ( NULL ) ;
}
2008-08-02 18:08:03 +03:00
if ( which > = items . size ( ) )
2008-01-31 23:35:30 +02:00
return ;
2008-02-03 06:22:58 +02:00
selected = which ;
2008-01-31 23:35:30 +02:00
LOCPLINT - > adventureInt - > centerOn ( items [ which ] . first - > pos ) ;
LOCPLINT - > adventureInt - > selection . type = HEROI_TYPE ;
LOCPLINT - > adventureInt - > selection . selected = items [ which ] . first ;
LOCPLINT - > adventureInt - > terrain . currentPath = items [ which ] . second ;
draw ( ) ;
LOCPLINT - > adventureInt - > townList . draw ( ) ;
2008-08-02 18:08:03 +03:00
2008-01-31 23:35:30 +02:00
LOCPLINT - > adventureInt - > infoBar . draw ( NULL ) ;
}
void CHeroList : : clickLeft ( tribool down )
{
if ( down )
{
/***************************ARROWS*****************************************/
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & from > 0 )
{
blitAt ( arrup - > ourImages [ 1 ] . bitmap , arrupp . x , arrupp . y ) ;
pressed = true ;
return ;
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & ( items . size ( ) - from > 5 ) )
{
blitAt ( arrdo - > ourImages [ 1 ] . bitmap , arrdop . x , arrdop . y ) ;
pressed = false ;
return ;
}
/***************************HEROES*****************************************/
int hx = LOCPLINT - > current - > motion . x , hy = LOCPLINT - > current - > motion . y ;
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
2008-04-20 18:56:03 +03:00
int ny = hy / 32 ;
2008-01-31 23:35:30 +02:00
if ( ny > = 5 | | ny < 0 )
return ;
2008-04-20 18:56:03 +03:00
if ( ( ny + from ) = = selected & & ( LOCPLINT - > adventureInt - > selection . type = = HEROI_TYPE ) )
2008-01-31 23:35:30 +02:00
LOCPLINT - > openHeroWindow ( items [ selected ] . first ) ; //print hero screen
select ( ny + from ) ;
}
else
{
if ( indeterminate ( pressed ) )
return ;
if ( pressed ) //up
{
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y ) ;
pressed = indeterminate ;
if ( ! down )
{
from - - ;
if ( from < 0 )
from = 0 ;
draw ( ) ;
}
}
else if ( ! pressed ) //down
{
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y ) ;
pressed = indeterminate ;
if ( ! down )
{
from + + ;
//if (from<items.size()-5)
// from=items.size()-5;
draw ( ) ;
}
}
else
throw 0 ;
}
}
void CHeroList : : mouseMoved ( SDL_MouseMotionEvent & sEvent )
{
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( from > 0 )
2008-02-06 07:12:59 +02:00
LOCPLINT - > adventureInt - > statusbar . print ( CGI - > preth - > zelp [ 303 ] . first ) ;
2008-01-31 23:35:30 +02:00
else
LOCPLINT - > adventureInt - > statusbar . clear ( ) ;
return ;
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( ( items . size ( ) - from ) > 5 )
2008-02-06 07:12:59 +02:00
LOCPLINT - > adventureInt - > statusbar . print ( CGI - > preth - > zelp [ 304 ] . first ) ;
2008-01-31 23:35:30 +02:00
else
LOCPLINT - > adventureInt - > statusbar . clear ( ) ;
return ;
}
//if not buttons then heroes
int hx = LOCPLINT - > current - > motion . x , hy = LOCPLINT - > current - > motion . y ;
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
2008-04-20 18:56:03 +03:00
int ny = hy / 32 ;
2008-01-31 23:35:30 +02:00
if ( ( ny > 5 | | ny < 0 ) | | ( from + ny > = items . size ( ) ) )
{
LOCPLINT - > adventureInt - > statusbar . clear ( ) ;
return ;
}
std : : vector < std : : string > temp ;
temp . push_back ( items [ from + ny ] . first - > name ) ;
temp . push_back ( items [ from + ny ] . first - > type - > heroClass - > name ) ;
LOCPLINT - > adventureInt - > statusbar . print ( processStr ( CGI - > generaltexth - > allTexts [ 15 ] , temp ) ) ;
//select(ny+from);
}
void CHeroList : : clickRight ( tribool down )
{
if ( down )
{
/***************************ARROWS*****************************************/
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & from > 0 )
{
2008-02-06 07:12:59 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 303 ] . second , down , this ) ;
2008-01-31 23:35:30 +02:00
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & ( items . size ( ) - from > 5 ) )
{
2008-02-06 07:12:59 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 304 ] . second , down , this ) ;
2008-01-31 23:35:30 +02:00
}
2008-02-23 00:26:31 +02:00
//if not buttons then heroes
int hx = LOCPLINT - > current - > motion . x , hy = LOCPLINT - > current - > motion . y ;
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
2008-04-20 18:56:03 +03:00
int ny = hy / 32 ;
2008-02-23 00:26:31 +02:00
if ( ( ny > 5 | | ny < 0 ) | | ( from + ny > = items . size ( ) ) )
{
return ;
}
//show popup
2008-06-13 11:16:51 +03:00
CInfoPopup * ip = new CInfoPopup ( graphics - > heroWins [ items [ from + ny ] . first - > subID ] , LOCPLINT - > current - > motion . x - graphics - > heroWins [ items [ from + ny ] . first - > subID ] - > w , LOCPLINT - > current - > motion . y - graphics - > heroWins [ items [ from + ny ] . first - > subID ] - > h , false ) ;
2008-02-23 00:26:31 +02:00
ip - > activate ( ) ;
2008-01-31 23:35:30 +02:00
}
else
{
2008-02-06 07:12:59 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 303 ] . second , down , this ) ;
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 304 ] . second , down , this ) ;
2008-01-31 23:35:30 +02:00
}
}
void CHeroList : : hover ( bool on )
{
}
void CHeroList : : keyPressed ( SDL_KeyboardEvent & key )
{
}
void CHeroList : : updateHList ( )
{
items . clear ( ) ;
genList ( ) ;
2008-02-15 20:40:58 +02:00
if ( selected > = items . size ( ) )
select ( items . size ( ) - 1 ) ;
2008-03-02 15:16:11 +02:00
if ( items . size ( ) = = 0 )
LOCPLINT - > adventureInt - > townList . select ( 0 ) ;
else
select ( selected ) ;
2008-01-31 23:35:30 +02:00
}
void CHeroList : : updateMove ( const CGHeroInstance * which ) //draws move points bar
{
int ser = LOCPLINT - > cb - > getHeroSerial ( which ) ;
ser - = from ;
int pom = ( which - > movement ) / 100 ;
blitAt ( mobile - > ourImages [ pom ] . bitmap , posmobx , posmoby + ser * 32 ) ; //move point
}
void CHeroList : : draw ( )
2008-08-02 18:08:03 +03:00
{
2008-01-31 23:35:30 +02:00
for ( int iT = 0 + from ; iT < 5 + from ; iT + + )
{
int i = iT - from ;
if ( iT > = items . size ( ) )
{
blitAt ( mobile - > ourImages [ 0 ] . bitmap , posmobx , posmoby + i * 32 ) ;
blitAt ( mana - > ourImages [ 0 ] . bitmap , posmanx , posmany + i * 32 ) ;
blitAt ( empty , posporx , pospory + i * 32 ) ;
continue ;
}
int pom = ( LOCPLINT - > cb - > getHeroInfo ( LOCPLINT - > playerID , iT , 0 ) - > movement ) / 100 ;
if ( pom > 25 ) pom = 25 ;
if ( pom < 0 ) pom = 0 ;
blitAt ( mobile - > ourImages [ pom ] . bitmap , posmobx , posmoby + i * 32 ) ; //move point
pom = ( LOCPLINT - > cb - > getHeroInfo ( LOCPLINT - > playerID , iT , 0 ) - > mana ) / 5 ; //bylo: .../10;
if ( pom > 25 ) pom = 25 ;
if ( pom < 0 ) pom = 0 ;
blitAt ( mana - > ourImages [ pom ] . bitmap , posmanx , posmany + i * 32 ) ; //mana
2008-08-02 18:08:03 +03:00
SDL_Surface * temp = graphics - > portraitSmall [ LOCPLINT - > cb - > getHeroInfo ( LOCPLINT - > playerID , iT , 0 ) - > portrait ] ;
2008-01-31 23:35:30 +02:00
blitAt ( temp , posporx , pospory + i * 32 ) ;
if ( ( selected = = iT ) & & ( LOCPLINT - > adventureInt - > selection . type = = HEROI_TYPE ) )
{
blitAt ( selection , posporx , pospory + i * 32 ) ;
}
//TODO: support for custom portraits
}
if ( from > 0 )
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y ) ;
else
blitAt ( arrup - > ourImages [ 2 ] . bitmap , arrupp . x , arrupp . y ) ;
if ( items . size ( ) - from > 5 )
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y ) ;
else
blitAt ( arrdo - > ourImages [ 2 ] . bitmap , arrdop . x , arrdop . y ) ;
2008-03-02 15:16:11 +02:00
}
2008-05-18 20:33:39 +03:00
CTownList : : ~ CTownList ( )
{
delete arrup ;
delete arrdo ;
}
CTownList : : CTownList ( int Size , SDL_Rect * Pos , int arupx , int arupy , int ardox , int ardoy )
: CList ( Size )
{
pos = * Pos ;
2008-06-12 09:45:51 +03:00
arrup = CDefHandler : : giveDef ( " IAM014.DEF " ) ;
arrdo = CDefHandler : : giveDef ( " IAM015.DEF " ) ;
2008-05-18 20:33:39 +03:00
arrupp . x = arupx ;
arrupp . y = arupy ;
arrupp . w = arrup - > ourImages [ 0 ] . bitmap - > w ;
arrupp . h = arrup - > ourImages [ 0 ] . bitmap - > h ;
arrdop . x = ardox ;
arrdop . y = ardoy ;
arrdop . w = arrdo - > ourImages [ 0 ] . bitmap - > w ;
arrdop . h = arrdo - > ourImages [ 0 ] . bitmap - > h ;
posporx = arrdop . x ;
pospory = arrupp . y + arrupp . h ;
pressed = indeterminate ;
from = 0 ;
2008-08-02 18:08:03 +03:00
2008-05-18 20:33:39 +03:00
}
void CTownList : : genList ( )
{
int howMany = LOCPLINT - > cb - > howManyTowns ( ) ;
for ( int i = 0 ; i < howMany ; i + + )
{
items . push_back ( LOCPLINT - > cb - > getTownInfo ( i , 0 ) ) ;
}
}
void CTownList : : select ( int which )
{
2008-08-02 18:08:03 +03:00
if ( which > = items . size ( ) )
2008-05-18 20:33:39 +03:00
return ;
selected = which ;
if ( ! fun . empty ( ) )
fun ( ) ;
}
void CTownList : : mouseMoved ( SDL_MouseMotionEvent & sEvent )
{
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( from > 0 )
LOCPLINT - > statusbar - > print ( CGI - > preth - > zelp [ 306 ] . first ) ;
else
LOCPLINT - > statusbar - > clear ( ) ;
return ;
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( ( items . size ( ) - from ) > SIZE )
LOCPLINT - > statusbar - > print ( CGI - > preth - > zelp [ 307 ] . first ) ;
else
LOCPLINT - > statusbar - > clear ( ) ;
return ;
}
//if not buttons then towns
int hx = LOCPLINT - > current - > motion . x , hy = LOCPLINT - > current - > motion . y ;
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
if ( ( ny > SIZE | | ny < 0 ) | | ( from + ny > = items . size ( ) ) )
{
LOCPLINT - > statusbar - > clear ( ) ;
return ;
} ;
2008-07-27 20:07:37 +03:00
LOCPLINT - > statusbar - > print ( items [ from + ny ] - > name ) ;
2008-05-18 20:33:39 +03:00
}
void CTownList : : clickLeft ( tribool down )
{
if ( down )
{
/***************************ARROWS*****************************************/
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & from > 0 )
{
blitAt ( arrup - > ourImages [ 1 ] . bitmap , arrupp . x , arrupp . y ) ;
pressed = true ;
return ;
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & ( items . size ( ) - from > SIZE ) )
{
blitAt ( arrdo - > ourImages [ 1 ] . bitmap , arrdop . x , arrdop . y ) ;
pressed = false ;
return ;
}
/***************************TOWNS*****************************************/
int hx = LOCPLINT - > current - > motion . x , hy = LOCPLINT - > current - > motion . y ;
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
if ( ny > SIZE | | ny < 0 )
return ;
if ( SIZE = = 5 & & ( ny + from ) = = selected & & ( LOCPLINT - > adventureInt - > selection . type = = TOWNI_TYPE ) )
LOCPLINT - > openTownWindow ( items [ selected ] ) ; //print town screen
else
select ( ny + from ) ;
}
else
{
if ( indeterminate ( pressed ) )
return ;
if ( pressed ) //up
{
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y ) ;
pressed = indeterminate ;
if ( ! down )
{
from - - ;
if ( from < 0 )
from = 0 ;
draw ( ) ;
}
}
else if ( ! pressed ) //down
{
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y ) ;
pressed = indeterminate ;
if ( ! down )
{
from + + ;
//if (from<items.size()-5)
// from=items.size()-5;
draw ( ) ;
}
}
else
throw 0 ;
}
}
void CTownList : : clickRight ( tribool down )
2008-08-02 18:08:03 +03:00
{
2008-05-18 20:33:39 +03:00
if ( down )
{
/***************************ARROWS*****************************************/
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & from > 0 )
{
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 306 ] . second , down , this ) ;
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & ( items . size ( ) - from > 5 ) )
{
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 307 ] . second , down , this ) ;
}
//if not buttons then towns
int hx = LOCPLINT - > current - > motion . x , hy = LOCPLINT - > current - > motion . y ;
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
if ( ( ny > 5 | | ny < 0 ) | | ( from + ny > = items . size ( ) ) )
{
return ;
}
//show popup
2008-06-13 11:16:51 +03:00
CInfoPopup * ip = new CInfoPopup ( graphics - > townWins [ items [ from + ny ] - > identifier ] , LOCPLINT - > current - > motion . x - graphics - > townWins [ items [ from + ny ] - > identifier ] - > w , LOCPLINT - > current - > motion . y - graphics - > townWins [ items [ from + ny ] - > identifier ] - > h , false ) ;
2008-05-18 20:33:39 +03:00
ip - > activate ( ) ;
}
else
{
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 306 ] . second , down , this ) ;
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > preth - > zelp [ 307 ] . second , down , this ) ;
}
}
void CTownList : : hover ( bool on )
{
}
void CTownList : : keyPressed ( SDL_KeyboardEvent & key )
{
}
void CTownList : : draw ( )
2008-08-02 18:08:03 +03:00
{
2008-05-18 20:33:39 +03:00
for ( int iT = 0 + from ; iT < SIZE + from ; iT + + )
{
int i = iT - from ;
if ( iT > = items . size ( ) )
{
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > getPic ( - 1 ) , posporx , pospory + i * 32 ) ;
2008-05-18 20:33:39 +03:00
continue ;
}
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > getPic ( items [ iT ] - > subID , items [ iT ] - > hasFort ( ) , items [ iT ] - > builded ) , posporx , pospory + i * 32 ) ;
2008-05-18 20:33:39 +03:00
if ( ( selected = = iT ) & & ( LOCPLINT - > adventureInt - > selection . type = = TOWNI_TYPE ) )
{
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > getPic ( - 2 ) , posporx , pospory + i * 32 ) ;
2008-05-18 20:33:39 +03:00
}
}
if ( from > 0 )
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y ) ;
else
blitAt ( arrup - > ourImages [ 2 ] . bitmap , arrupp . x , arrupp . y ) ;
if ( items . size ( ) - from > SIZE )
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y ) ;
else
blitAt ( arrdo - > ourImages [ 2 ] . bitmap , arrdop . x , arrdop . y ) ;
}
2008-06-04 16:00:56 +03:00
CCreaturePic : : CCreaturePic ( CCreature * cre )
: c ( cre )
{
anim = new CCreatureAnimation ( cre - > animDefName ) ;
}
CCreaturePic : : ~ CCreaturePic ( )
{
delete anim ;
}
int CCreaturePic : : blitPic ( SDL_Surface * to , int x , int y , bool nextFrame )
{
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > backgrounds [ c - > faction ] , x , y ) ; //curx-50,pos.y+130-65);
2008-06-04 16:00:56 +03:00
SDL_Rect dst = genRect ( 130 , 100 , x , y ) ;
if ( c - > isDoubleWide ( ) )
x - = 15 ;
return anim - > nextFrameMiddle ( to , x + 70 , y + 45 , true , nextFrame , false , & dst ) ;
}
SDL_Surface * CCreaturePic : : getPic ( bool nextFrame )
{
//TODO: write
return NULL ;
}
2008-04-04 20:30:53 +03:00
void CRecrutationWindow : : close ( )
{
deactivate ( ) ;
delete this ;
LOCPLINT - > curint - > activate ( ) ;
CCastleInterface * pom ;
if ( pom = dynamic_cast < CCastleInterface * > ( LOCPLINT - > curint ) )
pom - > showAll ( ) ;
}
void CRecrutationWindow : : Max ( )
{
slider - > moveTo ( slider - > amount ) ;
}
void CRecrutationWindow : : Buy ( )
{
2008-06-04 16:00:56 +03:00
recruit ( creatures [ which ] . ID , slider - > value ) ;
2008-04-04 20:30:53 +03:00
close ( ) ;
}
void CRecrutationWindow : : Cancel ( )
{
close ( ) ;
}
void CRecrutationWindow : : sliderMoved ( int to )
{
}
void CRecrutationWindow : : clickLeft ( tribool down )
{
2008-04-15 20:12:21 +03:00
int curx = 192 + 51 - ( 102 * creatures . size ( ) / 2 ) - ( 18 * ( creatures . size ( ) - 1 ) / 2 ) ;
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
if ( isItIn ( & genRect ( 132 , 102 , pos . x + curx , pos . y + 64 ) , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
2008-08-02 18:08:03 +03:00
which = i ;
2008-07-27 20:07:37 +03:00
int newAmount = min ( amounts [ i ] , creatures [ i ] . amount ) ;
2008-05-12 08:46:04 +03:00
slider - > amount = newAmount ;
if ( slider - > value > newAmount )
slider - > moveTo ( newAmount ) ;
else
slider - > moveTo ( slider - > value ) ;
2008-04-15 20:12:21 +03:00
curx = 192 + 51 - ( 102 * creatures . size ( ) / 2 ) - ( 18 * ( creatures . size ( ) - 1 ) / 2 ) ;
for ( int j = 0 ; j < creatures . size ( ) ; j + + )
{
if ( which = = j )
drawBorder ( bitmap , curx , 64 , 102 , 132 , int3 ( 255 , 0 , 0 ) ) ;
else
drawBorder ( bitmap , curx , 64 , 102 , 132 , int3 ( 239 , 215 , 123 ) ) ;
curx + = 120 ;
}
break ;
}
curx + = 120 ;
}
2008-04-04 20:30:53 +03:00
}
void CRecrutationWindow : : activate ( )
{
LOCPLINT - > objsToBlit . push_back ( this ) ;
2008-04-15 20:12:21 +03:00
ClickableL : : activate ( ) ;
2008-04-04 20:30:53 +03:00
buy - > activate ( ) ;
max - > activate ( ) ;
cancel - > activate ( ) ;
slider - > activate ( ) ;
}
void CRecrutationWindow : : deactivate ( )
{
LOCPLINT - > objsToBlit . erase ( std : : find ( LOCPLINT - > objsToBlit . begin ( ) , LOCPLINT - > objsToBlit . end ( ) , this ) ) ;
2008-04-15 20:12:21 +03:00
ClickableL : : deactivate ( ) ;
2008-04-04 20:30:53 +03:00
buy - > deactivate ( ) ;
max - > deactivate ( ) ;
cancel - > deactivate ( ) ;
slider - > deactivate ( ) ;
}
void CRecrutationWindow : : show ( SDL_Surface * to )
{
static char c = 0 ;
2008-04-25 12:25:59 +03:00
blitAt ( bitmap , pos . x , pos . y , to ? to : screen ) ;
2008-04-04 20:30:53 +03:00
buy - > show ( ) ;
max - > show ( ) ;
cancel - > show ( ) ;
slider - > show ( ) ;
char pom [ 15 ] ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( creatures [ which ] . amount , pom , 10 ) ; //available
2008-04-25 12:25:59 +03:00
printAtMiddle ( pom , pos . x + 205 , pos . y + 252 , GEOR13 , zwykly , screen ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( slider - > value , pom , 10 ) ; //recruit
2008-04-25 12:25:59 +03:00
printAtMiddle ( pom , pos . x + 279 , pos . y + 252 , GEOR13 , zwykly , screen ) ;
printAtMiddle ( CGI - > generaltexth - > allTexts [ 16 ] + " " + CGI - > creh - > creatures [ creatures [ which ] . ID ] . namePl , pos . x + 243 , pos . y + 32 , GEOR16 , tytulowy , screen ) ; //eg "Recruit Dragon flies"
2008-04-04 20:30:53 +03:00
int curx = pos . x + 115 - creatures [ which ] . res . size ( ) * 16 ;
for ( int i = 0 ; i < creatures [ which ] . res . size ( ) ; i + + )
{
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > resources32 - > ourImages [ creatures [ which ] . res [ i ] . first ] . bitmap , curx , pos . y + 243 , screen ) ;
blitAt ( graphics - > resources32 - > ourImages [ creatures [ which ] . res [ i ] . first ] . bitmap , curx + 258 , pos . y + 243 , screen ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( creatures [ which ] . res [ i ] . second , pom , 10 ) ;
2008-04-25 12:25:59 +03:00
printAtMiddle ( pom , curx + 12 , pos . y + 286 , GEOR13 , zwykly , screen ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( creatures [ which ] . res [ i ] . second * slider - > value , pom , 10 ) ;
2008-04-25 12:25:59 +03:00
printAtMiddle ( pom , curx + 12 + 258 , pos . y + 286 , GEOR13 , zwykly , screen ) ;
2008-04-04 20:30:53 +03:00
curx + = 32 ;
}
curx = pos . x + 192 + 102 - ( 102 * creatures . size ( ) / 2 ) - ( 18 * ( creatures . size ( ) - 1 ) / 2 ) ;
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
2008-06-04 16:00:56 +03:00
creatures [ i ] . pic - > blitPic ( screen , curx - 50 , pos . y + 130 - 65 , ! ( c % 2 ) ) ;
2008-04-04 20:30:53 +03:00
curx + = 120 ;
}
c + + ;
}
2008-06-04 16:00:56 +03:00
CRecrutationWindow : : CRecrutationWindow ( const std : : vector < std : : pair < int , int > > & Creatures , const boost : : function < void ( int , int ) > & Recruit ) //creatures - pairs<creature_ID,amount>
: recruit ( Recruit )
2008-04-04 20:30:53 +03:00
{
2008-04-15 20:12:21 +03:00
which = 0 ;
2008-04-04 20:30:53 +03:00
creatures . resize ( Creatures . size ( ) ) ;
2008-05-12 08:46:04 +03:00
amounts . resize ( Creatures . size ( ) ) ;
2008-04-04 20:30:53 +03:00
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
creatures [ i ] . amount = Creatures [ i ] . second ;
creatures [ i ] . ID = Creatures [ i ] . first ;
for ( int j = 0 ; j < CGI - > creh - > creatures [ Creatures [ i ] . first ] . cost . size ( ) ; j + + )
if ( CGI - > creh - > creatures [ Creatures [ i ] . first ] . cost [ j ] )
creatures [ i ] . res . push_back ( std : : make_pair ( j , CGI - > creh - > creatures [ Creatures [ i ] . first ] . cost [ j ] ) ) ;
2008-06-04 16:00:56 +03:00
creatures [ i ] . pic = new CCreaturePic ( & CGI - > creh - > creatures [ Creatures [ i ] . first ] ) ;
2008-05-12 08:46:04 +03:00
amounts [ i ] = CGI - > creh - > creatures [ Creatures [ i ] . first ] . maxAmount ( LOCPLINT - > cb - > getResourceAmount ( ) ) ;
2008-04-04 20:30:53 +03:00
}
2008-06-12 09:45:51 +03:00
SDL_Surface * hhlp = BitmapHandler : : loadBitmap ( " TPRCRT.bmp " ) ;
2008-06-30 03:06:41 +03:00
graphics - > blueToPlayersAdv ( hhlp , LOCPLINT - > playerID ) ;
2008-04-25 12:25:59 +03:00
bitmap = SDL_ConvertSurface ( hhlp , screen - > format , 0 ) ; //na 8bitowej mapie by sie psulo
2008-04-04 20:30:53 +03:00
SDL_SetColorKey ( bitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( bitmap - > format , 0 , 255 , 255 ) ) ;
SDL_FreeSurface ( hhlp ) ;
2008-04-25 12:25:59 +03:00
pos . x = screen - > w / 2 - bitmap - > w / 2 ;
pos . y = screen - > h / 2 - bitmap - > h / 2 ;
2008-04-04 20:30:53 +03:00
pos . w = bitmap - > w ;
pos . h = bitmap - > h ;
2008-07-27 20:07:37 +03:00
slider = new CSlider ( pos . x + 176 , pos . y + 279 , 135 , boost : : bind ( & CRecrutationWindow : : sliderMoved , this , _1 ) , 1 , min ( amounts [ 0 ] , creatures [ 0 ] . amount ) , 0 , true ) ;
2008-04-04 20:30:53 +03:00
std : : string pom ;
printAtMiddle ( CGI - > generaltexth - > allTexts [ 346 ] , 113 , 231 , GEOR13 , zwykly , bitmap ) ; //cost per troop t
printAtMiddle ( CGI - > generaltexth - > allTexts [ 465 ] , 205 , 231 , GEOR13 , zwykly , bitmap ) ; //available t
printAtMiddle ( CGI - > generaltexth - > allTexts [ 16 ] , 279 , 231 , GEOR13 , zwykly , bitmap ) ; //recruit t
printAtMiddle ( CGI - > generaltexth - > allTexts [ 466 ] , 373 , 231 , GEOR13 , zwykly , bitmap ) ; //total cost t
drawBorder ( bitmap , 172 , 222 , 67 , 42 , int3 ( 239 , 215 , 123 ) ) ;
drawBorder ( bitmap , 246 , 222 , 67 , 42 , int3 ( 239 , 215 , 123 ) ) ;
drawBorder ( bitmap , 64 , 222 , 99 , 76 , int3 ( 239 , 215 , 123 ) ) ;
drawBorder ( bitmap , 322 , 222 , 99 , 76 , int3 ( 239 , 215 , 123 ) ) ;
drawBorder ( bitmap , 133 , 312 , 66 , 34 , int3 ( 173 , 142 , 66 ) ) ;
drawBorder ( bitmap , 211 , 312 , 66 , 34 , int3 ( 173 , 142 , 66 ) ) ;
drawBorder ( bitmap , 289 , 312 , 66 , 34 , int3 ( 173 , 142 , 66 ) ) ;
//border for creatures
int curx = 192 + 51 - ( 102 * creatures . size ( ) / 2 ) - ( 18 * ( creatures . size ( ) - 1 ) / 2 ) ;
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
creatures [ i ] . pos . x = curx + 1 ;
creatures [ i ] . pos . y = 65 ;
creatures [ i ] . pos . w = 100 ;
creatures [ i ] . pos . h = 130 ;
2008-04-15 20:12:21 +03:00
if ( which = = i )
drawBorder ( bitmap , curx , 64 , 102 , 132 , int3 ( 255 , 0 , 0 ) ) ;
else
drawBorder ( bitmap , curx , 64 , 102 , 132 , int3 ( 239 , 215 , 123 ) ) ;
2008-04-04 20:30:53 +03:00
curx + = 120 ;
}
2008-05-18 20:33:39 +03:00
max = new AdventureMapButton ( " " , " " , boost : : bind ( & CRecrutationWindow : : Max , this ) , pos . x + 134 , pos . y + 313 , " IRCBTNS.DEF " ) ;
buy = new AdventureMapButton ( " " , " " , boost : : bind ( & CRecrutationWindow : : Buy , this ) , pos . x + 212 , pos . y + 313 , " IBY6432.DEF " ) ;
cancel = new AdventureMapButton ( " " , " " , boost : : bind ( & CRecrutationWindow : : Cancel , this ) , pos . x + 290 , pos . y + 313 , " ICN6432.DEF " ) ;
2008-04-04 20:30:53 +03:00
LOCPLINT - > curint - > deactivate ( ) ;
2008-08-02 18:08:03 +03:00
//AdventureMapButton( std::string Name, std::string HelpBox, void(T::*Function)(),
2008-04-04 20:30:53 +03:00
//int x, int y, std::string defName, T* Owner, bool activ=false, std::vector<std::string> * add = NULL, bool playerColoredButton = true );//c-tor
} //(int x, int y, int totalw, T*Owner,void(T::*Moved)(int to), int Capacity, int Amount, int Value, bool Horizontal)
CRecrutationWindow : : ~ CRecrutationWindow ( )
{
2008-06-04 16:00:56 +03:00
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
delete creatures [ i ] . pic ;
}
delete max ;
delete buy ;
delete cancel ;
2008-04-04 20:30:53 +03:00
SDL_FreeSurface ( bitmap ) ;
delete slider ;
2008-04-19 19:15:04 +03:00
}
CSplitWindow : : CSplitWindow ( int cid , int max , CGarrisonInt * Owner )
{
c = cid ;
slider = NULL ;
gar = Owner ;
2008-06-12 09:45:51 +03:00
bitmap = BitmapHandler : : loadBitmap ( " GPUCRDIV.bmp " ) ;
2008-05-03 18:30:11 +03:00
SDL_SetColorKey ( bitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( bitmap - > format , 0 , 255 , 255 ) ) ;
2008-04-25 12:25:59 +03:00
pos . x = screen - > w / 2 - bitmap - > w / 2 ;
pos . y = screen - > h / 2 - bitmap - > h / 2 ;
2008-04-19 19:15:04 +03:00
pos . w = bitmap - > w ;
pos . h = bitmap - > h ;
2008-05-18 20:33:39 +03:00
ok = new AdventureMapButton ( " " , " " , boost : : bind ( & CSplitWindow : : split , this ) , pos . x + 20 , pos . y + 263 , " IOK6432.DEF " ) ;
cancel = new AdventureMapButton ( " " , " " , boost : : bind ( & CSplitWindow : : close , this ) , pos . x + 214 , pos . y + 263 , " ICN6432.DEF " ) ;
slider = new CSlider ( pos . x + 21 , pos . y + 194 , 257 , boost : : bind ( & CSplitWindow : : sliderMoved , this , _1 ) , 1 , max , 0 , true ) ;
2008-04-19 19:15:04 +03:00
a1 = max ;
a2 = 0 ;
2008-06-04 16:00:56 +03:00
anim = new CCreaturePic ( & CGI - > creh - > creatures [ cid ] ) ;
anim - > anim - > setType ( 1 ) ;
2008-04-19 19:15:04 +03:00
std : : string title = CGI - > generaltexth - > allTexts [ 256 ] ;
boost : : algorithm : : replace_first ( title , " %s " , CGI - > creh - > creatures [ cid ] . namePl ) ;
printAtMiddle ( title , 150 , 34 , GEOR16 , tytulowy , bitmap ) ;
}
CSplitWindow : : ~ CSplitWindow ( )
{
SDL_FreeSurface ( bitmap ) ;
2008-06-04 16:00:56 +03:00
delete ok ;
delete cancel ;
delete slider ;
delete anim ;
2008-04-19 19:15:04 +03:00
}
void CSplitWindow : : activate ( )
{
LOCPLINT - > objsToBlit . push_back ( this ) ;
KeyInterested : : activate ( ) ;
ok - > activate ( ) ;
cancel - > activate ( ) ;
slider - > activate ( ) ;
}
void CSplitWindow : : deactivate ( )
{
LOCPLINT - > objsToBlit . erase ( std : : find ( LOCPLINT - > objsToBlit . begin ( ) , LOCPLINT - > objsToBlit . end ( ) , this ) ) ;
KeyInterested : : deactivate ( ) ;
ok - > deactivate ( ) ;
cancel - > deactivate ( ) ;
slider - > deactivate ( ) ;
}
void CSplitWindow : : split ( )
{
gar - > splitStacks ( a2 ) ;
close ( ) ;
}
void CSplitWindow : : close ( )
{
deactivate ( ) ;
delete this ;
LOCPLINT - > curint - > activate ( ) ;
2008-08-02 18:08:03 +03:00
2008-04-19 19:15:04 +03:00
CCastleInterface * c = dynamic_cast < CCastleInterface * > ( LOCPLINT - > curint ) ;
if ( c ) c - > showAll ( ) ;
}
void CSplitWindow : : sliderMoved ( int to )
{
a2 = to ;
if ( slider )
a1 = slider - > amount - to ;
}
void CSplitWindow : : show ( SDL_Surface * to )
{
char pom [ 15 ] ;
2008-04-25 12:25:59 +03:00
blitAt ( bitmap , pos . x , pos . y , screen ) ;
2008-04-19 19:15:04 +03:00
ok - > show ( ) ;
cancel - > show ( ) ;
slider - > show ( ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( a1 , pom , 10 ) ;
2008-04-25 12:25:59 +03:00
printAtMiddle ( pom , pos . x + 70 , pos . y + 237 , GEOR16 , zwykly , screen ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( a2 , pom , 10 ) ;
2008-04-25 12:25:59 +03:00
printAtMiddle ( pom , pos . x + 233 , pos . y + 237 , GEOR16 , zwykly , screen ) ;
2008-06-04 16:00:56 +03:00
anim - > blitPic ( screen , pos . x + 20 , pos . y + 54 , false ) ;
anim - > blitPic ( screen , pos . x + 177 , pos . y + 54 , false ) ;
2008-04-19 19:15:04 +03:00
}
void CSplitWindow : : keyPressed ( SDL_KeyboardEvent & key )
{
2008-08-02 18:08:03 +03:00
//TODO: make manual typing possible
2008-05-03 18:30:11 +03:00
}
2008-05-18 20:33:39 +03:00
void CCreInfoWindow : : show ( SDL_Surface * to )
{
char pom [ 15 ] ;
blitAt ( bitmap , pos . x , pos . y , screen ) ;
2008-06-04 16:00:56 +03:00
anim - > blitPic ( screen , pos . x + 21 , pos . y + 48 , ( type ) & & anf ) ;
anf = ! anf ;
2008-05-31 23:37:54 +03:00
if ( upgrade )
upgrade - > show ( ) ;
if ( dismiss )
dismiss - > show ( ) ;
if ( ok )
ok - > show ( ) ;
2008-05-18 20:33:39 +03:00
}
2008-05-31 23:37:54 +03:00
CCreInfoWindow : : CCreInfoWindow
( int Cid , int Type , StackState * State , boost : : function < void ( ) > Upg , boost : : function < void ( ) > Dsm )
: ok ( 0 ) , dismiss ( 0 ) , upgrade ( 0 ) , type ( Type ) , dsm ( Dsm )
2008-05-18 20:33:39 +03:00
{
c = & CGI - > creh - > creatures [ Cid ] ;
2008-06-12 09:45:51 +03:00
bitmap = BitmapHandler : : loadBitmap ( " CRSTKPU.bmp " ) ;
2008-05-18 20:33:39 +03:00
pos . x = screen - > w / 2 - bitmap - > w / 2 ;
pos . y = screen - > h / 2 - bitmap - > h / 2 ;
pos . w = bitmap - > w ;
pos . h = bitmap - > h ;
2008-06-30 03:06:41 +03:00
graphics - > blueToPlayersAdv ( bitmap , LOCPLINT - > playerID ) ;
2008-05-18 20:33:39 +03:00
SDL_SetColorKey ( bitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( bitmap - > format , 0 , 255 , 255 ) ) ;
2008-06-04 16:00:56 +03:00
anim = new CCreaturePic ( c ) ;
if ( ! type ) anim - > anim - > setType ( 1 ) ;
2008-05-18 20:33:39 +03:00
2008-05-23 22:50:11 +03:00
char pom [ 25 ] ; int hlp = 0 ;
2008-05-27 18:16:12 +03:00
printAtMiddle ( c - > namePl , 149 , 30 , GEOR13 , zwykly , bitmap ) ; //creature name
2008-05-18 20:33:39 +03:00
2008-05-23 22:50:11 +03:00
//atttack
2008-05-27 18:16:12 +03:00
printAt ( CGI - > preth - > zelp [ 435 ] . first , 155 , 48 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > attack , pom , 10 ) ;
2008-05-23 22:50:11 +03:00
if ( State & & State - > attackBonus )
{
int hlp = log10f ( c - > attack ) + 2 ;
pom [ hlp - 1 ] = ' ' ; pom [ hlp ] = ' ( ' ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > attack + State - > attackBonus , pom + hlp + 1 , 10 ) ;
2008-05-27 16:16:35 +03:00
hlp + = 2 + ( int ) log10f ( State - > attackBonus + c - > attack ) ;
pom [ hlp ] = ' ) ' ; pom [ hlp + 1 ] = ' \0 ' ;
2008-05-23 22:50:11 +03:00
}
2008-05-27 18:16:12 +03:00
printToWR ( pom , 276 , 61 , GEOR13 , zwykly , bitmap ) ;
2008-05-23 22:50:11 +03:00
//defense
2008-05-27 18:16:12 +03:00
printAt ( CGI - > preth - > zelp [ 436 ] . first , 155 , 67 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > defence , pom , 10 ) ;
2008-05-23 22:50:11 +03:00
if ( State & & State - > defenseBonus )
{
int hlp = log10f ( c - > defence ) + 2 ;
pom [ hlp - 1 ] = ' ' ; pom [ hlp ] = ' ( ' ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > defence + State - > defenseBonus , pom + hlp + 1 , 10 ) ;
2008-05-23 22:50:11 +03:00
pom [ hlp + 2 + ( int ) log10f ( State - > defenseBonus + c - > defence ) ] = ' ) ' ;
}
2008-05-27 18:16:12 +03:00
printToWR ( pom , 276 , 80 , GEOR13 , zwykly , bitmap ) ;
2008-05-23 22:50:11 +03:00
//shots
2008-05-18 20:33:39 +03:00
if ( c - > shots )
2008-05-23 22:50:11 +03:00
{
2008-05-27 18:16:12 +03:00
printAt ( CGI - > generaltexth - > allTexts [ 198 ] , 155 , 86 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > shots , pom , 10 ) ;
2008-05-27 18:16:12 +03:00
printToWR ( pom , 276 , 99 , GEOR13 , zwykly , bitmap ) ;
2008-05-23 22:50:11 +03:00
}
//damage
2008-05-27 18:16:12 +03:00
printAt ( CGI - > generaltexth - > allTexts [ 199 ] , 155 , 105 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > damageMin , pom , 10 ) ;
2008-05-23 22:50:11 +03:00
hlp = log10f ( c - > damageMin ) + 2 ;
pom [ hlp - 1 ] = ' ' ; pom [ hlp ] = ' - ' ; pom [ hlp + 1 ] = ' ' ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > damageMax , pom + hlp + 2 , 10 ) ;
2008-05-27 18:16:12 +03:00
printToWR ( pom , 276 , 118 , GEOR13 , zwykly , bitmap ) ;
2008-05-23 22:50:11 +03:00
//health
2008-05-27 18:16:12 +03:00
printAt ( CGI - > preth - > zelp [ 439 ] . first , 155 , 124 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > hitPoints , pom , 10 ) ;
2008-05-27 18:16:12 +03:00
printToWR ( pom , 276 , 137 , GEOR13 , zwykly , bitmap ) ;
2008-05-23 22:50:11 +03:00
//remaining health - TODO: show during the battles
2008-05-18 20:33:39 +03:00
//printAt(CGI->preth->zelp[440].first,155,143,GEOR13,zwykly,bitmap);
2008-05-23 22:50:11 +03:00
//speed
2008-05-27 18:16:12 +03:00
printAt ( CGI - > preth - > zelp [ 441 ] . first , 155 , 162 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > speed , pom , 10 ) ;
2008-05-27 18:16:12 +03:00
printToWR ( pom , 276 , 175 , GEOR13 , zwykly , bitmap ) ;
2008-05-23 22:50:11 +03:00
//luck and morale
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > morale42 - > ourImages [ ( State ) ? ( State - > morale + 3 ) : ( 3 ) ] . bitmap , 24 , 189 , bitmap ) ;
blitAt ( graphics - > luck42 - > ourImages [ ( State ) ? ( State - > luck + 3 ) : ( 3 ) ] . bitmap , 77 , 189 , bitmap ) ;
2008-05-23 22:50:11 +03:00
//print abilities text - if r-click popup
if ( type )
{
if ( Upg )
2008-05-31 23:37:54 +03:00
upgrade = new AdventureMapButton ( " " , CGI - > preth - > zelp [ 446 ] . second , Upg , pos . x + 76 , pos . y + 237 , " IVIEWCR.DEF " ) ;
2008-05-23 22:50:11 +03:00
if ( Dsm )
2008-05-31 23:37:54 +03:00
dismiss = new AdventureMapButton ( " " , CGI - > preth - > zelp [ 445 ] . second , boost : : bind ( & CCreInfoWindow : : dismissF , this ) , pos . x + 21 , pos . y + 237 , " IVIEWCR2.DEF " ) ;
ok = new AdventureMapButton ( " " , CGI - > preth - > zelp [ 445 ] . second , boost : : bind ( & CCreInfoWindow : : close , this ) , pos . x + 216 , pos . y + 237 , " IOKAY.DEF " ) ;
2008-05-23 22:50:11 +03:00
}
else
{
printAtWB ( c - > abilityText , 17 , 231 , GEOR13 , 35 , zwykly , bitmap ) ;
}
2008-05-18 20:33:39 +03:00
}
CCreInfoWindow : : ~ CCreInfoWindow ( )
{
SDL_FreeSurface ( bitmap ) ;
delete anim ;
2008-06-04 16:00:56 +03:00
delete upgrade ;
delete ok ;
delete dismiss ;
2008-05-18 20:33:39 +03:00
}
void CCreInfoWindow : : activate ( )
{
2008-06-04 16:00:56 +03:00
if ( ! type )
ClickableR : : activate ( ) ;
2008-05-18 20:33:39 +03:00
LOCPLINT - > objsToBlit . push_back ( this ) ;
if ( ok )
ok - > activate ( ) ;
if ( dismiss )
dismiss - > activate ( ) ;
if ( upgrade )
upgrade - > activate ( ) ;
2008-05-31 23:37:54 +03:00
if ( type )
LOCPLINT - > curint - > deactivate ( ) ;
2008-05-18 20:33:39 +03:00
}
void CCreInfoWindow : : close ( )
{
deactivate ( ) ;
2008-05-23 22:50:11 +03:00
CCastleInterface * c = dynamic_cast < CCastleInterface * > ( LOCPLINT - > curint ) ;
if ( c ) c - > showAll ( ) ;
2008-05-18 20:33:39 +03:00
if ( type )
LOCPLINT - > curint - > activate ( ) ;
2008-05-23 22:50:11 +03:00
delete this ;
2008-05-18 20:33:39 +03:00
}
void CCreInfoWindow : : clickRight ( boost : : logic : : tribool down )
{
if ( down )
return ;
close ( ) ;
}
2008-05-31 23:37:54 +03:00
void CCreInfoWindow : : dismissF ( )
{
dsm ( ) ;
close ( ) ;
}
2008-05-18 20:33:39 +03:00
void CCreInfoWindow : : keyPressed ( SDL_KeyboardEvent & key )
{
}
void CCreInfoWindow : : deactivate ( )
{
2008-06-04 16:00:56 +03:00
if ( ! type )
2008-08-02 18:08:03 +03:00
ClickableR : : deactivate ( ) ;
2008-05-18 20:33:39 +03:00
LOCPLINT - > objsToBlit . erase ( std : : find ( LOCPLINT - > objsToBlit . begin ( ) , LOCPLINT - > objsToBlit . end ( ) , this ) ) ;
if ( ok )
ok - > deactivate ( ) ;
if ( dismiss )
dismiss - > deactivate ( ) ;
if ( upgrade )
upgrade - > deactivate ( ) ;
2008-05-27 16:16:35 +03:00
}