2007-11-19 00:58:28 +02:00
# include "stdafx.h"
2008-03-16 02:09:43 +02:00
# include "CAdvmapInterface.h"
2008-08-27 13:19:18 +03:00
# include "CBattleInterface.h"
# include "CCallback.h"
# include "CCastleInterface.h"
# include "CCursorHandler.h"
# include "CGameInfo.h"
# include "CHeroWindow.h"
2007-11-19 00:58:28 +02:00
# include "CMessage.h"
2008-08-27 13:19:18 +03:00
# include "CPlayerInterface.h"
2008-12-17 23:16:19 +02:00
//#include "SDL_Extensions.h"
2007-11-19 00:58:28 +02:00
# include "SDL_Extensions.h"
2008-12-17 23:16:19 +02:00
//#include "SDL_framerate.h"
2008-08-27 13:19:18 +03:00
# include "SDL_framerate.h"
2008-11-12 20:26:23 +02:00
# include "client/CConfigHandler.h"
2008-08-27 13:19:18 +03:00
# include "client/CCreatureAnimation.h"
# include "client/Graphics.h"
# include "hch/CArtHandler.h"
# include "hch/CGeneralTextHandler.h"
2007-11-19 00:58:28 +02:00
# include "hch/CHeroHandler.h"
2008-08-27 13:19:18 +03:00
# include "hch/CLodHandler.h"
# include "hch/CObjectHandler.h"
2009-03-28 20:46:20 +02:00
# include "lib/Connection.h"
2008-08-27 13:19:18 +03:00
# include "hch/CSpellHandler.h"
2008-01-29 15:00:45 +02:00
# include "hch/CTownHandler.h"
2008-08-27 13:19:18 +03:00
# include "lib/CondSh.h"
# include "lib/NetPacks.h"
# include "map.h"
# include "mapHandler.h"
2008-01-20 18:24:03 +02:00
# include "timeHandler.h"
2009-02-09 18:18:48 +02:00
# include <boost/lexical_cast.hpp>
2008-01-29 15:00:45 +02:00
# include <boost/algorithm/string.hpp>
# include <boost/algorithm/string/replace.hpp>
2008-09-07 06:38:37 +03:00
# include <boost/assign/std/vector.hpp>
2008-10-17 19:30:56 +03:00
# include <boost/assign/list_of.hpp>
2009-03-28 02:38:48 +02:00
# include <boost/date_time/posix_time/posix_time.hpp>
2008-08-27 13:19:18 +03:00
# include <boost/thread.hpp>
2008-05-23 22:50:11 +03:00
# include <cmath>
2008-08-27 13:19:18 +03:00
# include <queue>
# include <sstream>
2008-10-19 02:20:48 +03:00
# ifdef min
# undef min
# endif
# ifdef max
# undef max
# endif
2009-04-15 17:03:31 +03:00
/*
* CPlayerInterface . cpp , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
*/
2008-09-07 06:38:37 +03:00
using namespace boost : : assign ;
2007-11-19 00:58:28 +02:00
using namespace CSDL_Ext ;
2009-04-21 01:57:07 +03:00
void processCommand ( const std : : string & message , CClient * & client ) ;
2008-01-30 16:19:35 +02:00
extern TTF_Font * GEOR16 ;
2009-03-12 20:50:36 +02:00
extern std : : queue < SDL_Event * > events ;
2008-07-27 20:07:37 +03:00
extern boost : : mutex eventsM ;
2008-01-30 16:19:35 +02:00
2009-04-21 01:57:07 +03:00
CPlayerInterface * LOCPLINT ;
enum EMoveState { STOP_MOVE , WAITING_MOVE , CONTINUE_MOVE , DURING_MOVE } ;
CondSh < EMoveState > stillMoveHero ; //used during hero movement
2008-07-31 00:27:15 +03:00
2008-12-17 23:16:19 +02:00
struct OCM_HLP_CGIN
2007-11-19 00:58:28 +02:00
{
2008-11-28 14:11:31 +02:00
bool inline 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-11-02 00:32:56 +02:00
void KeyShortcut : : keyPressed ( const SDL_KeyboardEvent & key )
{
if ( vstd : : contains ( assignedKeys , key . keysym . sym ) )
{
if ( key . state = = SDL_PRESSED )
clickLeft ( true ) ;
else
clickLeft ( false ) ;
}
}
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 )
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 4 ] ;
2008-01-29 15:00:45 +02:00
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
else if ( owner - > highlighted - > creature = = creature )
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 2 ] ;
2008-01-29 15:00:45 +02:00
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
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 7 ] ;
2008-01-29 15:00:45 +02:00
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
{
2008-09-19 15:09:15 +03:00
tlog2 < < " Warning - shouldn't be - highlighted void slot " < < owner - > highlighted < < std : : endl ;
tlog2 < < " Highlighted set to NULL " < < std : : endl ;
2008-04-13 14:05:39 +03:00
owner - > highlighted = NULL ;
}
2008-01-29 15:00:45 +02:00
}
else
{
if ( upg )
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 32 ] ;
2008-01-29 15:00:45 +02:00
}
else
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 12 ] ;
2008-01-29 15:00:45 +02:00
}
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 )
{
2008-11-15 02:55:19 +02:00
const CArmedInstance * highl = owner - > highlighted - > getObj ( ) ;
if ( highl - > needsLastStack ( ) //we are moving stack from hero's
& & highl - > army . slots . size ( ) = = 1 //it's only stack
& & owner - > highlighted - > upg ! = upg //we're moving it to the other garrison
)
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 5 ] ; //cannot move last stack!
2008-11-15 02:55:19 +02:00
}
else
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 6 ] ;
2008-01-29 15:00:45 +02:00
boost : : algorithm : : replace_first ( temp , " %s " , owner - > highlighted - > creature - > nameSing ) ;
2008-11-15 02:55:19 +02:00
}
2008-01-29 15:00:45 +02:00
}
else
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 11 ] ;
2008-01-29 15:00:45 +02:00
}
}
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 ) ;
}
2009-02-04 15:40:54 +02:00
StackState * getStackState ( const CGObjectInstance * obj , int pos , bool town )
{
const CGHeroInstance * h = dynamic_cast < const CGHeroInstance * > ( obj ) ;
if ( ! h ) return NULL ;
2009-04-04 22:26:41 +03:00
2009-02-04 15:40:54 +02:00
StackState * pom = new StackState ( ) ;
pom - > currentHealth = 0 ;
pom - > attackBonus = h - > getPrimSkillLevel ( 0 ) ;
pom - > defenseBonus = h - > getPrimSkillLevel ( 1 ) ;
pom - > luck = h - > getCurrentLuck ( ) ;
pom - > morale = h - > getCurrentMorale ( pos , town ) ;
2009-04-04 22:26:41 +03:00
pom - > speedBonus = h - > valOfBonuses ( HeroBonus : : STACKS_SPEED ) ;
2009-02-04 15:40:54 +02:00
return pom ;
}
2008-01-26 21:36:31 +02:00
void CGarrisonSlot : : clickRight ( tribool down )
{
2009-04-14 15:47:09 +03:00
StackState * pom = getStackState ( getObj ( ) , ID , LOCPLINT - > topInt ( ) = = LOCPLINT - > castleInt ) ;
2008-05-23 22:50:11 +03:00
if ( down & & creature )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( new CCreInfoWindow ( creature - > idNumber , 0 , count , pom , 0 , 0 , NULL ) ) ;
2008-05-23 22:50:11 +03:00
}
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
{
2009-04-14 15:47:09 +03:00
StackState * pom2 = getStackState ( getObj ( ) , ID , LOCPLINT - > topInt ( ) = = LOCPLINT - > castleInt ) ;
UpgradeInfo pom = LOCPLINT - > cb - > getUpgradeInfo ( getObj ( ) , ID ) ;
CCreInfoWindow * creWindow = NULL ;
if ( pom . oldID > = 0 ) //upgrade is possible
2008-08-15 15:11:42 +03:00
{
2009-04-14 15:47:09 +03:00
creWindow = new CCreInfoWindow (
creature - > idNumber , 1 , count , pom2 ,
boost : : bind ( & CCallback : : upgradeCreature , LOCPLINT - > cb , getObj ( ) , ID , pom . newID [ 0 ] ) , //bind upgrade function
boost : : bind ( & CCallback : : dismissCreature , LOCPLINT - > cb , getObj ( ) , ID ) , & pom ) ;
2008-08-15 15:11:42 +03:00
}
else
{
2009-04-14 15:47:09 +03:00
creWindow = new CCreInfoWindow (
creature - > idNumber , 1 , count , pom2 , 0 ,
boost : : bind ( & CCallback : : dismissCreature , LOCPLINT - > cb , getObj ( ) , ID ) , NULL ) ;
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( creWindow ) ;
2008-04-13 14:05:39 +03:00
owner - > highlighted = NULL ;
2009-04-14 17:19:46 +03:00
show ( screen2 ) ;
2008-05-18 20:33:39 +03:00
refr = true ;
2009-02-04 15:40:54 +02:00
delete pom2 ;
2008-04-13 14:05:39 +03:00
}
2009-03-27 01:05:40 +02:00
else if ( ( owner - > splitting | | LOCPLINT - > shiftPressed ( ) )
2009-04-14 15:47:09 +03:00
& & ( ! creature
2009-03-27 01:05:40 +02:00
| | ( creature = = owner - > highlighted - > creature ) )
2009-04-14 15:47:09 +03:00
) //we want to split
2008-04-19 19:15:04 +03:00
{
2009-03-27 01:05:40 +02:00
owner - > p2 = ID ; //store the second stack pos
owner - > pb = upg ; //store the second stack owner (up or down army)
2008-04-19 19:15:04 +03:00
owner - > splitting = false ;
2009-03-27 01:05:40 +02:00
int totalAmount = owner - > highlighted - > count ;
if ( creature )
totalAmount + = count ;
int last = - 1 ;
if ( upg ! = owner - > highlighted - > upg ) //not splitting within same army
{
if ( owner - > highlighted - > getObj ( ) - > army . slots . size ( ) = = 1
& & owner - > highlighted - > getObj ( ) - > needsLastStack ( ) )
{
last = 0 ;
}
if ( getObj ( ) - > army . slots . size ( ) = = 1
& & getObj ( ) - > needsLastStack ( ) )
{
last + = 2 ;
}
}
CSplitWindow * spw = new CSplitWindow ( owner - > highlighted - > creature - > idNumber , totalAmount , owner , last , count ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( spw ) ;
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 ;
2009-04-14 17:19:46 +03:00
show ( screen2 ) ;
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 ( ) ;
}
2009-04-14 15:47:09 +03:00
void CGarrisonSlot : : show ( SDL_Surface * to )
2008-01-26 21:36:31 +02:00
{
if ( creature )
{
2009-03-27 01:05:40 +02:00
char buf [ 15 ] ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( count , buf , 10 ) ;
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > bigImgs [ creature - > idNumber ] , pos , to ) ;
printToWR ( buf , pos . x + 56 , pos . y + 62 , GEOR16 , zwykly , to ) ;
2009-03-27 01:05:40 +02:00
if ( ( owner - > highlighted = = this )
| | ( owner - > splitting & & owner - > highlighted - > creature = = creature ) )
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > bigImgs [ - 1 ] , pos , to ) ;
2009-03-27 01:05:40 +02:00
}
2008-01-26 21:36:31 +02:00
}
2009-03-27 01:05:40 +02:00
else //empty slot
2008-01-26 21:36:31 +02:00
{
2008-11-09 00:29:19 +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 ;
2009-04-14 15:47:09 +03:00
SDL_BlitSurface ( owner - > sur , & jakis1 , to , & jakis2 ) ;
2008-04-19 19:15:04 +03:00
if ( owner - > splitting )
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > bigImgs [ - 1 ] , pos , to ) ;
2008-01-26 21:36:31 +02:00
}
}
CGarrisonInt : : ~ CGarrisonInt ( )
{
if ( sup )
{
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < sup - > size ( ) ; i + + )
{
2008-01-26 21:36:31 +02:00
delete ( * sup ) [ i ] ;
2008-12-23 15:59:03 +02:00
}
2008-01-26 21:36:31 +02:00
delete sup ;
}
if ( sdown )
{
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < sdown - > size ( ) ; i + + )
{
2008-12-21 21:17:35 +02:00
delete ( * sdown ) [ i ] ; //XXX what about smartpointers? boost or auto_ptr from std
2008-12-23 15:59:03 +02:00
}
2008-01-26 21:36:31 +02:00
delete sdown ;
}
}
2009-04-14 15:47:09 +03:00
void CGarrisonInt : : show ( SDL_Surface * to )
2008-01-26 21:36:31 +02:00
{
if ( sup )
{
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < sup - > size ( ) ; i + + )
2008-12-23 15:59:03 +02:00
{
if ( ( * sup ) [ i ] )
{
2009-04-14 15:47:09 +03:00
( * sup ) [ i ] - > show ( to ) ;
2008-12-23 15:59:03 +02:00
}
}
2008-01-26 21:36:31 +02:00
}
if ( sdown )
{
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < sdown - > size ( ) ; i + + )
{
if ( ( * sdown ) [ i ] )
{
2009-04-14 15:47:09 +03:00
( * sdown ) [ i ] - > show ( to ) ;
2008-12-23 15:59:03 +02:00
}
}
2008-01-26 21:36:31 +02:00
}
}
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-11-09 00:29:19 +02: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-11-09 00:29:19 +02: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
}
2009-04-21 01:57:07 +03:00
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
2008-01-26 21:36:31 +02:00
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 ] ;
}
}
2008-08-16 11:47:41 +03:00
delete sup ;
sup = NULL ;
2008-01-26 21:36:31 +02:00
}
if ( sdown )
{
for ( int i = 0 ; i < sdown - > size ( ) ; i + + )
{
if ( ( * sdown ) [ i ] )
{
delete ( * sdown ) [ i ] ;
}
}
2008-08-16 11:47:41 +03:00
delete sdown ;
sdown = NULL ;
2008-01-26 21:36:31 +02:00
}
}
void CGarrisonInt : : recreateSlots ( )
{
2008-04-19 19:15:04 +03:00
splitting = false ;
2008-04-19 22:29:00 +03:00
highlighted = NULL ;
2008-08-17 12:11:16 +03:00
if ( active )
{
deactiveteSlots ( ) ;
}
2008-01-26 21:36:31 +02:00
deleteSlots ( ) ;
createSlots ( ) ;
2008-08-17 12:11:16 +03:00
if ( active )
{
2008-08-28 20:36:34 +03:00
//ignoreEvent = true;
2008-08-17 12:11:16 +03:00
activeteSlots ( ) ;
2009-04-14 17:19:46 +03:00
//show(screen2);
2008-08-17 12:11:16 +03:00
}
2008-01-26 21:36:31 +02:00
}
2008-04-19 19:15:04 +03:00
void CGarrisonInt : : splitClick ( )
{
if ( ! highlighted )
return ;
splitting = ! splitting ;
2009-04-14 17:19:46 +03:00
show ( screen2 ) ;
2008-04-19 19:15:04 +03:00
}
void CGarrisonInt : : splitStacks ( int am2 )
{
LOCPLINT - > cb - > splitStack (
( highlighted - > upg ) ? ( odown ) : ( oup ) ,
( pb ) ? ( odown ) : ( oup ) ,
highlighted - > ID ,
p2 ,
am2 ) ;
}
2009-02-07 15:28:23 +02:00
CGarrisonInt : : CGarrisonInt ( int x , int y , int inx , int iny , SDL_Surface * & pomsur , int OX , int OY , const CArmedInstance * s1 ,
2008-11-09 00:29:19 +02:00
const CArmedInstance * s2 )
2009-04-15 13:20:47 +03:00
: interx ( inx ) , intery ( iny ) , highlighted ( NULL ) , sur ( pomsur ) , offx ( OX ) , offy ( OY ) , sup ( NULL ) ,
sdown ( NULL ) , oup ( s1 ) , odown ( s2 )
2008-01-26 21:36:31 +02:00
{
2008-08-17 12:11:16 +03:00
active = false ;
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 ( )
{
2008-08-17 12:11:16 +03:00
active = true ;
2008-01-26 21:36:31 +02:00
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 ( )
{
2008-08-17 12:11:16 +03:00
active = false ;
2008-01-26 21:36:31 +02:00
deactiveteSlots ( ) ;
}
2008-08-20 09:57:53 +03:00
CInfoWindow : : CInfoWindow ( std : : string text , int player , int charperline , const std : : vector < SComponent * > & comps , std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > & Buttons )
2008-08-15 15:11:42 +03:00
{
2009-04-11 04:32:50 +03:00
ID = - 1 ;
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < Buttons . size ( ) ; i + + )
{
2009-04-14 15:47:09 +03:00
buttons . push_back ( new AdventureMapButton ( " " , " " , boost : : bind ( & CInfoWindow : : close , this ) , 0 , 0 , Buttons [ i ] . first ) ) ;
buttons [ i ] - > callback . add ( Buttons [ i ] . second ) ; //each button will close the window apart from call-defined actions
2008-08-15 15:11:42 +03:00
}
2009-04-11 04:32:50 +03:00
buttons . front ( ) - > assignedKeys . insert ( SDLK_RETURN ) ; //first button - reacts on enter
buttons . back ( ) - > assignedKeys . insert ( SDLK_ESCAPE ) ; //last button - reacts on escape
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
components . push_back ( comps [ i ] ) ;
}
CMessage : : drawIWindow ( this , text , player , charperline ) ;
}
2008-10-19 16:17:32 +03:00
CInfoWindow : : CInfoWindow ( )
2007-11-24 00:33:55 +02:00
{
2009-04-11 04:32:50 +03:00
ID = - 1 ;
2007-11-24 00:33:55 +02:00
}
2008-08-15 15:11:42 +03:00
void CInfoWindow : : close ( )
2007-11-24 00:33:55 +02:00
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-08-16 11:47:41 +03:00
LOCPLINT - > showingDialog - > setn ( false ) ;
2008-08-15 15:11:42 +03:00
}
void CInfoWindow : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
CSimpleWindow : : show ( to ) ;
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < buttons . size ( ) ; i + + )
2009-04-14 15:47:09 +03:00
buttons [ i ] - > show ( to ) ;
2007-11-24 00:33:55 +02:00
}
2008-08-15 15:11:42 +03:00
CInfoWindow : : ~ CInfoWindow ( )
2007-11-24 00:33:55 +02:00
{
2008-08-16 11:47:41 +03:00
if ( delComps )
{
for ( int i = 0 ; i < components . size ( ) ; i + + )
delete components [ i ] ;
}
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < buttons . size ( ) ; i + + )
delete buttons [ i ] ;
2007-11-24 00:33:55 +02:00
}
2008-08-15 15:11:42 +03:00
void CInfoWindow : : activate ( )
2007-11-24 00:33:55 +02:00
{
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < components . size ( ) ; i + + )
components [ i ] - > activate ( ) ;
for ( int i = 0 ; i < buttons . size ( ) ; i + + )
buttons [ i ] - > activate ( ) ;
}
void CInfoWindow : : deactivate ( )
{
for ( int i = 0 ; i < components . size ( ) ; i + + )
components [ i ] - > deactivate ( ) ;
for ( int i = 0 ; i < buttons . size ( ) ; i + + )
buttons [ i ] - > deactivate ( ) ;
2007-11-24 00:33:55 +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 ( ) ;
}
2008-03-06 20:54:35 +02:00
void CRClickPopup : : deactivate ( )
2008-02-23 00:26:31 +02:00
{
ClickableR : : deactivate ( ) ;
2009-04-14 15:47:09 +03:00
}
void CRClickPopup : : close ( )
{
LOCPLINT - > popIntTotally ( this ) ;
2008-02-23 00:26:31 +02:00
}
2008-03-06 20:54:35 +02:00
CInfoPopup : : CInfoPopup ( SDL_Surface * Bitmap , int x , int y , bool Free )
2009-04-15 13:20:47 +03:00
: free ( Free ) , bitmap ( Bitmap )
2008-03-06 20:54:35 +02:00
{
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 ( )
{
if ( free )
SDL_FreeSurface ( bitmap ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-02-23 00:26:31 +02:00
}
void CInfoPopup : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bitmap , pos . x , pos . y , to ) ;
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 )
{
2008-08-25 13:25:16 +03:00
case artifact :
2008-11-30 02:15:38 +02:00
description = CGI - > arth - > artifacts [ Subtype ] . Description ( ) ;
subtitle = CGI - > arth - > artifacts [ Subtype ] . Name ( ) ;
2008-08-25 13:25:16 +03:00
break ;
2007-11-24 00:33:55 +02:00
case primskill :
2009-04-21 01:57:07 +03:00
oss < < ( ( Val > 0 ) ? ( " + " ) : ( " - " ) ) < < Val < < " " ;
if ( Subtype < 4 )
{
description = CGI - > generaltexth - > arraytxt [ 2 + Subtype ] ;
oss < < CGI - > generaltexth - > primarySkillNames [ Subtype ] ;
}
else if ( Subtype = = 5 ) //spell points
{
description = CGI - > generaltexth - > allTexts [ 149 ] ;
oss < < CGI - > generaltexth - > allTexts [ 387 ] ;
}
else
{
tlog1 < < " Wrong subtype= " < < Subtype < < std : : endl ;
}
2007-11-24 00:33:55 +02:00
subtitle = oss . str ( ) ;
break ;
2009-01-11 00:08:18 +02:00
case secskill44 : case secskill :
subtitle + = CGI - > generaltexth - > levels [ Val - 1 ] + " " + CGI - > generaltexth - > skillName [ Subtype ] ;
description = CGI - > generaltexth - > skillInfoTexts [ Subtype ] [ Val - 1 ] ;
2008-08-13 03:44:31 +03:00
break ;
2007-11-24 00:33:55 +02:00
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 ;
2008-08-27 13:19:18 +03:00
case spell :
description = CGI - > spellh - > spells [ Subtype ] . descriptions [ Val ] ;
subtitle = CGI - > spellh - > spells [ Subtype ] . name ;
break ;
2009-04-21 01:57:07 +03:00
case creature :
subtitle = boost : : lexical_cast < std : : string > ( Val ) + " " + CGI - > creh - > creatures [ Subtype ] . * ( val ! = 1 ? & CCreature : : namePl : & CCreature : : nameSing ) ;
break ;
2007-12-25 18:25:53 +02:00
case experience :
description = CGI - > generaltexth - > allTexts [ 241 ] ;
oss < < Val ;
2008-08-22 15:21:09 +03:00
if ( Subtype & & Val = = 1 )
{
subtitle = CGI - > generaltexth - > allTexts [ 442 ] ;
}
else
{
subtitle = oss . str ( ) ;
}
2007-12-25 18:25:53 +02:00
break ;
2007-11-24 00:33:55 +02:00
}
type = Type ;
subtype = Subtype ;
val = Val ;
2008-08-27 13:19:18 +03:00
SDL_Surface * temp = this - > getImg ( ) ;
2009-03-14 13:25:25 +02:00
if ( ! temp )
{
tlog1 < < " Error: cannot find graphic for component with id= " < < type < < " subid= " < < subtype < < " val= " < < val < < std : : endl ;
return ;
}
2007-11-24 00:33:55 +02:00
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-22 15:21:09 +03:00
if ( c . id = = 5 )
init ( experience , c . subtype , c . val ) ;
2009-03-14 13:25:25 +02:00
else if ( c . id = = Component : : SPELL )
init ( spell , c . subtype , c . val ) ;
2008-08-04 18:56:36 +03:00
else
init ( ( Etype ) c . id , c . subtype , c . val ) ;
2008-08-13 03:44:31 +03:00
if ( c . id = = 2 & & c . when = = - 1 )
subtitle + = CGI - > generaltexth - > allTexts [ 3 ] . substr ( 2 , CGI - > generaltexth - > allTexts [ 3 ] . length ( ) - 2 ) ;
}
void SComponent : : show ( SDL_Surface * to )
{
blitAt ( getImg ( ) , pos . x , pos . y , to ) ;
2008-07-31 13:35:22 +03:00
}
2007-11-24 00:33:55 +02:00
SDL_Surface * SComponent : : getImg ( )
{
switch ( type )
{
2008-08-25 13:25:16 +03:00
case artifact :
return graphics - > artDefs - > ourImages [ subtype ] . bitmap ;
break ;
2007-11-24 00:33:55 +02:00
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-08-13 03:44:31 +03:00
case secskill44 :
2009-02-06 16:15:45 +02:00
return graphics - > abils44 - > ourImages [ subtype * 3 + 3 + val - 1 ] . bitmap ;
2008-08-13 03:44:31 +03:00
break ;
2008-01-28 14:28:18 +02:00
case secskill :
2009-02-06 16:15:45 +02:00
return graphics - > abils82 - > ourImages [ subtype * 3 + 3 + val - 1 ] . 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 ;
2009-02-03 07:28:05 +02:00
case morale :
return graphics - > morale82 - > ourImages [ val + 3 ] . bitmap ;
break ;
2009-02-04 15:40:54 +02:00
case luck :
return graphics - > luck82 - > ourImages [ val + 3 ] . bitmap ;
break ;
2009-03-14 13:25:25 +02:00
case spell :
return graphics - > spellscr - > ourImages [ subtype ] . bitmap ;
break ;
2009-04-21 01:57:07 +03:00
case creature :
return graphics - > bigImgs [ subtype ] ;
2007-11-24 00:33:55 +02:00
}
return NULL ;
}
void SComponent : : clickRight ( tribool down )
{
2009-04-21 01:57:07 +03:00
if ( description . size ( ) )
LOCPLINT - > adventureInt - > handleRightClick ( description , down , this ) ;
2007-11-24 00:33:55 +02:00
}
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 )
{
2008-08-13 03:44:31 +03:00
if ( onSelect )
onSelect ( ) ;
2007-12-19 02:06:51 +02:00
}
}
2008-08-13 03:44:31 +03:00
void CSelectableComponent : : init ( SDL_Surface * Border )
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 + + )
{
2008-11-28 14:11:31 +02:00
SDL_PutPixelWithoutRefresh ( border , i , 0 , 239 , 215 , 123 ) ;
SDL_PutPixelWithoutRefresh ( border , i , ( border - > h ) - 1 , 239 , 215 , 123 ) ;
2007-12-19 02:06:51 +02:00
}
for ( int i = 0 ; i < border - > h ; i + + )
{
2008-11-28 14:11:31 +02:00
SDL_PutPixelWithoutRefresh ( border , 0 , i , 239 , 215 , 123 ) ;
SDL_PutPixelWithoutRefresh ( border , ( border - > w ) - 1 , i , 239 , 215 , 123 ) ;
2007-12-19 02:06:51 +02:00
}
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 ;
}
2008-08-13 03:44:31 +03:00
CSelectableComponent : : CSelectableComponent ( const Component & c , boost : : function < void ( ) > OnSelect , SDL_Surface * Border )
: SComponent ( c ) , onSelect ( OnSelect )
{
init ( Border ) ;
}
CSelectableComponent : : CSelectableComponent ( Etype Type , int Sub , int Val , boost : : function < void ( ) > OnSelect , SDL_Surface * Border )
: SComponent ( Type , Sub , Val ) , onSelect ( OnSelect )
{
init ( Border ) ;
}
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 ( )
{
2008-11-02 00:32:56 +02:00
KeyInterested : : activate ( ) ;
2007-12-19 02:06:51 +02:00
SComponent : : activate ( ) ;
ClickableL : : activate ( ) ;
}
void CSelectableComponent : : deactivate ( )
{
2008-11-02 00:32:56 +02:00
KeyInterested : : deactivate ( ) ;
2007-12-19 02:06:51 +02:00
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 ;
}
}
2008-08-13 03:44:31 +03:00
void CSelectableComponent : : show ( SDL_Surface * to )
{
blitAt ( myBitmap , pos . x , pos . y , to ) ;
printAtMiddleWB ( subtitle , pos . x + pos . w / 2 , pos . y + pos . h + 14 , GEOR13 , 12 , zwykly , to ) ;
}
2007-12-01 14:50:33 +02:00
void CSimpleWindow : : show ( SDL_Surface * to )
{
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 ;
}
}
2008-08-13 03:44:31 +03:00
void CSelWindow : : selectionChange ( unsigned to )
2007-12-19 02:06:51 +02:00
{
2008-08-13 03:44:31 +03:00
for ( unsigned i = 0 ; i < components . size ( ) ; i + + )
2007-12-19 02:06:51 +02:00
{
CSelectableComponent * pom = dynamic_cast < CSelectableComponent * > ( components [ i ] ) ;
if ( ! pom )
continue ;
2008-08-13 03:44:31 +03:00
pom - > select ( i = = to ) ;
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
}
}
2009-04-11 04:32:50 +03:00
CSelWindow : : CSelWindow ( const std : : string & text , int player , int charperline , const std : : vector < CSelectableComponent * > & comps , const std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > & Buttons , int askID )
2007-12-19 02:06:51 +02:00
{
2009-04-11 04:32:50 +03:00
ID = askID ;
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < Buttons . size ( ) ; i + + )
{
2009-04-11 04:32:50 +03:00
buttons . push_back ( new AdventureMapButton ( " " , " " , Buttons [ i ] . second , 0 , 0 , Buttons [ i ] . first ) ) ;
if ( ! i & & askID > = 0 )
buttons . back ( ) - > callback + = boost : : bind ( & CSelWindow : : madeChoice , this ) ;
buttons [ i ] - > callback + = boost : : bind ( & CInfoWindow : : close , this ) ; //each button will close the window apart from call-defined actions
2008-08-15 15:11:42 +03:00
}
2009-02-09 18:18:48 +02:00
2009-04-11 04:32:50 +03:00
buttons . front ( ) - > assignedKeys . insert ( SDLK_RETURN ) ; //first button - reacts on enter
buttons . back ( ) - > assignedKeys . insert ( SDLK_ESCAPE ) ; //last button - reacts on escape
if ( buttons . size ( ) > 1 & & askID > = 0 ) //cancel button functionality
buttons . back ( ) - > callback + = boost : : bind ( & ICallback : : selectionMade , LOCPLINT - > cb , 0 , askID ) ;
2009-02-09 18:18:48 +02:00
2008-08-15 15:11:42 +03:00
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
components . push_back ( comps [ i ] ) ;
comps [ i ] - > onSelect = boost : : bind ( & CSelWindow : : selectionChange , this , i ) ;
2009-02-07 15:28:23 +02:00
if ( i < 9 )
comps [ i ] - > assignedKeys . insert ( SDLK_1 + i ) ;
2008-08-15 15:11:42 +03:00
}
CMessage : : drawIWindow ( this , text , player , charperline ) ;
2007-12-19 02:06:51 +02:00
}
2009-04-11 04:32:50 +03:00
void CSelWindow : : madeChoice ( )
{
if ( ID < 0 )
return ;
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 ;
}
2008-08-02 18:08:03 +03:00
}
2009-04-11 04:32:50 +03:00
LOCPLINT - > cb - > selectionMade ( ret + 1 , ID ) ;
2007-12-19 02:06:51 +02:00
}
2009-04-11 04:32:50 +03: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 ;
}
2009-04-14 15:47:09 +03:00
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 ] ) ;
}
2009-04-14 15:47:09 +03:00
2007-12-01 14:50:33 +02:00
void CButtonBase : : show ( SDL_Surface * to )
2007-11-19 00:58:28 +02:00
{
2009-04-14 15:47:09 +03:00
int img = std : : min ( state + bitmapOffset , int ( imgs [ curimg ] . size ( ) - 1 ) ) ;
2007-11-19 00:58:28 +02:00
if ( abs )
{
2009-04-14 15:47:09 +03:00
blitAt ( imgs [ curimg ] [ img ] , pos . x , pos . y , to ) ;
2007-11-19 00:58:28 +02:00
}
else
{
2009-04-14 15:47:09 +03:00
blitAt ( imgs [ curimg ] [ img ] , pos . x + ourObj - > pos . x , pos . y + ourObj - > pos . y , to ) ;
2007-11-19 00:58:28 +02:00
}
}
2009-04-14 15:47:09 +03:00
2007-11-19 00:58:28 +02:00
ClickableL : : ClickableL ( )
{
pressedL = false ;
}
2008-12-17 23:16:19 +02:00
2008-12-23 15:59:03 +02:00
ClickableL : : ~ ClickableL ( )
2009-04-14 15:47:09 +03:00
{
}
2008-12-17 23:16:19 +02:00
2007-11-19 00:58:28 +02:00
void ClickableL : : clickLeft ( tribool down )
{
if ( down )
pressedL = true ;
else
pressedL = false ;
}
void ClickableL : : activate ( )
{
2008-09-17 13:18:22 +03:00
LOCPLINT - > lclickable . push_front ( this ) ;
2007-11-19 00:58:28 +02:00
}
void ClickableL : : deactivate ( )
{
LOCPLINT - > lclickable . erase
( std : : find ( LOCPLINT - > lclickable . begin ( ) , LOCPLINT - > lclickable . end ( ) , this ) ) ;
}
2008-12-17 23:16:19 +02:00
2007-11-19 00:58:28 +02:00
ClickableR : : ClickableR ( )
{
pressedR = false ;
}
2008-12-17 23:16:19 +02:00
2008-12-23 15:59:03 +02:00
ClickableR : : ~ ClickableR ( )
{ }
2008-12-17 23:16:19 +02:00
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 ( )
{
2008-09-17 13:18:22 +03:00
LOCPLINT - > rclickable . push_front ( this ) ;
2007-11-19 00:58:28 +02:00
}
void ClickableR : : deactivate ( )
{
LOCPLINT - > rclickable . erase ( std : : find ( LOCPLINT - > rclickable . begin ( ) , LOCPLINT - > rclickable . end ( ) , this ) ) ;
}
2008-12-17 23:16:19 +02:00
//ClickableR
2008-12-23 15:59:03 +02:00
Hoverable : : ~ Hoverable ( )
{ }
2008-12-17 23:16:19 +02:00
2007-11-19 00:58:28 +02:00
void Hoverable : : activate ( )
{
2008-09-17 13:18:22 +03:00
LOCPLINT - > hoverable . push_front ( this ) ;
2007-11-19 00:58:28 +02:00
}
2008-12-17 23:16:19 +02:00
2007-11-19 00:58:28 +02:00
void Hoverable : : deactivate ( )
{
LOCPLINT - > hoverable . erase ( std : : find ( LOCPLINT - > hoverable . begin ( ) , LOCPLINT - > hoverable . end ( ) , this ) ) ;
}
void Hoverable : : hover ( bool on )
{
hovered = on ;
}
2008-12-17 23:16:19 +02:00
//Hoverable
2008-12-23 15:59:03 +02:00
KeyInterested : : ~ KeyInterested ( )
{ }
2008-12-17 23:16:19 +02:00
2007-11-19 00:58:28 +02:00
void KeyInterested : : activate ( )
{
2008-09-17 13:18:22 +03:00
LOCPLINT - > keyinterested . push_front ( this ) ;
2007-11-19 00:58:28 +02:00
}
void KeyInterested : : deactivate ( )
{
LOCPLINT - >
keyinterested . erase ( std : : find ( LOCPLINT - > keyinterested . begin ( ) , LOCPLINT - > keyinterested . end ( ) , this ) ) ;
}
2008-12-17 23:16:19 +02:00
//KeyInterested
2007-11-19 00:58:28 +02:00
void MotionInterested : : activate ( )
{
2008-09-17 13:18:22 +03:00
LOCPLINT - > motioninterested . push_front ( this ) ;
2007-11-19 00:58:28 +02:00
}
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 ;
2009-03-28 02:38:48 +02:00
curAction = NULL ;
2008-06-12 09:45:51 +03:00
playerID = Player ;
serialID = serial ;
human = true ;
2009-03-09 21:40:43 +02:00
castleInt = NULL ;
2009-01-12 22:05:56 +02:00
adventureInt = NULL ;
2009-04-14 15:47:09 +03:00
battleInt = NULL ;
2008-09-20 21:30:37 +03:00
pim = new boost : : recursive_mutex ;
2008-08-16 11:47:41 +03:00
showingDialog = new CondSh < bool > ( false ) ;
2008-10-17 19:30:56 +03:00
heroMoveSpeed = 2 ;
2008-11-30 16:08:07 +02:00
mapScrollingSpeed = 2 ;
2008-10-18 14:41:24 +03:00
//initializing framerate keeper
mainFPSmng = new FPSmanager ;
SDL_initFramerate ( mainFPSmng ) ;
SDL_setFramerate ( mainFPSmng , 48 ) ;
//framerate keeper initialized
2009-04-03 18:55:26 +03:00
cingconsole = new CInGameConsole ;
2008-08-01 14:21:15 +03:00
}
CPlayerInterface : : ~ CPlayerInterface ( )
{
delete pim ;
2008-08-16 11:47:41 +03:00
delete showingDialog ;
2009-01-12 22:05:56 +02:00
delete mainFPSmng ;
delete adventureInt ;
2009-04-03 18:55:26 +03:00
delete cingconsole ;
2009-01-12 22:05:56 +02:00
for ( std : : map < int , SDL_Surface * > : : iterator i = graphics - > heroWins . begin ( ) ; i ! = graphics - > heroWins . end ( ) ; i + + )
SDL_FreeSurface ( i - > second ) ;
for ( std : : map < int , SDL_Surface * > : : iterator i = graphics - > townWins . begin ( ) ; i ! = graphics - > townWins . end ( ) ; i + + )
SDL_FreeSurface ( i - > second ) ;
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-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-08-17 12:11:16 +03:00
graphics - > townWins . insert ( std : : pair < int , SDL_Surface * > ( tt [ i ] - > id , pom ) ) ;
2008-02-18 23:14:28 +02:00
}
2007-11-19 00:58:28 +02:00
}
void CPlayerInterface : : yourTurn ( )
{
2009-04-11 04:32:50 +03:00
try
2008-10-18 14:41:24 +03:00
{
2009-04-11 04:32:50 +03:00
LOCPLINT = this ;
makingTurn = true ;
2008-10-18 14:41:24 +03:00
2009-04-11 04:32:50 +03:00
static int autosaveCount = 0 ;
LOCPLINT - > cb - > save ( " Autosave_ " + boost : : lexical_cast < std : : string > ( autosaveCount + + + 1 ) ) ;
autosaveCount % = 5 ;
2007-11-19 00:58:28 +02:00
2009-04-11 04:32:50 +03:00
for ( std : : map < int , SDL_Surface * > : : iterator i = graphics - > heroWins . begin ( ) ; i ! = graphics - > heroWins . end ( ) ; i + + ) //redraw hero infoboxes
SDL_FreeSurface ( i - > second ) ;
graphics - > heroWins . clear ( ) ;
std : : vector < const CGHeroInstance * > hh = cb - > getHeroesInfo ( false ) ;
for ( int i = 0 ; i < hh . size ( ) ; i + + )
{
SDL_Surface * pom = infoWin ( hh [ i ] ) ;
graphics - > heroWins . insert ( std : : pair < int , SDL_Surface * > ( hh [ i ] - > subID , pom ) ) ;
}
2009-03-09 21:40:43 +02:00
2009-04-22 21:48:56 +03:00
/* TODO: This isn't quite right. First day in game should play
* NEWDAY . And we don ' t play NEWMONTH . */
int day = cb - > getDate ( 1 ) ;
if ( day ! = 1 )
CGI - > mush - > playSound ( soundBase : : newDay ) ;
else
CGI - > mush - > playSound ( soundBase : : newWeek ) ;
adventureInt - > infoBar . newDay ( day ) ;
2009-03-09 21:40:43 +02:00
2009-04-11 04:32:50 +03:00
//select first hero if available.
//TODO: check if hero is slept
if ( adventureInt - > heroList . items . size ( ) )
adventureInt - > select ( adventureInt - > heroList . items [ 0 ] . first ) ;
else
adventureInt - > select ( adventureInt - > townList . items [ 0 ] ) ;
2009-03-09 21:40:43 +02:00
2009-04-14 15:47:09 +03:00
adventureInt - > showAll ( screen ) ;
pushInt ( adventureInt ) ;
2009-03-09 21:40:43 +02:00
2009-04-11 04:32:50 +03:00
timeHandler th ;
th . getDif ( ) ;
while ( makingTurn ) // main loop
2009-03-09 21:40:43 +02:00
{
2009-04-11 04:32:50 +03:00
updateWater ( ) ;
pim - > lock ( ) ;
2009-03-12 20:50:36 +02:00
2009-04-11 04:32:50 +03:00
//if there are any waiting dialogs, show them
if ( dialogs . size ( ) & & ! showingDialog - > get ( ) )
2009-03-12 20:50:36 +02:00
{
2009-04-11 04:32:50 +03:00
showingDialog - > set ( true ) ;
2009-04-14 15:47:09 +03:00
pushInt ( dialogs . front ( ) ) ;
2009-04-11 04:32:50 +03:00
dialogs . pop_front ( ) ;
}
int tv = th . getDif ( ) ;
std : : list < TimeInterested * > hlp = timeinterested ;
for ( std : : list < TimeInterested * > : : iterator i = hlp . begin ( ) ; i ! = hlp . end ( ) ; i + + )
{
if ( ! vstd : : contains ( timeinterested , * i ) ) continue ;
if ( ( * i ) - > toNextTick > = 0 )
( * i ) - > toNextTick - = tv ;
if ( ( * i ) - > toNextTick < 0 )
( * i ) - > tick ( ) ;
}
while ( true )
{
SDL_Event * ev = NULL ;
2009-03-12 20:50:36 +02:00
{
2009-04-11 04:32:50 +03:00
boost : : unique_lock < boost : : mutex > lock ( eventsM ) ;
if ( ! events . size ( ) )
{
break ;
}
else
{
ev = events . front ( ) ;
events . pop ( ) ;
}
2009-03-12 20:50:36 +02:00
}
2009-04-11 04:32:50 +03:00
handleEvent ( ev ) ;
delete ev ;
2009-03-12 20:50:36 +02:00
}
2009-04-14 15:47:09 +03:00
if ( objsToBlit . size ( ) > 1 )
blitAt ( screen2 , 0 , 0 , screen ) ; //blit background
objsToBlit . back ( ) - > show ( screen ) ; //blit active interface/window
2009-04-11 04:32:50 +03:00
CGI - > curh - > draw1 ( ) ;
CSDL_Ext : : update ( screen ) ;
CGI - > curh - > draw2 ( ) ;
pim - > unlock ( ) ;
SDL_framerateDelay ( mainFPSmng ) ;
2007-11-19 00:58:28 +02:00
}
2009-04-14 15:47:09 +03:00
popInt ( adventureInt ) ;
2009-04-11 04:32:50 +03:00
cb - > endTurn ( ) ;
} HANDLE_EXCEPTION
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-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-09-23 13:58:54 +03:00
2009-03-13 16:16:53 +02:00
adventureInt - > centerOn ( details . ho - > pos ) ; //actualizing screen pos
2009-04-14 15:47:09 +03:00
adventureInt - > minimap . draw ( screen2 ) ;
2009-04-21 01:57:07 +03:00
adventureInt - > heroList . draw ( screen2 ) ;
2008-09-23 13:58:54 +03:00
2009-03-27 01:05:40 +02:00
if ( details . style > 0 | | details . src = = details . dst )
2008-09-23 13:58:54 +03:00
return ;
2007-11-19 00:58:28 +02:00
//initializing objects and performing first step of move
2008-08-26 00:14:00 +03:00
const CGHeroInstance * ho = details . ho ; //object representing this hero
2007-11-19 00:58:28 +02:00
int3 hp = details . src ;
2008-09-23 13:58:54 +03:00
if ( ! details . successful ) //hero failed to move
2007-11-25 15:16:45 +02:00
{
2009-02-09 18:27:38 +02:00
if ( ho - > movement > 50 )
2009-02-09 18:18:48 +02:00
ho - > moveDir = getDir ( details . src , details . dst ) ;
2007-11-25 15:16:45 +02:00
ho - > isStanding = true ;
2009-04-21 01:57:07 +03:00
if ( ho - > movement )
2007-11-25 15:16:45 +02:00
{
delete adventureInt - > terrain . currentPath ;
adventureInt - > terrain . currentPath = NULL ;
2008-08-28 20:36:34 +03:00
adventureInt - > heroList . items [ adventureInt - > heroList . getPosOfHero ( ho ) ] . second = NULL ;
2007-11-25 15:16:45 +02:00
}
2009-04-21 01:57:07 +03:00
stillMoveHero . setn ( STOP_MOVE ) ;
2007-11-25 15:16:45 +02:00
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 ) ;
2009-04-21 01:57:07 +03:00
if ( ! adventureInt - > terrain . currentPath - > nodes . size ( ) )
{
delete adventureInt - > terrain . currentPath ;
adventureInt - > terrain . currentPath = NULL ;
adventureInt - > heroList . items [ adventureInt - > heroList . getPosOfHero ( ho ) ] . second = NULL ;
}
2007-11-19 00:58:28 +02:00
}
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
2008-10-17 19:30:56 +03:00
for ( int i = 1 ; i < 32 ; i + = 2 * heroMoveSpeed )
2007-11-19 00:58:28 +02:00
{
if ( details . dst . x + 1 = = details . src . x & & details . dst . y + 1 = = details . src . y ) //tl
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveX = i - 32 ;
adventureInt - > terrain . moveY = i - 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveY = i - 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveX = - i + 32 ;
adventureInt - > terrain . moveY = i - 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveX = - i + 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-10-17 19:30:56 +03:00
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveX = - i + 32 ;
adventureInt - > terrain . moveY = - i + 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveY = - i + 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveX = i - 32 ;
adventureInt - > terrain . moveY = - i + 32 ;
2007-11-19 00:58:28 +02:00
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
{
2008-11-28 03:36:34 +02:00
//setting advmap shift
2008-10-17 19:30:56 +03:00
adventureInt - > terrain . moveX = i - 32 ;
2007-11-19 00:58:28 +02:00
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 ) ;
}
2008-08-28 20:36:34 +03:00
adventureInt - > updateScreen = true ;
2009-04-14 15:47:09 +03:00
adventureInt - > show ( screen ) ;
//LOCPLINT->adventureInt->show(); //updating screen
2008-04-25 12:25:59 +03:00
CSDL_Ext : : update ( screen ) ;
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
2008-10-17 19:30:56 +03:00
//restoring adventureInt->terrain.move*
adventureInt - > terrain . moveX = adventureInt - > terrain . moveY = 0 ;
2007-11-19 00:58:28 +02:00
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 ) ;
}
2008-09-18 17:18:08 +03:00
2008-10-17 19:30:56 +03:00
//restoring good rects
subRect ( details . dst . x - 2 , details . dst . y - 1 , details . dst . z , genRect ( 32 , 32 , 0 , 0 ) , ho - > id ) ;
subRect ( details . dst . x - 1 , details . dst . y - 1 , details . dst . z , genRect ( 32 , 32 , 32 , 0 ) , ho - > id ) ;
subRect ( details . dst . x , details . dst . y - 1 , details . dst . z , genRect ( 32 , 32 , 64 , 0 ) , ho - > id ) ;
subRect ( details . dst . x - 2 , details . dst . y , details . dst . z , genRect ( 32 , 32 , 0 , 32 ) , ho - > id ) ;
subRect ( details . dst . x - 1 , details . dst . y , details . dst . z , genRect ( 32 , 32 , 32 , 32 ) , ho - > id ) ;
subRect ( details . dst . x , details . dst . y , details . dst . z , genRect ( 32 , 32 , 64 , 32 ) , ho - > id ) ;
2008-09-18 17:18:08 +03:00
//restoring good order of objects
std : : stable_sort ( CGI - > mh - > ttiles [ details . dst . x - 2 ] [ details . dst . y - 1 ] [ details . dst . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ details . dst . x - 2 ] [ details . dst . y - 1 ] [ details . dst . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ details . dst . x - 1 ] [ details . dst . y - 1 ] [ details . dst . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ details . dst . x - 1 ] [ details . dst . y - 1 ] [ details . dst . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ details . dst . x ] [ details . dst . y - 1 ] [ details . dst . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ details . dst . x ] [ details . dst . y - 1 ] [ details . dst . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ details . dst . x - 2 ] [ details . dst . y ] [ details . dst . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ details . dst . x - 2 ] [ details . dst . y ] [ details . dst . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ details . dst . x - 1 ] [ details . dst . y ] [ details . dst . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ details . dst . x - 1 ] [ details . dst . y ] [ details . dst . z ] . objects . end ( ) , ocmptwo_cgin ) ;
std : : stable_sort ( CGI - > mh - > ttiles [ details . dst . x ] [ details . dst . y ] [ details . dst . z ] . objects . begin ( ) , CGI - > mh - > ttiles [ details . dst . x ] [ details . dst . y ] [ details . dst . z ] . objects . end ( ) , ocmptwo_cgin ) ;
2007-11-19 00:58:28 +02:00
ho - > isStanding = true ;
//move finished
2009-04-14 15:47:09 +03:00
adventureInt - > minimap . draw ( screen2 ) ;
2007-12-06 21:19:25 +02:00
adventureInt - > heroList . updateMove ( ho ) ;
2009-03-12 20:50:36 +02:00
//check if user cancelled movement
{
boost : : unique_lock < boost : : mutex > un ( eventsM ) ;
while ( events . size ( ) )
{
SDL_Event * ev = events . front ( ) ;
events . pop ( ) ;
switch ( ev - > type )
{
case SDL_MOUSEBUTTONDOWN :
2009-04-21 01:57:07 +03:00
stillMoveHero . setn ( STOP_MOVE ) ;
2009-03-12 20:50:36 +02:00
break ;
case SDL_KEYDOWN :
if ( ev - > key . keysym . sym < SDLK_F1 )
2009-04-21 01:57:07 +03:00
stillMoveHero . setn ( STOP_MOVE ) ;
2009-03-12 20:50:36 +02:00
break ;
}
delete ev ;
}
}
2009-04-21 01:57:07 +03:00
if ( stillMoveHero . get ( ) = = 1 )
stillMoveHero . setn ( DURING_MOVE ) ;
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-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-06-13 11:16:51 +03:00
graphics - > heroWins . erase ( hero - > ID ) ;
2009-03-20 20:51:48 +02:00
adventureInt - > heroList . updateHList ( hero ) ;
2007-11-19 00:58:28 +02:00
}
void CPlayerInterface : : heroCreated ( const CGHeroInstance * hero )
{
2008-10-26 22:58:34 +02:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
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 ) ) ) ;
2008-10-26 22:58:34 +02:00
adventureInt - > heroList . updateHList ( ) ;
2007-12-19 02:06:51 +02:00
}
2008-01-09 19:21:31 +02:00
void CPlayerInterface : : openTownWindow ( const CGTownInstance * town )
{
2009-04-14 15:47:09 +03:00
castleInt = new CCastleInterface ( town ) ;
LOCPLINT - > pushInt ( castleInt ) ;
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 )
{
2009-02-06 16:15:45 +02:00
case HEROI_TYPE :
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 ;
2009-02-06 16:15:45 +02:00
case TOWNI_TYPE :
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
{
2008-08-28 20:36:34 +03:00
switch ( adventureInt - > selection - > ID )
2007-11-19 00:58:28 +02:00
{
2007-12-22 16:40:27 +02:00
case HEROI_TYPE :
{
2008-08-28 20:36:34 +03:00
const CGHeroInstance * curh = ( const CGHeroInstance * ) adventureInt - > selection ;
2008-06-13 11:16:51 +03:00
return graphics - > drawHeroInfoWin ( curh ) ;
2007-12-22 16:40:27 +02:00
}
case TOWNI_TYPE :
{
2008-08-28 20:36:34 +03:00
return graphics - > drawTownInfoWin ( ( const CGTownInstance * ) adventureInt - > selection ) ;
2007-12-22 16:40:27 +02:00
}
default :
2009-03-19 16:17:19 +02:00
tlog1 < < " Strange... selection is neither hero nor town \n " ;
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
}
}
2007-12-22 16:40:27 +02:00
void CPlayerInterface : : handleMouseMotion ( SDL_Event * sEvent )
2007-11-19 00:58:28 +02:00
{
2009-02-11 19:03:30 +02:00
//sending active, hovered hoverable objects hover() call
2008-09-17 13:18:22 +03:00
std : : vector < Hoverable * > hlp ;
for ( std : : list < Hoverable * > : : iterator i = hoverable . begin ( ) ; i ! = hoverable . end ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
if ( isItIn ( & ( * i ) - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-12-22 16:40:27 +02:00
{
2008-09-17 13:18:22 +03:00
if ( ! ( * i ) - > hovered )
hlp . push_back ( ( * i ) ) ;
2007-12-22 16:40:27 +02:00
}
2008-09-17 13:18:22 +03:00
else if ( ( * i ) - > hovered )
2007-12-22 16:40:27 +02:00
{
2008-09-17 13:18:22 +03:00
( * i ) - > hover ( false ) ;
2007-12-22 16:40:27 +02:00
}
2007-11-19 00:58:28 +02:00
}
2008-08-28 20:36:34 +03:00
for ( int i = 0 ; i < hlp . size ( ) ; i + + )
2008-09-17 13:18:22 +03:00
hlp [ i ] - > hover ( true ) ;
2009-02-11 19:03:30 +02:00
//sending active, MotionInterested objects mouseMoved() call
2008-09-30 17:50:11 +03:00
std : : list < MotionInterested * > miCopy = motioninterested ;
for ( std : : list < MotionInterested * > : : iterator i = miCopy . begin ( ) ; i ! = miCopy . end ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
if ( ( * i ) - > strongInterest | | isItIn ( & ( * i ) - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
( * i ) - > mouseMoved ( sEvent - > motion ) ;
2007-11-19 00:58:28 +02:00
}
2007-12-22 16:40:27 +02:00
}
2009-02-11 19:03:30 +02:00
//adventure map scrolling with mouse
2008-10-26 22:58:34 +02:00
if ( ! SDL_GetKeyState ( NULL ) [ SDLK_LCTRL ] )
2007-11-19 00:58:28 +02:00
{
2008-10-26 22:58:34 +02:00
if ( sEvent - > motion . x < 15 )
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir | = CAdvMapInt : : LEFT ;
2008-10-26 22:58:34 +02:00
}
else
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir & = ~ CAdvMapInt : : LEFT ;
2008-10-26 22:58:34 +02:00
}
if ( sEvent - > motion . x > screen - > w - 15 )
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir | = CAdvMapInt : : RIGHT ;
2008-10-26 22:58:34 +02:00
}
else
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir & = ~ CAdvMapInt : : RIGHT ;
2008-10-26 22:58:34 +02:00
}
if ( sEvent - > motion . y < 15 )
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir | = CAdvMapInt : : UP ;
2008-10-26 22:58:34 +02:00
}
else
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir & = ~ CAdvMapInt : : UP ;
2008-10-26 22:58:34 +02:00
}
if ( sEvent - > motion . y > screen - > h - 15 )
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir | = CAdvMapInt : : DOWN ;
2008-10-26 22:58:34 +02:00
}
else
{
2009-02-11 19:03:30 +02:00
adventureInt - > scrollingDir & = ~ CAdvMapInt : : DOWN ;
2008-10-26 22:58:34 +02:00
}
2007-12-22 16:40:27 +02:00
}
}
void CPlayerInterface : : handleEvent ( SDL_Event * sEvent )
{
current = sEvent ;
2008-10-19 16:17:32 +03:00
if ( sEvent - > type = = SDL_KEYDOWN | | sEvent - > type = = SDL_KEYUP )
2007-12-22 16:40:27 +02:00
{
2009-02-20 17:44:49 +02:00
SDL_KeyboardEvent key = sEvent - > key ;
//translate numpad keys
if ( key . keysym . sym > = SDLK_KP0 & & key . keysym . sym < = SDLK_KP9 )
{
key . keysym . sym = ( SDLKey ) ( key . keysym . sym - SDLK_KP0 + SDLK_0 ) ;
}
else if ( key . keysym . sym = = SDLK_KP_ENTER )
{
key . keysym . sym = ( SDLKey ) SDLK_RETURN ;
}
2009-04-03 18:55:26 +03:00
bool keysCaptured = false ;
for ( std : : list < KeyInterested * > : : iterator i = keyinterested . begin ( ) ; i ! = keyinterested . end ( ) ; i + + )
{
if ( ( * i ) - > captureAllKeys )
{
keysCaptured = true ;
break ;
}
}
2008-10-19 16:17:32 +03:00
std : : list < KeyInterested * > miCopy = keyinterested ;
for ( std : : list < KeyInterested * > : : iterator i = miCopy . begin ( ) ; i ! = miCopy . end ( ) ; i + + )
2009-04-03 18:55:26 +03:00
if ( vstd : : contains ( keyinterested , * i ) & & ( ! keysCaptured | | ( * i ) - > captureAllKeys ) )
2009-02-20 17:44:49 +02:00
( * * i ) . keyPressed ( key ) ;
2007-12-22 16:40:27 +02:00
}
else if ( sEvent - > type = = SDL_MOUSEMOTION )
{
2008-10-19 16:17:32 +03:00
CGI - > curh - > cursorMove ( sEvent - > motion . x , sEvent - > motion . y ) ;
2007-12-22 16:40:27 +02:00
handleMouseMotion ( sEvent ) ;
2008-10-19 16:17:32 +03:00
}
2007-11-19 00:58:28 +02:00
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONDOWN ) & & ( sEvent - > button . button = = SDL_BUTTON_LEFT ) )
{
2008-09-17 13:18:22 +03:00
std : : list < ClickableL * > hlp = lclickable ;
for ( std : : list < ClickableL * > : : iterator i = hlp . begin ( ) ; i ! = hlp . end ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
if ( ! vstd : : contains ( lclickable , * i ) ) continue ;
if ( isItIn ( & ( * i ) - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
( * i ) - > clickLeft ( true ) ;
2007-11-19 00:58:28 +02:00
}
}
}
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONUP ) & & ( sEvent - > button . button = = SDL_BUTTON_LEFT ) )
{
2008-09-17 13:18:22 +03:00
std : : list < ClickableL * > hlp = lclickable ;
for ( std : : list < ClickableL * > : : iterator i = hlp . begin ( ) ; i ! = hlp . end ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
if ( ! vstd : : contains ( lclickable , * i ) ) continue ;
if ( isItIn ( & ( * i ) - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
( * i ) - > clickLeft ( false ) ;
2007-11-19 00:58:28 +02:00
}
else
2008-09-17 13:18:22 +03:00
( * i ) - > clickLeft ( boost : : logic : : indeterminate ) ;
2007-11-19 00:58:28 +02:00
}
}
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONDOWN ) & & ( sEvent - > button . button = = SDL_BUTTON_RIGHT ) )
{
2008-09-17 13:18:22 +03:00
std : : list < ClickableR * > hlp = rclickable ;
for ( std : : list < ClickableR * > : : iterator i = hlp . begin ( ) ; i ! = hlp . end ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
if ( ! vstd : : contains ( rclickable , * i ) ) continue ;
if ( isItIn ( & ( * i ) - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
( * i ) - > clickRight ( true ) ;
2007-11-19 00:58:28 +02:00
}
}
}
else if ( ( sEvent - > type = = SDL_MOUSEBUTTONUP ) & & ( sEvent - > button . button = = SDL_BUTTON_RIGHT ) )
{
2008-09-17 13:18:22 +03:00
std : : list < ClickableR * > hlp = rclickable ;
for ( std : : list < ClickableR * > : : iterator i = hlp . begin ( ) ; i ! = hlp . end ( ) ; i + + )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
if ( ! vstd : : contains ( rclickable , * i ) ) continue ;
if ( isItIn ( & ( * i ) - > pos , sEvent - > motion . x , sEvent - > motion . y ) )
2007-11-19 00:58:28 +02:00
{
2008-09-17 13:18:22 +03:00
( * i ) - > clickRight ( false ) ;
2007-11-19 00:58:28 +02:00
}
else
2008-09-17 13:18:22 +03:00
( * i ) - > clickRight ( boost : : logic : : indeterminate ) ;
2007-11-19 00:58:28 +02:00
}
}
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 )
{
2009-03-19 16:17:19 +02:00
if ( which > = PRIMARY_SKILLS ) //no need to redraw infowin if this is experience (exp is treated as prim skill with id==4)
return ;
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-02-05 11:49:45 +02:00
redrawHeroWin ( hero ) ;
2007-11-19 00:58:28 +02:00
}
2008-10-19 02:20:48 +03:00
void CPlayerInterface : : heroManaPointsChanged ( const CGHeroInstance * hero )
{
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-02-05 11:49:45 +02:00
redrawHeroWin ( hero ) ;
2008-10-19 02:20:48 +03:00
}
void CPlayerInterface : : heroMovePointsChanged ( const CGHeroInstance * hero )
{
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-14 15:47:09 +03:00
//adventureInt->heroList.draw();
2008-10-19 02:20:48 +03:00
}
2007-11-25 15:16:45 +02:00
void CPlayerInterface : : receivedResource ( int type , int val )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-15 02:29:26 +03:00
LOCPLINT - > totalRedraw ( ) ;
2007-11-25 15:16:45 +02:00
}
2007-12-22 16:40:27 +02:00
2008-08-13 03:44:31 +03:00
void CPlayerInterface : : heroGotLevel ( const CGHeroInstance * hero , int pskill , std : : vector < ui16 > & skills , boost : : function < void ( ui32 ) > & callback )
{
2008-08-16 11:47:41 +03:00
{
boost : : unique_lock < boost : : mutex > un ( showingDialog - > mx ) ;
while ( showingDialog - > data )
showingDialog - > cond . wait ( un ) ;
}
2009-04-22 21:48:56 +03:00
CGI - > mush - > playSound ( soundBase : : heroNewLevel ) ;
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-08-13 03:44:31 +03:00
CLevelWindow * lw = new CLevelWindow ( hero , pskill , skills , callback ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( lw ) ;
2007-12-25 18:25:53 +02:00
}
2008-08-16 11:47:41 +03:00
void CPlayerInterface : : heroInGarrisonChange ( const CGTownInstance * town )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-08-16 11:47:41 +03:00
//redraw infowindow
2008-08-17 12:11:16 +03:00
SDL_FreeSurface ( graphics - > townWins [ town - > id ] ) ;
graphics - > townWins [ town - > id ] = infoWin ( town ) ;
2008-08-16 11:47:41 +03:00
if ( town - > garrisonHero )
{
CGI - > mh - > hideObject ( town - > garrisonHero ) ;
}
if ( town - > visitingHero )
{
CGI - > mh - > printObject ( town - > visitingHero ) ;
}
2008-08-20 09:57:53 +03:00
adventureInt - > heroList . updateHList ( ) ;
2008-08-16 11:47:41 +03:00
2009-04-14 15:47:09 +03:00
CCastleInterface * c = castleInt ;
2008-08-16 11:47:41 +03:00
if ( c )
{
c - > garr - > highlighted = NULL ;
c - > hslotup . hero = town - > garrisonHero ;
c - > garr - > odown = c - > hslotdown . hero = town - > visitingHero ;
c - > garr - > set2 = town - > visitingHero ? & town - > visitingHero - > army : NULL ;
c - > garr - > recreateSlots ( ) ;
}
2009-04-15 02:29:26 +03:00
LOCPLINT - > totalRedraw ( ) ;
2008-08-16 11:47:41 +03:00
}
2008-01-28 16:01:09 +02:00
void CPlayerInterface : : heroVisitsTown ( const CGHeroInstance * hero , const CGTownInstance * town )
{
2008-08-26 00:14:00 +03:00
if ( hero - > tempOwner ! = town - > tempOwner )
return ;
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-01-28 16:01:09 +02:00
openTownWindow ( town ) ;
}
void CPlayerInterface : : garrisonChanged ( const CGObjectInstance * obj )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-02-06 16:15:45 +02:00
if ( obj - > ID = = HEROI_TYPE ) //hero
2008-01-28 16:01:09 +02:00
{
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
}
}
2009-02-06 16:15:45 +02:00
else if ( obj - > ID = = TOWNI_TYPE ) //town
2008-01-28 16:01:09 +02:00
{
2008-02-18 23:14:28 +02:00
const CGTownInstance * tt ;
2008-08-17 12:11:16 +03:00
if ( tt = static_cast < const CGTownInstance * > ( obj ) )
2008-02-18 23:14:28 +02:00
{
2008-08-17 12:11:16 +03:00
SDL_FreeSurface ( graphics - > townWins [ tt - > id ] ) ;
graphics - > townWins [ tt - > id ] = infoWin ( tt ) ;
2008-04-11 20:41:02 +03:00
}
2008-08-20 09:57:53 +03:00
if ( tt - > visitingHero )
{
SDL_FreeSurface ( graphics - > heroWins [ tt - > visitingHero - > subID ] ) ;
graphics - > heroWins [ tt - > visitingHero - > subID ] = infoWin ( tt - > visitingHero ) ;
}
2009-04-12 03:58:41 +03:00
}
2009-04-14 15:47:09 +03:00
bool wasGarrison = false ;
for ( std : : list < IShowActivable * > : : iterator i = listInt . begin ( ) ; i ! = listInt . end ( ) ; i + + )
2009-04-12 03:58:41 +03:00
{
2009-04-14 15:47:09 +03:00
if ( ( * i ) - > type & IShowActivable : : WITH_GARRISON )
2008-04-11 20:41:02 +03:00
{
2009-04-14 15:47:09 +03:00
CWindowWithGarrison * wwg = static_cast < CWindowWithGarrison * > ( * i ) ;
wwg - > garr - > recreateSlots ( ) ;
wasGarrison = true ;
2008-02-18 23:14:28 +02:00
}
2008-01-28 16:01:09 +02:00
}
2009-04-16 03:28:54 +03:00
LOCPLINT - > totalRedraw ( ) ;
2008-01-28 16:01:09 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-23 03:01:17 +02:00
void CPlayerInterface : : buildChanged ( const CGTownInstance * town , int buildingID , int what ) //what: 1 - built, 2 - demolished
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-08-20 09:57:53 +03:00
switch ( buildingID )
{
case 7 : case 8 : case 9 : case 10 : case 11 : case 12 : case 13 : case 15 :
{
SDL_FreeSurface ( graphics - > townWins [ town - > id ] ) ;
graphics - > townWins [ town - > id ] = infoWin ( town ) ;
break ;
}
}
2009-04-14 15:47:09 +03:00
if ( ! castleInt )
2008-03-23 03:01:17 +02:00
return ;
if ( castleInt - > town ! = town )
return ;
switch ( what )
{
case 1 :
2009-04-22 21:48:56 +03:00
CGI - > mush - > playSound ( soundBase : : newBuilding ) ;
2008-03-23 03:01:17 +02:00
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
{
2009-04-15 02:29:26 +03:00
while ( showingDialog - > get ( ) )
SDL_Delay ( 20 ) ;
2009-04-21 01:57:07 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-14 15:47:09 +03:00
battleInt = new CBattleInterface ( army1 , army2 , hero1 , hero2 , genRect ( 600 , 800 , ( conf . cc . resx - 800 ) / 2 , ( conf . cc . resy - 600 ) / 2 ) ) ;
pushInt ( battleInt ) ;
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-09-29 00:01:49 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-10-18 14:41:24 +03:00
battleInt - > newRound ( round ) ;
2008-02-25 01:06:27 +02:00
}
2008-09-29 00:01:49 +03:00
void CPlayerInterface : : actionStarted ( const BattleAction * action )
{
2008-10-19 02:20:48 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-03-07 19:08:40 +02:00
curAction = new BattleAction ( * action ) ;
2009-02-21 17:43:28 +02:00
if ( ( action - > actionType = = 2 | | ( action - > actionType = = 6 & & action - > destinationTile ! = cb - > battleGetPos ( action - > stackNumber ) ) ) )
2008-09-29 13:16:02 +03:00
{
2009-02-21 17:43:28 +02:00
battleInt - > moveStarted = true ;
if ( battleInt - > creAnims [ action - > stackNumber ] - > framesInGroup ( 20 ) )
{
battleInt - > creAnims [ action - > stackNumber ] - > setType ( 20 ) ;
}
2008-10-19 02:20:48 +03:00
}
2009-02-05 11:49:45 +02:00
battleInt - > deactivate ( ) ;
CStack * stack = cb - > battleGetStackByID ( action - > stackNumber ) ;
char txt [ 400 ] ;
2008-10-19 18:41:18 +03:00
if ( action - > actionType = = 1 )
{
if ( action - > side )
battleInt - > defendingHero - > setPhase ( 4 ) ;
else
battleInt - > attackingHero - > setPhase ( 4 ) ;
2009-02-14 16:37:13 +02:00
return ;
2008-10-19 18:41:18 +03:00
}
2009-02-05 11:49:45 +02:00
if ( ! stack )
2009-01-25 18:40:50 +02:00
{
2009-02-20 15:06:20 +02:00
tlog1 < < " Something wrong with stackNumber in actionStarted. Stack number: " < < action - > stackNumber < < std : : endl ;
2009-02-05 11:49:45 +02:00
return ;
2009-01-25 18:40:50 +02:00
}
2009-02-05 11:49:45 +02:00
int txtid = 0 ;
switch ( action - > actionType )
2009-01-25 18:40:50 +02:00
{
2009-02-05 11:49:45 +02:00
case 3 : //defend
txtid = 120 ;
break ;
case 8 : //wait
txtid = 136 ;
break ;
case 11 : //bad morale
txtid = - 34 ; //negative -> no separate singular/plural form
battleInt - > displayEffect ( 30 , stack - > position ) ;
break ;
}
if ( txtid > 0 & & stack - > amount ! = 1 )
txtid + + ; //move to plural text
else if ( txtid < 0 )
txtid = - txtid ;
if ( txtid )
{
sprintf ( txt , CGI - > generaltexth - > allTexts [ txtid ] . c_str ( ) , ( stack - > amount ! = 1 ) ? stack - > creature - > namePl . c_str ( ) : stack - > creature - > nameSing . c_str ( ) , 0 ) ;
LOCPLINT - > battleInt - > console - > addText ( txt ) ;
2009-01-25 18:40:50 +02:00
}
2008-10-11 16:14:52 +03:00
}
2008-09-29 00:01:49 +03:00
void CPlayerInterface : : actionFinished ( const BattleAction * action )
{
2008-10-19 02:20:48 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-03-07 19:08:40 +02:00
delete curAction ;
2008-09-29 00:01:49 +03:00
curAction = NULL ;
2008-10-19 02:20:48 +03:00
//if((action->actionType==2 || (action->actionType==6 && action->destinationTile!=cb->battleGetPos(action->stackNumber)))) //activating interface when move is finished
2008-10-17 19:30:56 +03:00
{
2008-10-18 14:41:24 +03:00
battleInt - > activate ( ) ;
2008-10-17 19:30:56 +03:00
}
2008-10-19 18:41:18 +03:00
if ( action - > actionType = = 1 )
{
if ( action - > side )
battleInt - > defendingHero - > setPhase ( 0 ) ;
else
battleInt - > attackingHero - > setPhase ( 0 ) ;
}
2008-09-29 00:01:49 +03:00
}
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-10-18 14:41:24 +03:00
CBattleInterface * b = battleInt ;
2008-03-01 00:14:53 +02:00
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-02-05 11:49:45 +02:00
CStack * stack = cb - > battleGetStackByID ( stackID ) ;
if ( vstd : : contains ( stack - > state , MOVED ) ) //this stack has moved and makes second action -> high morale
{
std : : string hlp = CGI - > generaltexth - > allTexts [ 33 ] ;
boost : : algorithm : : replace_first ( hlp , " %s " , ( stack - > amount ! = 1 ) ? stack - > creature - > namePl : stack - > creature - > nameSing ) ;
battleInt - > displayEffect ( 20 , stack - > position ) ;
battleInt - > console - > addText ( hlp ) ;
}
2008-08-04 18:56:36 +03:00
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-08-05 02:04:15 +03:00
b - > givenCommand - > data = NULL ;
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-09-29 00:01:49 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-14 15:47:09 +03:00
battleInt - > battleFinished ( * br ) ;
2008-02-25 01:06:27 +02:00
}
2009-03-31 23:47:53 +03:00
void CPlayerInterface : : battleStackMoved ( int ID , int dest , int distance , bool end )
2008-03-23 19:25:38 +02:00
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-03-31 23:47:53 +03:00
battleInt - > stackMoved ( ID , dest , end , distance ) ;
2008-10-18 14:41:24 +03:00
}
void CPlayerInterface : : battleSpellCasted ( SpellCasted * sc )
{
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-10-18 16:50:18 +03:00
battleInt - > spellCasted ( sc ) ;
2008-10-18 14:41:24 +03:00
}
2009-03-21 18:03:07 +02:00
void CPlayerInterface : : battleStacksEffectsSet ( SetStackEffect & sse )
{
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
battleInt - > battleStacksEffectsSet ( sse ) ;
}
2009-03-21 14:49:58 +02:00
void CPlayerInterface : : battleStacksAttacked ( std : : set < BattleStackAttacked > & bsa )
2008-10-18 14:41:24 +03:00
{
2009-03-20 20:51:48 +02:00
tlog5 < < " CPlayerInterface::battleStackAttacked - locking... " ;
2008-10-18 14:41:24 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-03-20 20:51:48 +02:00
tlog5 < < " done! \n " ;
2009-03-21 14:49:58 +02:00
std : : vector < CBattleInterface : : SStackAttackedInfo > arg ;
for ( std : : set < BattleStackAttacked > : : iterator i = bsa . begin ( ) ; i ! = bsa . end ( ) ; i + + )
2008-10-31 15:15:36 +02:00
{
2009-04-17 17:01:22 +03:00
if ( i - > isEffect ( ) & & i - > effect ! = 12 ) //and not armageddon
2009-03-21 14:49:58 +02:00
{
battleInt - > displayEffect ( i - > effect , cb - > battleGetStackByID ( i - > stackAttacked ) - > position ) ;
}
CBattleInterface : : SStackAttackedInfo to_put = { i - > stackAttacked , i - > damageAmount , i - > killedAmount , LOCPLINT - > curAction - > stackNumber , LOCPLINT - > curAction - > actionType = = 7 , i - > killed ( ) } ;
arg . push_back ( to_put ) ;
2008-10-31 15:15:36 +02:00
}
2009-03-21 14:49:58 +02:00
2009-04-17 17:01:22 +03:00
if ( bsa . begin ( ) - > isEffect ( ) & & bsa . begin ( ) - > effect = = 12 ) //for armageddon - I hope this condition is enough
{
battleInt - > displayEffect ( bsa . begin ( ) - > effect , - 1 ) ;
}
2008-11-28 14:11:31 +02:00
battleInt - > stacksAreAttacked ( arg ) ;
2008-03-23 19:25:38 +02:00
}
2008-08-09 02:02:32 +03:00
void CPlayerInterface : : battleAttack ( BattleAttack * ba )
2008-08-02 18:08:03 +03:00
{
2009-03-20 20:51:48 +02:00
tlog5 < < " CPlayerInterface::battleAttack - locking... " ;
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-03-20 20:51:48 +02:00
tlog5 < < " done! \n " ;
2009-03-21 14:49:58 +02:00
if ( ba - > lucky ( ) ) //lucky hit
2009-02-05 11:49:45 +02:00
{
CStack * stack = cb - > battleGetStackByID ( ba - > stackAttacking ) ;
std : : string hlp = CGI - > generaltexth - > allTexts [ 45 ] ;
boost : : algorithm : : replace_first ( hlp , " %s " , ( stack - > amount ! = 1 ) ? stack - > creature - > namePl . c_str ( ) : stack - > creature - > nameSing . c_str ( ) ) ;
battleInt - > console - > addText ( hlp ) ;
battleInt - > displayEffect ( 18 , stack - > position ) ;
}
2009-03-21 14:49:58 +02:00
//TODO: bad luck?
2008-08-09 02:02:32 +03:00
if ( ba - > shot ( ) )
2009-03-21 14:49:58 +02:00
{
for ( std : : set < BattleStackAttacked > : : iterator i = ba - > bsa . begin ( ) ; i ! = ba - > bsa . end ( ) ; i + + )
battleInt - > stackIsShooting ( ba - > stackAttacking , cb - > battleGetPos ( i - > stackAttacked ) ) ;
}
2008-08-09 02:02:32 +03:00
else
2009-02-05 17:44:21 +02:00
{
CStack * attacker = cb - > battleGetStackByID ( ba - > stackAttacking ) ;
2009-02-07 15:28:23 +02:00
int shift = 0 ;
if ( ba - > counter ( ) & & BattleInfo : : mutualPosition ( curAction - > destinationTile , attacker - > position ) < 0 )
{
if ( attacker - > attackerOwned )
shift = 1 ;
else
shift = - 1 ;
}
battleInt - > stackAttacking ( ba - > stackAttacking , ba - > counter ( ) ? curAction - > destinationTile + shift : curAction - > additionalInfo ) ;
2009-02-05 17:44:21 +02:00
}
2008-08-02 18:08:03 +03:00
}
2009-02-07 15:28:23 +02:00
2007-12-22 16:40:27 +02:00
void CPlayerInterface : : showComp ( SComponent comp )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-22 21:50:22 +03:00
CGI - > mush - > playSoundFromSet ( CGI - > mush - > pickup_sounds ) ;
2007-12-22 20:04:34 +02:00
adventureInt - > infoBar . showComp ( & comp , 4000 ) ;
2007-12-22 16:40:27 +02:00
}
2009-04-30 13:53:06 +03:00
void CPlayerInterface : : showInfoDialog ( const std : : string & text , const std : : vector < Component * > & components , soundBase : : soundID soundID )
2008-07-31 00:27:15 +03:00
{
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 ] ) ) ;
2009-04-22 21:48:56 +03:00
showInfoDialog ( text , intComps , soundID ) ;
2008-08-15 15:11:42 +03:00
}
2009-03-09 21:40:43 +02:00
2009-04-30 13:53:06 +03:00
void CPlayerInterface : : showInfoDialog ( const std : : string & text , const std : : vector < SComponent * > & components , soundBase : : soundID soundID )
2008-08-15 15:11:42 +03:00
{
2009-04-21 01:57:07 +03:00
{
boost : : unique_lock < boost : : mutex > un ( showingDialog - > mx ) ;
while ( showingDialog - > data )
showingDialog - > cond . wait ( un ) ;
}
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-21 01:57:07 +03:00
if ( stillMoveHero . get ( ) = = DURING_MOVE ) //if we are in the middle of hero movement
stillMoveHero . setn ( STOP_MOVE ) ; //after showing dialog movement will be stopped
2008-08-15 15:11:42 +03:00
std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > pom ;
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " IOKAY.DEF " , 0 ) ) ;
2009-03-31 23:47:53 +03:00
CInfoWindow * temp = new CInfoWindow ( text , playerID , 36 , components , pom ) ;
2009-03-09 21:40:43 +02:00
2009-04-14 15:47:09 +03:00
if ( makingTurn & & listInt . size ( ) )
2009-03-09 21:40:43 +02:00
{
2009-04-22 21:48:56 +03:00
CGI - > mush - > playSound ( soundID ) ;
2009-03-09 21:40:43 +02:00
showingDialog - > set ( true ) ;
2009-04-14 15:47:09 +03:00
pushInt ( temp ) ;
2009-03-09 21:40:43 +02:00
}
else
{
dialogs . push_back ( temp ) ;
}
2008-07-31 00:27:15 +03:00
}
2009-04-11 04:32:50 +03:00
2009-04-14 15:47:09 +03:00
void CPlayerInterface : : showYesNoDialog ( const std : : string & text , const std : : vector < SComponent * > & components , CFunctionList < void ( ) > onYes , CFunctionList < void ( ) > onNo , bool DelComps )
2007-11-24 00:33:55 +02:00
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-02-11 19:03:30 +02:00
LOCPLINT - > showingDialog - > setn ( true ) ;
2008-08-15 15:11:42 +03:00
std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > pom ;
2009-04-14 15:47:09 +03:00
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " IOKAY.DEF " , 0 ) ) ;
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " ICANCEL.DEF " , 0 ) ) ;
2009-03-31 23:47:53 +03:00
CInfoWindow * temp = new CInfoWindow ( text , playerID , 36 , components , pom ) ;
2008-08-16 11:47:41 +03:00
temp - > delComps = DelComps ;
for ( int i = 0 ; i < onYes . funcs . size ( ) ; i + + )
temp - > buttons [ 0 ] - > callback + = onYes . funcs [ i ] ;
for ( int i = 0 ; i < onNo . funcs . size ( ) ; i + + )
temp - > buttons [ 1 ] - > callback + = onNo . funcs [ i ] ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( temp ) ;
2007-11-24 00:33:55 +02:00
}
2008-08-22 15:21:09 +03:00
2009-04-30 13:53:06 +03:00
void CPlayerInterface : : showBlockingDialog ( const std : : string & text , const std : : vector < Component > & components , ui32 askID , soundBase : : soundID soundID , bool selection , bool cancel )
2008-08-22 15:21:09 +03:00
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-08-22 15:21:09 +03:00
2009-04-22 21:48:56 +03:00
CGI - > mush - > playSound ( soundID ) ;
2008-08-22 15:21:09 +03:00
2009-04-11 04:32:50 +03:00
if ( ! selection & & cancel ) //simple yes/no dialog
{
std : : vector < SComponent * > intComps ;
for ( int i = 0 ; i < components . size ( ) ; i + + )
intComps . push_back ( new SComponent ( components [ i ] ) ) ; //will be deleted by close in window
2009-04-14 15:47:09 +03:00
showYesNoDialog ( text , intComps , boost : : bind ( & CCallback : : selectionMade , cb , 1 , askID ) , boost : : bind ( & CCallback : : selectionMade , cb , 0 , askID ) , true ) ;
2009-04-11 04:32:50 +03:00
}
else if ( selection )
{
std : : vector < CSelectableComponent * > intComps ;
for ( int i = 0 ; i < components . size ( ) ; i + + )
intComps . push_back ( new CSelectableComponent ( components [ i ] ) ) ; //will be deleted by CSelWindow::close
std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > pom ;
2009-04-14 15:47:09 +03:00
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " IOKAY.DEF " , 0 ) ) ;
2009-04-11 04:32:50 +03:00
if ( cancel )
{
2009-04-14 15:47:09 +03:00
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " ICANCEL.DEF " , 0 ) ) ;
2009-04-11 04:32:50 +03:00
}
CSelWindow * temp = new CSelWindow ( text , playerID , 35 , intComps , pom , askID ) ;
2009-04-14 15:47:09 +03:00
pushInt ( temp ) ;
2009-04-11 04:32:50 +03:00
intComps [ 0 ] - > clickLeft ( true ) ;
}
2008-08-22 15:21:09 +03:00
}
2009-04-11 04:32:50 +03:00
2008-10-19 02:20:48 +03:00
void CPlayerInterface : : tileRevealed ( const std : : set < int3 > & pos )
2007-12-06 20:55:58 +02:00
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-10-19 02:20:48 +03:00
for ( std : : set < int3 > : : const_iterator i = pos . begin ( ) ; i ! = pos . end ( ) ; i + + )
adventureInt - > minimap . showTile ( * i ) ;
2007-12-06 20:55:58 +02:00
}
2009-04-14 15:47:09 +03:00
2008-10-19 02:20:48 +03:00
void CPlayerInterface : : tileHidden ( const std : : set < int3 > & pos )
2007-12-06 20:55:58 +02:00
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-10-19 02:20:48 +03:00
for ( std : : set < int3 > : : const_iterator i = pos . begin ( ) ; i ! = pos . end ( ) ; i + + )
adventureInt - > minimap . hideTile ( * i ) ;
2007-12-06 20:55:58 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-10 21:01:25 +02:00
void CPlayerInterface : : openHeroWindow ( const CGHeroInstance * hero )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2008-01-11 20:56:39 +02:00
adventureInt - > heroWindow - > setHero ( hero ) ;
2009-04-14 15:47:09 +03:00
adventureInt - > heroWindow - > quitButton - > callback = boost : : bind ( & CHeroWindow : : quit , adventureInt - > heroWindow ) ;
pushInt ( adventureInt - > heroWindow ) ;
2008-01-27 22:37:10 +02:00
}
2008-08-25 13:25:16 +03:00
void CPlayerInterface : : heroArtifactSetChanged ( const CGHeroInstance * hero )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-14 15:47:09 +03:00
if ( adventureInt - > heroWindow - > curHero )
2008-08-25 13:25:16 +03:00
{
2008-08-28 20:36:34 +03:00
adventureInt - > heroWindow - > deactivate ( ) ;
adventureInt - > heroWindow - > setHero ( adventureInt - > heroWindow - > curHero ) ;
adventureInt - > heroWindow - > activate ( ) ;
}
}
void CPlayerInterface : : updateWater ( )
{
2008-11-30 02:15:38 +02:00
2008-08-25 13:25:16 +03:00
}
2008-08-30 00:41:32 +03:00
void CPlayerInterface : : availableCreaturesChanged ( const CGTownInstance * town )
{
2008-09-20 21:30:37 +03:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
2009-04-14 15:47:09 +03:00
if ( castleInt )
2008-08-30 00:41:32 +03:00
{
2009-04-21 01:57:07 +03:00
CFortScreen * fs = dynamic_cast < CFortScreen * > ( listInt . front ( ) ) ;
if ( fs )
fs - > draw ( castleInt , false ) ;
2008-08-30 00:41:32 +03:00
}
}
2009-02-05 11:49:45 +02:00
void CPlayerInterface : : heroBonusChanged ( const CGHeroInstance * hero , const HeroBonus & bonus , bool gain )
{
2009-02-06 13:15:39 +02:00
if ( bonus . type = = HeroBonus : : NONE ) return ;
2009-02-05 11:49:45 +02:00
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
redrawHeroWin ( hero ) ;
}
2009-03-28 20:46:20 +02:00
template < typename Handler > void CPlayerInterface : : serializeTempl ( Handler & h , const int version )
{
h & playerID & serialID ;
h & heroMoveSpeed & mapScrollingSpeed ;
h & CBattleInterface : : settings ;
}
void CPlayerInterface : : serialize ( COSer < CSaveFile > & h , const int version )
{
serializeTempl ( h , version ) ;
}
void CPlayerInterface : : serialize ( CISer < CLoadFile > & h , const int version )
{
serializeTempl ( h , version ) ;
}
2009-02-05 11:49:45 +02:00
void CPlayerInterface : : redrawHeroWin ( const CGHeroInstance * hero )
{
2009-03-19 16:17:19 +02:00
if ( ! vstd : : contains ( graphics - > heroWins , hero - > subID ) )
{
tlog1 < < " Cannot redraw infowindow for hero with subID= " < < hero - > subID < < " - not present in our map \n " ;
return ;
}
2009-02-05 11:49:45 +02:00
SDL_FreeSurface ( graphics - > heroWins [ hero - > subID ] ) ;
graphics - > heroWins [ hero - > subID ] = infoWin ( hero ) ;
if ( adventureInt - > selection = = hero )
2009-04-15 02:29:26 +03:00
adventureInt - > infoBar . draw ( screen ) ;
2009-02-05 11:49:45 +02:00
}
2009-04-21 01:57:07 +03:00
bool CPlayerInterface : : moveHero ( const CGHeroInstance * h , CPath path )
2009-03-12 20:50:36 +02:00
{
2009-04-21 01:57:07 +03:00
if ( ! h )
2009-03-12 20:50:36 +02:00
return false ; //can't find hero
2009-03-19 16:17:19 +02:00
bool result = false ;
2009-04-21 01:57:07 +03:00
path . convert ( 0 ) ;
boost : : unique_lock < boost : : mutex > un ( stillMoveHero . mx ) ;
stillMoveHero . data = CONTINUE_MOVE ;
2009-03-12 20:50:36 +02:00
2009-04-23 22:50:27 +03:00
enum EterrainType currentTerrain = border ; // not init yet
enum EterrainType newTerrain ;
int sh = - 1 ;
2009-04-21 01:57:07 +03:00
for ( int i = path . nodes . size ( ) - 1 ; i > 0 & & stillMoveHero . data = = CONTINUE_MOVE ; i - - )
2009-03-12 20:50:36 +02:00
{
2009-04-23 22:50:27 +03:00
// Start a new sound for the hero movement or let the existing one carry on.
#if 0
// TODO
if ( hero is flying & & sh = = - 1 )
sh = CGI - > mush - > playSound ( soundBase : : horseFlying , - 1 ) ;
}
else if ( hero is in a boat & & sh = - 1 ) {
sh = CGI - > mush - > playSound ( soundBase : : sound_todo , - 1 ) ;
} else
# endif
{
2009-04-24 00:09:10 +03:00
newTerrain = cb - > getTileInfo ( path . nodes [ i ] . coord ) - > tertype ;
2009-04-23 22:50:27 +03:00
if ( newTerrain ! = currentTerrain ) {
CGI - > mush - > stopSound ( sh ) ;
sh = CGI - > mush - > playSound ( CGI - > mush - > horseSounds [ newTerrain ] , - 1 ) ;
currentTerrain = newTerrain ;
}
}
2009-04-21 01:57:07 +03:00
stillMoveHero . data = WAITING_MOVE ;
int3 endpos ( path . nodes [ i - 1 ] . coord . x , path . nodes [ i - 1 ] . coord . y , h - > pos . z ) ;
cb - > moveHero ( h , endpos ) ;
while ( stillMoveHero . data ! = STOP_MOVE & & stillMoveHero . data ! = CONTINUE_MOVE )
stillMoveHero . cond . wait ( un ) ;
2009-03-12 20:50:36 +02:00
}
2009-04-23 22:50:27 +03:00
CGI - > mush - > stopSound ( sh ) ;
2009-04-21 01:57:07 +03:00
//stillMoveHero = false;
2009-03-12 20:50:36 +02:00
return result ;
}
2009-03-27 01:05:40 +02:00
bool CPlayerInterface : : shiftPressed ( ) const
{
return SDL_GetKeyState ( NULL ) [ SDLK_LSHIFT ] | | SDL_GetKeyState ( NULL ) [ SDLK_RSHIFT ] ;
}
2009-04-12 03:58:41 +03:00
void CPlayerInterface : : showGarrisonDialog ( const CArmedInstance * up , const CGHeroInstance * down , boost : : function < void ( ) > & onEnd )
{
2009-04-21 01:57:07 +03:00
{
boost : : unique_lock < boost : : mutex > un ( showingDialog - > mx ) ;
while ( showingDialog - > data )
showingDialog - > cond . wait ( un ) ;
}
boost : : unique_lock < boost : : recursive_mutex > un ( * pim ) ;
while ( dialogs . size ( ) )
{
pim - > unlock ( ) ;
SDL_Delay ( 20 ) ;
pim - > lock ( ) ;
}
2009-04-12 03:58:41 +03:00
CGarrisonWindow * cgw = new CGarrisonWindow ( up , down ) ;
cgw - > quit - > callback + = onEnd ;
2009-04-14 15:47:09 +03:00
pushInt ( cgw ) ;
}
void CPlayerInterface : : popInt ( IShowActivable * top )
{
assert ( listInt . front ( ) = = top ) ;
top - > deactivate ( ) ;
listInt . pop_front ( ) ;
objsToBlit - = top ;
if ( listInt . size ( ) )
listInt . front ( ) - > activate ( ) ;
totalRedraw ( ) ;
}
void CPlayerInterface : : popIntTotally ( IShowActivable * top )
{
assert ( listInt . front ( ) = = top ) ;
popInt ( top ) ;
delete top ;
}
void CPlayerInterface : : pushInt ( IShowActivable * newInt )
{
if ( listInt . size ( ) )
listInt . front ( ) - > deactivate ( ) ;
listInt . push_front ( newInt ) ;
newInt - > activate ( ) ;
objsToBlit + = newInt ;
LOCPLINT - > totalRedraw ( ) ;
}
void CPlayerInterface : : popInts ( int howMany )
{
if ( ! howMany ) return ; //senseless but who knows...
assert ( listInt . size ( ) > howMany ) ;
listInt . front ( ) - > deactivate ( ) ;
for ( int i = 0 ; i < howMany ; i + + )
{
objsToBlit - = listInt . front ( ) ;
delete listInt . front ( ) ;
listInt . pop_front ( ) ;
}
listInt . front ( ) - > activate ( ) ;
totalRedraw ( ) ;
}
IShowActivable * CPlayerInterface : : topInt ( )
{
if ( ! listInt . size ( ) )
return NULL ;
else
return listInt . front ( ) ;
}
void CPlayerInterface : : totalRedraw ( )
{
for ( int i = 0 ; i < objsToBlit . size ( ) ; i + + )
objsToBlit [ i ] - > showAll ( screen2 ) ;
blitAt ( screen2 , 0 , 0 , screen ) ;
if ( objsToBlit . size ( ) )
objsToBlit . back ( ) - > showAll ( screen ) ;
2009-04-12 03:58:41 +03:00
}
2009-04-21 01:57:07 +03:00
void CPlayerInterface : : requestRealized ( PackageApplied * pa )
{
if ( stillMoveHero . get ( ) = = DURING_MOVE )
stillMoveHero . setn ( CONTINUE_MOVE ) ;
}
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-11-15 15:44:32 +02:00
pos . w = std : : 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 ;
}
2009-04-14 15:47:09 +03:00
2008-01-27 22:37:10 +02:00
CStatusBar : : ~ CStatusBar ( )
{
SDL_FreeSurface ( bg ) ;
}
2009-04-14 15:47:09 +03:00
2008-01-27 22:37:10 +02:00
void CStatusBar : : clear ( )
{
2009-04-03 18:55:26 +03:00
if ( LOCPLINT - > cingconsole - > enteredText = = " " ) //for appropriate support for in-game console
{
current = " " ;
2009-04-14 15:47:09 +03:00
show ( screen ) ;
2009-04-03 18:55:26 +03:00
}
2008-01-27 22:37:10 +02:00
}
2009-04-14 15:47:09 +03:00
2008-09-25 17:09:31 +03:00
void CStatusBar : : print ( const std : : string & text )
2008-01-27 22:37:10 +02:00
{
2009-04-03 18:55:26 +03:00
if ( LOCPLINT - > cingconsole - > enteredText = = " " | | text = = LOCPLINT - > cingconsole - > enteredText ) //for appropriate support for in-game console
{
current = text ;
2009-04-14 15:47:09 +03:00
show ( screen ) ;
2009-04-03 18:55:26 +03:00
}
2008-01-27 22:37:10 +02:00
}
2009-04-14 15:47:09 +03:00
void CStatusBar : : show ( SDL_Surface * to )
2008-01-27 22:37:10 +02:00
{
SDL_Rect pom = genRect ( pos . h , pos . w , pos . x , pos . y ) ;
2009-04-14 15:47:09 +03:00
SDL_BlitSurface ( bg , & genRect ( pos . h , pos . w , 0 , 0 ) , to , & pom ) ;
printAtMiddle ( current , middlex , middley , GEOR13 , zwykly , to ) ;
2008-01-27 22:37:10 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-27 22:37:10 +02:00
std : : string CStatusBar : : getCurrent ( )
{
return current ;
2008-01-31 23:35:30 +02:00
}
2009-04-14 15:47:09 +03:00
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
} ;
2009-04-14 15:47:09 +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
} ;
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CList : : clickLeft ( tribool down )
{
} ;
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
CList : : CList ( int Size )
: SIZE ( Size )
{
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
CHeroList : : CHeroList ( int Size )
: CList ( Size )
{
2008-11-12 20:26:23 +02:00
arrup = CDefHandler : : giveDef ( conf . go ( ) - > ac . hlistAU ) ;
arrdo = CDefHandler : : giveDef ( conf . go ( ) - > ac . hlistAD ) ;
mobile = CDefHandler : : giveDef ( conf . go ( ) - > ac . hlistMB ) ;
mana = CDefHandler : : giveDef ( conf . go ( ) - > ac . hlistMN ) ;
2008-06-12 09:45:51 +03:00
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 ) ) ;
2008-11-12 20:26:23 +02:00
2008-11-12 20:59:33 +02:00
pos = genRect ( 32 * SIZE + arrup - > height + arrdo - > height , std : : max ( arrup - > width , arrdo - > width ) , conf . go ( ) - > ac . hlistX , conf . go ( ) - > ac . hlistY ) ;
2008-11-12 20:26:23 +02:00
2008-11-12 20:59:33 +02:00
arrupp = genRect ( arrup - > height , arrup - > width , pos . x , pos . y ) ;
arrdop = genRect ( arrdo - > height , arrdo - > width , pos . x , pos . y + 32 * SIZE + arrup - > height ) ;
2008-11-12 20:26:23 +02:00
//32px per hero
posmobx = pos . x + 1 ;
2008-11-12 20:59:33 +02:00
posmoby = pos . y + arrup - > height + 1 ;
posporx = pos . x + mobile - > width + 2 ;
pospory = pos . y + arrup - > height ;
posmanx = pos . x + 1 + 50 + mobile - > width ;
posmany = pos . y + arrup - > height + 1 ;
2008-11-12 20:26:23 +02:00
2008-01-31 23:35:30 +02:00
from = 0 ;
pressed = indeterminate ;
}
void CHeroList : : init ( )
{
2008-11-12 20:26:23 +02:00
int w = pos . w + 1 , h = pos . h + 4 ;
bg = CSDL_Ext : : newSurface ( w , h , screen ) ;
SDL_BlitSurface ( LOCPLINT - > adventureInt - > bg , & genRect ( w , h , pos . x , pos . y ) , bg , & genRect ( w , h , 0 , 0 ) ) ;
2008-01-31 23:35:30 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CHeroList : : genList ( )
{
int howMany = LOCPLINT - > cb - > howManyHeroes ( ) ;
for ( int i = 0 ; i < howMany ; i + + )
{
2008-08-27 13:19:18 +03:00
const CGHeroInstance * h = LOCPLINT - > cb - > getHeroInfo ( i , 0 ) ;
2008-08-20 09:57:53 +03:00
if ( ! h - > inTownGarrison )
items . push_back ( std : : pair < const CGHeroInstance * , CPath * > ( h , NULL ) ) ;
2008-01-31 23:35:30 +02:00
}
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CHeroList : : select ( int which )
{
2008-02-15 20:40:58 +02:00
if ( which < 0 )
{
selected = which ;
2008-08-28 20:36:34 +03:00
LOCPLINT - > adventureInt - > selection = NULL ;
LOCPLINT - > adventureInt - > terrain . currentPath = NULL ;
2009-04-14 17:19:46 +03:00
draw ( screen ) ;
LOCPLINT - > adventureInt - > infoBar . draw ( screen ) ;
2008-02-15 20:40:58 +02:00
}
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 ;
2009-04-14 17:19:46 +03:00
2009-02-06 17:56:03 +02:00
//recalculationg path in case of something has changed on map
if ( items [ which ] . second )
{
2009-03-19 16:17:19 +02:00
CPath * newPath = LOCPLINT - > cb - > getPath ( items [ which ] . second - > startPos ( ) , items [ which ] . second - > endPos ( ) , items [ which ] . first ) ;
delete items [ which ] . second ;
2009-02-06 17:56:03 +02:00
LOCPLINT - > adventureInt - > terrain . currentPath = items [ which ] . second = newPath ;
}
else
{
LOCPLINT - > adventureInt - > terrain . currentPath = NULL ;
}
2009-04-14 17:19:46 +03:00
LOCPLINT - > adventureInt - > select ( items [ which ] . first ) ;
2009-02-06 17:56:03 +02:00
//recalculated and assigned
2008-01-31 23:35:30 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
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 ;
}
2008-11-12 20:26:23 +02:00
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & ( items . size ( ) - from > SIZE ) )
2008-01-31 23:35:30 +02:00
{
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-11-12 20:26:23 +02:00
if ( ny > = SIZE | | ny < 0 )
2008-01-31 23:35:30 +02:00
return ;
2008-08-28 20:36:34 +03:00
if ( ( ny + from ) = = selected & & ( LOCPLINT - > adventureInt - > selection - > ID = = 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 ;
2009-04-14 17:19:46 +03:00
draw ( screen2 ) ;
2008-01-31 23:35:30 +02:00
}
}
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;
2009-04-14 15:47:09 +03:00
2009-04-14 17:19:46 +03:00
draw ( screen2 ) ;
2008-01-31 23:35:30 +02:00
}
}
else
throw 0 ;
}
}
2009-04-14 15:47:09 +03:00
2008-09-25 17:09:31 +03:00
void CHeroList : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
2008-01-31 23:35:30 +02:00
{
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( from > 0 )
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > statusbar . print ( CGI - > generaltexth - > 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 ) )
{
2008-11-12 20:26:23 +02:00
if ( ( items . size ( ) - from ) > SIZE )
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > statusbar . print ( CGI - > generaltexth - > 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-11-12 20:26:23 +02:00
if ( ( ny > SIZE | | ny < 0 ) | | ( from + ny > = items . size ( ) ) )
2008-01-31 23:35:30 +02:00
{
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);
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CHeroList : : clickRight ( tribool down )
{
if ( down )
{
/***************************ARROWS*****************************************/
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & from > 0 )
{
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > 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-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > 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-11-12 20:26:23 +02:00
if ( ( ny > SIZE | | ny < 0 ) | | ( from + ny > = items . size ( ) ) )
2008-02-23 00:26:31 +02:00
{
return ;
}
//show popup
2008-11-09 00:29:19 +02:00
CInfoPopup * ip = new CInfoPopup ( graphics - > heroWins [ items [ from + ny ] . first - > subID ] ,
2009-04-14 15:47:09 +03:00
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 ) ;
LOCPLINT - > pushInt ( ip ) ;
2008-01-31 23:35:30 +02:00
}
else
{
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 303 ] . second , down , this ) ;
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 304 ] . second , down , this ) ;
2008-01-31 23:35:30 +02:00
}
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CHeroList : : hover ( bool on )
{
}
2009-04-14 15:47:09 +03:00
2008-09-25 17:09:31 +03:00
void CHeroList : : keyPressed ( const SDL_KeyboardEvent & key )
2008-01-31 23:35:30 +02:00
{
}
2009-04-14 15:47:09 +03:00
2009-03-20 20:51:48 +02:00
void CHeroList : : updateHList ( const CGHeroInstance * toRemove )
2008-01-31 23:35:30 +02:00
{
2009-03-20 20:51:48 +02:00
if ( toRemove ) //remove specific hero
{
for ( std : : vector < std : : pair < const CGHeroInstance * , CPath * > > : : iterator i = items . begin ( ) ; i ! = items . end ( ) ; i + + )
{
if ( i - > first = = toRemove )
{
delete i - > second ;
items . erase ( i ) ;
break ;
}
}
}
else
{
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
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CHeroList : : updateMove ( const CGHeroInstance * which ) //draws move points bar
{
2008-11-09 00:29:19 +02:00
int ser = - 1 ;
for ( int i = 0 ; i < items . size ( ) & & ser < 0 ; i + + )
if ( items [ i ] . first - > subID = = which - > subID )
ser = i ;
2008-01-31 23:35:30 +02:00
ser - = from ;
2008-11-09 00:29:19 +02:00
if ( ser < 0 | | ser > SIZE ) return ;
2008-12-31 11:33:46 +02:00
int pom = std : : min ( ( which - > movement ) / 100 , ( si32 ) mobile - > ourImages . size ( ) - 1 ) ;
2008-01-31 23:35:30 +02:00
blitAt ( mobile - > ourImages [ pom ] . bitmap , posmobx , posmoby + ser * 32 ) ; //move point
}
2009-04-14 15:47:09 +03:00
void CHeroList : : draw ( SDL_Surface * to )
2008-08-02 18:08:03 +03:00
{
2008-11-12 20:26:23 +02:00
for ( int iT = 0 + from ; iT < SIZE + from ; iT + + )
2008-01-31 23:35:30 +02:00
{
int i = iT - from ;
if ( iT > = items . size ( ) )
{
2009-04-14 15:47:09 +03:00
blitAt ( mobile - > ourImages [ 0 ] . bitmap , posmobx , posmoby + i * 32 , to ) ;
blitAt ( mana - > ourImages [ 0 ] . bitmap , posmanx , posmany + i * 32 , to ) ;
blitAt ( empty , posporx , pospory + i * 32 , to ) ;
2008-01-31 23:35:30 +02:00
continue ;
}
2008-08-20 09:57:53 +03:00
const CGHeroInstance * cur = items [ iT ] . first ;
int pom = cur - > movement / 100 ;
2008-01-31 23:35:30 +02:00
if ( pom > 25 ) pom = 25 ;
if ( pom < 0 ) pom = 0 ;
2009-04-14 15:47:09 +03:00
blitAt ( mobile - > ourImages [ pom ] . bitmap , posmobx , posmoby + i * 32 , to ) ; //move point
2008-11-12 20:26:23 +02:00
pom = cur - > mana / 5 ;
2008-01-31 23:35:30 +02:00
if ( pom > 25 ) pom = 25 ;
if ( pom < 0 ) pom = 0 ;
2009-04-14 15:47:09 +03:00
blitAt ( mana - > ourImages [ pom ] . bitmap , posmanx , posmany + i * 32 , to ) ; //mana
2008-08-20 09:57:53 +03:00
SDL_Surface * temp = graphics - > portraitSmall [ cur - > portrait ] ;
2009-04-14 15:47:09 +03:00
blitAt ( temp , posporx , pospory + i * 32 , to ) ;
2008-08-28 20:36:34 +03:00
if ( ( selected = = iT ) & & ( LOCPLINT - > adventureInt - > selection - > ID = = HEROI_TYPE ) )
2008-01-31 23:35:30 +02:00
{
2009-04-14 15:47:09 +03:00
blitAt ( selection , posporx , pospory + i * 32 , to ) ;
2008-01-31 23:35:30 +02:00
}
//TODO: support for custom portraits
}
if ( from > 0 )
2009-04-14 15:47:09 +03:00
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y , to ) ;
2008-01-31 23:35:30 +02:00
else
2009-04-14 15:47:09 +03:00
blitAt ( arrup - > ourImages [ 2 ] . bitmap , arrupp . x , arrupp . y , to ) ;
2008-01-31 23:35:30 +02:00
2008-11-12 20:26:23 +02:00
if ( items . size ( ) - from > SIZE )
2009-04-14 15:47:09 +03:00
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y , to ) ;
2008-01-31 23:35:30 +02:00
else
2009-04-14 15:47:09 +03:00
blitAt ( arrdo - > ourImages [ 2 ] . bitmap , arrdop . x , arrdop . y , to ) ;
2008-03-02 15:16:11 +02:00
}
2008-05-18 20:33:39 +03:00
2008-08-28 20:36:34 +03:00
int CHeroList : : getPosOfHero ( const CArmedInstance * h )
{
2009-03-22 18:04:46 +02:00
return vstd : : findPos (
items , h ,
boost : : bind ( vstd : : equal < std : : pair < const CGHeroInstance * , CPath * > ,
const CArmedInstance * , const CGHeroInstance * > , _1 ,
& std : : pair < const CGHeroInstance * , CPath * > : : first , _2 ) ) ;
2008-08-28 20:36:34 +03:00
}
2008-05-18 20:33:39 +03:00
CTownList : : ~ CTownList ( )
{
delete arrup ;
delete arrdo ;
}
2008-11-12 20:26:23 +02:00
CTownList : : CTownList ( int Size , int x , int y , std : : string arrupg , std : : string arrdog )
2008-05-18 20:33:39 +03:00
: CList ( Size )
{
2008-11-12 20:26:23 +02:00
arrup = CDefHandler : : giveDef ( arrupg ) ;
arrdo = CDefHandler : : giveDef ( arrdog ) ;
pos . x = x ;
pos . y = y ;
2008-11-30 02:15:38 +02:00
pos . w = std : : max ( arrdo - > width , arrup - > width ) ;
pos . h = arrdo - > height + arrup - > height + Size * 32 ;
2008-11-12 20:26:23 +02:00
arrupp . x = x ;
arrupp . y = y ;
2008-11-12 20:59:33 +02:00
arrupp . w = arrup - > width ;
arrupp . h = arrup - > height ;
2008-11-12 20:26:23 +02:00
arrdop . x = x ;
2008-11-12 20:59:33 +02:00
arrdop . y = y + arrup - > height + 32 * SIZE ;
arrdop . w = arrdo - > width ;
arrdop . h = arrdo - > height ;
2008-05-18 20:33:39 +03:00
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 ( ) ;
}
2008-09-25 17:09:31 +03:00
void CTownList : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
2008-05-18 20:33:39 +03:00
{
if ( isItIn ( & arrupp , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( from > 0 )
2008-11-28 03:36:34 +02:00
LOCPLINT - > statusbar - > print ( CGI - > generaltexth - > zelp [ 306 ] . first ) ;
2008-05-18 20:33:39 +03:00
else
LOCPLINT - > statusbar - > clear ( ) ;
return ;
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) )
{
if ( ( items . size ( ) - from ) > SIZE )
2008-11-28 03:36:34 +02:00
LOCPLINT - > statusbar - > print ( CGI - > generaltexth - > zelp [ 307 ] . first ) ;
2008-05-18 20:33:39 +03:00
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 ;
2009-04-14 15:47:09 +03:00
if ( LOCPLINT - > topInt ( ) = = LOCPLINT - > adventureInt
2008-11-28 03:36:34 +02:00
& & ( ny + from ) = = selected
& & LOCPLINT - > adventureInt - > selection - > ID = = TOWNI_TYPE
)
2008-05-18 20:33:39 +03:00
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 ;
2009-04-14 15:47:09 +03:00
2009-04-14 17:19:46 +03:00
draw ( screen2 ) ;
2008-05-18 20:33:39 +03:00
}
}
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;
2009-04-14 15:47:09 +03:00
2009-04-14 17:19:46 +03:00
draw ( screen2 ) ;
2008-05-18 20:33:39 +03:00
}
}
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 )
{
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 306 ] . second , down , this ) ;
2008-05-18 20:33:39 +03:00
}
else if ( isItIn ( & arrdop , LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) & & ( items . size ( ) - from > 5 ) )
{
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 307 ] . second , down , this ) ;
2008-05-18 20:33:39 +03:00
}
//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
2009-04-14 15:47:09 +03:00
CInfoPopup * ip = new CInfoPopup (
graphics - > townWins [ items [ from + ny ] - > id ] ,
LOCPLINT - > current - > motion . x - graphics - > townWins [ items [ from + ny ] - > id ] - > w ,
LOCPLINT - > current - > motion . y - graphics - > townWins [ items [ from + ny ] - > id ] - > h ,
false ) ;
LOCPLINT - > pushInt ( ip ) ;
2008-05-18 20:33:39 +03:00
}
else
{
2008-11-28 03:36:34 +02:00
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 306 ] . second , down , this ) ;
LOCPLINT - > adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 307 ] . second , down , this ) ;
2008-05-18 20:33:39 +03:00
}
}
void CTownList : : hover ( bool on )
{
}
2008-09-25 17:09:31 +03:00
void CTownList : : keyPressed ( const SDL_KeyboardEvent & key )
2008-05-18 20:33:39 +03:00
{
}
2009-04-14 15:47:09 +03:00
void CTownList : : draw ( SDL_Surface * to )
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 ( ) )
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > getPic ( - 1 ) , posporx , pospory + i * 32 , to ) ;
2008-05-18 20:33:39 +03:00
continue ;
}
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > getPic ( items [ iT ] - > subID , items [ iT ] - > hasFort ( ) , items [ iT ] - > builded ) , posporx , pospory + i * 32 , to ) ;
2008-05-18 20:33:39 +03:00
2008-08-28 20:36:34 +03:00
if ( ( selected = = iT ) & & ( LOCPLINT - > adventureInt - > selection - > ID = = TOWNI_TYPE ) )
2008-05-18 20:33:39 +03:00
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > getPic ( - 2 ) , posporx , pospory + i * 32 , to ) ;
2008-05-18 20:33:39 +03:00
}
}
if ( from > 0 )
2009-04-14 15:47:09 +03:00
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y , to ) ;
2008-05-18 20:33:39 +03:00
else
2009-04-14 15:47:09 +03:00
blitAt ( arrup - > ourImages [ 2 ] . bitmap , arrupp . x , arrupp . y , to ) ;
2008-05-18 20:33:39 +03:00
if ( items . size ( ) - from > SIZE )
2009-04-14 15:47:09 +03:00
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y , to ) ;
2008-05-18 20:33:39 +03:00
else
2009-04-14 15:47:09 +03:00
blitAt ( arrdo - > ourImages [ 2 ] . bitmap , arrdop . x , arrdop . y , to ) ;
2008-05-18 20:33:39 +03:00
}
2008-08-17 12:11:16 +03:00
CCreaturePic : : CCreaturePic ( CCreature * cre , bool Big )
: c ( cre ) , big ( Big )
2008-06-04 16:00:56 +03:00
{
anim = new CCreatureAnimation ( cre - > animDefName ) ;
}
CCreaturePic : : ~ CCreaturePic ( )
{
delete anim ;
}
int CCreaturePic : : blitPic ( SDL_Surface * to , int x , int y , bool nextFrame )
{
2008-08-17 12:11:16 +03:00
SDL_Rect dst ;
if ( big )
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > backgrounds [ c - > faction ] , x , y , to ) ; //curx-50,pos.y+130-65);
2008-08-17 12:11:16 +03:00
dst = genRect ( 130 , 100 , x , y ) ;
}
else
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > backgroundsm [ c - > faction ] , x , y , to ) ; //curx-50,pos.y+130-65);
2008-08-17 12:11:16 +03:00
dst = genRect ( 120 , 100 , x , y ) ;
}
2008-06-04 16:00:56 +03:00
if ( c - > isDoubleWide ( ) )
x - = 15 ;
2009-02-21 17:43:28 +02:00
return anim - > nextFrameMiddle ( to , x + 78 , y + ( big ? 55 : 45 ) , true , 0 , nextFrame , false , false , & dst ) ;
2008-06-04 16:00:56 +03:00
}
SDL_Surface * CCreaturePic : : getPic ( bool nextFrame )
{
//TODO: write
return NULL ;
}
2008-04-04 20:30:53 +03:00
void CRecrutationWindow : : close ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-04-04 20:30:53 +03:00
}
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 )
{
2009-02-06 13:15:39 +02:00
buy - > block ( ! to ) ;
2008-04-04 20:30:53 +03:00
}
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-11-15 15:44:32 +02:00
int newAmount = std : : 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
}
2009-01-22 19:30:15 +02:00
void CRecrutationWindow : : clickRight ( boost : : logic : : tribool down )
{
if ( down )
{
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 ) )
{
CCreInfoWindow * popup = new CCreInfoWindow ( creatures [ i ] . ID , 0 , 0 , NULL , NULL , NULL , NULL ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( popup ) ;
2009-01-22 19:30:15 +02:00
break ;
}
curx + = 120 ;
}
}
}
2008-04-04 20:30:53 +03:00
void CRecrutationWindow : : activate ( )
{
2008-04-15 20:12:21 +03:00
ClickableL : : activate ( ) ;
2009-01-22 19:30:15 +02:00
ClickableR : : activate ( ) ;
2008-04-04 20:30:53 +03:00
buy - > activate ( ) ;
max - > activate ( ) ;
cancel - > activate ( ) ;
slider - > activate ( ) ;
2009-02-06 13:15:39 +02:00
LOCPLINT - > statusbar = bar ;
2008-04-04 20:30:53 +03:00
}
void CRecrutationWindow : : deactivate ( )
{
2008-04-15 20:12:21 +03:00
ClickableL : : deactivate ( ) ;
2009-01-22 19:30:15 +02:00
ClickableR : : 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 ;
2009-04-14 15:47:09 +03:00
blitAt ( bitmap , pos . x , pos . y , to ) ;
buy - > show ( to ) ;
max - > show ( to ) ;
cancel - > show ( to ) ;
slider - > show ( to ) ;
2008-04-04 20:30:53 +03:00
char pom [ 15 ] ;
2008-08-20 09:57:53 +03:00
SDL_itoa ( creatures [ which ] . amount - slider - > value , pom , 10 ) ; //available
2009-04-14 15:47:09 +03:00
printAtMiddle ( pom , pos . x + 205 , pos . y + 252 , GEOR13 , zwykly , to ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( slider - > value , pom , 10 ) ; //recruit
2009-04-14 15:47:09 +03:00
printAtMiddle ( pom , pos . x + 279 , pos . y + 252 , GEOR13 , zwykly , to ) ;
printAtMiddle ( CGI - > generaltexth - > allTexts [ 16 ] + " " + CGI - > creh - > creatures [ creatures [ which ] . ID ] . namePl , pos . x + 243 , pos . y + 32 , GEOR16 , tytulowy , to ) ; //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 + + )
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > resources32 - > ourImages [ creatures [ which ] . res [ i ] . first ] . bitmap , curx , pos . y + 243 , to ) ;
blitAt ( graphics - > resources32 - > ourImages [ creatures [ which ] . res [ i ] . first ] . bitmap , curx + 258 , pos . y + 243 , to ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( creatures [ which ] . res [ i ] . second , pom , 10 ) ;
2009-04-14 15:47:09 +03:00
printAtMiddle ( pom , curx + 12 , pos . y + 286 , GEOR13 , zwykly , to ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( creatures [ which ] . res [ i ] . second * slider - > value , pom , 10 ) ;
2009-04-14 15:47:09 +03:00
printAtMiddle ( pom , curx + 12 + 258 , pos . y + 286 , GEOR13 , zwykly , to ) ;
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 + + )
{
2009-04-14 15:47:09 +03:00
creatures [ i ] . pic - > blitPic ( to , curx - 50 , pos . y + 130 - 65 , ! ( c % 4 ) ) ;
2008-04-04 20:30:53 +03:00
curx + = 120 ;
}
c + + ;
2009-04-14 15:47:09 +03:00
bar - > show ( to ) ;
2008-04-04 20:30:53 +03:00
}
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 ;
2009-02-06 13:15:39 +02:00
bar = new CStatusBar ( pos . x + 8 , pos . y + 370 , " APHLFTRT.bmp " , 471 ) ;
max = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 553 ] , boost : : bind ( & CRecrutationWindow : : Max , this ) , pos . x + 134 , pos . y + 313 , " IRCBTNS.DEF " , SDLK_m ) ;
buy = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 554 ] , boost : : bind ( & CRecrutationWindow : : Buy , this ) , pos . x + 212 , pos . y + 313 , " IBY6432.DEF " , SDLK_RETURN ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 555 ] , boost : : bind ( & CRecrutationWindow : : Cancel , this ) , pos . x + 290 , pos . y + 313 , " ICN6432.DEF " , SDLK_ESCAPE ) ;
2008-11-15 15:44:32 +02:00
slider = new CSlider ( pos . x + 176 , pos . y + 279 , 135 , boost : : bind ( & CRecrutationWindow : : sliderMoved , this , _1 ) , 1 , std : : 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 ;
}
2009-02-06 13:15:39 +02:00
if ( ! creatures [ 0 ] . amount | | ! amounts [ 0 ] )
2008-09-14 10:11:07 +03:00
{
max - > block ( true ) ;
2009-02-06 13:15:39 +02:00
slider - > block ( true ) ;
2008-09-14 10:11:07 +03:00
}
2009-02-06 13:15:39 +02:00
//buy->block(true); //not needed, will be blocked by initing slider on 0
2008-08-17 12:11:16 +03:00
}
2008-04-04 20:30:53 +03:00
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 ;
2009-02-06 13:15:39 +02:00
delete bar ;
2008-04-19 19:15:04 +03:00
}
2009-03-27 01:05:40 +02:00
CSplitWindow : : CSplitWindow ( int cid , int max , CGarrisonInt * Owner , int Last , int val )
2008-04-19 19:15:04 +03:00
{
2009-03-27 01:05:40 +02:00
last = Last ;
2009-02-20 21:19:52 +02:00
which = 1 ;
2008-04-19 19:15:04 +03:00
c = cid ;
slider = NULL ;
gar = Owner ;
2008-06-12 09:45:51 +03:00
bitmap = BitmapHandler : : loadBitmap ( " GPUCRDIV.bmp " ) ;
2009-02-20 21:19:52 +02:00
graphics - > blueToPlayersAdv ( bitmap , LOCPLINT - > playerID ) ;
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-10-19 16:17:32 +03:00
ok = new AdventureMapButton ( " " , " " , boost : : bind ( & CSplitWindow : : split , this ) , pos . x + 20 , pos . y + 263 , " IOK6432.DEF " , SDLK_RETURN ) ;
cancel = new AdventureMapButton ( " " , " " , boost : : bind ( & CSplitWindow : : close , this ) , pos . x + 214 , pos . y + 263 , " ICN6432.DEF " , SDLK_ESCAPE ) ;
2009-03-27 01:05:40 +02:00
int sliderPositions = max - ( last > = 0 ) - ( last = = 2 ) ;
slider = new CSlider ( pos . x + 21 , pos . y + 194 , 257 , boost : : bind ( & CSplitWindow : : sliderMoved , this , _1 ) , 1 , sliderPositions , val , true ) ;
a1 = max - val ;
a2 = val ;
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 ( )
{
2009-02-20 21:19:52 +02:00
ClickableL : : activate ( ) ;
2008-04-19 19:15:04 +03:00
KeyInterested : : activate ( ) ;
ok - > activate ( ) ;
cancel - > activate ( ) ;
slider - > activate ( ) ;
}
void CSplitWindow : : deactivate ( )
{
2009-02-20 21:19:52 +02:00
ClickableL : : deactivate ( ) ;
2008-04-19 19:15:04 +03:00
KeyInterested : : deactivate ( ) ;
ok - > deactivate ( ) ;
cancel - > deactivate ( ) ;
slider - > deactivate ( ) ;
}
void CSplitWindow : : split ( )
{
gar - > splitStacks ( a2 ) ;
close ( ) ;
}
void CSplitWindow : : close ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-04-19 19:15:04 +03:00
}
void CSplitWindow : : sliderMoved ( int to )
{
2009-03-27 01:05:40 +02:00
int all = a1 + a2 ;
a2 = to + ( last = = 1 | | last = = 2 ) ;
2008-04-19 19:15:04 +03:00
if ( slider )
2009-03-27 01:05:40 +02:00
a1 = all - a2 ;
2008-04-19 19:15:04 +03:00
}
void CSplitWindow : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bitmap , pos . x , pos . y , to ) ;
ok - > show ( to ) ;
cancel - > show ( to ) ;
slider - > show ( to ) ;
printAtMiddle ( boost : : lexical_cast < std : : string > ( a1 ) + ( ! which ? " _ " : " " ) , pos . x + 70 , pos . y + 237 , GEOR16 , zwykly , to ) ;
printAtMiddle ( boost : : lexical_cast < std : : string > ( a2 ) + ( which ? " _ " : " " ) , pos . x + 233 , pos . y + 237 , GEOR16 , zwykly , to ) ;
anim - > blitPic ( to , pos . x + 20 , pos . y + 54 , false ) ;
anim - > blitPic ( to , pos . x + 177 , pos . y + 54 , false ) ;
2008-04-19 19:15:04 +03:00
}
2008-09-25 17:09:31 +03:00
void CSplitWindow : : keyPressed ( const SDL_KeyboardEvent & key )
2008-04-19 19:15:04 +03:00
{
2009-02-20 21:19:52 +02:00
if ( key . state ! = SDL_PRESSED )
return ;
int & cur = ( which ? a2 : a1 ) ,
& sec = ( which ? a1 : a2 ) ,
ncur = cur ;
if ( key . keysym . sym = = SDLK_BACKSPACE )
{
ncur / = 10 ;
}
else if ( key . keysym . sym = = SDLK_TAB )
{
which = ! which ;
}
else
{
int number = key . keysym . sym - SDLK_0 ;
2009-03-27 01:05:40 +02:00
if ( number < 0 | | number > 9 ) //not a number pressed
2009-02-20 21:19:52 +02:00
{
return ;
}
ncur = cur * 10 + number ;
}
int delta = ncur - cur ;
if ( delta > sec )
{
cur + = sec ;
sec = 0 ;
}
slider - > moveTo ( which ? ncur : a1 + a2 - ncur ) ;
}
void CSplitWindow : : clickLeft ( boost : : logic : : tribool down )
{
if ( down )
{
Point click ( LOCPLINT - > current - > motion . x , LOCPLINT - > current - > motion . y ) ;
click - = pos . topLeft ( ) ;
if ( Rect ( 19 , 216 , 105 , 40 ) . isIn ( click ) )
which = 0 ;
else if ( Rect ( 175 , 216 , 105 , 40 ) . isIn ( click ) )
which = 1 ;
}
2008-05-03 18:30:11 +03:00
}
2008-05-18 20:33:39 +03:00
2009-02-20 21:19:52 +02:00
2008-05-18 20:33:39 +03:00
void CCreInfoWindow : : show ( SDL_Surface * to )
{
char pom [ 15 ] ;
2009-04-14 15:47:09 +03:00
blitAt ( bitmap , pos . x , pos . y , to ) ;
anim - > blitPic ( to , pos . x + 21 , pos . y + 48 , ( type ) & & ! ( anf % 4 ) ) ;
2008-08-16 11:47:41 +03:00
if ( + + anf = = 4 )
anf = 0 ;
if ( count . size ( ) )
2009-04-14 15:47:09 +03:00
printTo ( count . c_str ( ) , pos . x + 114 , pos . y + 174 , GEOR16 , zwykly , to ) ;
2008-05-31 23:37:54 +03:00
if ( upgrade )
2009-04-14 15:47:09 +03:00
upgrade - > show ( to ) ;
2008-05-31 23:37:54 +03:00
if ( dismiss )
2009-04-14 15:47:09 +03:00
dismiss - > show ( to ) ;
2008-05-31 23:37:54 +03:00
if ( ok )
2009-04-14 15:47:09 +03:00
ok - > show ( to ) ;
2008-05-18 20:33:39 +03:00
}
2008-08-16 11:47:41 +03:00
CCreInfoWindow : : CCreInfoWindow ( int Cid , int Type , int creatureCount , StackState * State , boost : : function < void ( ) > Upg , boost : : function < void ( ) > Dsm , UpgradeInfo * ui )
2009-04-15 13:20:47 +03:00
: type ( Type ) , dsm ( Dsm ) , dismiss ( 0 ) , upgrade ( 0 ) , ok ( 0 )
2008-05-18 20:33:39 +03:00
{
2009-04-14 15:47:09 +03:00
//active = false;
2008-08-16 11:47:41 +03:00
anf = 0 ;
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 ) ;
2008-11-06 19:17:48 +02:00
if ( ! type ) anim - > anim - > setType ( 2 ) ;
2008-05-18 20:33:39 +03:00
2008-11-01 00:41:22 +02:00
char pom [ 75 ] ; int hlp = 0 ;
2008-08-16 11:47:41 +03:00
if ( creatureCount )
{
SDL_itoa ( creatureCount , pom , 10 ) ;
count = pom ;
}
2009-01-22 19:30:15 +02:00
printAtMiddle ( c - > namePl , 149 , 30 , GEOR13 , tytulowy , bitmap ) ; //creature name
2008-05-18 20:33:39 +03:00
2008-05-23 22:50:11 +03:00
//atttack
2009-01-22 19:30:15 +02:00
printAt ( CGI - > generaltexth - > primarySkillNames [ 0 ] , 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 )
{
2008-11-06 19:17:48 +02:00
int hlp ;
if ( c - > attack > 0 )
hlp = log10f ( c - > attack ) + 2 ;
else
hlp = 2 ;
2008-05-23 22:50:11 +03:00
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
2009-01-22 19:30:15 +02:00
printAt ( CGI - > generaltexth - > primarySkillNames [ 1 ] , 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 )
{
2008-11-06 19:17:48 +02:00
int hlp ;
if ( c - > defence > 0 )
hlp = log10f ( c - > defence ) + 2 ;
else
hlp = 2 ;
2008-05-23 22:50:11 +03:00
pom [ hlp - 1 ] = ' ' ; pom [ hlp ] = ' ( ' ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > defence + State - > defenseBonus , pom + hlp + 1 , 10 ) ;
2008-08-09 02:02:32 +03:00
hlp + = 2 + ( int ) log10f ( State - > defenseBonus + c - > defence ) ;
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 , 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-11-01 00:41:22 +02:00
if ( State )
sprintf ( pom , " %d(%d) " , c - > shots , State - > shotsLeft ) ;
else
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-11-06 19:17:48 +02:00
if ( c - > damageMin > 0 )
hlp = log10f ( c - > damageMin ) + 2 ;
else
hlp = 2 ;
2008-05-23 22:50:11 +03:00
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
2009-01-22 19:30:15 +02:00
printAt ( CGI - > generaltexth - > allTexts [ 388 ] , 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
2008-08-09 02:02:32 +03:00
//remaining health
2008-08-13 12:28:06 +03:00
if ( State & & State - > currentHealth )
2008-08-09 02:02:32 +03:00
{
2009-01-22 19:30:15 +02:00
printAt ( CGI - > generaltexth - > allTexts [ 200 ] , 155 , 143 , GEOR13 , zwykly , bitmap ) ;
2008-08-09 02:02:32 +03:00
SDL_itoa ( State - > currentHealth , pom , 10 ) ;
printToWR ( pom , 276 , 156 , GEOR13 , zwykly , bitmap ) ;
}
2008-05-23 22:50:11 +03:00
//speed
2008-11-28 03:36:34 +02:00
printAt ( CGI - > generaltexth - > zelp [ 441 ] . first , 155 , 162 , GEOR13 , zwykly , bitmap ) ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( c - > speed , pom , 10 ) ;
2009-01-30 16:36:26 +02:00
if ( State & & State - > speedBonus )
{
int hlp ;
if ( c - > speed > 0 )
hlp = log10f ( c - > speed ) + 2 ;
else
hlp = 2 ;
pom [ hlp - 1 ] = ' ' ; pom [ hlp ] = ' ( ' ;
SDL_itoa ( c - > speed + State - > speedBonus , pom + hlp + 1 , 10 ) ;
hlp + = 2 + ( int ) log10f ( c - > speed + State - > speedBonus ) ;
pom [ hlp ] = ' ) ' ; pom [ hlp + 1 ] = ' \0 ' ;
}
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 )
{
2008-08-15 17:08:39 +03:00
if ( Upg & & ui )
2008-08-15 15:11:42 +03:00
{
2008-08-20 22:02:48 +03:00
bool enough = true ;
2008-08-16 11:47:41 +03:00
for ( std : : set < std : : pair < int , int > > : : iterator i = ui - > cost [ 0 ] . begin ( ) ; i ! = ui - > cost [ 0 ] . end ( ) ; i + + ) //calculate upgrade cost
{
2008-08-20 22:02:48 +03:00
if ( LOCPLINT - > cb - > getResourceAmount ( i - > first ) < i - > second * creatureCount )
enough = false ;
2008-08-16 11:47:41 +03:00
upgResCost . push_back ( new SComponent ( SComponent : : resource , i - > first , i - > second * creatureCount ) ) ;
}
2008-08-20 22:02:48 +03:00
if ( enough )
{
CFunctionList < void ( ) > fs [ 2 ] ;
fs [ 0 ] + = Upg ;
fs [ 0 ] + = boost : : bind ( & CCreInfoWindow : : close , this ) ;
CFunctionList < void ( ) > cfl ;
2009-04-14 15:47:09 +03:00
cfl = boost : : bind ( & CPlayerInterface : : showYesNoDialog , LOCPLINT , CGI - > generaltexth - > allTexts [ 207 ] , boost : : ref ( upgResCost ) , fs [ 0 ] , fs [ 1 ] , false ) ;
2008-11-28 03:36:34 +02:00
upgrade = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 446 ] . second , cfl , pos . x + 76 , pos . y + 237 , " IVIEWCR.DEF " , SDLK_u ) ;
2008-08-20 22:02:48 +03:00
}
else
2008-08-15 17:08:39 +03:00
{
2008-11-28 03:36:34 +02:00
upgrade = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 446 ] . second , boost : : function < void ( ) > ( ) , pos . x + 76 , pos . y + 237 , " IVIEWCR.DEF " ) ;
2008-08-20 22:02:48 +03:00
upgrade - > callback . funcs . clear ( ) ;
upgrade - > bitmapOffset = 2 ;
2008-08-15 17:08:39 +03:00
}
2008-08-20 22:02:48 +03:00
2008-08-15 15:11:42 +03:00
}
2008-05-23 22:50:11 +03:00
if ( Dsm )
2008-08-15 17:08:39 +03:00
{
CFunctionList < void ( ) > fs [ 2 ] ;
2008-08-16 11:47:41 +03:00
//on dismiss confirmed
fs [ 0 ] + = Dsm ; //dismiss
fs [ 0 ] + = boost : : bind ( & CCreInfoWindow : : close , this ) ; //close this window
2008-08-17 17:09:30 +03:00
CFunctionList < void ( ) > cfl ;
2009-04-14 15:47:09 +03:00
cfl = boost : : bind ( & CPlayerInterface : : showYesNoDialog , LOCPLINT , CGI - > generaltexth - > allTexts [ 12 ] , std : : vector < SComponent * > ( ) , fs [ 0 ] , fs [ 1 ] , false ) ;
2008-11-28 03:36:34 +02:00
dismiss = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 445 ] . second , cfl , pos . x + 21 , pos . y + 237 , " IVIEWCR2.DEF " , SDLK_d ) ;
2008-08-15 17:08:39 +03:00
}
2008-11-28 03:36:34 +02:00
ok = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 445 ] . second , boost : : bind ( & CCreInfoWindow : : close , this ) , pos . x + 216 , pos . y + 237 , " IOKAY.DEF " , SDLK_RETURN ) ;
2008-05-23 22:50:11 +03:00
}
else
{
printAtWB ( c - > abilityText , 17 , 231 , GEOR13 , 35 , zwykly , bitmap ) ;
}
2008-12-21 13:07:23 +02:00
//spell effects
if ( State )
{
int printed = 0 ; //how many effect pics have been printed
for ( std : : set < int > : : const_iterator it = State - > effects . begin ( ) ; it ! = State - > effects . end ( ) ; + + it )
{
blitAt ( graphics - > spellEffectsPics - > ourImages [ * it + 1 ] . bitmap , 127 + 52 * printed , 186 , bitmap ) ;
+ + printed ;
if ( printed > = 3 )
{
break ;
}
}
}
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-08-16 11:47:41 +03:00
for ( int i = 0 ; i < upgResCost . size ( ) ; i + + )
delete upgResCost [ i ] ;
2008-05-18 20:33:39 +03:00
}
2009-04-14 15:47:09 +03:00
2008-05-18 20:33:39 +03:00
void CCreInfoWindow : : activate ( )
{
2009-04-14 15:47:09 +03:00
//if(active) return;
//active = true;
2008-06-04 16:00:56 +03:00
if ( ! type )
ClickableR : : activate ( ) ;
2008-05-18 20:33:39 +03:00
if ( ok )
ok - > activate ( ) ;
if ( dismiss )
dismiss - > activate ( ) ;
if ( upgrade )
upgrade - > activate ( ) ;
}
2009-04-14 15:47:09 +03:00
2008-05-18 20:33:39 +03:00
void CCreInfoWindow : : close ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-05-18 20:33:39 +03:00
}
2009-04-14 15:47:09 +03:00
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 ( ) ;
}
2009-04-14 15:47:09 +03:00
2008-09-25 17:09:31 +03:00
void CCreInfoWindow : : keyPressed ( const SDL_KeyboardEvent & key )
2008-05-18 20:33:39 +03:00
{
}
2009-04-14 15:47:09 +03:00
2008-05-18 20:33:39 +03:00
void CCreInfoWindow : : deactivate ( )
{
2009-04-14 15:47:09 +03:00
//if(!active) return;
//active = false;
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
if ( ok )
ok - > deactivate ( ) ;
if ( dismiss )
dismiss - > deactivate ( ) ;
if ( upgrade )
upgrade - > deactivate ( ) ;
2008-05-27 16:16:35 +03:00
}
2008-08-13 03:44:31 +03:00
void CLevelWindow : : close ( )
{
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
if ( comps [ i ] - > selected )
{
cb ( i ) ;
break ;
}
}
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2009-02-14 16:37:13 +02:00
LOCPLINT - > showingDialog - > setn ( false ) ;
2008-08-13 03:44:31 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-13 03:44:31 +03:00
CLevelWindow : : CLevelWindow ( const CGHeroInstance * hero , int pskill , std : : vector < ui16 > & skills , boost : : function < void ( ui32 ) > & callback )
{
2009-02-14 16:37:13 +02:00
LOCPLINT - > showingDialog - > setn ( true ) ;
2008-08-13 03:44:31 +03:00
heroType = hero - > subID ;
cb = callback ;
for ( int i = 0 ; i < skills . size ( ) ; i + + )
2009-02-14 15:51:21 +02:00
{
2009-02-14 16:37:13 +02:00
comps . push_back ( new CSelectableComponent ( SComponent : : secskill44 , skills [ i ] , hero - > getSecSkillLevel ( skills [ i ] ) + 1 , boost : : bind ( & CLevelWindow : : selectionChanged , this , i ) ) ) ;
comps . back ( ) - > assignedKeys . insert ( SDLK_1 + i ) ;
2009-02-04 05:55:12 +02:00
}
2008-08-13 03:44:31 +03:00
bitmap = BitmapHandler : : loadBitmap ( " LVLUPBKG.bmp " ) ;
graphics - > blueToPlayersAdv ( bitmap , hero - > tempOwner ) ;
SDL_SetColorKey ( bitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( bitmap - > format , 0 , 255 , 255 ) ) ;
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-10-19 16:17:32 +03:00
ok = new AdventureMapButton ( " " , " " , boost : : bind ( & CLevelWindow : : close , this ) , pos . x + 297 , pos . y + 413 , " IOKAY.DEF " , SDLK_RETURN ) ;
2008-08-13 03:44:31 +03:00
//draw window
char buf [ 100 ] , buf2 [ 100 ] ;
strcpy ( buf2 , CGI - > generaltexth - > allTexts [ 444 ] . c_str ( ) ) ; //%s has gained a level.
sprintf ( buf , buf2 , hero - > name . c_str ( ) ) ;
printAtMiddle ( buf , 192 , 35 , GEOR16 , zwykly , bitmap ) ;
strcpy ( buf2 , CGI - > generaltexth - > allTexts [ 445 ] . c_str ( ) ) ; //%s is now a level %d %s.
sprintf ( buf , buf2 , hero - > name . c_str ( ) , hero - > level , hero - > type - > heroClass - > name . c_str ( ) ) ;
printAtMiddle ( buf , 192 , 162 , GEOR16 , zwykly , bitmap ) ;
blitAt ( graphics - > pskillsm - > ourImages [ pskill ] . bitmap , 174 , 190 , bitmap ) ;
printAtMiddle ( ( CGI - > generaltexth - > primarySkillNames [ pskill ] + " +1 " ) , 192 , 252 , GEOR16 , zwykly , bitmap ) ;
SDL_Surface * ort = TTF_RenderText_Blended ( GEOR16 , CGI - > generaltexth - > allTexts [ 4 ] . c_str ( ) , zwykly ) ;
int curx = bitmap - > w / 2 - ( skills . size ( ) * 44 + ( skills . size ( ) - 1 ) * ( 36 + ort - > w ) ) / 2 ;
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
comps [ i ] - > pos . x = curx + pos . x ;
comps [ i ] - > pos . y = 326 + pos . y ;
if ( i < ( comps . size ( ) - 1 ) )
{
curx + = 44 + 18 ; //skill width + margin to "or"
blitAt ( ort , curx , 346 , bitmap ) ;
curx + = ort - > w + 18 ;
}
}
2009-02-14 16:37:13 +02:00
if ( comps . size ( ) > 1 )
{
ok - > block ( true ) ;
}
else if ( comps . size ( ) = = 1 )
{
comps [ 0 ] - > select ( true ) ;
}
2008-08-13 03:44:31 +03:00
SDL_FreeSurface ( ort ) ;
}
void CLevelWindow : : selectionChanged ( unsigned to )
{
2008-11-02 00:32:56 +02:00
if ( ok - > blocked )
ok - > block ( false ) ;
2008-08-13 03:44:31 +03:00
for ( int i = 0 ; i < comps . size ( ) ; i + + )
if ( i = = to )
comps [ i ] - > select ( true ) ;
else
comps [ i ] - > select ( false ) ;
}
CLevelWindow : : ~ CLevelWindow ( )
{
delete ok ;
for ( int i = 0 ; i < comps . size ( ) ; i + + )
delete comps [ i ] ;
SDL_FreeSurface ( bitmap ) ;
}
void CLevelWindow : : activate ( )
{
ok - > activate ( ) ;
for ( int i = 0 ; i < comps . size ( ) ; i + + )
comps [ i ] - > activate ( ) ;
}
void CLevelWindow : : deactivate ( )
{
ok - > deactivate ( ) ;
for ( int i = 0 ; i < comps . size ( ) ; i + + )
comps [ i ] - > deactivate ( ) ;
}
void CLevelWindow : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bitmap , pos . x , pos . y , to ) ;
blitAt ( graphics - > portraitLarge [ heroType ] , 170 + pos . x , 66 + pos . y , to ) ;
ok - > show ( to ) ;
2008-08-13 03:44:31 +03:00
for ( int i = 0 ; i < comps . size ( ) ; i + + )
2009-04-14 15:47:09 +03:00
comps [ i ] - > show ( to ) ;
2008-08-17 12:11:16 +03:00
}
void CMinorResDataBar : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos . x , pos . y , to ) ;
char buf [ 30 ] ;
2008-08-17 12:11:16 +03:00
for ( int i = 0 ; i < 7 ; i + + )
{
SDL_itoa ( LOCPLINT - > cb - > getResourceAmount ( i ) , buf , 10 ) ;
2009-04-14 15:47:09 +03:00
CSDL_Ext : : printAtMiddle ( buf , pos . x + 50 + 76 * i , pos . y + pos . h / 2 , GEOR13 , zwykly , to ) ;
2008-08-17 12:11:16 +03:00
}
std : : vector < std : : string > temp ;
SDL_itoa ( LOCPLINT - > cb - > getDate ( 3 ) , buf , 10 ) ; temp . push_back ( std : : string ( buf ) ) ;
SDL_itoa ( LOCPLINT - > cb - > getDate ( 2 ) , buf , 10 ) ; temp . push_back ( buf ) ;
SDL_itoa ( LOCPLINT - > cb - > getDate ( 1 ) , buf , 10 ) ; temp . push_back ( buf ) ;
CSDL_Ext : : printAtMiddle ( CSDL_Ext : : processStr (
CGI - > generaltexth - > allTexts [ 62 ]
+ " : %s, "
+ CGI - > generaltexth - > allTexts [ 63 ]
+ " : %s, "
+ CGI - > generaltexth - > allTexts [ 64 ]
+ " : %s " , temp )
2009-04-14 15:47:09 +03:00
, pos . x + 545 + ( pos . w - 545 ) / 2 , pos . y + pos . h / 2 , GEOR13 , zwykly , to ) ;
2008-08-17 12:11:16 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-17 12:11:16 +03:00
CMinorResDataBar : : CMinorResDataBar ( )
{
bg = BitmapHandler : : loadBitmap ( " Z2ESBAR.bmp " ) ;
SDL_SetColorKey ( bg , SDL_SRCCOLORKEY , SDL_MapRGB ( bg - > format , 0 , 255 , 255 ) ) ;
graphics - > blueToPlayersAdv ( bg , LOCPLINT - > playerID ) ;
pos . x = 7 ;
pos . y = 575 ;
pos . w = bg - > w ;
pos . h = bg - > h ;
}
CMinorResDataBar : : ~ CMinorResDataBar ( )
{
SDL_FreeSurface ( bg ) ;
2008-08-17 17:09:30 +03:00
}
2008-08-27 13:19:18 +03:00
SDL_Surface * CCustomImgComponent : : getImg ( )
{
return bmp ;
}
CCustomImgComponent : : CCustomImgComponent ( Etype Type , int Subtype , int Val , SDL_Surface * sur , bool freeSur )
: bmp ( sur ) , free ( freeSur )
{
init ( Type , Subtype , Val ) ;
}
CCustomImgComponent : : ~ CCustomImgComponent ( )
{
if ( free )
SDL_FreeSurface ( bmp ) ;
2008-09-07 06:38:37 +03:00
}
CMarketplaceWindow : : CTradeableItem : : CTradeableItem ( int Type , int ID , bool Left )
{
left = Left ;
type = Type ;
id = ID ;
}
2009-04-14 15:47:09 +03:00
void CMarketplaceWindow : : CTradeableItem : : show ( SDL_Surface * to )
2008-09-07 06:38:37 +03:00
{
SDL_Surface * hlp = getSurface ( ) ;
blitAt ( hlp , pos . x + 19 , pos . y + 9 , to ) ;
}
void CMarketplaceWindow : : CTradeableItem : : clickLeft ( boost : : logic : : tribool down )
{
2009-04-14 15:47:09 +03:00
CMarketplaceWindow * mw = dynamic_cast < CMarketplaceWindow * > ( LOCPLINT - > topInt ( ) ) ;
assert ( mw ) ;
2008-09-07 06:38:37 +03:00
if ( down )
{
if ( left )
{
if ( mw - > hLeft ! = this )
mw - > hLeft = this ;
else
return ;
}
else
{
if ( mw - > hRight ! = this )
mw - > hRight = this ;
else
return ;
}
mw - > selectionChanged ( left ) ;
}
}
void CMarketplaceWindow : : CTradeableItem : : activate ( )
{
ClickableL : : activate ( ) ;
}
void CMarketplaceWindow : : CTradeableItem : : deactivate ( )
{
ClickableL : : deactivate ( ) ;
}
SDL_Surface * CMarketplaceWindow : : CTradeableItem : : getSurface ( )
{
switch ( type )
{
case 0 :
return graphics - > resources32 - > ourImages [ id ] . bitmap ;
case 1 :
return graphics - > artDefs - > ourImages [ id ] . bitmap ;
default :
return NULL ;
}
}
void initItems ( std : : vector < CMarketplaceWindow : : CTradeableItem * > & i , std : : vector < SDL_Rect > & p , int type , int amount , bool left , std : : vector < int > * ids /*=NULL*/ )
{
i . resize ( amount ) ;
for ( int j = 0 ; j < amount ; j + + )
{
i [ j ] = new CMarketplaceWindow : : CTradeableItem ( type , ( ids & & ids - > size ( ) > j ) ? ( * ids ) [ j ] : j , left ) ;
i [ j ] - > pos = p [ j ] ;
}
}
void CMarketplaceWindow : : setMode ( int mode )
{
std : : vector < SDL_Rect > lpos , rpos ;
clear ( ) ;
switch ( mode )
{
case 0 :
{
SDL_Surface * bg2 = BitmapHandler : : loadBitmap ( " TPMRKRES.bmp " ) ;
SDL_SetColorKey ( bg2 , SDL_SRCCOLORKEY , SDL_MapRGB ( bg2 - > format , 0 , 255 , 255 ) ) ;
graphics - > blueToPlayersAdv ( bg2 , LOCPLINT - > playerID ) ;
bg = SDL_ConvertSurface ( bg2 , screen - > format , 0 ) ;
SDL_FreeSurface ( bg2 ) ;
lpos + = genRect ( 66 , 69 , 39 , 180 ) , genRect ( 66 , 69 , 122 , 180 ) , genRect ( 66 , 69 , 204 , 180 ) ,
genRect ( 66 , 69 , 39 , 259 ) , genRect ( 66 , 69 , 122 , 259 ) , genRect ( 66 , 69 , 204 , 259 ) ,
genRect ( 66 , 69 , 122 , 338 ) ;
for ( int i = 0 ; i < lpos . size ( ) ; i + + )
{
lpos [ i ] . x + = pos . x ;
lpos [ i ] . y + = pos . y ;
rpos . push_back ( lpos [ i ] ) ;
rpos [ rpos . size ( ) - 1 ] . x + = 288 ;
}
initItems ( left , lpos , 0 , 7 , true , NULL ) ;
initItems ( right , rpos , 0 , 7 , false , NULL ) ;
printAtMiddle ( CGI - > generaltexth - > allTexts [ 158 ] , 303 , 28 , GEORXX , tytulowy , bg ) ; //title
printAtMiddle ( CGI - > generaltexth - > allTexts [ 270 ] , 158 , 148 , GEOR13 , zwykly , bg ) ; //kingdom res.
printAtMiddle ( CGI - > generaltexth - > allTexts [ 168 ] , 450 , 148 , GEOR13 , zwykly , bg ) ; //available for trade
}
}
}
void CMarketplaceWindow : : clear ( )
{
for ( int i = 0 ; i < left . size ( ) ; i + + )
delete left [ i ] ;
for ( int i = 0 ; i < right . size ( ) ; i + + )
delete right [ i ] ;
left . clear ( ) ;
right . clear ( ) ;
SDL_FreeSurface ( bg ) ;
}
CMarketplaceWindow : : CMarketplaceWindow ( int Mode )
{
mode = Mode ;
bg = NULL ;
ok = max = deal = NULL ;
pos . x = screen - > w / 2 - 300 ;
pos . y = screen - > h / 2 - 296 ;
slider = new CSlider ( pos . x + 231 , pos . y + 490 , 137 , boost : : bind ( & CMarketplaceWindow : : sliderMoved , this , _1 ) , 0 , 0 ) ;
setMode ( mode ) ;
hLeft = hRight = NULL ;
2009-04-14 15:47:09 +03:00
ok = new AdventureMapButton ( " " , " " , boost : : bind ( & CPlayerInterface : : popIntTotally , LOCPLINT , this ) , pos . x + 516 , pos . y + 520 , " IOK6432.DEF " , SDLK_RETURN ) ;
2008-09-07 06:38:37 +03:00
deal = new AdventureMapButton ( " " , " " , boost : : bind ( & CMarketplaceWindow : : makeDeal , this ) , pos . x + 307 , pos . y + 520 , " TPMRKB.DEF " ) ;
max = new AdventureMapButton ( " " , " " , boost : : bind ( & CMarketplaceWindow : : setMax , this ) , pos . x + 229 , pos . y + 520 , " IRCBTNS.DEF " ) ;
max - > block ( true ) ;
deal - > block ( true ) ;
}
CMarketplaceWindow : : ~ CMarketplaceWindow ( )
{
2009-04-14 15:47:09 +03:00
clear ( ) ;
2008-09-07 06:38:37 +03:00
delete slider ;
}
2009-04-14 15:47:09 +03:00
void CMarketplaceWindow : : show ( SDL_Surface * to )
2008-09-07 06:38:37 +03:00
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos , to ) ;
2008-09-07 06:38:37 +03:00
if ( hRight )
2009-04-14 15:47:09 +03:00
CSDL_Ext : : drawBorder ( to , hRight - > pos . x - 1 , hRight - > pos . y - 1 , hRight - > pos . w + 2 , hRight - > pos . h + 2 , int3 ( 255 , 231 , 148 ) ) ;
2008-09-07 06:38:37 +03:00
if ( hLeft )
2009-04-14 15:47:09 +03:00
CSDL_Ext : : drawBorder ( to , hLeft - > pos . x - 1 , hLeft - > pos . y - 1 , hLeft - > pos . w + 2 , hLeft - > pos . h + 2 , int3 ( 255 , 231 , 148 ) ) ;
ok - > show ( to ) ;
deal - > show ( to ) ;
max - > show ( to ) ;
slider - > show ( to ) ;
2008-09-07 06:38:37 +03:00
for ( int i = 0 ; i < left . size ( ) ; i + + )
2009-04-14 15:47:09 +03:00
left [ i ] - > show ( to ) ;
2008-09-07 06:38:37 +03:00
for ( int i = 0 ; i < right . size ( ) ; i + + )
2009-04-14 15:47:09 +03:00
right [ i ] - > show ( to ) ;
2008-09-07 06:38:37 +03:00
if ( mode = = 0 )
{
char buf [ 15 ] ;
for ( int i = 0 ; i < left . size ( ) ; i + + )
{
SDL_itoa ( LOCPLINT - > cb - > getResourceAmount ( i ) , buf , 10 ) ;
2009-04-14 15:47:09 +03:00
printAtMiddle ( buf , left [ i ] - > pos . x + 35 , left [ i ] - > pos . y + 56 , GEOR13 , zwykly , to ) ;
2008-09-07 06:38:37 +03:00
}
if ( hLeft ) //print prices
{
for ( int i = 0 ; i < right . size ( ) ; i + + )
{
if ( right [ i ] - > id ! = hLeft - > id )
2009-04-14 15:47:09 +03:00
printAtMiddle ( rSubs [ i ] , right [ i ] - > pos . x + 35 , right [ i ] - > pos . y + 56 , GEOR13 , zwykly , to ) ;
2008-09-07 06:38:37 +03:00
else
2009-04-14 15:47:09 +03:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 164 ] , right [ i ] - > pos . x + 35 , right [ i ] - > pos . y + 56 , GEOR13 , zwykly , to ) ;
2008-09-07 06:38:37 +03:00
}
}
if ( hLeft & & hRight & & hLeft - > id ! = hRight - > id )
{
2009-04-14 15:47:09 +03:00
blitAt ( hLeft - > getSurface ( ) , pos . x + 142 , pos . y + 457 , to ) ;
blitAt ( hRight - > getSurface ( ) , pos . x + 430 , pos . y + 457 , to ) ;
2008-09-07 06:38:37 +03:00
SDL_itoa ( slider - > value * r1 , buf , 10 ) ;
2009-04-14 15:47:09 +03:00
printAtMiddle ( buf , pos . x + 158 , pos . y + 504 , GEOR13 , zwykly , to ) ;
2008-09-07 06:38:37 +03:00
SDL_itoa ( slider - > value * r2 , buf , 10 ) ;
2009-04-14 15:47:09 +03:00
printAtMiddle ( buf , pos . x + 446 , pos . y + 504 , GEOR13 , zwykly , to ) ;
2008-09-07 06:38:37 +03:00
}
}
}
void CMarketplaceWindow : : activate ( )
{
for ( int i = 0 ; i < left . size ( ) ; i + + )
left [ i ] - > activate ( ) ;
for ( int i = 0 ; i < right . size ( ) ; i + + )
right [ i ] - > activate ( ) ;
ok - > activate ( ) ;
max - > activate ( ) ;
deal - > activate ( ) ;
slider - > activate ( ) ;
}
void CMarketplaceWindow : : deactivate ( )
{
for ( int i = 0 ; i < left . size ( ) ; i + + )
left [ i ] - > deactivate ( ) ;
for ( int i = 0 ; i < right . size ( ) ; i + + )
right [ i ] - > deactivate ( ) ;
ok - > deactivate ( ) ;
max - > deactivate ( ) ;
deal - > deactivate ( ) ;
slider - > deactivate ( ) ;
}
void CMarketplaceWindow : : setMax ( )
{
slider - > moveTo ( slider - > amount ) ;
}
void CMarketplaceWindow : : makeDeal ( )
{
LOCPLINT - > cb - > trade ( mode , hLeft - > id , hRight - > id , slider - > value * r1 ) ;
slider - > moveTo ( 0 ) ;
hLeft = NULL ;
selectionChanged ( true ) ;
}
void CMarketplaceWindow : : sliderMoved ( int to )
{
}
void CMarketplaceWindow : : selectionChanged ( bool side )
{
if ( hLeft & & hRight & & hLeft - > id ! = hRight - > id )
{
LOCPLINT - > cb - > getMarketOffer ( hLeft - > id , hRight - > id , r1 , r2 , 0 ) ;
slider - > amount = LOCPLINT - > cb - > getResourceAmount ( hLeft - > id ) / r1 ;
slider - > moveTo ( 0 ) ;
max - > block ( false ) ;
deal - > block ( false ) ;
}
else
{
max - > block ( true ) ;
deal - > block ( true ) ;
slider - > amount = 0 ;
slider - > moveTo ( 0 ) ;
}
if ( side & & hLeft ) //left selection changed, recalculate offers
{
rSubs . clear ( ) ;
rSubs . resize ( right . size ( ) ) ;
int h1 , h2 ;
for ( int i = 0 ; i < right . size ( ) ; i + + )
{
std : : ostringstream oss ;
LOCPLINT - > cb - > getMarketOffer ( hLeft - > id , i , h1 , h2 , 0 ) ;
oss < < h2 ;
if ( h1 ! = 1 )
oss < < " / " < < h1 ;
rSubs [ i ] = oss . str ( ) ;
}
}
2008-09-25 17:09:31 +03:00
}
2008-10-17 19:30:56 +03:00
CSystemOptionsWindow : : CSystemOptionsWindow ( const SDL_Rect & pos , CPlayerInterface * owner )
2008-09-25 17:09:31 +03:00
{
this - > pos = pos ;
background = BitmapHandler : : loadBitmap ( " SysOpbck.bmp " , true ) ;
graphics - > blueToPlayersAdv ( background , LOCPLINT - > playerID ) ;
//printing texts
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 568 ] , 240 , 32 , GEOR16 , tytulowy , background ) ; //window title
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 569 ] , 122 , 65 , GEOR16 , tytulowy , background ) ; //hero speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 570 ] , 122 , 131 , GEOR16 , tytulowy , background ) ; //enemy speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 571 ] , 122 , 197 , GEOR16 , tytulowy , background ) ; //map scroll speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 20 ] , 122 , 263 , GEOR16 , tytulowy , background ) ; //video quality
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 394 ] , 122 , 348 , GEOR16 , tytulowy , background ) ; //music volume
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 395 ] , 122 , 414 , GEOR16 , tytulowy , background ) ; //effects volume
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 572 ] , 283 , 57 , GEOR16 , zwykly , background ) ; //show move path
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 573 ] , 283 , 89 , GEOR16 , zwykly , background ) ; //show hero reminder
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 574 ] , 283 , 121 , GEOR16 , zwykly , background ) ; //quick combat
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 575 ] , 283 , 153 , GEOR16 , zwykly , background ) ; //video subtitles
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 576 ] , 283 , 185 , GEOR16 , zwykly , background ) ; //town building outlines
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 577 ] , 283 , 217 , GEOR16 , zwykly , background ) ; //spell book animation
//setting up buttons
2009-03-28 02:38:48 +02:00
save = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 321 ] . first , CGI - > generaltexth - > zelp [ 321 ] . second , boost : : bind ( & CSystemOptionsWindow : : bsavef , this ) , 516 , 354 , " SOSAVE.DEF " , SDLK_s ) ;
std : : swap ( save - > imgs [ 0 ] [ 0 ] , save - > imgs [ 0 ] [ 1 ] ) ;
2008-11-28 03:36:34 +02:00
quitGame = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 324 ] . first , CGI - > generaltexth - > zelp [ 324 ] . second , boost : : bind ( & CSystemOptionsWindow : : bquitf , this ) , 405 , 471 , " soquit.def " , SDLK_q ) ;
2008-09-25 17:09:31 +03:00
std : : swap ( quitGame - > imgs [ 0 ] [ 0 ] , quitGame - > imgs [ 0 ] [ 1 ] ) ;
2008-11-28 03:36:34 +02:00
backToMap = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 325 ] . first , CGI - > generaltexth - > zelp [ 325 ] . second , boost : : bind ( & CSystemOptionsWindow : : breturnf , this ) , 516 , 471 , " soretrn.def " , SDLK_RETURN ) ;
2009-04-04 22:26:41 +03:00
backToMap - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2008-09-25 17:09:31 +03:00
std : : swap ( backToMap - > imgs [ 0 ] [ 0 ] , backToMap - > imgs [ 0 ] [ 1 ] ) ;
2008-10-17 19:30:56 +03:00
heroMoveSpeed = new CHighlightableButtonsGroup ( 0 ) ;
2008-11-28 03:36:34 +02:00
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 349 ] . first ) , CGI - > generaltexth - > zelp [ 349 ] . second , " sysopb1.def " , 187 , 134 , 1 ) ;
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 350 ] . first ) , CGI - > generaltexth - > zelp [ 350 ] . second , " sysopb2.def " , 235 , 134 , 2 ) ;
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 351 ] . first ) , CGI - > generaltexth - > zelp [ 351 ] . second , " sysopb3.def " , 283 , 134 , 4 ) ;
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 352 ] . first ) , CGI - > generaltexth - > zelp [ 352 ] . second , " sysopb4.def " , 331 , 134 , 8 ) ;
2008-10-17 19:30:56 +03:00
heroMoveSpeed - > select ( owner - > heroMoveSpeed , 1 ) ;
heroMoveSpeed - > onChange = boost : : bind ( & CPlayerInterface : : setHeroMoveSpeed , owner , _1 ) ;
2008-11-30 16:08:07 +02:00
mapScrollSpeed = new CHighlightableButtonsGroup ( 0 ) ;
mapScrollSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 357 ] . first ) , CGI - > generaltexth - > zelp [ 357 ] . second , " sysopb9.def " , 187 , 267 , 1 ) ;
mapScrollSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 358 ] . first ) , CGI - > generaltexth - > zelp [ 358 ] . second , " sysob10.def " , 251 , 267 , 2 ) ;
mapScrollSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 359 ] . first ) , CGI - > generaltexth - > zelp [ 359 ] . second , " sysob11.def " , 315 , 267 , 4 ) ;
mapScrollSpeed - > select ( owner - > mapScrollingSpeed , 1 ) ;
mapScrollSpeed - > onChange = boost : : bind ( & CPlayerInterface : : setMapScrollingSpeed , owner , _1 ) ;
2008-09-25 17:09:31 +03:00
}
CSystemOptionsWindow : : ~ CSystemOptionsWindow ( )
{
SDL_FreeSurface ( background ) ;
2009-03-28 02:38:48 +02:00
delete save ;
2008-09-25 17:09:31 +03:00
delete quitGame ;
delete backToMap ;
2008-10-17 19:30:56 +03:00
delete heroMoveSpeed ;
2008-11-30 16:08:07 +02:00
delete mapScrollSpeed ;
2008-09-25 17:09:31 +03:00
}
void CSystemOptionsWindow : : bquitf ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > showYesNoDialog ( CGI - > generaltexth - > allTexts [ 578 ] , std : : vector < SComponent * > ( ) , boost : : bind ( exit , 0 ) , boost : : bind ( & CSystemOptionsWindow : : activate , this ) , false ) ;
2008-09-25 17:09:31 +03:00
}
void CSystemOptionsWindow : : breturnf ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-09-25 17:09:31 +03:00
}
2009-03-28 02:38:48 +02:00
void CSystemOptionsWindow : : bsavef ( )
{
using namespace boost : : posix_time ;
std : : ostringstream fnameStream ;
fnameStream < < second_clock : : local_time ( ) ;
std : : string fname = fnameStream . str ( ) ;
boost : : algorithm : : replace_all ( fname , " : " , " " ) ;
boost : : algorithm : : replace_all ( fname , " " , " - " ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > showYesNoDialog ( " Do you want to save current game as " + fname , std : : vector < SComponent * > ( ) , boost : : bind ( & CCallback : : save , LOCPLINT - > cb , fname ) , boost : : bind ( & CSystemOptionsWindow : : activate , this ) , false ) ;
2009-03-28 02:38:48 +02:00
}
2008-09-25 17:09:31 +03:00
void CSystemOptionsWindow : : activate ( )
{
2009-03-28 02:38:48 +02:00
save - > activate ( ) ;
2008-09-25 17:09:31 +03:00
quitGame - > activate ( ) ;
backToMap - > activate ( ) ;
2008-10-17 19:30:56 +03:00
heroMoveSpeed - > activate ( ) ;
2008-11-30 16:08:07 +02:00
mapScrollSpeed - > activate ( ) ;
2008-09-25 17:09:31 +03:00
}
void CSystemOptionsWindow : : deactivate ( )
{
2009-03-28 02:38:48 +02:00
save - > deactivate ( ) ;
2008-09-25 17:09:31 +03:00
quitGame - > deactivate ( ) ;
backToMap - > deactivate ( ) ;
2008-10-17 19:30:56 +03:00
heroMoveSpeed - > deactivate ( ) ;
2008-11-30 16:08:07 +02:00
mapScrollSpeed - > deactivate ( ) ;
2008-09-25 17:09:31 +03:00
}
void CSystemOptionsWindow : : show ( SDL_Surface * to )
{
SDL_BlitSurface ( background , NULL , to , & pos ) ;
2009-03-28 02:38:48 +02:00
save - > show ( to ) ;
2008-09-25 17:09:31 +03:00
quitGame - > show ( to ) ;
backToMap - > show ( to ) ;
2008-10-17 19:30:56 +03:00
heroMoveSpeed - > show ( to ) ;
2008-11-30 16:08:07 +02:00
mapScrollSpeed - > show ( to ) ;
2008-09-25 17:09:31 +03:00
}
2008-10-26 22:58:34 +02:00
CTavernWindow : : CTavernWindow ( const CGHeroInstance * H1 , const CGHeroInstance * H2 , const std : : string & gossip )
: h1 ( selected , 0 , 72 , 299 , H1 ) , h2 ( selected , 1 , 162 , 299 , H2 )
{
2009-02-09 18:18:48 +02:00
if ( H1 )
selected = 0 ;
else
selected = - 1 ;
2008-10-26 22:58:34 +02:00
bg = BitmapHandler : : loadBitmap ( " TPTAVERN.bmp " ) ;
2009-03-20 20:51:48 +02:00
SDL_SetColorKey ( bg , SDL_SRCCOLORKEY , SDL_MapRGB ( bg - > format , 0 , 255 , 255 ) ) ;
2008-10-26 22:58:34 +02:00
graphics - > blueToPlayersAdv ( bg , LOCPLINT - > playerID ) ;
printAtMiddle ( CGI - > generaltexth - > jktexts [ 37 ] , 200 , 35 , GEOR16 , tytulowy , bg ) ;
printAtMiddle ( " 2500 " , 320 , 328 , GEOR13 , zwykly , bg ) ;
printAtMiddle ( CGI - > generaltexth - > jktexts [ 38 ] , 146 , 283 , GEOR16 , tytulowy , bg ) ;
printAtMiddleWB ( gossip , 200 , 220 , GEOR13 , 50 , zwykly , bg ) ;
pos . w = bg - > w ;
pos . h = bg - > h ;
pos . x = ( screen - > w - bg - > w ) / 2 ;
pos . y = ( screen - > h - bg - > h ) / 2 ;
2009-02-09 18:18:48 +02:00
bar = new CStatusBar ( pos . x + 8 , pos . y + 478 , " APHLFTRT.bmp " , 380 ) ;
2008-10-26 22:58:34 +02:00
h1 . pos . x + = pos . x ;
h2 . pos . x + = pos . x ;
h1 . pos . y + = pos . y ;
h2 . pos . y + = pos . y ;
2009-02-09 18:18:48 +02:00
cancel = new AdventureMapButton ( CGI - > generaltexth - > tavernInfo [ 7 ] , " " , boost : : bind ( & CTavernWindow : : close , this ) , pos . x + 310 , pos . y + 428 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
2008-10-26 22:58:34 +02:00
recruit = new AdventureMapButton ( " " , " " , boost : : bind ( & CTavernWindow : : recruitb , this ) , pos . x + 272 , pos . y + 355 , " TPTAV01.DEF " , SDLK_RETURN ) ;
2009-02-09 18:18:48 +02:00
thiefGuild = new AdventureMapButton ( CGI - > generaltexth - > tavernInfo [ 5 ] , " " , 0 , pos . x + 22 , pos . y + 428 , " TPTAV02.DEF " , SDLK_t ) ;
if ( LOCPLINT - > cb - > getResourceAmount ( 6 ) < 2500 ) //not enough gold
{
recruit - > hoverTexts [ 0 ] = CGI - > generaltexth - > tavernInfo [ 0 ] ; //Cannot afford a Hero
recruit - > block ( 2 ) ;
}
2009-04-09 18:05:20 +03:00
else if ( LOCPLINT - > cb - > howManyHeroes ( false ) > = 8 )
2009-02-09 18:18:48 +02:00
{
recruit - > hoverTexts [ 0 ] = CGI - > generaltexth - > tavernInfo [ 1 ] ; //Cannot recruit. You already have %d Heroes.
boost : : algorithm : : replace_first ( recruit - > hoverTexts [ 0 ] , " %d " , boost : : lexical_cast < std : : string > ( LOCPLINT - > cb - > howManyHeroes ( ) ) ) ;
recruit - > block ( 2 ) ;
}
else if ( LOCPLINT - > castleInt & & LOCPLINT - > castleInt - > town - > visitingHero )
{
recruit - > hoverTexts [ 0 ] = CGI - > generaltexth - > tavernInfo [ 2 ] ; //Cannot recruit. You already have a Hero in this town.
recruit - > block ( 2 ) ;
}
else
{
if ( H1 )
{
recruit - > hoverTexts [ 0 ] = CGI - > generaltexth - > tavernInfo [ 3 ] ; //Recruit %s the %s
boost : : algorithm : : replace_first ( recruit - > hoverTexts [ 0 ] , " %s " , H1 - > name ) ;
boost : : algorithm : : replace_first ( recruit - > hoverTexts [ 0 ] , " %s " , H1 - > type - > heroClass - > name ) ;
}
else
recruit - > block ( 1 ) ;
}
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : recruitb ( )
{
const CGHeroInstance * toBuy = ( selected ? h2 : h1 ) . h ;
close ( ) ;
LOCPLINT - > cb - > recruitHero ( LOCPLINT - > castleInt - > town , toBuy ) ;
}
CTavernWindow : : ~ CTavernWindow ( )
{
SDL_FreeSurface ( bg ) ;
delete cancel ;
delete thiefGuild ;
delete recruit ;
2009-02-09 18:18:48 +02:00
delete bar ;
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : activate ( )
{
thiefGuild - > activate ( ) ;
cancel - > activate ( ) ;
2009-02-09 18:18:48 +02:00
if ( h1 . h )
h1 . activate ( ) ;
if ( h2 . h )
h2 . activate ( ) ;
2008-10-26 22:58:34 +02:00
recruit - > activate ( ) ;
2009-02-09 18:18:48 +02:00
LOCPLINT - > statusbar = bar ;
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : deactivate ( )
{
thiefGuild - > deactivate ( ) ;
cancel - > deactivate ( ) ;
2009-02-09 18:18:48 +02:00
if ( h1 . h )
h1 . deactivate ( ) ;
if ( h2 . h )
h2 . deactivate ( ) ;
2008-10-26 22:58:34 +02:00
recruit - > deactivate ( ) ;
}
void CTavernWindow : : close ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos . x , pos . y , to ) ;
2009-02-09 18:18:48 +02:00
if ( h1 . h )
2009-04-14 15:47:09 +03:00
h1 . show ( to ) ;
2009-02-09 18:18:48 +02:00
if ( h2 . h )
2009-04-14 15:47:09 +03:00
h2 . show ( to ) ;
thiefGuild - > show ( to ) ;
cancel - > show ( to ) ;
recruit - > show ( to ) ;
bar - > show ( to ) ;
2008-10-26 22:58:34 +02:00
2009-02-09 18:18:48 +02:00
if ( selected > = 0 )
{
HeroPortrait * sel = selected ? & h2 : & h1 ;
char descr [ 300 ] ;
int artifs = sel - > h - > artifWorn . size ( ) + sel - > h - > artifacts . size ( ) ;
for ( int i = 13 ; i < = 17 ; i + + ) //war machines and spellbook doesn't count
if ( vstd : : contains ( sel - > h - > artifWorn , i ) )
artifs - - ;
sprintf_s ( descr , 300 , CGI - > generaltexth - > allTexts [ 215 ] . c_str ( ) ,
sel - > h - > name . c_str ( ) , sel - > h - > level , sel - > h - > type - > heroClass - > name . c_str ( ) , artifs ) ;
2009-04-14 15:47:09 +03:00
printAtMiddleWB ( descr , pos . x + 146 , pos . y + 389 , GEOR13 , 40 , zwykly , to ) ;
CSDL_Ext : : drawBorder ( to , sel - > pos . x - 2 , sel - > pos . y - 2 , sel - > pos . w + 4 , sel - > pos . h + 4 , int3 ( 247 , 223 , 123 ) ) ;
2009-02-09 18:18:48 +02:00
}
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : HeroPortrait : : clickLeft ( boost : : logic : : tribool down )
{
if ( pressedL & & ! down )
as ( ) ;
ClickableL : : clickLeft ( down ) ;
}
void CTavernWindow : : HeroPortrait : : activate ( )
{
ClickableL : : activate ( ) ;
ClickableR : : activate ( ) ;
2009-02-09 18:18:48 +02:00
Hoverable : : activate ( ) ;
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : HeroPortrait : : deactivate ( )
{
ClickableL : : deactivate ( ) ;
ClickableR : : deactivate ( ) ;
2009-02-09 18:18:48 +02:00
Hoverable : : deactivate ( ) ;
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : HeroPortrait : : clickRight ( boost : : logic : : tribool down )
{
if ( down )
{
LOCPLINT - > adventureInt - > heroWindow - > setHero ( h ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > pushInt ( new CRClickPopupInt ( LOCPLINT - > adventureInt - > heroWindow , false ) ) ;
2008-10-26 22:58:34 +02:00
}
}
CTavernWindow : : HeroPortrait : : HeroPortrait ( int & sel , int id , int x , int y , const CGHeroInstance * H )
: as ( sel , id )
{
h = H ;
pos . x = x ;
pos . y = y ;
pos . w = 58 ;
pos . h = 64 ;
2009-02-09 18:18:48 +02:00
if ( H )
{
hoverName = CGI - > generaltexth - > tavernInfo [ 4 ] ;
boost : : algorithm : : replace_first ( hoverName , " %s " , H - > name ) ;
}
2008-10-26 22:58:34 +02:00
}
void CTavernWindow : : HeroPortrait : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > portraitLarge [ h - > subID ] , pos , to ) ;
2008-11-01 00:41:22 +02:00
}
2009-02-09 18:18:48 +02:00
void CTavernWindow : : HeroPortrait : : hover ( bool on )
{
Hoverable : : hover ( on ) ;
if ( on )
LOCPLINT - > statusbar - > print ( hoverName ) ;
else
LOCPLINT - > statusbar - > clear ( ) ;
2009-04-03 18:55:26 +03:00
}
void CInGameConsole : : activate ( )
{
KeyInterested : : activate ( ) ;
}
void CInGameConsole : : deactivate ( )
{
KeyInterested : : deactivate ( ) ;
}
void CInGameConsole : : show ( SDL_Surface * to )
{
int number = 0 ;
std : : vector < std : : list < std : : pair < std : : string , int > > : : iterator > toDel ;
for ( std : : list < std : : pair < std : : string , int > > : : iterator it = texts . begin ( ) ; it ! = texts . end ( ) ; + + it , + + number )
{
SDL_Color green = { 0 , 0xff , 0 , 0 } ;
2009-04-04 22:26:41 +03:00
Point leftBottomCorner ( 0 , screen - > h ) ;
2009-04-14 15:47:09 +03:00
if ( LOCPLINT - > battleInt )
2009-04-04 22:26:41 +03:00
{
leftBottomCorner = LOCPLINT - > battleInt - > pos . bottomLeft ( ) ;
}
2009-04-14 15:47:09 +03:00
CSDL_Ext : : printAt ( it - > first , leftBottomCorner . x + 50 , leftBottomCorner . y - texts . size ( ) * 20 - 80 + number * 20 , TNRB16 , green ) ;
2009-04-03 18:55:26 +03:00
if ( SDL_GetTicks ( ) - it - > second > defaultTimeout )
{
toDel . push_back ( it ) ;
}
}
for ( int it = 0 ; it < toDel . size ( ) ; + + it )
{
texts . erase ( toDel [ it ] ) ;
}
}
2009-04-04 22:26:41 +03:00
void CInGameConsole : : print ( const std : : string & txt )
{
texts . push_back ( std : : make_pair ( txt , SDL_GetTicks ( ) ) ) ;
if ( texts . size ( ) > maxDisplayedTexts )
{
texts . pop_front ( ) ;
}
}
2009-04-03 18:55:26 +03:00
void CInGameConsole : : keyPressed ( const SDL_KeyboardEvent & key )
{
2009-04-04 22:26:41 +03:00
if ( key . type ! = SDL_KEYDOWN ) return ;
2009-04-05 17:37:14 +03:00
if ( ! captureAllKeys & & key . keysym . sym ! = SDLK_TAB ) return ; //because user is not entering any text
2009-04-04 22:26:41 +03:00
switch ( key . keysym . sym )
2009-04-03 18:55:26 +03:00
{
2009-04-04 22:26:41 +03:00
case SDLK_TAB :
2009-04-03 18:55:26 +03:00
{
2009-04-04 22:26:41 +03:00
if ( captureAllKeys )
2009-04-03 18:55:26 +03:00
{
2009-04-04 22:26:41 +03:00
captureAllKeys = false ;
endEnteringText ( false ) ;
2009-04-03 18:55:26 +03:00
}
2009-04-04 22:26:41 +03:00
else
2009-04-03 18:55:26 +03:00
{
2009-04-04 22:26:41 +03:00
captureAllKeys = true ;
startEnteringText ( ) ;
2009-04-03 18:55:26 +03:00
}
2009-04-04 22:26:41 +03:00
break ;
}
case SDLK_RETURN : //enter key
{
if ( enteredText . size ( ) > 0 & & captureAllKeys )
{
captureAllKeys = false ;
endEnteringText ( true ) ;
}
break ;
}
case SDLK_BACKSPACE :
{
if ( enteredText . size ( ) > 1 )
{
enteredText . resize ( enteredText . size ( ) - 1 ) ;
enteredText [ enteredText . size ( ) - 1 ] = ' _ ' ;
refreshEnteredText ( ) ;
}
break ;
}
2009-04-05 17:37:14 +03:00
case SDLK_UP : //up arrow
{
if ( prevEntDisp = = - 1 )
{
prevEntDisp = previouslyEntered . size ( ) - 1 ;
enteredText = previouslyEntered [ prevEntDisp ] + " _ " ;
refreshEnteredText ( ) ;
}
else if ( prevEntDisp > 0 )
{
- - prevEntDisp ;
enteredText = previouslyEntered [ prevEntDisp ] + " _ " ;
refreshEnteredText ( ) ;
}
break ;
}
case SDLK_DOWN : //down arrow
{
if ( prevEntDisp ! = - 1 & & prevEntDisp + 1 < previouslyEntered . size ( ) )
{
+ + prevEntDisp ;
enteredText = previouslyEntered [ prevEntDisp ] + " _ " ;
refreshEnteredText ( ) ;
}
else if ( prevEntDisp + 1 = = previouslyEntered . size ( ) ) //useful feature
{
prevEntDisp = - 1 ;
enteredText = " _ " ;
refreshEnteredText ( ) ;
}
break ;
}
2009-04-04 22:26:41 +03:00
default :
{
if ( enteredText . size ( ) > 0 )
2009-04-03 18:55:26 +03:00
{
2009-04-04 22:26:41 +03:00
if ( key . keysym . unicode < 0x80 & & key . keysym . unicode > 0 )
2009-04-03 18:55:26 +03:00
{
2009-04-04 22:26:41 +03:00
enteredText [ enteredText . size ( ) - 1 ] = ( char ) key . keysym . unicode ;
enteredText + = " _ " ;
refreshEnteredText ( ) ;
2009-04-03 18:55:26 +03:00
}
}
2009-04-04 22:26:41 +03:00
break ;
2009-04-03 18:55:26 +03:00
}
}
}
void CInGameConsole : : startEnteringText ( )
{
enteredText = " _ " ;
2009-04-14 15:47:09 +03:00
if ( LOCPLINT - > topInt ( ) = = LOCPLINT - > adventureInt )
2009-04-03 18:55:26 +03:00
{
LOCPLINT - > statusbar - > print ( enteredText ) ;
}
2009-04-14 15:47:09 +03:00
else if ( LOCPLINT - > battleInt )
2009-04-03 18:55:26 +03:00
{
LOCPLINT - > battleInt - > console - > ingcAlter = enteredText ;
}
}
void CInGameConsole : : endEnteringText ( bool printEnteredText )
{
2009-04-05 17:37:14 +03:00
prevEntDisp = - 1 ;
2009-04-03 18:55:26 +03:00
if ( printEnteredText )
{
2009-04-04 22:26:41 +03:00
std : : string txt = enteredText . substr ( 0 , enteredText . size ( ) - 1 ) ;
LOCPLINT - > cb - > sendMessage ( txt ) ;
2009-04-05 17:37:14 +03:00
previouslyEntered . push_back ( txt ) ;
2009-04-04 22:26:41 +03:00
print ( txt ) ;
2009-04-03 18:55:26 +03:00
}
enteredText = " " ;
2009-04-14 15:47:09 +03:00
if ( LOCPLINT - > topInt ( ) = = LOCPLINT - > adventureInt )
2009-04-03 18:55:26 +03:00
{
LOCPLINT - > statusbar - > clear ( ) ;
}
2009-04-14 15:47:09 +03:00
else if ( LOCPLINT - > battleInt )
2009-04-03 18:55:26 +03:00
{
LOCPLINT - > battleInt - > console - > ingcAlter = " " ;
}
}
2009-04-04 22:26:41 +03:00
void CInGameConsole : : refreshEnteredText ( )
{
2009-04-14 15:47:09 +03:00
if ( LOCPLINT - > topInt ( ) = = LOCPLINT - > adventureInt )
2009-04-04 22:26:41 +03:00
{
LOCPLINT - > statusbar - > print ( enteredText ) ;
}
2009-04-14 15:47:09 +03:00
else if ( LOCPLINT - > battleInt )
2009-04-04 22:26:41 +03:00
{
LOCPLINT - > battleInt - > console - > ingcAlter = enteredText ;
}
}
2009-04-15 13:20:47 +03:00
CInGameConsole : : CInGameConsole ( ) : prevEntDisp ( - 1 ) , defaultTimeout ( 10000 ) , maxDisplayedTexts ( 10 )
2009-04-03 18:55:26 +03:00
{
}
2009-04-12 03:58:41 +03:00
void CGarrisonWindow : : close ( )
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > popIntTotally ( this ) ;
2009-04-12 03:58:41 +03:00
}
void CGarrisonWindow : : activate ( )
{
split - > activate ( ) ;
quit - > activate ( ) ;
garr - > activate ( ) ;
}
void CGarrisonWindow : : deactivate ( )
{
split - > deactivate ( ) ;
quit - > deactivate ( ) ;
garr - > deactivate ( ) ;
}
void CGarrisonWindow : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos , to ) ;
split - > show ( to ) ;
quit - > show ( to ) ;
garr - > show ( to ) ;
2009-04-16 03:28:54 +03:00
blitAt ( graphics - > flags - > ourImages [ garr - > odown - > getOwner ( ) ] . bitmap , pos . x + 29 , pos . y + 125 , to ) ;
blitAt ( graphics - > portraitLarge [ static_cast < const CGHeroInstance * > ( garr - > odown ) - > portrait ] , pos . x + 29 , pos . y + 222 , to ) ;
printAtMiddle ( CGI - > generaltexth - > allTexts [ 709 ] , pos . x + 275 , pos . y + 30 , GEOR16 , tytulowy , to ) ;
2009-04-12 03:58:41 +03:00
}
CGarrisonWindow : : CGarrisonWindow ( const CArmedInstance * up , const CGHeroInstance * down )
{
bg = BitmapHandler : : loadBitmap ( " GARRISON.bmp " ) ;
SDL_SetColorKey ( bg , SDL_SRCCOLORKEY , SDL_MapRGB ( bg - > format , 0 , 255 , 255 ) ) ;
graphics - > blueToPlayersAdv ( bg , LOCPLINT - > playerID ) ;
pos . x = screen - > w / 2 - bg - > w / 2 ;
pos . y = screen - > h / 2 - bg - > h / 2 ;
pos . w = screen - > w ;
pos . h = screen - > h ;
2009-04-12 04:48:50 +03:00
garr = new CGarrisonInt ( pos . x + 92 , pos . y + 129 , 4 , 30 , bg , 92 , 129 , up , down ) ;
2009-04-12 03:58:41 +03:00
split = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 3 ] , " " , boost : : bind ( & CGarrisonInt : : splitClick , garr ) , pos . x + 88 , pos . y + 314 , " IDV6432.DEF " ) ;
quit = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CGarrisonWindow : : close , this ) , pos . x + 399 , pos . y + 314 , " IOK6432.DEF " , SDLK_RETURN ) ;
}
CGarrisonWindow : : ~ CGarrisonWindow ( )
{
SDL_FreeSurface ( bg ) ;
delete split ;
delete quit ;
delete garr ;
2009-04-14 15:47:09 +03:00
}
IShowActivable : : IShowActivable ( )
{
type = 0 ;
}
CWindowWithGarrison : : CWindowWithGarrison ( )
{
type | = WITH_GARRISON ;
}
void CRClickPopupInt : : show ( SDL_Surface * to )
{
inner - > show ( to ) ;
}
CRClickPopupInt : : CRClickPopupInt ( IShowActivable * our , bool deleteInt )
{
inner = our ;
delInner = deleteInt ;
}
CRClickPopupInt : : ~ CRClickPopupInt ( )
{
if ( delInner )
delete inner ;
2009-04-12 03:58:41 +03:00
}