2009-05-19 21:23:04 +03:00
# include "GUIClasses.h"
2009-05-20 13:08:56 +03:00
# include "SDL_Extensions.h"
2009-05-19 21:23:04 +03:00
# include "../stdafx.h"
2009-05-20 13:08:56 +03:00
# include "CAdvmapInterface.h"
# include "CBattleInterface.h"
2009-05-19 21:23:04 +03:00
# include "../CCallback.h"
2009-05-20 13:08:56 +03:00
# include "CCastleInterface.h"
2011-03-03 20:25:48 +02:00
# include "CCreatureWindow.h"
2009-05-20 13:08:56 +03:00
# include "CCursorHandler.h"
# include "CGameInfo.h"
# include "CHeroWindow.h"
# include "CMessage.h"
2009-06-02 06:01:17 +03:00
# include "CConfigHandler.h"
2009-05-20 13:08:56 +03:00
# include "SDL_framerate.h"
2009-05-19 21:23:04 +03:00
# include "CConfigHandler.h"
# include "CCreatureAnimation.h"
2011-02-06 19:26:27 +02:00
# include "CPlayerInterface.h"
2009-05-19 21:23:04 +03:00
# include "Graphics.h"
2010-11-15 17:15:00 +02:00
# include "CAnimation.h"
2010-12-20 23:22:53 +02:00
# include "../lib/CArtHandler.h"
# include "../lib/CBuildingHandler.h"
# include "../lib/CGeneralTextHandler.h"
# include "../lib/CHeroHandler.h"
# include "../lib/CLodHandler.h"
# include "../lib/CObjectHandler.h"
# include "../lib/CSpellHandler.h"
# include "../lib/CTownHandler.h"
2009-05-19 21:23:04 +03:00
# include "../lib/CondSh.h"
2009-05-20 13:08:56 +03:00
# include "../lib/map.h"
2010-04-06 11:59:24 +03:00
# include "mapHandler.h"
2009-05-19 21:23:04 +03:00
# include "../timeHandler.h"
2010-02-16 16:39:56 +02:00
# include <boost/foreach.hpp>
2009-05-19 21:23:04 +03:00
# include <boost/lexical_cast.hpp>
2009-11-28 21:55:40 +02:00
# include <boost/format.hpp>
2009-05-19 21:23:04 +03:00
# include <boost/algorithm/string.hpp>
# include <boost/algorithm/string/replace.hpp>
# include <boost/assign/std/vector.hpp>
# include <boost/assign/list_of.hpp>
# include <boost/date_time/posix_time/posix_time.hpp>
2009-05-25 02:21:55 +03:00
//#include <boost/thread.hpp>
2009-05-19 21:23:04 +03:00
# include <cmath>
# include <queue>
# include <sstream>
# include "../lib/NetPacks.h"
2009-06-18 18:05:00 +03:00
# include "CSpellWindow.h"
# include "CHeroWindow.h"
2010-12-20 23:22:53 +02:00
# include "CVideoHandler.h"
2009-09-05 13:23:29 +03:00
# include "../StartInfo.h"
2009-09-07 05:29:44 +03:00
# include "CPreGame.h"
2010-05-02 21:20:26 +03:00
# include "../lib/HeroBonus.h"
2010-12-20 23:22:53 +02:00
# include "../lib/CCreatureHandler.h"
# include "CMusicHandler.h"
2010-12-26 16:34:11 +02:00
# include "../lib/BattleState.h"
2009-05-19 21:23:04 +03:00
/*
* GUIClasses . 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
*
*/
using namespace boost : : assign ;
using namespace CSDL_Ext ;
extern std : : queue < SDL_Event * > events ;
extern boost : : mutex eventsM ;
2010-02-16 18:35:24 +02:00
std : : list < CFocusable * > CFocusable : : focusables ;
CFocusable * CFocusable : : inputWithFocus ;
2010-02-15 13:37:47 +02:00
2009-06-24 15:14:48 +03:00
# undef min
# undef max
2011-02-27 21:58:14 +02:00
2009-05-19 21:23:04 +03:00
void CGarrisonSlot : : hover ( bool on )
{
2009-08-11 19:05:33 +03:00
////Hoverable::hover(on);
2009-05-19 21:23:04 +03:00
if ( on )
{
std : : string temp ;
if ( creature )
{
if ( owner - > highlighted )
{
if ( owner - > highlighted = = this )
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 4 ] ; //View %s
2009-05-19 21:23:04 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
else if ( owner - > highlighted - > creature = = creature )
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 2 ] ; //Combine %s armies
2009-05-19 21:23:04 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
else if ( owner - > highlighted - > creature )
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 7 ] ; //Exchange %s with %s
2009-05-19 21:23:04 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , owner - > highlighted - > creature - > nameSing ) ;
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
}
else
{
tlog2 < < " Warning - shouldn't be - highlighted void slot " < < owner - > highlighted < < std : : endl ;
tlog2 < < " Highlighted set to NULL " < < std : : endl ;
owner - > highlighted = NULL ;
}
}
else
{
if ( upg )
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 32 ] ; //Select %s (visiting)
}
2011-02-05 15:39:10 +02:00
else if ( owner - > armedObjs [ 0 ] & & owner - > armedObjs [ 0 ] - > ID = = TOWNI_TYPE )
2009-07-16 01:46:00 +03:00
{
temp = CGI - > generaltexth - > tcommands [ 12 ] ; //Select %s (in garrison)
2009-05-19 21:23:04 +03:00
}
else
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > allTexts [ 481 ] ; //Select %s
2009-05-19 21:23:04 +03:00
}
boost : : algorithm : : replace_first ( temp , " %s " , creature - > nameSing ) ;
} ;
}
else
{
if ( owner - > highlighted )
{
const CArmedInstance * highl = owner - > highlighted - > getObj ( ) ;
if ( highl - > needsLastStack ( ) //we are moving stack from hero's
2010-05-02 21:20:26 +03:00
& & highl - > stacksCount ( ) = = 1 //it's only stack
2009-05-19 21:23:04 +03:00
& & owner - > highlighted - > upg ! = upg //we're moving it to the other garrison
)
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 5 ] ; //Cannot move last army to garrison
2009-05-19 21:23:04 +03:00
}
else
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 6 ] ; //Move %s
2009-05-19 21:23:04 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , owner - > highlighted - > creature - > nameSing ) ;
}
}
else
{
2009-07-16 01:46:00 +03:00
temp = CGI - > generaltexth - > tcommands [ 11 ] ; //Empty
2009-05-19 21:23:04 +03:00
}
}
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( temp ) ;
2009-05-19 21:23:04 +03:00
}
else
{
2010-02-15 08:54:57 +02:00
GH . statusbar - > clear ( ) ;
2009-05-19 21:23:04 +03:00
}
}
const CArmedInstance * CGarrisonSlot : : getObj ( )
{
2011-02-05 15:39:10 +02:00
return ( ! upg ) ? ( owner - > armedObjs [ 0 ] ) : ( owner - > armedObjs [ 1 ] ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-12 18:54:25 +03:00
bool CGarrisonSlot : : our ( )
{
2011-02-05 15:39:10 +02:00
return upg ? ( owner - > owned [ 1 ] ) : ( owner - > owned [ 0 ] ) ;
2010-08-12 18:54:25 +03:00
}
2009-08-11 19:05:33 +03:00
void CGarrisonSlot : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down & & creature )
2011-03-03 20:25:48 +02:00
{
//GH.pushInt(new CCreInfoWindow(*myStack));
2011-03-06 14:12:22 +02:00
GH . pushInt ( new CCreatureWindow ( * myStack , 2 ) ) ;
2011-03-03 20:25:48 +02:00
}
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CGarrisonSlot : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
bool refr = false ;
if ( owner - > highlighted )
{
if ( owner - > highlighted = = this ) //view info
{
UpgradeInfo pom = LOCPLINT - > cb - > getUpgradeInfo ( getObj ( ) , ID ) ;
2010-08-12 18:54:25 +03:00
bool canUpgrade = getObj ( ) - > tempOwner = = LOCPLINT - > playerID & & pom . oldID > = 0 ; //upgrade is possible
bool canDismiss = getObj ( ) - > tempOwner = = LOCPLINT - > playerID & & ( getObj ( ) - > stacksCount ( ) > 1 | | ! getObj ( ) - > needsLastStack ( ) ) ;
boost : : function < void ( ) > upgr = NULL ;
boost : : function < void ( ) > dism = NULL ;
if ( canUpgrade ) upgr = boost : : bind ( & CCallback : : upgradeCreature , LOCPLINT - > cb , getObj ( ) , ID , pom . newID [ 0 ] ) ;
if ( canDismiss ) dism = boost : : bind ( & CCallback : : dismissCreature , LOCPLINT - > cb , getObj ( ) , ID ) ;
2009-05-19 21:23:04 +03:00
2011-03-03 20:25:48 +02:00
//CCreInfoWindow *creWindow = new CCreInfoWindow( *myStack, 1, upgr, dism, &pom);
2011-03-06 14:12:22 +02:00
CCreatureWindow * creWindow = new CCreatureWindow ( * myStack , 3 , upgr , dism , & pom ) ;
2010-08-12 18:54:25 +03:00
2009-08-07 01:36:51 +03:00
GH . pushInt ( creWindow ) ;
2009-05-19 21:23:04 +03:00
owner - > highlighted = NULL ;
2009-09-09 09:04:42 +03:00
owner - > splitting = false ;
for ( size_t i = 0 ; i < owner - > splitButtons . size ( ) ; i + + )
owner - > splitButtons [ i ] - > block ( true ) ;
2011-01-21 12:37:19 +02:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
refr = true ;
}
2009-09-24 16:23:52 +03:00
else
{
2010-08-12 18:54:25 +03:00
// Only allow certain moves if troops aren't removable or not ours.
if ( ( owner - > highlighted - > our ( ) //our creature is selected
| | owner - > highlighted - > creature = = creature ) //or we are rebalancing army
& & ( owner - > removableUnits
| | ( upg = = 0 & & ( owner - > highlighted - > upg = = 1 & & ! creature ) )
| | ( upg = = 1 & & owner - > highlighted - > upg = = 1 ) ) )
2009-05-19 21:23:04 +03:00
{
2009-09-09 20:49:03 +03:00
//we want to split
if ( ( owner - > splitting | | LOCPLINT - > shiftPressed ( ) )
& & ( ! creature
| | ( creature = = owner - > highlighted - > creature ) ) )
2009-05-19 21:23:04 +03:00
{
2009-09-09 20:49:03 +03:00
owner - > p2 = ID ; //store the second stack pos
owner - > pb = upg ; //store the second stack owner (up or down army)
owner - > splitting = false ;
int totalAmount = owner - > highlighted - > count ;
if ( creature )
totalAmount + = count ;
int last = - 1 ;
if ( upg ! = owner - > highlighted - > upg ) //not splitting within same army
{
2010-05-02 21:20:26 +03:00
if ( owner - > highlighted - > getObj ( ) - > stacksCount ( ) = = 1 //we're splitting away the last stack
2009-09-09 20:49:03 +03:00
& & owner - > highlighted - > getObj ( ) - > needsLastStack ( ) )
{
last = 0 ;
}
2010-05-02 21:20:26 +03:00
if ( getObj ( ) - > stacksCount ( ) = = 1 //destination army can't be emptied, unless we're rebalancing two stacks of same creature
2009-09-24 16:23:52 +03:00
& & owner - > highlighted - > creature = = creature
2009-09-09 20:49:03 +03:00
& & getObj ( ) - > needsLastStack ( ) )
{
last + = 2 ;
}
}
CSplitWindow * spw = new CSplitWindow ( owner - > highlighted - > creature - > idNumber , totalAmount , owner , last , count ) ;
GH . pushInt ( spw ) ;
refr = true ;
2009-05-19 21:23:04 +03:00
}
2009-09-09 20:49:03 +03:00
else if ( creature ! = owner - > highlighted - > creature ) //swap
2009-05-19 21:23:04 +03:00
{
2009-09-09 20:49:03 +03:00
LOCPLINT - > cb - > swapCreatures (
2011-02-05 15:39:10 +02:00
( ! upg ) ? ( owner - > armedObjs [ 0 ] ) : ( owner - > armedObjs [ 1 ] ) ,
( ! owner - > highlighted - > upg ) ? ( owner - > armedObjs [ 0 ] ) : ( owner - > armedObjs [ 1 ] ) ,
2009-09-09 20:49:03 +03:00
ID , owner - > highlighted - > ID ) ;
}
else //merge
{
LOCPLINT - > cb - > mergeStacks (
2011-02-05 15:39:10 +02:00
( ! owner - > highlighted - > upg ) ? ( owner - > armedObjs [ 0 ] ) : ( owner - > armedObjs [ 1 ] ) ,
( ! upg ) ? ( owner - > armedObjs [ 0 ] ) : ( owner - > armedObjs [ 1 ] ) ,
2009-09-09 20:49:03 +03:00
owner - > highlighted - > ID , ID ) ;
2009-05-19 21:23:04 +03:00
}
}
2009-09-24 16:23:52 +03:00
else // Highlight
{
2009-09-09 20:49:03 +03:00
if ( creature )
owner - > highlighted = this ;
2011-01-21 12:37:19 +02:00
redraw ( ) ;
2009-09-09 20:49:03 +03:00
refr = true ;
}
2009-05-19 21:23:04 +03:00
}
}
else //highlight
{
if ( creature )
2009-09-09 09:04:42 +03:00
{
2009-05-19 21:23:04 +03:00
owner - > highlighted = this ;
2009-09-09 09:04:42 +03:00
for ( size_t i = 0 ; i < owner - > splitButtons . size ( ) ; i + + )
owner - > splitButtons [ i ] - > block ( false ) ;
}
2011-01-21 12:37:19 +02:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
refr = true ;
}
if ( refr ) { hover ( false ) ; hover ( true ) ; } //to refresh statusbar
}
}
void CGarrisonSlot : : activate ( )
{
if ( ! active ) active = true ;
else return ;
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
activateHover ( ) ;
2009-05-19 21:23:04 +03:00
}
void CGarrisonSlot : : deactivate ( )
{
if ( active ) active = false ;
else return ;
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
deactivateHover ( ) ;
2009-05-19 21:23:04 +03:00
}
2010-05-02 21:20:26 +03:00
CGarrisonSlot : : CGarrisonSlot ( CGarrisonInt * Owner , int x , int y , int IID , int Upg , const CStackInstance * Creature )
2009-05-19 21:23:04 +03:00
{
2010-05-02 21:20:26 +03:00
//assert(Creature == CGI->creh->creatures[Creature->idNumber]);
2009-05-19 21:23:04 +03:00
active = false ;
upg = Upg ;
ID = IID ;
2010-05-02 21:20:26 +03:00
myStack = Creature ;
creature = Creature ? Creature - > type : NULL ;
count = Creature ? Creature - > count : 0 ;
2010-08-27 19:20:35 +03:00
pos . x + = x ;
pos . y + = y ;
2009-06-28 11:21:50 +03:00
if ( Owner - > smallIcons )
{
pos . w = 32 ;
pos . h = 32 ;
}
else
{
pos . w = 58 ;
pos . h = 64 ;
}
2009-05-19 21:23:04 +03:00
owner = Owner ;
}
CGarrisonSlot : : ~ CGarrisonSlot ( )
{
if ( active )
deactivate ( ) ;
}
2011-01-06 22:00:19 +02:00
void CGarrisonSlot : : showAll ( SDL_Surface * to )
2009-05-19 21:23:04 +03:00
{
2009-06-28 11:21:50 +03:00
std : : map < int , SDL_Surface * > & imgs = ( owner - > smallIcons ? graphics - > smallImgs : graphics - > bigImgs ) ;
2009-05-19 21:23:04 +03:00
if ( creature )
{
char buf [ 15 ] ;
SDL_itoa ( count , buf , 10 ) ;
2009-06-28 11:21:50 +03:00
blitAt ( imgs [ creature - > idNumber ] , pos , to ) ;
2010-02-07 17:06:14 +02:00
printTo ( buf , pos . x + pos . w , pos . y + pos . h + 1 , owner - > smallIcons ? FONT_TINY : FONT_MEDIUM , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
if ( ( owner - > highlighted = = this )
| | ( owner - > splitting & & owner - > highlighted - > creature = = creature ) )
{
2009-06-28 11:21:50 +03:00
blitAt ( imgs [ - 1 ] , pos , to ) ;
2009-05-19 21:23:04 +03:00
}
}
2010-01-30 21:08:26 +02:00
else //empty slot
2009-05-19 21:23:04 +03:00
{
2010-08-12 18:54:25 +03:00
if ( owner - > splitting & & owner - > highlighted - > our ( ) )
2009-06-28 11:21:50 +03:00
blitAt ( imgs [ - 1 ] , pos , to ) ;
2009-05-19 21:23:04 +03:00
}
}
2011-02-05 15:39:10 +02:00
2009-05-19 21:23:04 +03:00
CGarrisonInt : : ~ CGarrisonInt ( )
2010-08-27 19:20:35 +03:00
{ /*
2009-09-11 08:45:40 +03:00
for ( size_t i = 0 ; i < splitButtons . size ( ) ; i + + )
2010-08-27 19:20:35 +03:00
delete splitButtons [ i ] ; */
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
void CGarrisonInt : : addSplitBtn ( AdventureMapButton * button )
2009-05-19 21:23:04 +03:00
{
2010-08-27 19:20:35 +03:00
addChild ( button ) ;
button - > recActions = defActions ;
splitButtons . push_back ( button ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
void CGarrisonInt : : createSet ( std : : vector < CGarrisonSlot * > & ret , const CCreatureSet * set , int posX , int posY , int distance , int Upg )
2009-05-19 21:23:04 +03:00
{
2010-08-27 19:20:35 +03:00
ret . resize ( 7 ) ;
for ( TSlots : : const_iterator i = set - > Slots ( ) . begin ( ) ; i ! = set - > Slots ( ) . end ( ) ; i + + )
2009-05-19 21:23:04 +03:00
{
2010-11-22 02:34:46 +02:00
ret [ i - > first ] = new CGarrisonSlot ( this , posX + ( i - > first * distance ) , posY , i - > first , Upg , i - > second ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
for ( int i = 0 ; i < ret . size ( ) ; i + + )
if ( ! ret [ i ] )
ret [ i ] = new CGarrisonSlot ( this , posX + ( i * distance ) , posY , i , Upg , NULL ) ;
if ( twoRows )
for ( int i = 4 ; i < ret . size ( ) ; i + + )
2009-05-19 21:23:04 +03:00
{
2010-08-27 19:20:35 +03:00
ret [ i ] - > pos . x - = 126 ;
ret [ i ] - > pos . y + = 37 ;
} ;
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
2009-05-19 21:23:04 +03:00
void CGarrisonInt : : createSlots ( )
{
2010-08-27 19:20:35 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2009-06-28 11:21:50 +03:00
int h , w ; //height and width of slot
if ( smallIcons )
{
h = w = 32 ;
}
else
{
h = 64 ;
w = 58 ;
}
2011-02-05 15:39:10 +02:00
if ( armedObjs [ 0 ] )
createSet ( slotsUp , armedObjs [ 0 ] , 0 , 0 , w + interx , 0 ) ;
2010-04-02 05:07:40 +03:00
2011-02-05 15:39:10 +02:00
if ( armedObjs [ 1 ] )
createSet ( slotsDown , armedObjs [ 1 ] , garOffset . x , garOffset . y , w + interx , 1 ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
2009-05-19 21:23:04 +03:00
void CGarrisonInt : : deleteSlots ( )
{
2010-08-27 19:20:35 +03:00
for ( int i = 0 ; i < slotsUp . size ( ) ; i + + )
delChildNUll ( slotsUp [ i ] ) ;
for ( int i = 0 ; i < slotsDown . size ( ) ; i + + )
delChildNUll ( slotsDown [ i ] ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
2009-05-19 21:23:04 +03:00
void CGarrisonInt : : recreateSlots ( )
{
2010-08-27 19:20:35 +03:00
2009-05-19 21:23:04 +03:00
splitting = false ;
highlighted = NULL ;
2009-09-09 09:04:42 +03:00
for ( size_t i = 0 ; i < splitButtons . size ( ) ; i + + )
splitButtons [ i ] - > block ( true ) ;
2010-08-27 19:20:35 +03:00
bool wasActive = active ;
2009-05-19 21:23:04 +03:00
if ( active )
{
2010-08-27 19:20:35 +03:00
deactivate ( ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-27 19:20:35 +03:00
2009-05-19 21:23:04 +03:00
deleteSlots ( ) ;
createSlots ( ) ;
2010-08-27 19:20:35 +03:00
if ( wasActive )
2009-05-19 21:23:04 +03:00
{
2010-08-27 19:20:35 +03:00
activate ( ) ;
showAll ( screen2 ) ;
2009-05-19 21:23:04 +03:00
}
}
2010-08-27 19:20:35 +03:00
2009-05-19 21:23:04 +03:00
void CGarrisonInt : : splitClick ( )
{
if ( ! highlighted )
return ;
splitting = ! splitting ;
2011-03-13 00:29:19 +02:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
}
void CGarrisonInt : : splitStacks ( int am2 )
{
2011-02-05 15:39:10 +02:00
LOCPLINT - > cb - > splitStack ( armedObjs [ highlighted - > upg ] , armedObjs [ pb ] , highlighted - > ID , p2 , am2 ) ;
2009-05-19 21:23:04 +03:00
}
2011-02-05 15:39:10 +02:00
2010-08-27 19:20:35 +03:00
CGarrisonInt : : CGarrisonInt ( int x , int y , int inx , const Point & garsOffset ,
2011-04-23 13:27:44 +03:00
SDL_Surface * pomsur , const Point & SurOffset ,
2010-08-27 19:20:35 +03:00
const CArmedInstance * s1 , const CArmedInstance * s2 ,
bool _removableUnits , bool smallImgs , bool _twoRows )
2011-04-23 13:27:44 +03:00
: interx ( inx ) , garOffset ( garsOffset ) , highlighted ( NULL ) , splitting ( false ) ,
2011-02-05 15:39:10 +02:00
smallIcons ( smallImgs ) , removableUnits ( _removableUnits ) , twoRows ( _twoRows )
2009-05-19 21:23:04 +03:00
{
2011-02-05 15:39:10 +02:00
setArmy ( s1 , false ) ;
setArmy ( s2 , true ) ;
2010-08-27 19:20:35 +03:00
pos . x + = x ;
pos . y + = y ;
2009-05-19 21:23:04 +03:00
createSlots ( ) ;
}
void CGarrisonInt : : activate ( )
{
2009-09-09 09:04:42 +03:00
for ( size_t i = 0 ; i < splitButtons . size ( ) ; i + + )
2011-02-20 11:24:53 +02:00
if ( ( splitButtons [ i ] - > isBlocked ( ) ) ! = ! highlighted )
2009-09-09 09:04:42 +03:00
splitButtons [ i ] - > block ( ! highlighted ) ;
2011-02-23 13:21:40 +02:00
2010-08-27 19:20:35 +03:00
CIntObject : : activate ( ) ;
2009-05-19 21:23:04 +03:00
}
2011-02-05 15:39:10 +02:00
void CGarrisonInt : : setArmy ( const CArmedInstance * army , bool bottomGarrison )
{
owned [ bottomGarrison ] = army ? ( army - > tempOwner = = LOCPLINT - > playerID | | army - > tempOwner = = 254 ) : false ; //254 - neutral objects (pandora, banks)
armedObjs [ bottomGarrison ] = army ;
}
2011-03-12 23:55:31 +02:00
CInfoWindow : : CInfoWindow ( std : : string Text , int player , const TCompsInfo & comps , const TButtonsInfo & Buttons , bool delComps )
2009-05-19 21:23:04 +03:00
{
2010-07-06 05:10:26 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2011-03-22 15:19:07 +02:00
type | = BLOCK_ADV_HOTKEYS ;
2009-05-19 21:23:04 +03:00
ID = - 1 ;
for ( int i = 0 ; i < Buttons . size ( ) ; i + + )
{
2011-04-26 16:30:29 +03:00
AdventureMapButton * button = new AdventureMapButton ( " " , " " , boost : : bind ( & CInfoWindow : : close , this ) , 0 , 0 , Buttons [ i ] . first ) ;
button - > borderColor = int3 ( 173 , 142 , 66 ) ;
button - > borderEnabled = true ;
button - > callback . add ( Buttons [ i ] . second ) ; //each button will close the window apart from call-defined actions
buttons . push_back ( button ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-06 05:10:26 +03:00
text = new CTextBox ( Text , Rect ( 0 , 0 , 250 , 100 ) , 0 , FONT_MEDIUM , CENTER , zwykly ) ;
text - > redrawParentOnScrolling = true ;
2011-03-12 23:55:31 +02:00
if ( buttons . size ( ) )
{
buttons . front ( ) - > assignedKeys . insert ( SDLK_RETURN ) ; //first button - reacts on enter
buttons . back ( ) - > assignedKeys . insert ( SDLK_ESCAPE ) ; //last button - reacts on escape
}
2009-05-19 21:23:04 +03:00
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
2010-07-06 05:10:26 +03:00
comps [ i ] - > recActions = 0xff ;
addChild ( comps [ i ] ) ;
2010-07-21 13:09:29 +03:00
comps [ i ] - > recActions & = ~ ( SHOWALL | UPDATE ) ;
2009-05-19 21:23:04 +03:00
components . push_back ( comps [ i ] ) ;
}
2010-07-15 06:04:57 +03:00
setDelComps ( delComps ) ;
2010-07-26 18:37:58 +03:00
CMessage : : drawIWindow ( this , Text , player ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-06 05:10:26 +03:00
2009-05-19 21:23:04 +03:00
CInfoWindow : : CInfoWindow ( )
{
ID = - 1 ;
2010-07-15 06:04:57 +03:00
setDelComps ( false ) ;
2010-07-06 05:10:26 +03:00
text = NULL ;
2011-02-23 13:21:40 +02:00
}
2011-02-20 11:24:53 +02:00
2009-05-19 21:23:04 +03:00
void CInfoWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-11-24 22:29:50 +02:00
if ( LOCPLINT )
LOCPLINT - > showingDialog - > setn ( false ) ;
2009-05-19 21:23:04 +03:00
}
2011-02-20 11:24:53 +02:00
2009-05-19 21:23:04 +03:00
void CInfoWindow : : show ( SDL_Surface * to )
{
2010-07-06 05:10:26 +03:00
CIntObject : : show ( to ) ;
2009-05-19 21:23:04 +03:00
}
CInfoWindow : : ~ CInfoWindow ( )
{
2010-07-15 06:04:57 +03:00
if ( ! delComps )
{
for ( int i = 0 ; i < components . size ( ) ; i + + )
removeChild ( components [ i ] ) ;
}
2009-05-19 21:23:04 +03:00
}
2009-08-17 11:50:31 +03:00
void CInfoWindow : : showAll ( SDL_Surface * to )
{
2010-07-06 05:10:26 +03:00
CSimpleWindow : : show ( to ) ;
CIntObject : : showAll ( to ) ;
2009-08-17 11:50:31 +03:00
}
2009-11-13 21:04:36 +02:00
void CInfoWindow : : showYesNoDialog ( const std : : string & text , const std : : vector < SComponent * > * components , const CFunctionList < void ( ) > & onYes , const CFunctionList < void ( ) > & onNo , bool DelComps , int player )
{
assert ( ! LOCPLINT | | LOCPLINT - > showingDialog - > get ( ) ) ;
std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > pom ;
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " IOKAY.DEF " , 0 ) ) ;
2010-08-18 13:52:30 +03:00
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " ICANCEL.DEF " , 0 ) ) ;
2010-07-26 18:37:58 +03:00
CInfoWindow * temp = new CInfoWindow ( text , player , components ? * components : std : : vector < SComponent * > ( ) , pom , DelComps ) ;
2009-11-13 21:04:36 +02:00
for ( int i = 0 ; i < onYes . funcs . size ( ) ; i + + )
temp - > buttons [ 0 ] - > callback + = onYes . funcs [ i ] ;
2010-08-18 13:52:30 +03:00
for ( int i = 0 ; i < onNo . funcs . size ( ) ; i + + )
temp - > buttons [ 1 ] - > callback + = onNo . funcs [ i ] ;
2009-11-13 21:04:36 +02:00
GH . pushInt ( temp ) ;
}
2010-07-24 14:46:04 +03:00
CInfoWindow * CInfoWindow : : create ( const std : : string & text , int playerID /*= 1*/ , const std : : vector < SComponent * > * components /*= NULL*/ , bool DelComps )
2010-03-08 00:56:51 +02:00
{
std : : vector < std : : pair < std : : string , CFunctionList < void ( ) > > > pom ;
pom . push_back ( std : : pair < std : : string , CFunctionList < void ( ) > > ( " IOKAY.DEF " , 0 ) ) ;
2010-07-26 18:37:58 +03:00
CInfoWindow * ret = new CInfoWindow ( text , playerID , components ? * components : std : : vector < SComponent * > ( ) , pom , DelComps ) ;
2010-03-08 00:56:51 +02:00
return ret ;
}
2010-07-15 06:04:57 +03:00
void CInfoWindow : : setDelComps ( bool DelComps )
{
delComps = DelComps ;
BOOST_FOREACH ( SComponent * comp , components )
{
if ( delComps )
comp - > recActions | = DISPOSE ;
else
comp - > recActions & = ~ DISPOSE ;
}
}
2009-08-11 19:05:33 +03:00
void CRClickPopup : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
return ;
close ( ) ;
}
void CRClickPopup : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateRClick ( ) ;
2009-05-19 21:23:04 +03:00
}
void CRClickPopup : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateRClick ( ) ;
2009-05-19 21:23:04 +03:00
}
void CRClickPopup : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
2011-03-12 23:55:31 +02:00
void CRClickPopup : : createAndPush ( const std : : string & txt , const CInfoWindow : : TCompsInfo & comps )
2010-03-21 00:17:19 +02:00
{
int player = LOCPLINT ? LOCPLINT - > playerID : 1 ; //if no player, then use blue
2011-03-08 11:09:57 +02:00
2011-03-12 23:55:31 +02:00
CSimpleWindow * temp = new CInfoWindow ( txt , player , comps ) ;
temp - > center ( Point ( GH . current - > motion ) ) ; //center on mouse
2011-03-20 00:27:05 +02:00
temp - > fitToScreen ( 10 ) ;
2010-03-21 00:17:19 +02:00
CRClickPopupInt * rcpi = new CRClickPopupInt ( temp , true ) ;
GH . pushInt ( rcpi ) ;
}
void CRClickPopup : : createAndPush ( const CGObjectInstance * obj , const Point & p , EAlignment alignment /*= BOTTOMRIGHT*/ )
{
SDL_Surface * iWin = LOCPLINT - > infoWin ( obj ) ; //try get custom infowindow for this obj
if ( iWin )
GH . pushInt ( new CInfoPopup ( iWin , p , alignment , true ) ) ;
else
CRClickPopup : : createAndPush ( obj - > getHoverText ( ) ) ;
}
CRClickPopup : : CRClickPopup ( )
{
}
CRClickPopup : : ~ CRClickPopup ( )
{
}
2009-05-19 21:23:04 +03:00
CInfoPopup : : CInfoPopup ( SDL_Surface * Bitmap , int x , int y , bool Free )
: free ( Free ) , bitmap ( Bitmap )
{
2010-03-21 00:17:19 +02:00
init ( x , y ) ;
}
2009-10-22 06:12:01 +03:00
2009-06-02 06:01:17 +03:00
2010-03-21 00:17:19 +02:00
CInfoPopup : : CInfoPopup ( SDL_Surface * Bitmap , const Point & p , EAlignment alignment , bool Free /*=false*/ )
: free ( Free ) , bitmap ( Bitmap )
{
switch ( alignment )
{
case BOTTOMRIGHT :
init ( p . x - Bitmap - > w , p . y - Bitmap - > h ) ;
break ;
case CENTER :
init ( p . x - Bitmap - > w / 2 , p . y - Bitmap - > h / 2 ) ;
break ;
case TOPLEFT :
init ( p . x , p . y ) ;
break ;
default :
assert ( 0 ) ; //not implemented
}
2009-05-19 21:23:04 +03:00
}
2009-05-22 02:50:45 +03:00
CInfoPopup : : CInfoPopup ( SDL_Surface * Bitmap , bool Free )
{
2010-12-19 16:39:56 +02:00
CCS - > curh - > hide ( ) ;
2009-10-22 06:12:01 +03:00
2009-05-22 02:50:45 +03:00
free = Free ;
bitmap = Bitmap ;
2009-08-22 16:59:15 +03:00
2009-08-23 21:23:21 +03:00
if ( bitmap )
{
pos . x = screen - > w / 2 - bitmap - > w / 2 ;
pos . y = screen - > h / 2 - bitmap - > h / 2 ;
pos . h = bitmap - > h ;
pos . w = bitmap - > w ;
}
2009-05-22 02:50:45 +03:00
}
2009-05-19 21:23:04 +03:00
void CInfoPopup : : close ( )
{
if ( free )
SDL_FreeSurface ( bitmap ) ;
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
void CInfoPopup : : show ( SDL_Surface * to )
{
blitAt ( bitmap , pos . x , pos . y , to ) ;
}
2009-10-22 06:12:01 +03:00
CInfoPopup : : ~ CInfoPopup ( )
{
2010-12-19 16:39:56 +02:00
CCS - > curh - > show ( ) ;
2009-10-22 06:12:01 +03:00
}
2009-05-19 21:23:04 +03:00
2010-03-21 00:17:19 +02:00
void CInfoPopup : : init ( int x , int y )
{
2010-12-19 16:39:56 +02:00
CCS - > curh - > hide ( ) ;
2010-03-21 00:17:19 +02:00
pos . x = x ;
pos . y = y ;
pos . h = bitmap - > h ;
pos . w = bitmap - > w ;
// Put the window back on screen if necessary
amax ( pos . x , 0 ) ;
amax ( pos . y , 0 ) ;
amin ( pos . x , conf . cc . resx - bitmap - > w ) ;
amin ( pos . y , conf . cc . resy - bitmap - > h ) ;
}
2009-05-19 21:23:04 +03:00
void SComponent : : init ( Etype Type , int Subtype , int Val )
{
std : : ostringstream oss ;
switch ( Type )
{
case artifact :
2010-06-26 19:02:10 +03:00
description = CGI - > arth - > artifacts [ Subtype ] - > Description ( ) ;
subtitle = CGI - > arth - > artifacts [ Subtype ] - > Name ( ) ;
2009-05-19 21:23:04 +03:00
break ;
case primskill :
2009-07-16 01:46:00 +03:00
oss < < std : : showpos < < Val < < " " ;
2009-05-19 21:23:04 +03:00
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 ;
}
subtitle = oss . str ( ) ;
2009-12-30 09:49:25 +02:00
break ;
case building :
2009-12-29 15:40:16 +02:00
description = CGI - > buildh - > buildings [ Subtype ] [ Val ] - > Description ( ) ;
2009-12-30 09:49:25 +02:00
subtitle = CGI - > buildh - > buildings [ Subtype ] [ Val ] - > Name ( ) ;
2009-05-19 21:23:04 +03:00
break ;
case secskill44 : case secskill :
subtitle + = CGI - > generaltexth - > levels [ Val - 1 ] + " " + CGI - > generaltexth - > skillName [ Subtype ] ;
description = CGI - > generaltexth - > skillInfoTexts [ Subtype ] [ Val - 1 ] ;
break ;
2010-08-27 19:20:35 +03:00
case morale :
description = CGI - > generaltexth - > heroscrn [ 4 - ( val > 0 ) + ( val < 0 ) ] ;
break ;
case luck :
description = CGI - > generaltexth - > heroscrn [ 7 - ( val > 0 ) + ( val < 0 ) ] ;
break ;
2009-05-19 21:23:04 +03:00
case resource :
description = CGI - > generaltexth - > allTexts [ 242 ] ;
oss < < Val ;
subtitle = oss . str ( ) ;
break ;
case spell :
2010-12-19 16:39:56 +02:00
description = CGI - > spellh - > spells [ Subtype ] - > descriptions [ Val ] ;
subtitle = CGI - > spellh - > spells [ Subtype ] - > name ;
2009-05-19 21:23:04 +03:00
break ;
case creature :
2010-08-22 10:54:24 +03:00
subtitle = ( Val ? boost : : lexical_cast < std : : string > ( Val ) + " " : " " ) + CGI - > creh - > creatures [ Subtype ] - > * ( Val ! = 1 ? & CCreature : : namePl : & CCreature : : nameSing ) ;
2009-05-19 21:23:04 +03:00
break ;
case experience :
description = CGI - > generaltexth - > allTexts [ 241 ] ;
oss < < Val ;
if ( Subtype & & Val = = 1 )
{
subtitle = CGI - > generaltexth - > allTexts [ 442 ] ;
}
else
{
subtitle = oss . str ( ) ;
}
break ;
2010-02-02 19:05:03 +02:00
case hero :
subtitle = description = CGI - > heroh - > heroes [ Subtype ] - > name ;
break ;
2010-02-01 19:07:46 +02:00
case flag :
subtitle = CGI - > generaltexth - > capColors [ Subtype ] ;
break ;
2009-05-19 21:23:04 +03:00
}
2010-08-18 17:24:30 +03:00
img = NULL ;
free = false ;
2009-05-19 21:23:04 +03:00
type = Type ;
subtype = Subtype ;
val = Val ;
SDL_Surface * temp = this - > getImg ( ) ;
if ( ! temp )
{
tlog1 < < " Error: cannot find graphic for component with id= " < < type < < " subid= " < < subtype < < " val= " < < val < < std : : endl ;
return ;
}
pos . w = temp - > w ;
pos . h = temp - > h ;
}
2010-08-18 17:24:30 +03:00
SComponent : : SComponent ( Etype Type , int Subtype , int Val , SDL_Surface * sur , bool freeSur ) : img ( sur ) , free ( freeSur )
2009-05-19 21:23:04 +03:00
{
init ( Type , Subtype , Val ) ;
}
SComponent : : SComponent ( const Component & c )
{
if ( c . id = = 5 )
init ( experience , c . subtype , c . val ) ;
else if ( c . id = = Component : : SPELL )
init ( spell , c . subtype , c . val ) ;
else
init ( ( Etype ) c . id , c . subtype , c . val ) ;
if ( c . id = = 2 & & c . when = = - 1 )
subtitle + = CGI - > generaltexth - > allTexts [ 3 ] . substr ( 2 , CGI - > generaltexth - > allTexts [ 3 ] . length ( ) - 2 ) ;
}
2010-08-18 17:24:30 +03:00
2011-01-24 01:49:17 +02:00
SComponent : : SComponent ( )
{
img = NULL ;
}
2010-08-18 17:24:30 +03:00
SComponent : : ~ SComponent ( )
{
if ( free & & img )
SDL_FreeSurface ( img ) ;
}
SDL_Surface * SComponent : : setSurface ( std : : string defname , int imagepos )
{
if ( img )
tlog1 < < " SComponent::setSurface: Warning - surface is already set! \n " ;
CDefEssential * def = CDefHandler : : giveDefEss ( defname ) ;
free = true ;
img = def - > ourImages [ imagepos ] . bitmap ;
img - > refcount + + ; //to preserve surface whed def is deleted
delete def ;
2010-08-19 18:24:32 +03:00
return img ;
2010-08-18 17:24:30 +03:00
}
2009-05-19 21:23:04 +03:00
void SComponent : : show ( SDL_Surface * to )
{
blitAt ( getImg ( ) , pos . x , pos . y , to ) ;
}
2010-08-18 17:24:30 +03:00
2009-05-19 21:23:04 +03:00
SDL_Surface * SComponent : : getImg ( )
{
2010-08-18 17:24:30 +03:00
if ( img )
return img ;
2009-05-19 21:23:04 +03:00
switch ( type )
{
case artifact :
return graphics - > artDefs - > ourImages [ subtype ] . bitmap ;
case primskill :
return graphics - > pskillsb - > ourImages [ subtype ] . bitmap ;
case secskill44 :
return graphics - > abils44 - > ourImages [ subtype * 3 + 3 + val - 1 ] . bitmap ;
case secskill :
return graphics - > abils82 - > ourImages [ subtype * 3 + 3 + val - 1 ] . bitmap ;
case resource :
return graphics - > resources - > ourImages [ subtype ] . bitmap ;
case experience :
return graphics - > pskillsb - > ourImages [ 4 ] . bitmap ;
case morale :
return graphics - > morale82 - > ourImages [ val + 3 ] . bitmap ;
case luck :
return graphics - > luck82 - > ourImages [ val + 3 ] . bitmap ;
case spell :
return graphics - > spellscr - > ourImages [ subtype ] . bitmap ;
2010-08-18 17:24:30 +03:00
case building :
return setSurface ( graphics - > buildingPics [ subtype ] , val ) ;
2009-05-19 21:23:04 +03:00
case creature :
return graphics - > bigImgs [ subtype ] ;
2010-02-02 19:05:03 +02:00
case hero :
return graphics - > portraitLarge [ subtype ] ;
2010-02-01 19:07:46 +02:00
case flag :
return graphics - > flags - > ourImages [ subtype ] . bitmap ;
2009-05-19 21:23:04 +03:00
}
return NULL ;
}
2009-08-11 19:05:33 +03:00
void SComponent : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( description . size ( ) )
2010-03-21 00:17:19 +02:00
adventureInt - > handleRightClick ( description , down ) ;
2009-05-19 21:23:04 +03:00
}
void SComponent : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateRClick ( ) ;
2009-05-19 21:23:04 +03:00
}
void SComponent : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateRClick ( ) ;
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CSelectableComponent : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
if ( onSelect )
onSelect ( ) ;
}
}
2010-08-12 08:22:48 +03:00
void CSelectableComponent : : init ( )
2009-05-19 21:23:04 +03:00
{
selected = false ;
}
2010-08-12 08:22:48 +03:00
CSelectableComponent : : CSelectableComponent ( const Component & c , boost : : function < void ( ) > OnSelect )
2009-05-19 21:23:04 +03:00
: SComponent ( c ) , onSelect ( OnSelect )
{
2010-08-12 08:22:48 +03:00
init ( ) ;
2009-05-19 21:23:04 +03:00
}
2010-08-12 08:22:48 +03:00
CSelectableComponent : : CSelectableComponent ( Etype Type , int Sub , int Val , boost : : function < void ( ) > OnSelect )
2009-05-19 21:23:04 +03:00
: SComponent ( Type , Sub , Val ) , onSelect ( OnSelect )
{
2010-08-12 08:22:48 +03:00
init ( ) ;
2009-05-19 21:23:04 +03:00
}
CSelectableComponent : : ~ CSelectableComponent ( )
{
}
void CSelectableComponent : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateKeys ( ) ;
2009-05-19 21:23:04 +03:00
SComponent : : activate ( ) ;
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
2009-05-19 21:23:04 +03:00
}
void CSelectableComponent : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateKeys ( ) ;
2009-05-19 21:23:04 +03:00
SComponent : : deactivate ( ) ;
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
2009-05-19 21:23:04 +03:00
}
void CSelectableComponent : : select ( bool on )
{
if ( on ! = selected )
{
selected = on ;
return ;
}
else
{
return ;
}
}
void CSelectableComponent : : show ( SDL_Surface * to )
{
2010-08-12 08:22:48 +03:00
blitAt ( getImg ( ) , pos . x , pos . y , to ) ;
if ( selected )
2010-08-18 13:58:41 +03:00
{
CSDL_Ext : : drawBorder ( to , Rect : : around ( Rect ( pos . x , pos . y , getImg ( ) - > w , getImg ( ) - > h ) ) , int3 ( 239 , 215 , 123 ) ) ;
}
2010-08-12 08:22:48 +03:00
2010-02-02 18:24:53 +02:00
printAtMiddleWB ( subtitle , pos . x + pos . w / 2 , pos . y + pos . h + 25 , FONT_SMALL , 12 , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-26 18:37:58 +03:00
2009-05-19 21:23:04 +03:00
void CSimpleWindow : : show ( SDL_Surface * to )
{
2010-07-06 05:10:26 +03:00
if ( bitmap )
blitAt ( bitmap , pos . x , pos . y , to ) ;
2009-05-19 21:23:04 +03:00
}
CSimpleWindow : : ~ CSimpleWindow ( )
{
if ( bitmap )
{
SDL_FreeSurface ( bitmap ) ;
bitmap = NULL ;
}
}
void CSelWindow : : selectionChange ( unsigned to )
{
for ( unsigned i = 0 ; i < components . size ( ) ; i + + )
{
CSelectableComponent * pom = dynamic_cast < CSelectableComponent * > ( components [ i ] ) ;
if ( ! pom )
continue ;
pom - > select ( i = = to ) ;
blitAt ( pom - > getImg ( ) , pom - > pos . x - pos . x , pom - > pos . y - pos . y , bitmap ) ;
}
}
2010-07-26 18:37:58 +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 )
2009-05-19 21:23:04 +03:00
{
2010-07-26 18:37:58 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2009-05-19 21:23:04 +03:00
ID = askID ;
for ( int i = 0 ; i < Buttons . size ( ) ; i + + )
{
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
}
2010-07-26 18:37:58 +03:00
text = new CTextBox ( Text , Rect ( 0 , 0 , 250 , 100 ) , 0 , FONT_MEDIUM , CENTER , zwykly ) ;
text - > redrawParentOnScrolling = true ;
2009-05-19 21:23:04 +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 ) ;
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
2010-07-06 05:10:26 +03:00
comps [ i ] - > recActions = 255 ;
addChild ( comps [ i ] ) ;
2009-05-19 21:23:04 +03:00
components . push_back ( comps [ i ] ) ;
comps [ i ] - > onSelect = boost : : bind ( & CSelWindow : : selectionChange , this , i ) ;
if ( i < 9 )
comps [ i ] - > assignedKeys . insert ( SDLK_1 + i ) ;
}
2010-07-26 18:37:58 +03:00
CMessage : : drawIWindow ( this , Text , player ) ;
BOOST_FOREACH ( SComponent * c , components )
c - > subtitle = " " ; //workaround - erase subtitles since they were hard-blitted by function drawing window
2009-05-19 21:23:04 +03:00
}
void CSelWindow : : madeChoice ( )
{
if ( ID < 0 )
return ;
int ret = - 1 ;
for ( int i = 0 ; i < components . size ( ) ; i + + )
{
if ( dynamic_cast < CSelectableComponent * > ( components [ i ] ) - > selected )
{
ret = i ;
}
}
LOCPLINT - > cb - > selectionMade ( ret + 1 , ID ) ;
}
CStatusBar : : CStatusBar ( int x , int y , std : : string name , int maxw )
{
bg = BitmapHandler : : loadBitmap ( name ) ;
SDL_SetColorKey ( bg , SDL_SRCCOLORKEY , SDL_MapRGB ( bg - > format , 0 , 255 , 255 ) ) ;
2010-02-07 17:06:14 +02:00
pos . x + = x ;
pos . y + = y ;
2009-05-19 21:23:04 +03:00
if ( maxw > = 0 )
pos . w = std : : min ( bg - > w , maxw ) ;
else
pos . w = bg - > w ;
pos . h = bg - > h ;
2010-02-13 17:56:34 +02:00
middlex = ( pos . w / 2 ) + pos . x ;
middley = ( bg - > h / 2 ) + pos . y ;
2009-05-19 21:23:04 +03:00
}
CStatusBar : : ~ CStatusBar ( )
{
SDL_FreeSurface ( bg ) ;
}
void CStatusBar : : clear ( )
{
if ( LOCPLINT - > cingconsole - > enteredText = = " " ) //for appropriate support for in-game console
{
current = " " ;
2010-07-21 13:09:29 +03:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
}
}
void CStatusBar : : print ( const std : : string & text )
{
if ( LOCPLINT - > cingconsole - > enteredText = = " " | | text = = LOCPLINT - > cingconsole - > enteredText ) //for appropriate support for in-game console
{
current = text ;
2010-07-21 13:09:29 +03:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
}
}
void CStatusBar : : show ( SDL_Surface * to )
{
2011-02-20 11:24:53 +02:00
SDL_Rect srcRect = genRect ( pos . h , pos . w , 0 , 0 ) ;
SDL_Rect dstRect = genRect ( pos . h , pos . w , pos . x , pos . y ) ;
CSDL_Ext : : blitSurface ( bg , & srcRect , to , & dstRect ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( current , middlex , middley , FONT_SMALL , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
}
std : : string CStatusBar : : getCurrent ( )
{
return current ;
}
void CList : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
activateHover ( ) ;
activateKeys ( ) ;
activateMouseMove ( ) ;
2009-05-19 21:23:04 +03:00
} ;
void CList : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
deactivateHover ( ) ;
deactivateKeys ( ) ;
deactivateMouseMove ( ) ;
2009-05-19 21:23:04 +03:00
} ;
2009-08-11 19:05:33 +03:00
void CList : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
} ;
CList : : CList ( int Size )
: SIZE ( Size )
{
}
2009-09-13 01:17:23 +03:00
void CList : : fixPos ( )
{
if ( selected < 0 ) //no selection, do nothing
return ;
if ( selected < from ) //scroll up
from = selected ;
else if ( from + SIZE < = selected )
from = selected - SIZE + 1 ;
amin ( from , size ( ) - SIZE ) ;
amax ( from , 0 ) ;
2010-08-13 13:46:08 +03:00
draw ( screen ) ;
2009-09-13 01:17:23 +03:00
}
2009-05-19 21:23:04 +03:00
CHeroList : : CHeroList ( int Size )
2010-02-20 15:24:38 +02:00
: CList ( Size )
2009-05-19 21:23:04 +03: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 ) ;
empty = BitmapHandler : : loadBitmap ( " HPSXXX.bmp " ) ;
selection = BitmapHandler : : loadBitmap ( " HPSYYY.bmp " ) ;
SDL_SetColorKey ( selection , SDL_SRCCOLORKEY , SDL_MapRGB ( selection - > format , 0 , 255 , 255 ) ) ;
pos = genRect ( 32 * SIZE + arrup - > height + arrdo - > height , std : : max ( arrup - > width , arrdo - > width ) , conf . go ( ) - > ac . hlistX , conf . go ( ) - > ac . hlistY ) ;
arrupp = genRect ( arrup - > height , arrup - > width , pos . x , pos . y ) ;
arrdop = genRect ( arrdo - > height , arrdo - > width , pos . x , pos . y + 32 * SIZE + arrup - > height ) ;
//32px per hero
posmobx = pos . x + 1 ;
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 ;
from = 0 ;
selected = - 1 ;
pressed = indeterminate ;
}
void CHeroList : : init ( )
{
int w = pos . w + 1 , h = pos . h + 4 ;
bg = CSDL_Ext : : newSurface ( w , h , screen ) ;
2011-02-20 11:24:53 +02:00
Rect srcRect = genRect ( w , h , pos . x , pos . y ) ;
Rect dstRect = genRect ( w , h , 0 , 0 ) ;
CSDL_Ext : : blitSurface ( adventureInt - > bg , & srcRect , bg , & dstRect ) ;
2009-05-19 21:23:04 +03:00
}
void CHeroList : : genList ( )
{
2009-06-11 20:21:06 +03:00
//int howMany = LOCPLINT->cb->howManyHeroes();
//for (int i=0;i<howMany;i++)
//{
// const CGHeroInstance * h = LOCPLINT->cb->getHeroInfo(i,0);
// if(!h->inTownGarrison)
// items.push_back(std::pair<const CGHeroInstance *,CPath *>(h,NULL));
//}
2009-05-19 21:23:04 +03:00
}
void CHeroList : : select ( int which )
{
if ( which < 0 )
{
selected = which ;
2010-02-20 15:24:38 +02:00
adventureInt - > selection = NULL ;
adventureInt - > terrain . currentPath = NULL ;
2009-05-19 21:23:04 +03:00
draw ( screen ) ;
2010-03-21 00:17:19 +02:00
adventureInt - > infoBar . showAll ( screen ) ;
2009-05-19 21:23:04 +03:00
}
2010-02-20 15:24:38 +02:00
if ( which > = LOCPLINT - > wanderingHeroes . size ( ) )
2009-05-19 21:23:04 +03:00
return ;
2009-06-11 20:21:06 +03:00
selected = which ;
2010-02-20 15:24:38 +02:00
adventureInt - > select ( LOCPLINT - > wanderingHeroes [ which ] ) ;
2010-08-13 13:46:08 +03:00
fixPos ( ) ;
draw ( screen ) ;
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CHeroList : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
/***************************ARROWS*****************************************/
2009-08-07 01:36:51 +03:00
if ( isItIn ( & arrupp , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
if ( from > 0 )
{
blitAt ( arrup - > ourImages [ 1 ] . bitmap , arrupp . x , arrupp . y ) ;
pressed = true ;
}
return ;
}
2009-08-07 01:36:51 +03:00
else if ( isItIn ( & arrdop , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
2010-02-20 15:24:38 +02:00
if ( LOCPLINT - > wanderingHeroes . size ( ) - from > SIZE )
2009-05-19 21:23:04 +03:00
{
blitAt ( arrdo - > ourImages [ 1 ] . bitmap , arrdop . x , arrdop . y ) ;
pressed = false ;
}
return ;
}
/***************************HEROES*****************************************/
2009-08-07 01:36:51 +03:00
int hx = GH . current - > motion . x , hy = GH . current - > motion . y ;
2009-05-19 21:23:04 +03:00
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
if ( ny > = SIZE | | ny < 0 )
return ;
2010-02-20 15:24:38 +02:00
if ( ( ny + from ) = = selected & & ( adventureInt - > selection - > ID = = HEROI_TYPE ) )
LOCPLINT - > openHeroWindow ( LOCPLINT - > wanderingHeroes [ selected ] ) ; //print hero screen
2009-05-19 21:23:04 +03:00
select ( ny + from ) ;
}
else
{
if ( indeterminate ( pressed ) )
return ;
if ( pressed ) //up
{
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y ) ;
pressed = indeterminate ;
if ( ! down )
{
from - - ;
if ( from < 0 )
from = 0 ;
draw ( screen ) ;
}
}
else if ( ! pressed ) //down
{
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y ) ;
pressed = indeterminate ;
if ( ! down )
{
from + + ;
//if (from<items.size()-5)
// from=items.size()-5;
draw ( screen ) ;
}
}
else
throw 0 ;
}
}
void CHeroList : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
{
2009-08-07 01:36:51 +03:00
if ( isItIn ( & arrupp , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
if ( from > 0 )
2010-02-20 15:24:38 +02:00
adventureInt - > statusbar . print ( CGI - > generaltexth - > zelp [ 303 ] . first ) ;
2009-05-19 21:23:04 +03:00
else
2010-02-20 15:24:38 +02:00
adventureInt - > statusbar . clear ( ) ;
2009-05-19 21:23:04 +03:00
return ;
}
2009-08-07 01:36:51 +03:00
else if ( isItIn ( & arrdop , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
2010-02-20 15:24:38 +02:00
if ( ( LOCPLINT - > wanderingHeroes . size ( ) - from ) > SIZE )
adventureInt - > statusbar . print ( CGI - > generaltexth - > zelp [ 304 ] . first ) ;
2009-05-19 21:23:04 +03:00
else
2010-02-20 15:24:38 +02:00
adventureInt - > statusbar . clear ( ) ;
2009-05-19 21:23:04 +03:00
return ;
}
//if not buttons then heroes
2009-08-07 01:36:51 +03:00
int hx = GH . current - > motion . x , hy = GH . current - > motion . y ;
2009-05-19 21:23:04 +03:00
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
2010-02-20 15:24:38 +02:00
if ( ( ny > SIZE | | ny < 0 ) | | ( from + ny > = LOCPLINT - > wanderingHeroes . size ( ) ) )
2009-05-19 21:23:04 +03:00
{
2010-02-20 15:24:38 +02:00
adventureInt - > statusbar . clear ( ) ;
2009-05-19 21:23:04 +03:00
return ;
}
std : : vector < std : : string > temp ;
2010-02-20 15:24:38 +02:00
temp . push_back ( LOCPLINT - > wanderingHeroes [ from + ny ] - > name ) ;
temp . push_back ( LOCPLINT - > wanderingHeroes [ from + ny ] - > type - > heroClass - > name ) ;
adventureInt - > statusbar . print ( processStr ( CGI - > generaltexth - > allTexts [ 15 ] , temp ) ) ;
2009-05-19 21:23:04 +03:00
//select(ny+from);
}
2009-08-11 19:05:33 +03:00
void CHeroList : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
/***************************ARROWS*****************************************/
2009-08-07 01:36:51 +03:00
if ( isItIn ( & arrupp , GH . current - > motion . x , GH . current - > motion . y ) & & from > 0 )
2009-05-19 21:23:04 +03:00
{
2010-03-21 00:17:19 +02:00
adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 303 ] . second , down ) ;
2009-05-19 21:23:04 +03:00
}
2010-02-20 15:24:38 +02:00
else if ( isItIn ( & arrdop , GH . current - > motion . x , GH . current - > motion . y ) & & ( LOCPLINT - > wanderingHeroes . size ( ) - from > 5 ) )
2009-05-19 21:23:04 +03:00
{
2010-03-21 00:17:19 +02:00
adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 304 ] . second , down ) ;
2009-05-19 21:23:04 +03:00
}
else
{
//if not buttons then heroes
2009-08-07 01:36:51 +03:00
int hx = GH . current - > motion . x , hy = GH . current - > motion . y ;
2009-05-19 21:23:04 +03:00
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
2010-02-20 15:24:38 +02:00
if ( ( ny > SIZE | | ny < 0 ) | | ( from + ny > = LOCPLINT - > wanderingHeroes . size ( ) ) )
2009-05-19 21:23:04 +03:00
{
return ;
2010-03-21 00:17:19 +02:00
} //show popup
2009-05-19 21:23:04 +03:00
2010-03-21 00:17:19 +02:00
CRClickPopup : : createAndPush ( LOCPLINT - > wanderingHeroes [ from + ny ] , GH . current - > motion ) ;
2009-05-19 21:23:04 +03:00
}
}
}
void CHeroList : : hover ( bool on )
{
}
void CHeroList : : keyPressed ( const SDL_KeyboardEvent & key )
{
}
void CHeroList : : updateHList ( const CGHeroInstance * toRemove )
{
if ( toRemove ) //remove specific hero
2010-02-20 15:24:38 +02:00
LOCPLINT - > wanderingHeroes - = toRemove ;
2009-05-19 21:23:04 +03:00
else
2010-02-26 13:18:09 +02:00
LOCPLINT - > recreateHeroTownList ( ) ;
2009-06-11 20:21:06 +03:00
2010-02-20 15:24:38 +02:00
if ( selected > = LOCPLINT - > wanderingHeroes . size ( ) )
select ( LOCPLINT - > wanderingHeroes . size ( ) - 1 ) ;
2009-06-11 20:21:06 +03:00
2009-09-07 05:29:44 +03:00
if ( toRemove )
{
2010-02-20 15:24:38 +02:00
if ( LOCPLINT - > wanderingHeroes . size ( ) = = 0 )
adventureInt - > townList . select ( 0 ) ;
2009-09-07 05:29:44 +03:00
else
select ( selected ) ;
}
2009-05-19 21:23:04 +03:00
}
void CHeroList : : updateMove ( const CGHeroInstance * which ) //draws move points bar
{
int ser = - 1 ;
2010-02-20 15:24:38 +02:00
for ( int i = 0 ; i < LOCPLINT - > wanderingHeroes . size ( ) & & ser < 0 ; i + + )
if ( LOCPLINT - > wanderingHeroes [ i ] - > subID = = which - > subID )
2009-05-19 21:23:04 +03:00
ser = i ;
ser - = from ;
2009-10-22 06:28:54 +03:00
if ( ser < 0 | | ser > = SIZE ) return ;
2009-05-19 21:23:04 +03:00
int pom = std : : min ( ( which - > movement ) / 100 , ( si32 ) mobile - > ourImages . size ( ) - 1 ) ;
blitAt ( mobile - > ourImages [ pom ] . bitmap , posmobx , posmoby + ser * 32 ) ; //move point
}
void CHeroList : : draw ( SDL_Surface * to )
{
for ( int iT = 0 + from ; iT < SIZE + from ; iT + + )
{
int i = iT - from ;
2010-02-20 15:24:38 +02:00
if ( iT > = LOCPLINT - > wanderingHeroes . size ( ) )
2009-05-19 21:23:04 +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 ) ;
continue ;
}
2010-02-20 15:24:38 +02:00
const CGHeroInstance * cur = LOCPLINT - > wanderingHeroes [ iT ] ;
2009-05-19 21:23:04 +03:00
int pom = cur - > movement / 100 ;
if ( pom > 25 ) pom = 25 ;
if ( pom < 0 ) pom = 0 ;
blitAt ( mobile - > ourImages [ pom ] . bitmap , posmobx , posmoby + i * 32 , to ) ; //move point
pom = cur - > mana / 5 ;
if ( pom > 25 ) pom = 25 ;
if ( pom < 0 ) pom = 0 ;
blitAt ( mana - > ourImages [ pom ] . bitmap , posmanx , posmany + i * 32 , to ) ; //mana
SDL_Surface * temp = graphics - > portraitSmall [ cur - > portrait ] ;
blitAt ( temp , posporx , pospory + i * 32 , to ) ;
2010-05-08 21:56:38 +03:00
if ( adventureInt - > selection & & ( selected = = iT ) & & ( adventureInt - > selection - > ID = = HEROI_TYPE ) )
2009-05-19 21:23:04 +03:00
{
blitAt ( selection , posporx , pospory + i * 32 , to ) ;
}
//TODO: support for custom portraits
}
if ( from > 0 )
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y , to ) ;
else
blitAt ( arrup - > ourImages [ 2 ] . bitmap , arrupp . x , arrupp . y , to ) ;
2010-02-20 15:24:38 +02:00
if ( LOCPLINT - > wanderingHeroes . size ( ) - from > SIZE )
2009-05-19 21:23:04 +03:00
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y , to ) ;
else
blitAt ( arrdo - > ourImages [ 2 ] . bitmap , arrdop . x , arrdop . y , to ) ;
}
2009-06-11 20:21:06 +03:00
int CHeroList : : getPosOfHero ( const CGHeroInstance * h )
2009-05-19 21:23:04 +03:00
{
2010-02-20 15:24:38 +02:00
return vstd : : findPos ( LOCPLINT - > wanderingHeroes , h , std : : equal_to < const CGHeroInstance * > ( ) ) ;
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CHeroList : : show ( SDL_Surface * to )
{
}
2009-09-13 01:17:23 +03:00
2011-04-07 20:54:08 +03:00
void CHeroList : : showAll ( SDL_Surface * to )
{
draw ( to ) ;
}
2009-09-13 01:17:23 +03:00
int CHeroList : : size ( )
{
2010-02-20 15:24:38 +02:00
return LOCPLINT - > wanderingHeroes . size ( ) ;
2009-09-13 01:17:23 +03:00
}
2009-05-19 21:23:04 +03:00
CTownList : : ~ CTownList ( )
{
delete arrup ;
delete arrdo ;
}
CTownList : : CTownList ( int Size , int x , int y , std : : string arrupg , std : : string arrdog )
: CList ( Size )
{
arrup = CDefHandler : : giveDef ( arrupg ) ;
arrdo = CDefHandler : : giveDef ( arrdog ) ;
2011-04-07 20:54:08 +03:00
pos . x + = x ;
pos . y + = y ;
2009-05-19 21:23:04 +03:00
pos . w = std : : max ( arrdo - > width , arrup - > width ) ;
pos . h = arrdo - > height + arrup - > height + Size * 32 ;
2011-04-07 20:54:08 +03:00
arrupp . x = pos . x ;
arrupp . y = pos . y ;
2009-05-19 21:23:04 +03:00
arrupp . w = arrup - > width ;
arrupp . h = arrup - > height ;
2011-04-07 20:54:08 +03:00
arrdop . x = pos . x ;
arrdop . y = pos . y + arrup - > height + 32 * SIZE ;
2009-05-19 21:23:04 +03:00
arrdop . w = arrdo - > width ;
arrdop . h = arrdo - > height ;
posporx = arrdop . x ;
pospory = arrupp . y + arrupp . h ;
pressed = indeterminate ;
from = 0 ;
selected = - 1 ;
}
void CTownList : : genList ( )
{
2010-02-26 13:18:09 +02:00
// LOCPLINT->towns.clear();
// int howMany = LOCPLINT->cb->howManyTowns();
// for (int i=0;i<howMany;i++)
// {
// LOCPLINT->towns.push_back(LOCPLINT->cb->getTownInfo(i,0));
// }
2009-05-19 21:23:04 +03:00
}
void CTownList : : select ( int which )
{
2010-02-26 13:18:09 +02:00
if ( which > = LOCPLINT - > towns . size ( ) )
2009-05-19 21:23:04 +03:00
return ;
selected = which ;
2010-08-28 18:10:37 +03:00
fixPos ( ) ;
2009-05-19 21:23:04 +03:00
if ( ! fun . empty ( ) )
fun ( ) ;
}
void CTownList : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
{
2009-08-07 01:36:51 +03:00
if ( isItIn ( & arrupp , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
if ( from > 0 )
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( CGI - > generaltexth - > zelp [ 306 ] . first ) ;
2009-05-19 21:23:04 +03:00
else
2010-02-15 08:54:57 +02:00
GH . statusbar - > clear ( ) ;
2009-05-19 21:23:04 +03:00
return ;
}
2009-08-07 01:36:51 +03:00
else if ( isItIn ( & arrdop , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
2010-02-26 13:18:09 +02:00
if ( ( LOCPLINT - > towns . size ( ) - from ) > SIZE )
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( CGI - > generaltexth - > zelp [ 307 ] . first ) ;
2009-05-19 21:23:04 +03:00
else
2010-02-15 08:54:57 +02:00
GH . statusbar - > clear ( ) ;
2009-05-19 21:23:04 +03:00
return ;
}
//if not buttons then towns
2009-08-07 01:36:51 +03:00
int hx = GH . current - > motion . x , hy = GH . current - > motion . y ;
2009-05-19 21:23:04 +03:00
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
2010-02-26 13:18:09 +02:00
if ( ( ny > = SIZE | | ny < 0 ) | | ( from + ny > = LOCPLINT - > towns . size ( ) ) )
2009-05-19 21:23:04 +03:00
{
2010-02-15 08:54:57 +02:00
GH . statusbar - > clear ( ) ;
2009-05-19 21:23:04 +03:00
return ;
} ;
2009-12-23 03:46:15 +02:00
std : : string temp = CGI - > generaltexth - > tcommands [ 4 ] ;
2010-02-26 13:18:09 +02:00
boost : : algorithm : : replace_first ( temp , " %s " , LOCPLINT - > towns [ from + ny ] - > name ) ;
temp + = " , " + LOCPLINT - > towns [ from + ny ] - > town - > Name ( ) ;
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( temp ) ;
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CTownList : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
/***************************ARROWS*****************************************/
2009-08-07 01:36:51 +03:00
if ( isItIn ( & arrupp , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
if ( from > 0 )
{
2009-05-25 02:21:55 +03:00
blitAt ( arrup - > ourImages [ 1 ] . bitmap , arrupp . x , arrupp . y , screenBuf ) ;
2009-05-19 21:23:04 +03:00
pressed = true ;
}
return ;
}
2009-08-07 01:36:51 +03:00
else if ( isItIn ( & arrdop , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
2010-02-26 13:18:09 +02:00
if ( LOCPLINT - > towns . size ( ) - from > SIZE )
2009-05-19 21:23:04 +03:00
{
2009-05-25 02:21:55 +03:00
blitAt ( arrdo - > ourImages [ 1 ] . bitmap , arrdop . x , arrdop . y , screenBuf ) ;
2009-05-19 21:23:04 +03:00
pressed = false ;
}
return ;
}
/***************************TOWNS*****************************************/
2009-08-07 01:36:51 +03:00
int hx = GH . current - > motion . x , hy = GH . current - > motion . y ;
2009-05-19 21:23:04 +03:00
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
2010-02-13 17:56:34 +02:00
if ( ny > = SIZE | | ny < 0 )
2009-05-19 21:23:04 +03:00
return ;
2010-02-20 15:24:38 +02:00
if ( GH . topInt ( ) = = adventureInt
2009-05-19 21:23:04 +03:00
& & ( ny + from ) = = selected
2010-02-20 15:24:38 +02:00
& & adventureInt - > selection - > ID = = TOWNI_TYPE
2009-05-19 21:23:04 +03:00
)
2010-02-26 13:18:09 +02:00
LOCPLINT - > openTownWindow ( LOCPLINT - > towns [ selected ] ) ; //print town screen
2009-05-19 21:23:04 +03:00
else
select ( ny + from ) ;
}
else
{
if ( indeterminate ( pressed ) )
return ;
if ( pressed ) //up
{
2009-05-25 02:21:55 +03:00
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y , screenBuf ) ;
2009-05-19 21:23:04 +03:00
pressed = indeterminate ;
if ( ! down )
{
from - - ;
if ( from < 0 )
from = 0 ;
2009-05-25 02:21:55 +03:00
draw ( screenBuf ) ;
2009-05-19 21:23:04 +03:00
}
}
else if ( ! pressed ) //down
{
2009-05-25 02:21:55 +03:00
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y , screenBuf ) ;
2009-05-19 21:23:04 +03:00
pressed = indeterminate ;
if ( ! down )
{
from + + ;
2010-02-26 13:18:09 +02:00
//if (from<LOCPLINT->towns.size()-5)
// from=LOCPLINT->towns.size()-5;
2009-05-19 21:23:04 +03:00
2009-05-25 02:21:55 +03:00
draw ( screenBuf ) ;
2009-05-19 21:23:04 +03:00
}
}
else
throw 0 ;
}
}
2009-08-11 19:05:33 +03:00
void CTownList : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
/***************************ARROWS*****************************************/
2009-08-07 01:36:51 +03:00
if ( isItIn ( & arrupp , GH . current - > motion . x , GH . current - > motion . y ) & & from > 0 )
2009-05-19 21:23:04 +03:00
{
2010-03-21 00:17:19 +02:00
adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 306 ] . second , down ) ;
2009-05-19 21:23:04 +03:00
}
2010-02-26 13:18:09 +02:00
else if ( isItIn ( & arrdop , GH . current - > motion . x , GH . current - > motion . y ) & & ( LOCPLINT - > towns . size ( ) - from > 5 ) )
2009-05-19 21:23:04 +03:00
{
2010-03-21 00:17:19 +02:00
adventureInt - > handleRightClick ( CGI - > generaltexth - > zelp [ 307 ] . second , down ) ;
2009-05-19 21:23:04 +03:00
}
//if not buttons then towns
2009-08-07 01:36:51 +03:00
int hx = GH . current - > motion . x , hy = GH . current - > motion . y ;
2009-05-19 21:23:04 +03:00
hx - = pos . x ;
hy - = pos . y ; hy - = arrup - > ourImages [ 0 ] . bitmap - > h ;
int ny = hy / 32 ;
2010-02-26 13:18:09 +02:00
if ( ( ny > = SIZE | | ny < 0 ) | | ( from + ny > = LOCPLINT - > towns . size ( ) ) )
2009-05-19 21:23:04 +03:00
{
return ;
}
//show popup
2010-03-21 00:17:19 +02:00
CRClickPopup : : createAndPush ( LOCPLINT - > towns [ from + ny ] , GH . current - > motion ) ;
2009-05-19 21:23:04 +03:00
}
}
void CTownList : : hover ( bool on )
{
}
void CTownList : : keyPressed ( const SDL_KeyboardEvent & key )
{
}
void CTownList : : draw ( SDL_Surface * to )
{
for ( int iT = 0 + from ; iT < SIZE + from ; iT + + )
{
int i = iT - from ;
2010-02-26 13:18:09 +02:00
if ( iT > = LOCPLINT - > towns . size ( ) )
2009-05-19 21:23:04 +03:00
{
blitAt ( graphics - > getPic ( - 1 ) , posporx , pospory + i * 32 , to ) ;
continue ;
}
2010-02-26 13:18:09 +02:00
blitAt ( graphics - > getPic ( LOCPLINT - > towns [ iT ] - > subID , LOCPLINT - > towns [ iT ] - > hasFort ( ) , LOCPLINT - > towns [ iT ] - > builded ) , posporx , pospory + i * 32 , to ) ;
2009-05-19 21:23:04 +03:00
2010-05-08 21:56:38 +03:00
if ( adventureInt - > selection & & ( selected = = iT ) & & ( adventureInt - > selection - > ID = = TOWNI_TYPE ) )
2009-05-19 21:23:04 +03:00
{
blitAt ( graphics - > getPic ( - 2 ) , posporx , pospory + i * 32 , to ) ;
}
}
if ( from > 0 )
blitAt ( arrup - > ourImages [ 0 ] . bitmap , arrupp . x , arrupp . y , to ) ;
else
blitAt ( arrup - > ourImages [ 2 ] . bitmap , arrupp . x , arrupp . y , to ) ;
2010-02-26 13:18:09 +02:00
if ( LOCPLINT - > towns . size ( ) - from > SIZE )
2009-05-19 21:23:04 +03:00
blitAt ( arrdo - > ourImages [ 0 ] . bitmap , arrdop . x , arrdop . y , to ) ;
else
blitAt ( arrdo - > ourImages [ 2 ] . bitmap , arrdop . x , arrdop . y , to ) ;
}
2009-08-11 19:05:33 +03:00
void CTownList : : show ( SDL_Surface * to )
{
}
2009-05-19 21:23:04 +03:00
2011-04-07 20:54:08 +03:00
void CTownList : : showAll ( SDL_Surface * to )
{
draw ( to ) ;
}
2009-09-13 01:17:23 +03:00
int CTownList : : size ( )
{
2010-02-26 13:18:09 +02:00
return LOCPLINT - > towns . size ( ) ;
2009-09-13 01:17:23 +03:00
}
2010-11-15 17:15:00 +02:00
CCreaturePic : : CCreaturePic ( int x , int y , const CCreature * cre , bool Big , bool Animated )
2009-05-19 21:23:04 +03:00
{
2010-11-15 17:15:00 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
pos . x + = x ;
pos . y + = y ;
2011-02-06 19:26:27 +02:00
if ( Big )
bg = new CPicture ( graphics - > backgrounds [ cre - > faction ] , 0 , 0 , false ) ;
else
bg = new CPicture ( graphics - > backgroundsm [ cre - > faction ] , 0 , 0 , false ) ;
bg - > needRefresh = true ;
anim = new CCreatureAnim ( 0 , 0 , cre - > animDefName , Rect ( ) ) ;
anim - > clipRect ( cre - > doubleWide ? 170 : 150 , 155 , bg - > pos . w , bg - > pos . h ) ;
anim - > startPreview ( ) ;
2009-05-19 21:23:04 +03:00
}
2010-11-15 17:15:00 +02:00
2009-05-19 21:23:04 +03:00
CCreaturePic : : ~ CCreaturePic ( )
{
2010-11-15 17:15:00 +02:00
2009-05-19 21:23:04 +03:00
}
2010-11-15 17:15:00 +02:00
2009-05-19 21:23:04 +03:00
void CRecruitmentWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
void CRecruitmentWindow : : Max ( )
{
2010-10-24 14:35:14 +03:00
slider - > moveToMax ( ) ;
2009-05-19 21:23:04 +03:00
}
void CRecruitmentWindow : : Buy ( )
{
2009-08-07 01:36:51 +03:00
int crid = creatures [ which ] . ID ,
2010-05-02 21:20:26 +03:00
dstslot = dst - > getSlotFor ( crid ) ;
2009-08-07 01:36:51 +03:00
2010-11-28 18:39:13 +02:00
if ( dstslot < 0 & & ! vstd : : contains ( CGI - > arth - > bigArtifacts , CGI - > arth - > convertMachineID ( crid , true ) ) ) //no available slot
2009-08-07 01:36:51 +03:00
{
std : : string txt ;
if ( dst - > ID = = HEROI_TYPE )
{
txt = CGI - > generaltexth - > allTexts [ 425 ] ; //The %s would join your hero, but there aren't enough provisions to support them.
2010-05-02 21:20:26 +03:00
boost : : algorithm : : replace_first ( txt , " %s " , slider - > value > 1 ? CGI - > creh - > creatures [ crid ] - > namePl : CGI - > creh - > creatures [ crid ] - > nameSing ) ;
2009-08-07 01:36:51 +03:00
}
else
{
txt = CGI - > generaltexth - > allTexts [ 17 ] ; //There is no room in the garrison for this army.
}
LOCPLINT - > showInfoDialog ( txt ) ;
return ;
}
recruit ( crid , slider - > value ) ;
2009-07-26 13:43:22 +03:00
if ( level > = 0 )
close ( ) ;
else
slider - > moveTo ( 0 ) ;
2009-05-19 21:23:04 +03:00
}
void CRecruitmentWindow : : Cancel ( )
{
close ( ) ;
}
void CRecruitmentWindow : : sliderMoved ( int to )
{
buy - > block ( ! to ) ;
2011-02-12 18:12:48 +02:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CRecruitmentWindow : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
2011-03-20 00:27:05 +02:00
Rect creaPos = pos + creatures [ i ] . pos ;
if ( isItIn ( & creaPos , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
which = i ;
int newAmount = std : : min ( amounts [ i ] , creatures [ i ] . amount ) ;
2009-08-17 11:50:31 +03:00
slider - > setAmount ( newAmount ) ;
2010-05-15 11:33:32 +03:00
slider - > block ( ! newAmount ) ;
max - > block ( ! newAmount ) ;
2009-05-19 21:23:04 +03:00
if ( slider - > value > newAmount )
slider - > moveTo ( newAmount ) ;
else
slider - > moveTo ( slider - > value ) ;
2011-02-12 18:12:48 +02:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
break ;
}
}
}
2009-08-11 19:05:33 +03:00
void CRecruitmentWindow : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
2009-08-07 01:36:51 +03:00
int curx = 192 + 51 - ( CREATURE_WIDTH * creatures . size ( ) / 2 ) - ( SPACE_BETWEEN * ( creatures . size ( ) - 1 ) / 2 ) ;
2009-05-19 21:23:04 +03:00
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
2009-08-08 08:45:00 +03:00
const int sCREATURE_WIDTH = CREATURE_WIDTH ; // gcc -O0 workaround
2011-02-20 11:24:53 +02:00
Rect creatureRect = genRect ( 132 , sCREATURE_WIDTH , pos . x + curx , pos . y + 64 ) ;
if ( isItIn ( & creatureRect , GH . current - > motion . x , GH . current - > motion . y ) )
2009-05-19 21:23:04 +03:00
{
2011-03-06 14:12:22 +02:00
CCreatureWindow * popup = new CCreatureWindow ( creatures [ i ] . ID , 0 , 0 ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( popup ) ;
2009-05-19 21:23:04 +03:00
break ;
}
2009-08-07 01:36:51 +03:00
curx + = TOTAL_CREATURE_WIDTH ;
2009-05-19 21:23:04 +03:00
}
}
}
2011-02-12 18:12:48 +02:00
void CRecruitmentWindow : : showAll ( SDL_Surface * to )
2009-05-19 21:23:04 +03:00
{
2011-02-12 18:12:48 +02:00
CIntObject : : showAll ( to ) ;
2009-05-19 21:23:04 +03:00
char pom [ 15 ] ;
SDL_itoa ( creatures [ which ] . amount - slider - > value , pom , 10 ) ; //available
2011-02-12 18:12:48 +02:00
printAtMiddleLoc ( pom , 205 , 253 , FONT_SMALL , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
SDL_itoa ( slider - > value , pom , 10 ) ; //recruit
2011-02-12 18:12:48 +02:00
printAtMiddleLoc ( pom , 279 , 253 , FONT_SMALL , zwykly , to ) ;
printAtMiddleLoc ( CGI - > generaltexth - > allTexts [ 16 ] + " " + CGI - > creh - > creatures [ creatures [ which ] . ID ] - > namePl , 243 , 32 , FONT_BIG , tytulowy , to ) ; //eg "Recruit Dragon flies"
2009-05-19 21:23:04 +03:00
2011-02-12 18:12:48 +02:00
int curx = 122 - creatures [ which ] . res . size ( ) * 24 ;
2010-06-30 22:27:35 +03:00
for ( int i = creatures [ which ] . res . size ( ) - 1 ; i > = 0 ; i - - ) // decrement used to make gold displayed as first res
2009-05-19 21:23:04 +03:00
{
2011-02-12 18:12:48 +02:00
blitAtLoc ( graphics - > resources32 - > ourImages [ creatures [ which ] . res [ i ] . first ] . bitmap , curx , 243 , to ) ;
blitAtLoc ( graphics - > resources32 - > ourImages [ creatures [ which ] . res [ i ] . first ] . bitmap , curx + 258 , 243 , to ) ;
2009-05-19 21:23:04 +03:00
SDL_itoa ( creatures [ which ] . res [ i ] . second , pom , 10 ) ;
2011-02-12 18:12:48 +02:00
printAtMiddleLoc ( pom , curx + 15 , 287 , FONT_SMALL , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
SDL_itoa ( creatures [ which ] . res [ i ] . second * slider - > value , pom , 10 ) ;
2011-02-12 18:12:48 +02:00
printAtMiddleLoc ( pom , curx + 15 + 258 , 287 , FONT_SMALL , zwykly , to ) ;
2010-06-30 22:27:35 +03:00
curx + = 32 + 16 ; //size of bitmap + distance between them
2009-05-19 21:23:04 +03:00
}
2011-02-12 18:12:48 +02:00
for ( int j = 0 ; j < creatures . size ( ) ; j + + )
{
if ( which = = j )
drawBorder ( * bitmap , creatures [ j ] . pos , int3 ( 255 , 0 , 0 ) ) ;
else
drawBorder ( * bitmap , creatures [ j ] . pos , int3 ( 239 , 215 , 123 ) ) ;
}
2009-05-19 21:23:04 +03:00
}
2010-06-30 22:27:35 +03:00
CRecruitmentWindow : : CRecruitmentWindow ( const CGDwelling * Dwelling , int Level , const CArmedInstance * Dst , const boost : : function < void ( int , int ) > & Recruit , int y_offset )
2010-08-27 19:20:35 +03:00
: recruit ( Recruit ) , dwelling ( Dwelling ) , level ( Level ) , dst ( Dst )
2009-05-19 21:23:04 +03:00
{
2011-02-12 18:12:48 +02:00
used = LCLICK | RCLICK ;
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2009-07-26 13:43:22 +03:00
which = 0 ;
2011-02-12 18:12:48 +02:00
bitmap = new CPicture ( " TPRCRT.bmp " ) ;
bitmap - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
bitmap - > center ( ) ;
pos = ( bitmap - > pos + = Point ( 0 , y_offset ) ) ;
bar = new CGStatusBar ( 8 , 370 , " APHLFTRT.bmp " , 471 ) ;
max = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 553 ] , boost : : bind ( & CRecruitmentWindow : : Max , this ) , 134 , 313 , " IRCBTNS.DEF " , SDLK_m ) ;
buy = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 554 ] , boost : : bind ( & CRecruitmentWindow : : Buy , this ) , 212 , 313 , " IBY6432.DEF " , SDLK_RETURN ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 555 ] , boost : : bind ( & CRecruitmentWindow : : Cancel , this ) , 290 , 313 , " ICN6432.DEF " , SDLK_ESCAPE ) ;
slider = new CSlider ( 176 , 279 , 135 , 0 , 0 , 0 , 0 , true ) ;
slider - > moved = boost : : bind ( & CRecruitmentWindow : : sliderMoved , this , _1 ) ;
2009-07-26 13:43:22 +03:00
initCres ( ) ;
2011-02-12 18:12:48 +02:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 346 ] , 113 , 232 , FONT_SMALL , zwykly , * bitmap ) ; //cost per troop t
printAtMiddle ( CGI - > generaltexth - > allTexts [ 465 ] , 205 , 233 , FONT_SMALL , zwykly , * bitmap ) ; //available t
printAtMiddle ( CGI - > generaltexth - > allTexts [ 16 ] , 279 , 233 , FONT_SMALL , zwykly , * bitmap ) ; //recruit t
printAtMiddle ( CGI - > generaltexth - > allTexts [ 466 ] , 371 , 232 , FONT_SMALL , 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 ) ) ;
2009-05-19 21:23:04 +03:00
//border for creatures
2010-11-15 17:15:00 +02:00
int curx = 192 + 50 - ( CREATURE_WIDTH * creatures . size ( ) / 2 ) - ( SPACE_BETWEEN * ( creatures . size ( ) - 1 ) / 2 ) ;
2009-05-19 21:23:04 +03:00
for ( int i = 0 ; i < creatures . size ( ) ; i + + )
{
2011-02-12 18:12:48 +02:00
creatures [ i ] . pos . x = curx - 1 ;
creatures [ i ] . pos . y = 65 - 1 ;
creatures [ i ] . pos . w = 100 + 2 ;
creatures [ i ] . pos . h = 130 + 2 ;
// if(which==i)
// drawBorder(*bitmap,curx-1,64,CREATURE_WIDTH,132,int3(255,0,0));
// else
// drawBorder(*bitmap,curx-1,64,CREATURE_WIDTH,132,int3(239,215,123));
creatures [ i ] . pic = new CCreaturePic ( curx , 65 , CGI - > creh - > creatures [ creatures [ i ] . ID ] ) ;
2009-08-07 01:36:51 +03:00
curx + = TOTAL_CREATURE_WIDTH ;
2009-05-19 21:23:04 +03:00
}
if ( ! creatures [ 0 ] . amount | | ! amounts [ 0 ] )
{
max - > block ( true ) ;
slider - > block ( true ) ;
}
2011-03-01 15:54:48 +02:00
buy - > block ( true ) ;
2009-05-19 21:23:04 +03:00
}
CRecruitmentWindow : : ~ CRecruitmentWindow ( )
{
}
2009-07-26 13:43:22 +03:00
void CRecruitmentWindow : : initCres ( )
{
2011-02-12 18:12:48 +02:00
creatures . clear ( ) ;
amounts . clear ( ) ;
2009-07-26 13:43:22 +03:00
for ( int i = 0 ; i < dwelling - > creatures . size ( ) ; i + + )
{
if ( level > = 0 & & i ! = level )
continue ;
for ( int j = dwelling - > creatures [ i ] . second . size ( ) - 1 ; j > = 0 ; j - - )
{
creatures . resize ( creatures . size ( ) + 1 ) ;
creinfo & cur = creatures . back ( ) ;
cur . amount = dwelling - > creatures [ i ] . first ;
cur . ID = dwelling - > creatures [ i ] . second [ j ] ;
2010-12-19 16:39:56 +02:00
const CCreature * cre = CGI - > creh - > creatures [ cur . ID ] ;
2009-07-26 13:43:22 +03:00
for ( int k = 0 ; k < cre - > cost . size ( ) ; k + + )
if ( cre - > cost [ k ] )
cur . res . push_back ( std : : make_pair ( k , cre - > cost [ k ] ) ) ;
amounts . push_back ( cre - > maxAmount ( LOCPLINT - > cb - > getResourceAmount ( ) ) ) ;
}
}
2009-08-17 11:50:31 +03:00
slider - > setAmount ( std : : min ( amounts [ which ] , creatures [ which ] . amount ) ) ;
2009-07-26 13:43:22 +03:00
}
2009-05-19 21:23:04 +03:00
CSplitWindow : : CSplitWindow ( int cid , int max , CGarrisonInt * Owner , int Last , int val )
{
last = Last ;
which = 1 ;
c = cid ;
slider = NULL ;
gar = Owner ;
2010-02-02 18:24:53 +02:00
SDL_Surface * hhlp = BitmapHandler : : loadBitmap ( " GPUCRDIV.bmp " ) ;
graphics - > blueToPlayersAdv ( hhlp , LOCPLINT - > playerID ) ;
bitmap = SDL_ConvertSurface ( hhlp , screen - > format , 0 ) ;
2009-05-19 21:23:04 +03:00
SDL_SetColorKey ( bitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( bitmap - > format , 0 , 255 , 255 ) ) ;
2010-02-02 18:24:53 +02:00
SDL_FreeSurface ( hhlp ) ;
2009-05-19 21:23:04 +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 ;
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 ) ;
int sliderPositions = max - ( last > = 0 ) - ( last = = 2 ) ;
2009-09-20 15:47:40 +03:00
slider = new CSlider ( pos . x + 21 , pos . y + 194 , 257 , boost : : bind ( & CSplitWindow : : sliderMoved , this , _1 ) , 0 , sliderPositions , val , true ) ;
2009-05-19 21:23:04 +03:00
a1 = max - val ;
a2 = val ;
2010-11-15 17:15:00 +02:00
animLeft = new CCreaturePic ( pos . x + 20 , pos . y + 54 , CGI - > creh - > creatures [ cid ] , true , false ) ;
animRight = new CCreaturePic ( pos . x + 177 , pos . y + 54 , CGI - > creh - > creatures [ cid ] , true , false ) ;
2009-05-19 21:23:04 +03:00
std : : string title = CGI - > generaltexth - > allTexts [ 256 ] ;
2010-05-02 21:20:26 +03:00
boost : : algorithm : : replace_first ( title , " %s " , CGI - > creh - > creatures [ cid ] - > namePl ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( title , 150 , 34 , FONT_BIG , tytulowy , bitmap ) ;
2009-05-19 21:23:04 +03:00
}
CSplitWindow : : ~ CSplitWindow ( ) //d-tor
{
SDL_FreeSurface ( bitmap ) ;
delete ok ;
delete cancel ;
delete slider ;
2010-11-15 17:15:00 +02:00
delete animLeft ;
delete animRight ;
2009-05-19 21:23:04 +03:00
}
void CSplitWindow : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateKeys ( ) ;
2009-05-19 21:23:04 +03:00
ok - > activate ( ) ;
cancel - > activate ( ) ;
slider - > activate ( ) ;
}
void CSplitWindow : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateKeys ( ) ;
2009-05-19 21:23:04 +03:00
ok - > deactivate ( ) ;
cancel - > deactivate ( ) ;
slider - > deactivate ( ) ;
}
void CSplitWindow : : split ( )
{
gar - > splitStacks ( a2 ) ;
close ( ) ;
}
void CSplitWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
void CSplitWindow : : sliderMoved ( int to )
{
int all = a1 + a2 ;
a2 = to + ( last = = 1 | | last = = 2 ) ;
if ( slider )
a1 = all - a2 ;
}
void CSplitWindow : : show ( SDL_Surface * to )
{
blitAt ( bitmap , pos . x , pos . y , to ) ;
2011-02-20 11:24:53 +02:00
ok - > showAll ( to ) ;
cancel - > showAll ( to ) ;
slider - > showAll ( to ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( boost : : lexical_cast < std : : string > ( a1 ) + ( ! which ? " _ " : " " ) , pos . x + 70 , pos . y + 237 , FONT_BIG , zwykly , to ) ;
printAtMiddle ( boost : : lexical_cast < std : : string > ( a2 ) + ( which ? " _ " : " " ) , pos . x + 233 , pos . y + 237 , FONT_BIG , zwykly , to ) ;
2010-11-15 17:15:00 +02:00
animLeft - > show ( to ) ;
animRight - > show ( to ) ;
2009-05-19 21:23:04 +03:00
}
void CSplitWindow : : keyPressed ( const SDL_KeyboardEvent & key )
{
2009-09-07 05:29:44 +03:00
SDLKey k = key . keysym . sym ;
if ( isNumKey ( k ) ) //convert numpad number to normal digit
k = numToDigit ( k ) ;
2009-05-19 21:23:04 +03:00
if ( key . state ! = SDL_PRESSED )
return ;
int & cur = ( which ? a2 : a1 ) ,
& sec = ( which ? a1 : a2 ) ,
ncur = cur ;
2009-09-07 05:29:44 +03:00
if ( k = = SDLK_BACKSPACE )
2009-05-19 21:23:04 +03:00
{
ncur / = 10 ;
}
2009-09-07 05:29:44 +03:00
else if ( k = = SDLK_TAB )
2009-05-19 21:23:04 +03:00
{
which = ! which ;
}
2010-08-19 14:03:33 +03:00
else if ( k = = SDLK_LEFT )
{
ncur - - ;
}
else if ( k = = SDLK_RIGHT )
{
ncur + + ;
}
2009-05-19 21:23:04 +03:00
else
{
2009-09-07 05:29:44 +03:00
int number = k - SDLK_0 ;
2009-05-19 21:23:04 +03:00
if ( number < 0 | | number > 9 ) //not a number pressed
{
return ;
}
ncur = cur * 10 + number ;
}
int delta = ncur - cur ;
if ( delta > sec )
{
cur + = sec ;
sec = 0 ;
}
slider - > moveTo ( which ? ncur : a1 + a2 - ncur ) ;
}
2009-08-11 19:05:33 +03:00
void CSplitWindow : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
{
2009-08-07 01:36:51 +03:00
Point click ( GH . current - > motion . x , GH . current - > motion . y ) ;
2009-09-26 00:11:13 +03:00
click = click - pos . topLeft ( ) ;
2009-05-19 21:23:04 +03:00
if ( Rect ( 19 , 216 , 105 , 40 ) . isIn ( click ) ) //left picture
which = 0 ;
else if ( Rect ( 175 , 216 , 105 , 40 ) . isIn ( click ) ) //right picture
which = 1 ;
}
}
void CCreInfoWindow : : show ( SDL_Surface * to )
{
2010-05-02 21:20:26 +03:00
blitAt ( * bitmap , pos . x , pos . y , to ) ;
2010-11-15 17:15:00 +02:00
anim - > show ( to ) ;
2009-05-19 21:23:04 +03:00
if ( count . size ( ) )
2010-02-02 18:24:53 +02:00
printTo ( count . c_str ( ) , pos . x + 114 , pos . y + 174 , FONT_TIMES , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
if ( upgrade )
2011-02-20 11:24:53 +02:00
upgrade - > showAll ( to ) ;
2009-05-19 21:23:04 +03:00
if ( dismiss )
2011-02-20 11:24:53 +02:00
dismiss - > showAll ( to ) ;
2009-05-19 21:23:04 +03:00
if ( ok )
2011-02-20 11:24:53 +02:00
ok - > showAll ( to ) ;
2009-05-19 21:23:04 +03:00
}
2010-05-02 21:20:26 +03:00
CCreInfoWindow : : CCreInfoWindow ( const CStackInstance & st , int Type , boost : : function < void ( ) > Upg , boost : : function < void ( ) > Dsm , UpgradeInfo * ui )
2009-07-30 15:49:45 +03:00
: type ( Type ) , dsm ( Dsm ) , dismiss ( 0 ) , upgrade ( 0 ) , ok ( 0 )
2009-05-19 21:23:04 +03:00
{
2010-05-02 21:20:26 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2010-12-06 01:10:02 +02:00
init ( st . type , & st , dynamic_cast < const CGHeroInstance * > ( st . armyObj ) , st . count ) ;
2009-05-19 21:23:04 +03:00
//print abilities text - if r-click popup
if ( type )
{
if ( Upg & & ui )
{
bool enough = true ;
for ( std : : set < std : : pair < int , int > > : : iterator i = ui - > cost [ 0 ] . begin ( ) ; i ! = ui - > cost [ 0 ] . end ( ) ; i + + ) //calculate upgrade cost
{
2010-07-15 06:04:57 +03:00
BLOCK_CAPTURING ;
2010-05-02 21:20:26 +03:00
if ( LOCPLINT - > cb - > getResourceAmount ( i - > first ) < i - > second * st . count )
2009-05-19 21:23:04 +03:00
enough = false ;
2010-05-02 21:20:26 +03:00
upgResCost . push_back ( new SComponent ( SComponent : : resource , i - > first , i - > second * st . count ) ) ;
2009-05-19 21:23:04 +03:00
}
if ( enough )
{
2010-05-30 14:48:24 +03:00
CFunctionList < void ( ) > fs ;
fs + = Upg ;
fs + = boost : : bind ( & CCreInfoWindow : : close , this ) ;
2009-05-19 21:23:04 +03:00
CFunctionList < void ( ) > cfl ;
2010-05-30 14:48:24 +03:00
cfl = boost : : bind ( & CPlayerInterface : : showYesNoDialog , LOCPLINT , CGI - > generaltexth - > allTexts [ 207 ] , boost : : ref ( upgResCost ) , fs , 0 , false ) ;
2010-05-02 21:20:26 +03:00
upgrade = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 446 ] . second , cfl , 76 , 237 , " IVIEWCR.DEF " , SDLK_u ) ;
2009-05-19 21:23:04 +03:00
}
else
{
2010-05-02 21:20:26 +03:00
upgrade = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 446 ] . second , boost : : function < void ( ) > ( ) , 76 , 237 , " IVIEWCR.DEF " ) ;
2009-05-19 21:23:04 +03:00
upgrade - > callback . funcs . clear ( ) ;
2011-02-20 11:24:53 +02:00
upgrade - > setOffset ( 2 ) ;
2009-05-19 21:23:04 +03:00
}
}
if ( Dsm )
{
CFunctionList < void ( ) > fs [ 2 ] ;
//on dismiss confirmed
fs [ 0 ] + = Dsm ; //dismiss
fs [ 0 ] + = boost : : bind ( & CCreInfoWindow : : close , this ) ; //close this window
CFunctionList < void ( ) > cfl ;
cfl = boost : : bind ( & CPlayerInterface : : showYesNoDialog , LOCPLINT , CGI - > generaltexth - > allTexts [ 12 ] , std : : vector < SComponent * > ( ) , fs [ 0 ] , fs [ 1 ] , false ) ;
2010-05-02 21:20:26 +03:00
dismiss = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 445 ] . second , cfl , 21 , 237 , " IVIEWCR2.DEF " , SDLK_d ) ;
2009-05-19 21:23:04 +03:00
}
2010-05-02 21:20:26 +03:00
ok = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 445 ] . second , boost : : bind ( & CCreInfoWindow : : close , this ) , 216 , 237 , " IOKAY.DEF " , SDLK_RETURN ) ;
2009-05-19 21:23:04 +03:00
}
2010-05-02 21:20:26 +03:00
}
2010-12-06 01:10:02 +02:00
CCreInfoWindow : : CCreInfoWindow ( int Cid , int Type , int creatureCount )
: type ( Type ) , dismiss ( 0 ) , upgrade ( 0 ) , ok ( 0 )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
const CCreature * cre = CGI - > creh - > creatures [ Cid ] ;
init ( cre , NULL , NULL , creatureCount ) ;
}
CCreInfoWindow : : CCreInfoWindow ( const CStack & st , int Type /*= 0*/ )
: type ( Type ) , dismiss ( 0 ) , upgrade ( 0 ) , ok ( 0 )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
init ( st . getCreature ( ) , & st , st . getMyHero ( ) , st . count ) ;
}
2010-05-02 21:20:26 +03:00
void CCreInfoWindow : : printLine ( int nr , const std : : string & text , int baseVal , int val /*=-1*/ , bool range /*=false*/ )
{
printAt ( text , 155 , 48 + nr * 19 , FONT_SMALL , zwykly , * bitmap ) ;
std : : string hlp ;
if ( range & & baseVal ! = val )
hlp = boost : : str ( boost : : format ( " %d - %d " ) % baseVal % val ) ;
else if ( baseVal ! = val & & val > = 0 )
hlp = boost : : str ( boost : : format ( " %d (%d) " ) % baseVal % val ) ;
else
hlp = boost : : lexical_cast < std : : string > ( baseVal ) ;
printTo ( hlp , 276 , 61 + nr * 19 , FONT_SMALL , zwykly , * bitmap ) ;
}
2010-12-06 01:10:02 +02:00
//void CCreInfoWindow::init(const CCreature *cre, const CStackInstance *stack, int creatureCount)
void CCreInfoWindow : : init ( const CCreature * cre , const CBonusSystemNode * stackNode , const CGHeroInstance * heroOwner , int creatureCount )
2010-05-02 21:20:26 +03:00
{
c = cre ;
2010-12-06 01:10:02 +02:00
if ( ! stackNode ) stackNode = c ;
2010-05-02 21:20:26 +03:00
bitmap = new CPicture ( " CRSTKPU.bmp " ) ;
2010-05-08 01:10:32 +03:00
bitmap - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
2010-05-02 21:20:26 +03:00
pos = bitmap - > center ( ) ;
2010-11-15 17:15:00 +02:00
anim = new CCreaturePic ( 21 , 48 , c ) ;
2010-05-02 21:20:26 +03:00
count = boost : : lexical_cast < std : : string > ( creatureCount ) ;
printAtMiddle ( c - > namePl , 149 , 30 , FONT_SMALL , tytulowy , * bitmap ) ; //creature name
2010-12-06 01:10:02 +02:00
printLine ( 0 , CGI - > generaltexth - > primarySkillNames [ 0 ] , cre - > valOfBonuses ( Bonus : : PRIMARY_SKILL , PrimarySkill : : ATTACK ) , stackNode - > valOfBonuses ( Bonus : : PRIMARY_SKILL , PrimarySkill : : ATTACK ) ) ;
printLine ( 1 , CGI - > generaltexth - > primarySkillNames [ 1 ] , cre - > valOfBonuses ( Bonus : : PRIMARY_SKILL , PrimarySkill : : DEFENSE ) , stackNode - > valOfBonuses ( Bonus : : PRIMARY_SKILL , PrimarySkill : : DEFENSE ) ) ;
2011-04-12 11:59:18 +03:00
//if(c->shots)
// printLine(2, CGI->generaltexth->allTexts[198], c->shots);
if ( stackNode - > valOfBonuses ( Bonus : : SHOTS ) )
printLine ( 2 , CGI - > generaltexth - > allTexts [ 198 ] , stackNode - > valOfBonuses ( Bonus : : SHOTS ) ) ;
2010-05-02 21:20:26 +03:00
//TODO
int dmgMultiply = 1 ;
2010-12-06 01:10:02 +02:00
if ( heroOwner & & stackNode - > hasBonusOfType ( Bonus : : SIEGE_WEAPON ) )
dmgMultiply + = heroOwner - > Attack ( ) ;
2010-05-02 21:20:26 +03:00
2010-12-06 01:10:02 +02:00
printLine ( 3 , CGI - > generaltexth - > allTexts [ 199 ] , stackNode - > getMinDamage ( ) * dmgMultiply , stackNode - > getMaxDamage ( ) * dmgMultiply , true ) ;
printLine ( 4 , CGI - > generaltexth - > allTexts [ 388 ] , cre - > valOfBonuses ( Bonus : : STACK_HEALTH ) , stackNode - > valOfBonuses ( Bonus : : STACK_HEALTH ) ) ;
printLine ( 6 , CGI - > generaltexth - > zelp [ 441 ] . first , cre - > valOfBonuses ( Bonus : : STACKS_SPEED ) , stackNode - > valOfBonuses ( Bonus : : STACKS_SPEED ) ) ;
2010-05-02 21:20:26 +03:00
2010-07-13 08:25:40 +03:00
//setting morale
2011-01-06 22:00:19 +02:00
morale = new MoraleLuckBox ( true , genRect ( 42 , 42 , 24 , 189 ) ) ;
2010-12-06 01:10:02 +02:00
morale - > set ( stackNode ) ;
2010-07-13 08:25:40 +03:00
//setting luck
2011-01-06 22:00:19 +02:00
luck = new MoraleLuckBox ( false , genRect ( 42 , 42 , 77 , 189 ) ) ;
2010-12-06 01:10:02 +02:00
luck - > set ( stackNode ) ;
2010-07-13 08:25:40 +03:00
2010-05-02 21:20:26 +03:00
//luck and morale
int luck = 3 , morale = 3 ;
2010-12-06 01:10:02 +02:00
if ( stackNode )
2010-05-02 21:20:26 +03:00
{
//add modifiers
2010-12-06 01:10:02 +02:00
luck + = stackNode - > LuckVal ( ) ;
morale + = stackNode - > MoraleVal ( ) ;
2009-05-19 21:23:04 +03:00
}
2010-05-02 21:20:26 +03:00
blitAt ( graphics - > morale42 - > ourImages [ morale ] . bitmap , 24 , 189 , * bitmap ) ;
blitAt ( graphics - > luck42 - > ourImages [ luck ] . bitmap , 77 , 189 , * bitmap ) ;
2010-12-06 01:10:02 +02:00
if ( ! type )
{
printAtWB ( c - > abilityText , 17 , 231 , FONT_SMALL , 35 , zwykly , * bitmap ) ;
}
//if we are displying window fo r stack in battle, there are several more things that we need to display
if ( const CStack * battleStack = dynamic_cast < const CStack * > ( stackNode ) )
{
//spell effects
int printed = 0 ; //how many effect pics have been printed
std : : vector < si32 > spells = battleStack - > activeSpells ( ) ;
BOOST_FOREACH ( si32 effect , spells )
{
blitAt ( graphics - > spellEffectsPics - > ourImages [ effect + 1 ] . bitmap , 127 + 52 * printed , 186 , * bitmap ) ;
+ + printed ;
if ( printed > = 3 ) //we can fit only 3 effects
break ;
}
//print current health
printLine ( 5 , CGI - > generaltexth - > allTexts [ 200 ] , battleStack - > firstHPleft ) ;
}
2009-05-19 21:23:04 +03:00
}
2010-05-02 21:20:26 +03:00
2010-12-06 01:10:02 +02:00
2009-05-19 21:23:04 +03:00
CCreInfoWindow : : ~ CCreInfoWindow ( )
{
2010-07-15 06:04:57 +03:00
for ( int i = 0 ; i < upgResCost . size ( ) ; i + + )
delete upgResCost [ i ] ;
2009-05-19 21:23:04 +03:00
}
void CCreInfoWindow : : activate ( )
{
2010-05-02 21:20:26 +03:00
CIntObject : : activate ( ) ;
2009-05-19 21:23:04 +03:00
if ( ! type )
2009-08-11 19:05:33 +03:00
activateRClick ( ) ;
2009-05-19 21:23:04 +03:00
}
void CCreInfoWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
2009-08-11 19:05:33 +03:00
void CCreInfoWindow : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
if ( down )
return ;
close ( ) ;
}
void CCreInfoWindow : : dismissF ( )
{
dsm ( ) ;
close ( ) ;
}
void CCreInfoWindow : : keyPressed ( const SDL_KeyboardEvent & key )
{
}
void CCreInfoWindow : : deactivate ( )
{
if ( ! type )
2009-08-11 19:05:33 +03:00
deactivateRClick ( ) ;
2010-05-02 21:20:26 +03:00
CIntObject : : deactivate ( ) ;
2009-05-19 21:23:04 +03:00
}
void CLevelWindow : : close ( )
{
for ( int i = 0 ; i < comps . size ( ) ; i + + )
{
if ( comps [ i ] - > selected )
{
cb ( i ) ;
break ;
}
}
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
LOCPLINT - > showingDialog - > setn ( false ) ;
}
CLevelWindow : : CLevelWindow ( const CGHeroInstance * hero , int pskill , std : : vector < ui16 > & skills , boost : : function < void ( ui32 ) > & callback )
{
LOCPLINT - > showingDialog - > setn ( true ) ;
2009-11-29 04:46:30 +02:00
heroPortrait = hero - > portrait ;
2009-05-19 21:23:04 +03:00
cb = callback ;
for ( int i = 0 ; i < skills . size ( ) ; i + + )
{
2010-12-23 22:18:10 +02:00
comps . push_back ( new CSelectableComponent ( SComponent : : secskill44 , skills [ i ] ,
hero - > getSecSkillLevel ( static_cast < CGHeroInstance : : SecondarySkill > ( skills [ i ] ) ) + 1 ,
boost : : bind ( & CLevelWindow : : selectionChanged , this , i ) ) ) ;
2009-05-19 21:23:04 +03:00
comps . back ( ) - > assignedKeys . insert ( SDLK_1 + i ) ;
}
2010-02-02 18:24:53 +02:00
SDL_Surface * hhlp = BitmapHandler : : loadBitmap ( " LVLUPBKG.bmp " ) ;
graphics - > blueToPlayersAdv ( hhlp , LOCPLINT - > playerID ) ;
bitmap = SDL_ConvertSurface ( hhlp , screen - > format , 0 ) ;
2009-05-19 21:23:04 +03:00
SDL_SetColorKey ( bitmap , SDL_SRCCOLORKEY , SDL_MapRGB ( bitmap - > format , 0 , 255 , 255 ) ) ;
2010-02-02 18:24:53 +02:00
SDL_FreeSurface ( hhlp ) ;
2009-05-19 21:23:04 +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 ;
ok = new AdventureMapButton ( " " , " " , boost : : bind ( & CLevelWindow : : close , this ) , pos . x + 297 , pos . y + 413 , " IOKAY.DEF " , SDLK_RETURN ) ;
//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 ( ) ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( buf , 192 , 33 , FONT_MEDIUM , zwykly , bitmap ) ;
2009-05-19 21:23:04 +03:00
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 ( ) ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( buf , 192 , 162 , FONT_MEDIUM , zwykly , bitmap ) ;
2009-05-19 21:23:04 +03:00
blitAt ( graphics - > pskillsm - > ourImages [ pskill ] . bitmap , 174 , 190 , bitmap ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( ( CGI - > generaltexth - > primarySkillNames [ pskill ] + " +1 " ) , 192 , 253 , FONT_MEDIUM , zwykly , bitmap ) ;
const Font * f = graphics - > fonts [ FONT_MEDIUM ] ;
std : : string text = CGI - > generaltexth - > allTexts [ 4 ] ;
int fontWidth = f - > getWidth ( text . c_str ( ) ) / 2 ;
int curx = bitmap - > w / 2 - ( skills . size ( ) * 44 + ( skills . size ( ) - 1 ) * ( 36 + fontWidth ) ) / 2 ;
2009-05-19 21:23:04 +03:00
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 ) )
{
2010-02-02 18:24:53 +02:00
curx + = 44 + 21 ; //skill width + margin to "or"
printAtMiddle ( text , curx , 346 , FONT_MEDIUM , zwykly , bitmap ) ;
curx + = fontWidth + 15 ;
2009-05-19 21:23:04 +03:00
}
}
2010-07-29 01:39:56 +03:00
if ( comps . size ( ) )
2009-05-19 21:23:04 +03:00
{
comps [ 0 ] - > select ( true ) ;
}
}
void CLevelWindow : : selectionChanged ( unsigned to )
{
2011-02-20 11:24:53 +02:00
if ( ok - > isBlocked ( ) )
2009-05-19 21:23:04 +03:00
ok - > block ( false ) ;
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 )
{
blitAt ( bitmap , pos . x , pos . y , to ) ;
2009-11-29 04:46:30 +02:00
blitAt ( graphics - > portraitLarge [ heroPortrait ] , 170 + pos . x , 66 + pos . y , to ) ;
2011-02-20 11:24:53 +02:00
ok - > showAll ( to ) ;
2009-05-19 21:23:04 +03:00
for ( int i = 0 ; i < comps . size ( ) ; i + + )
comps [ i ] - > show ( to ) ;
}
void CMinorResDataBar : : show ( SDL_Surface * to )
{
blitAt ( bg , pos . x , pos . y , to ) ;
char buf [ 30 ] ;
for ( int i = 0 ; i < 7 ; i + + )
{
SDL_itoa ( LOCPLINT - > cb - > getResourceAmount ( i ) , buf , 10 ) ;
2010-02-02 18:24:53 +02:00
CSDL_Ext : : printAtMiddle ( buf , pos . x + 50 + 76 * i , pos . y + pos . h / 2 , FONT_SMALL , zwykly , to ) ;
2009-05-19 21:23:04 +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 )
2010-02-02 18:24:53 +02:00
, pos . x + 545 + ( pos . w - 545 ) / 2 , pos . y + pos . h / 2 , FONT_SMALL , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
}
2010-11-15 17:15:00 +02:00
void CMinorResDataBar : : showAll ( SDL_Surface * to )
{
show ( to ) ;
}
2009-05-19 21:23:04 +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 ) ;
}
2010-06-26 13:01:26 +03:00
CObjectListWindow : : CObjectListWindow ( const std : : vector < int > & _items , CPicture * titlePic , std : : string _title , std : : string _descr ,
2010-08-27 19:20:35 +03:00
boost : : function < void ( int ) > Callback , int initState )
: title ( _title ) , descr ( _descr ) , items ( _items ) , selected ( initState )
2010-06-26 13:01:26 +03:00
{
init = false ;
OBJ_CONSTRUCTION_CAPTURING_ALL ;
defActions = ACTIVATE | DEACTIVATE | UPDATE | SHOWALL | DISPOSE | SHARE_POS ;
used = LCLICK | KEYBOARD ;
onSelect = Callback ;
length = 9 ;
pos . x = ( screen - > w - 306 ) / 2 ;
pos . y = ( screen - > h - 468 ) / 2 ;
bg = new CPicture ( " TPGATE.pcx " ) ; //x=0, y=0
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
slider = new CSlider ( 277 , 120 , 256 , boost : : bind ( & CObjectListWindow : : moveList , this , _1 ) , length , items . size ( ) , 0 , false , 0 ) ;
ok = new AdventureMapButton ( " " , " " , boost : : bind ( & CObjectListWindow : : elementSelected , this ) , 15 , 402 , " IOKAY.DEF " , SDLK_RETURN ) ;
exit = new AdventureMapButton ( " " , " " , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 228 , 402 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
pos . w = bg - > pos . w ;
pos . h = bg - > pos . h ;
titleImage = titlePic ;
titleImage - > pos . x = 153 + pos . x - titleImage - > pos . w / 2 ;
titleImage - > pos . y = 75 + pos . y - titleImage - > pos . h / 2 ;
for ( int i = 0 ; i < length ; i + + )
areas . push_back ( genRect ( 22 , 260 , pos . x + 15 , pos . y + 152 + i * 25 ) ) ; //rects for selecting\printing items
init = true ;
}
CObjectListWindow : : ~ CObjectListWindow ( )
{
delete titleImage ;
}
void CObjectListWindow : : elementSelected ( )
{
2010-06-30 22:27:35 +03:00
boost : : function < void ( int ) > toCall = onSelect ; //save
2011-01-15 19:30:46 +02:00
int where = items [ selected ] ; //required variables
2010-06-30 22:27:35 +03:00
GH . popIntTotally ( this ) ; //then destroy window
toCall ( where ) ; //and send selected object
2010-06-26 13:01:26 +03:00
}
void CObjectListWindow : : moveList ( int which )
{
if ( init ) //TODO: is there a way to disable running this when CSlider is created?
showAll ( screen2 ) ;
}
void CObjectListWindow : : clickLeft ( tribool down , bool previousState )
{
if ( previousState & & ( ! down ) )
{
for ( int i = 0 ; i < areas . size ( ) ; i + + )
if ( slider - > value + i < items . size ( ) & & isItIn ( & areas [ i ] , GH . current - > motion . x , GH . current - > motion . y ) )
{ //check all areas to find element which was clicked
selected = i + slider - > value ;
showAll ( screen2 ) ;
return ;
}
}
}
void CObjectListWindow : : keyPressed ( const SDL_KeyboardEvent & key )
{
if ( key . state ! = SDL_PRESSED ) return ;
int sel = selected ;
switch ( key . keysym . sym )
{
case SDLK_UP :
sel - = 1 ;
break ;
case SDLK_DOWN :
sel + = 1 ;
break ;
case SDLK_PAGEUP :
sel - = length ;
break ;
case SDLK_PAGEDOWN :
sel + = length ;
break ;
case SDLK_HOME :
sel = 0 ;
break ;
case SDLK_END :
sel = slider - > amount ;
break ;
default :
return ;
}
2010-06-30 22:27:35 +03:00
if ( sel < - 1 ) //nothing was selected & list was moved up
return ;
2010-06-26 13:01:26 +03:00
if ( sel < 0 ) //start of list reached
sel = 0 ;
2010-06-30 22:27:35 +03:00
if ( sel > = slider - > amount ) //end of list reached
2010-06-26 13:01:26 +03:00
sel = slider - > amount - 1 ;
if ( sel > = items . size ( ) )
sel = items . size ( ) - 1 ;
if ( sel < slider - > value ) //need to move list up
slider - > moveTo ( sel ) ;
else
if ( sel > = slider - > value + length ) //move to bottom
slider - > moveTo ( sel - length + 1 ) ;
selected = sel ;
showAll ( screen2 ) ;
}
void CObjectListWindow : : show ( SDL_Surface * to )
{
}
void CObjectListWindow : : showAll ( SDL_Surface * to )
{
ok - > block ( ( selected < 0 ) ? 2 : 0 ) ;
CIntObject : : showAll ( to ) ;
CSDL_Ext : : printAtMiddle ( title , pos . x + 152 , pos . y + 27 , FONT_BIG , tytulowy , to ) ; //"castle gate"
CSDL_Ext : : printAtMiddle ( descr , pos . x + 145 , pos . y + 133 , FONT_SMALL , zwykly , to ) ; //"select destination"
titleImage - > showAll ( to ) ;
if ( selected > = slider - > value & & selected < slider - > value + length ) //if selected item is visible
{
SDL_Rect a = areas [ selected - slider - > value ] ;
CSDL_Ext : : drawBorder ( to , a . x , a . y , a . w , a . h , int3 ( 255 , 231 , 148 ) ) ;
CSDL_Ext : : drawBorder ( to , a . x - 1 , a . y - 1 , a . w + 2 , a . h + 2 , int3 ( 255 , 231 , 148 ) ) ; //border shoul be 2 pixels width
}
int position = slider - > value ;
for ( int i = 0 ; i < 9 & & i < items . size ( ) - position ; i + + )
CSDL_Ext : : printAtMiddle ( CGI - > mh - > map - > objects [ items [ i + position ] ] - > hoverName , pos . x + 145 , pos . y + 163 + 25 * i ,
FONT_SMALL , zwykly , to ) ; //print item names in list
}
2010-07-20 09:05:45 +03:00
CTradeWindow : : CTradeableItem : : CTradeableItem ( EType Type , int ID , bool Left , int Serial )
2009-05-19 21:23:04 +03:00
{
2010-05-26 12:47:53 +03:00
serial = Serial ;
2009-05-19 21:23:04 +03:00
left = Left ;
type = Type ;
id = ID ;
2010-07-20 09:05:45 +03:00
used = LCLICK | HOVER | RCLICK ;
downSelection = false ;
2011-02-14 12:38:33 +02:00
hlp = NULL ;
2009-05-19 21:23:04 +03:00
}
2010-07-20 09:05:45 +03:00
void CTradeWindow : : CTradeableItem : : showAll ( SDL_Surface * to )
2009-05-19 21:23:04 +03:00
{
2010-07-20 09:05:45 +03:00
Point posToBitmap ;
Point posToSubCenter ;
2010-05-08 01:10:32 +03:00
switch ( type )
{
case RESOURCE :
2010-07-20 09:05:45 +03:00
posToBitmap = Point ( 19 , 9 ) ;
2010-07-31 04:38:12 +03:00
posToSubCenter = Point ( 36 , 59 ) ;
2010-07-20 09:05:45 +03:00
break ;
case CREATURE_PLACEHOLDER :
case CREATURE :
posToSubCenter = Point ( 29 , 76 ) ;
if ( downSelection )
posToSubCenter . y + = 5 ;
break ;
case PLAYER :
posToSubCenter = Point ( 31 , 76 ) ;
break ;
2010-07-23 15:02:15 +03:00
case ARTIFACT_PLACEHOLDER :
2011-04-23 00:51:10 +03:00
case ARTIFACT_INSTANCE :
2010-07-31 04:38:12 +03:00
posToSubCenter = Point ( 19 , 55 ) ;
if ( downSelection )
posToSubCenter . y + = 8 ;
break ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2010-07-31 04:38:12 +03:00
posToSubCenter = Point ( 19 , 58 ) ;
2010-05-08 01:10:32 +03:00
break ;
}
2010-07-20 09:05:45 +03:00
if ( SDL_Surface * hlp = getSurface ( ) )
blitAt ( hlp , pos + posToBitmap , to ) ;
printAtMiddleLoc ( subtitle , posToSubCenter , FONT_SMALL , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-20 09:05:45 +03:00
void CTradeWindow : : CTradeableItem : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
2011-01-28 04:11:58 +02:00
CTradeWindow * mw = dynamic_cast < CTradeWindow * > ( parent ) ;
2009-05-19 21:23:04 +03:00
assert ( mw ) ;
if ( down )
{
2010-07-23 15:02:15 +03:00
if ( type = = ARTIFACT_PLACEHOLDER )
{
CAltarWindow * aw = static_cast < CAltarWindow * > ( mw ) ;
2011-01-28 04:11:58 +02:00
if ( const CArtifactInstance * movedArt = aw - > arts - > commonInfo - > src . art )
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
aw - > moveFromSlotToAltar ( aw - > arts - > commonInfo - > src . slotID , this , movedArt ) ;
2010-07-23 15:02:15 +03:00
}
2010-12-29 23:04:22 +02:00
else if ( const CArtifactInstance * art = getArtInstance ( ) )
2010-07-23 15:02:15 +03:00
{
2011-01-06 22:00:19 +02:00
aw - > arts - > commonInfo - > src . AOH = aw - > arts ;
2011-01-28 04:11:58 +02:00
aw - > arts - > commonInfo - > src . art = art ;
2011-01-15 04:17:56 +02:00
aw - > arts - > commonInfo - > src . slotID = aw - > hero - > getArtPos ( art ) ;
2011-01-28 04:11:58 +02:00
aw - > arts - > markPossibleSlots ( art ) ;
2010-07-23 15:02:15 +03:00
2011-01-15 04:17:56 +02:00
//aw->arts->commonInfo->dst.AOH = aw->arts;
2011-01-28 04:11:58 +02:00
CCS - > curh - > dragAndDropCursor ( graphics - > artDefs - > ourImages [ art - > artType - > id ] . bitmap ) ;
2010-07-23 15:02:15 +03:00
2011-01-28 04:11:58 +02:00
aw - > arts - > artifactsOnAltar . erase ( art ) ;
2010-07-23 15:02:15 +03:00
id = - 1 ;
subtitle = " " ;
aw - > deal - > block ( ! aw - > arts - > artifactsOnAltar . size ( ) ) ;
}
aw - > calcTotalExp ( ) ;
return ;
}
2009-05-19 21:23:04 +03:00
if ( left )
{
if ( mw - > hLeft ! = this )
mw - > hLeft = this ;
else
return ;
}
else
{
2009-09-09 09:04:42 +03:00
if ( mw - > hRight ! = this )
2009-05-19 21:23:04 +03:00
mw - > hRight = this ;
else
return ;
}
mw - > selectionChanged ( left ) ;
}
}
2010-07-20 09:05:45 +03:00
SDL_Surface * CTradeWindow : : CTradeableItem : : getSurface ( )
2009-05-19 21:23:04 +03:00
{
switch ( type )
{
2010-05-08 01:10:32 +03:00
case RESOURCE :
2009-05-19 21:23:04 +03:00
return graphics - > resources32 - > ourImages [ id ] . bitmap ;
2010-05-08 01:10:32 +03:00
case PLAYER :
return graphics - > flags - > ourImages [ id ] . bitmap ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2010-07-23 15:02:15 +03:00
case ARTIFACT_PLACEHOLDER :
2011-04-23 00:51:10 +03:00
case ARTIFACT_INSTANCE :
2010-07-23 15:02:15 +03:00
return id > = 0 ? graphics - > artDefs - > ourImages [ id ] . bitmap : NULL ;
2010-05-26 12:47:53 +03:00
case CREATURE :
return graphics - > bigImgs [ id ] ;
2009-05-19 21:23:04 +03:00
default :
return NULL ;
}
}
2010-07-20 09:05:45 +03:00
void CTradeWindow : : CTradeableItem : : showAllAt ( const Point & dstPos , const std : : string & customSub , SDL_Surface * to )
{
Rect oldPos = pos ;
std : : string oldSub = subtitle ;
downSelection = true ;
pos = dstPos ;
subtitle = customSub ;
showAll ( to ) ;
downSelection = false ;
pos = oldPos ;
subtitle = oldSub ;
}
void CTradeWindow : : CTradeableItem : : hover ( bool on )
{
if ( ! on )
{
GH . statusbar - > clear ( ) ;
return ;
}
switch ( type )
{
case CREATURE :
case CREATURE_PLACEHOLDER :
GH . statusbar - > print ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 481 ] ) % CGI - > creh - > creatures [ id ] - > namePl ) ) ;
break ;
case ARTIFACT_PLACEHOLDER :
if ( id < 0 )
GH . statusbar - > print ( CGI - > generaltexth - > zelp [ 582 ] . first ) ;
else
GH . statusbar - > print ( CGI - > arth - > artifacts [ id ] - > Name ( ) ) ;
break ;
}
}
void CTradeWindow : : CTradeableItem : : clickRight ( tribool down , bool previousState )
{
2010-07-23 15:02:15 +03:00
if ( down )
2010-07-20 09:05:45 +03:00
{
2010-07-23 15:02:15 +03:00
switch ( type )
{
case CREATURE :
case CREATURE_PLACEHOLDER :
//GH.statusbar->print(boost::str(boost::format(CGI->generaltexth->allTexts[481]) % CGI->creh->creatures[id]->namePl));
break ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2010-07-23 15:02:15 +03:00
case ARTIFACT_PLACEHOLDER :
if ( id > = 0 )
adventureInt - > handleRightClick ( CGI - > arth - > artifacts [ id ] - > Description ( ) , down ) ;
break ;
}
2010-07-20 09:05:45 +03:00
}
}
2010-07-31 04:38:12 +03:00
std : : string CTradeWindow : : CTradeableItem : : getName ( int number /*= -1*/ ) const
{
switch ( type )
{
case PLAYER :
return CGI - > generaltexth - > capColors [ id ] ;
case RESOURCE :
return CGI - > generaltexth - > restypes [ id ] ;
case CREATURE :
if ( number = = 1 )
return CGI - > creh - > creatures [ id ] - > nameSing ;
else
return CGI - > creh - > creatures [ id ] - > namePl ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2011-04-23 00:51:10 +03:00
case ARTIFACT_INSTANCE :
2010-07-31 04:38:12 +03:00
return CGI - > arth - > artifacts [ id ] - > Name ( ) ;
}
2010-08-02 14:06:49 +03:00
assert ( 0 ) ;
return " " ;
2010-07-31 04:38:12 +03:00
}
2010-12-29 23:04:22 +02:00
const CArtifactInstance * CTradeWindow : : CTradeableItem : : getArtInstance ( ) const
{
switch ( type )
{
case ARTIFACT_PLACEHOLDER :
case ARTIFACT_INSTANCE :
return ( const CArtifactInstance * ) hlp ;
default :
return NULL ;
}
}
2011-04-23 00:51:10 +03:00
void CTradeWindow : : CTradeableItem : : setArtInstance ( const CArtifactInstance * art )
{
assert ( type = = ARTIFACT_PLACEHOLDER | | type = = ARTIFACT_INSTANCE ) ;
hlp = art ;
if ( art )
id = art - > artType - > id ;
else
id = - 1 ;
}
2010-12-29 23:04:22 +02:00
2010-07-20 09:05:45 +03:00
CTradeWindow : : CTradeWindow ( const IMarket * Market , const CGHeroInstance * Hero , EMarketMode Mode )
2010-08-27 19:20:35 +03:00
: market ( Market ) , hero ( Hero ) , arts ( NULL ) , hLeft ( NULL ) , hRight ( NULL ) , readyToTrade ( false )
2010-07-20 09:05:45 +03:00
{
2011-01-28 04:11:58 +02:00
type | = BLOCK_ADV_HOTKEYS ;
2010-07-20 09:05:45 +03:00
mode = Mode ;
initTypes ( ) ;
}
void CTradeWindow : : initTypes ( )
{
switch ( mode )
{
case RESOURCE_RESOURCE :
itemsType [ 1 ] = RESOURCE ;
itemsType [ 0 ] = RESOURCE ;
break ;
case RESOURCE_PLAYER :
itemsType [ 1 ] = RESOURCE ;
itemsType [ 0 ] = PLAYER ;
break ;
case CREATURE_RESOURCE :
itemsType [ 1 ] = CREATURE ;
itemsType [ 0 ] = RESOURCE ;
break ;
case RESOURCE_ARTIFACT :
itemsType [ 1 ] = RESOURCE ;
2010-12-29 23:04:22 +02:00
itemsType [ 0 ] = ARTIFACT_TYPE ;
2010-07-20 09:05:45 +03:00
break ;
2011-04-23 00:51:10 +03:00
case ARTIFACT_RESOURCE :
itemsType [ 1 ] = ARTIFACT_INSTANCE ;
itemsType [ 0 ] = RESOURCE ;
break ;
2010-07-20 09:05:45 +03:00
case CREATURE_EXP :
itemsType [ 1 ] = CREATURE ;
itemsType [ 0 ] = CREATURE_PLACEHOLDER ;
break ;
case ARTIFACT_EXP :
2010-12-29 23:04:22 +02:00
itemsType [ 1 ] = ARTIFACT_TYPE ;
2010-07-20 09:05:45 +03:00
itemsType [ 0 ] = ARTIFACT_PLACEHOLDER ;
break ;
}
}
void CTradeWindow : : initItems ( bool Left )
2009-05-19 21:23:04 +03:00
{
2011-04-23 00:51:10 +03:00
if ( Left & & ( itemsType [ 1 ] = = ARTIFACT_TYPE | | itemsType [ 1 ] = = ARTIFACT_INSTANCE ) )
{
int xOffset = 0 , yOffset = 0 ;
if ( mode = = ARTIFACT_RESOURCE )
{
xOffset = - 361 ;
yOffset = + 46 ;
CTradeableItem * hlp = new CTradeableItem ( itemsType [ Left ] , - 1 , 1 , 0 ) ;
hlp - > recActions & = ~ ( UPDATE | SHOWALL ) ;
hlp - > pos + = Rect ( 137 , 469 , 42 , 42 ) ;
items [ Left ] . push_back ( hlp ) ;
}
else //ARTIFACT_EXP
{
xOffset = - 363 ;
yOffset = - 12 ;
}
BLOCK_CAPTURING ;
arts = new CArtifactsOfHero ( Point ( pos . x + xOffset , pos . y + yOffset ) ) ;
arts - > commonInfo = new CArtifactsOfHero : : SCommonPart ;
arts - > commonInfo - > participants . insert ( arts ) ;
arts - > recActions = 255 ;
arts - > setHero ( hero ) ;
arts - > allowedAssembling = false ;
addChild ( arts ) ;
artSets . push_back ( arts ) ;
if ( mode = = ARTIFACT_RESOURCE )
arts - > highlightModeCallback = boost : : bind ( & CTradeWindow : : artifactSelected , this , _1 ) ;
return ;
}
2010-07-20 09:05:45 +03:00
std : : vector < int > * ids = getItemsIds ( Left ) ;
std : : vector < Rect > pos ;
int amount = - 1 ;
getPositionsFor ( pos , Left , itemsType [ Left ] ) ;
if ( Left | | ! ids )
amount = 7 ;
else
amount = ids - > size ( ) ;
2010-05-08 01:10:32 +03:00
if ( ids )
amin ( amount , ids - > size ( ) ) ;
2010-07-20 09:05:45 +03:00
for ( int j = 0 ; j < amount ; j + + )
2009-05-19 21:23:04 +03:00
{
2010-05-26 12:47:53 +03:00
int id = ( ids & & ids - > size ( ) > j ) ? ( * ids ) [ j ] : j ;
2010-07-23 15:02:15 +03:00
if ( id < 0 & & mode ! = ARTIFACT_EXP ) //when sacrificing artifacts we need to prepare empty slots
2010-05-26 12:47:53 +03:00
continue ;
2010-07-20 09:05:45 +03:00
CTradeableItem * hlp = new CTradeableItem ( itemsType [ Left ] , id , Left , j ) ;
hlp - > pos = pos [ j ] + hlp - > pos ;
items [ Left ] . push_back ( hlp ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-20 09:05:45 +03:00
initSubs ( Left ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-20 09:05:45 +03:00
std : : vector < int > * CTradeWindow : : getItemsIds ( bool Left )
2009-05-19 21:23:04 +03:00
{
2010-07-20 09:05:45 +03:00
std : : vector < int > * ids = NULL ;
2010-06-27 19:03:01 +03:00
2010-07-23 15:02:15 +03:00
if ( mode = = ARTIFACT_EXP )
return new std : : vector < int > ( 22 , - 1 ) ;
2010-07-20 09:05:45 +03:00
if ( Left )
{
switch ( itemsType [ 1 ] )
{
case CREATURE :
ids = new std : : vector < int > ;
for ( int i = 0 ; i < 7 ; i + + )
{
if ( const CCreature * c = hero - > getCreature ( i ) )
ids - > push_back ( c - > idNumber ) ;
else
ids - > push_back ( - 1 ) ;
}
break ;
}
}
else
{
switch ( itemsType [ 0 ] )
{
case PLAYER :
ids = new std : : vector < int > ;
2010-10-31 00:53:41 +03:00
for ( int i = 0 ; i < PLAYER_LIMIT ; i + + )
2010-07-20 09:05:45 +03:00
if ( i ! = LOCPLINT - > playerID & & LOCPLINT - > cb - > getPlayerStatus ( i ) = = PlayerState : : INGAME )
ids - > push_back ( i ) ;
break ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2010-07-20 09:05:45 +03:00
ids = new std : : vector < int > ( market - > availableItemsIds ( mode ) ) ;
break ;
}
}
return ids ;
}
void CTradeWindow : : getPositionsFor ( std : : vector < Rect > & poss , bool Left , EType type ) const
{
if ( mode = = ARTIFACT_EXP & & ! Left )
{
//22 boxes, 5 in row, last row: two boxes centered
int h , w , x , y , dx , dy ;
h = w = 44 ;
x = 317 ;
y = 53 ;
dx = 54 ;
dy = 70 ;
for ( int i = 0 ; i < 4 ; i + + )
for ( int j = 0 ; j < 5 ; j + + )
poss + = Rect ( x + dx * j , y + dy * i , w , h ) ;
2010-07-23 15:02:15 +03:00
poss + = Rect ( x + dx * 1.5 , y + dy * 4 , w , h ) ;
poss + = Rect ( x + dx * 2.5 , y + dy * 4 , w , h ) ;
2010-07-20 09:05:45 +03:00
}
else
{
//seven boxes:
// X X X
// X X X
// X
int h , w , x , y , dx , dy ;
int leftToRightOffset ;
getBaseForPositions ( type , dx , dy , x , y , h , w , ! Left , leftToRightOffset ) ;
poss + = genRect ( h , w , x , y ) , genRect ( h , w , x + dx , y ) , genRect ( h , w , x + 2 * dx , y ) ,
genRect ( h , w , x , y + dy ) , genRect ( h , w , x + dx , y + dy ) , genRect ( h , w , x + 2 * dx , y + dy ) ,
genRect ( h , w , x + dx , y + 2 * dy ) ;
if ( ! Left )
2010-11-15 17:15:00 +02:00
{
2010-07-20 09:05:45 +03:00
BOOST_FOREACH ( Rect & r , poss )
r . x + = leftToRightOffset ;
2010-11-15 17:15:00 +02:00
}
2010-07-20 09:05:45 +03:00
}
}
void CTradeWindow : : initSubs ( bool Left )
{
BOOST_FOREACH ( CTradeableItem * t , items [ Left ] )
{
if ( Left )
{
switch ( itemsType [ 1 ] )
{
case CREATURE :
2010-11-27 03:46:19 +02:00
t - > subtitle = boost : : lexical_cast < std : : string > ( hero - > getStackCount ( t - > serial ) ) ;
2010-07-20 09:05:45 +03:00
break ;
case RESOURCE :
t - > subtitle = boost : : lexical_cast < std : : string > ( LOCPLINT - > cb - > getResourceAmount ( t - > serial ) ) ;
break ;
}
}
else //right side
{
if ( itemsType [ 0 ] = = PLAYER )
{
t - > subtitle = CGI - > generaltexth - > capColors [ t - > id ] ;
}
else if ( hLeft ) //artifact, creature
{
int h1 , h2 ; //hlp variables for getting offer
market - > getOffer ( hLeft - > id , t - > id , h1 , h2 , mode ) ;
if ( t - > id ! = hLeft - > id | | mode ! = RESOURCE_RESOURCE ) //don't allow exchanging same resources
{
std : : ostringstream oss ;
oss < < h2 ;
if ( h1 ! = 1 )
oss < < " / " < < h1 ;
t - > subtitle = oss . str ( ) ;
}
else
t - > subtitle = CGI - > generaltexth - > allTexts [ 164 ] ; // n/a
}
else
t - > subtitle = " " ;
}
}
}
void CTradeWindow : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
if ( hRight )
CSDL_Ext : : drawBorder ( to , hRight - > pos . x - 1 , hRight - > pos . y - 1 , hRight - > pos . w + 2 , hRight - > pos . h + 2 , int3 ( 255 , 231 , 148 ) ) ;
2011-04-23 00:51:10 +03:00
if ( hLeft & & hLeft - > type ! = ARTIFACT_INSTANCE )
2010-07-20 09:05:45 +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 ) ) ;
if ( readyToTrade )
{
hLeft - > showAllAt ( pos . topLeft ( ) + selectionOffset ( true ) , selectionSubtitle ( true ) , to ) ;
hRight - > showAllAt ( pos . topLeft ( ) + selectionOffset ( false ) , selectionSubtitle ( false ) , to ) ;
}
}
void CTradeWindow : : removeItems ( const std : : set < CTradeableItem * > & toRemove )
{
BOOST_FOREACH ( CTradeableItem * t , toRemove )
removeItem ( t ) ;
}
void CTradeWindow : : removeItem ( CTradeableItem * t )
{
if ( active )
t - > deactivate ( ) ;
items [ t - > left ] - = t ;
delChild ( t ) ;
if ( hRight = = t )
{
hRight = NULL ;
selectionChanged ( false ) ;
}
}
void CTradeWindow : : getEmptySlots ( std : : set < CTradeableItem * > & toRemove )
{
BOOST_FOREACH ( CTradeableItem * t , items [ 1 ] )
2010-11-27 03:46:19 +02:00
if ( ! hero - > getStackCount ( t - > serial ) )
2010-07-20 09:05:45 +03:00
toRemove . insert ( t ) ;
}
void CTradeWindow : : setMode ( EMarketMode Mode )
{
2010-07-23 15:02:15 +03:00
const IMarket * m = market ;
const CGHeroInstance * h = hero ;
2010-07-20 09:05:45 +03:00
CTradeWindow * nwindow = NULL ;
2010-07-23 15:02:15 +03:00
GH . popIntTotally ( this ) ;
2010-07-20 09:05:45 +03:00
switch ( Mode )
{
case CREATURE_EXP :
case ARTIFACT_EXP :
2010-07-23 15:02:15 +03:00
nwindow = new CAltarWindow ( m , h , Mode ) ;
2010-07-20 09:05:45 +03:00
break ;
default :
2010-07-23 15:02:15 +03:00
nwindow = new CMarketplaceWindow ( m , h , Mode ) ;
2010-07-20 09:05:45 +03:00
break ;
}
GH . pushInt ( nwindow ) ;
}
2010-05-08 01:10:32 +03:00
2011-04-23 00:51:10 +03:00
void CTradeWindow : : artifactSelected ( CArtPlace * slot )
{
assert ( mode = = ARTIFACT_RESOURCE ) ;
items [ 1 ] [ 0 ] - > setArtInstance ( slot - > ourArt ) ;
if ( slot - > ourArt )
hLeft = items [ 1 ] [ 0 ] ;
else
hLeft = NULL ;
selectionChanged ( true ) ;
}
2010-07-20 09:05:45 +03:00
CMarketplaceWindow : : CMarketplaceWindow ( const IMarket * Market , const CGHeroInstance * Hero , EMarketMode Mode )
: CTradeWindow ( Market , Hero , Mode )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2010-07-31 04:38:12 +03:00
madeTransaction = false ;
2010-05-08 01:10:32 +03:00
std : : string bgName ;
2010-06-27 19:03:01 +03:00
bool sliderNeeded = true ;
2010-05-08 01:10:32 +03:00
switch ( Mode )
{
case RESOURCE_RESOURCE :
bgName = " TPMRKRES.bmp " ;
break ;
2010-05-26 12:47:53 +03:00
2010-05-08 01:10:32 +03:00
case RESOURCE_PLAYER :
bgName = " TPMRKPTS.bmp " ;
break ;
2010-05-26 12:47:53 +03:00
case CREATURE_RESOURCE :
bgName = " TPMRKCRS.bmp " ;
break ;
2010-06-27 19:03:01 +03:00
case RESOURCE_ARTIFACT :
bgName = " TPMRKABS.bmp " ;
sliderNeeded = false ;
2010-07-20 09:05:45 +03:00
break ;
2010-07-26 18:37:58 +03:00
case ARTIFACT_RESOURCE :
bgName = " TPMRKASS.bmp " ;
2011-04-23 00:51:10 +03:00
sliderNeeded = false ;
2010-07-26 18:37:58 +03:00
break ;
2010-05-08 01:10:32 +03:00
}
bg = new CPicture ( bgName ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
2010-07-20 09:05:45 +03:00
pos = bg - > center ( ) ;
2010-05-08 01:10:32 +03:00
2010-07-26 18:37:58 +03:00
new CGStatusBar ( 302 , 576 ) ;
2010-07-31 04:38:12 +03:00
if ( market - > o - > ID = = 7 ) //black market
{
printAtMiddle ( CGI - > generaltexth - > allTexts [ 349 ] , 300 , 27 , FONT_BIG , tytulowy , * bg ) ; //title
}
else if ( market - > o - > ID = = 99 | | market - > o - > ID = = 221 ) //trading post
2010-05-26 12:47:53 +03:00
{
printAtMiddle ( CGI - > generaltexth - > allTexts [ 159 ] , 300 , 27 , FONT_BIG , tytulowy , * bg ) ; //title
}
else if ( mode = = CREATURE_RESOURCE )
{
if ( market - > o - > ID = = TOWNI_TYPE )
printAtMiddle ( CGI - > buildh - > buildings [ 6 ] [ 21 ] - > Name ( ) , 300 , 27 , FONT_BIG , tytulowy , * bg ) ; //title
else
printAtMiddle ( market - > o - > getHoverText ( ) , 300 , 27 , FONT_BIG , tytulowy , * bg ) ; //title
}
2010-10-31 21:56:37 +02:00
else if ( mode = = RESOURCE_ARTIFACT | | mode = = ARTIFACT_RESOURCE )
{
const std : : string & title = market - > o - > ID = = TOWNI_TYPE
? CGI - > buildh - > buildings [ market - > o - > subID ] [ 17 ] - > Name ( )
: market - > o - > getHoverText ( ) ;
printAtMiddle ( title , 300 , 27 , FONT_BIG , tytulowy , * bg ) ; //title
}
2010-05-26 12:47:53 +03:00
else
{
2010-07-31 04:38:12 +03:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 158 ] , 300 , 27 , FONT_BIG , tytulowy , * bg ) ; //marketplace
2010-05-26 12:47:53 +03:00
}
2010-05-08 01:10:32 +03:00
2010-07-20 09:05:45 +03:00
initItems ( false ) ;
initItems ( true ) ;
2010-05-26 12:47:53 +03:00
2010-07-31 04:38:12 +03:00
ok = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 600 ] , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 516 , 520 , " IOK6432.DEF " , SDLK_RETURN ) ;
2009-07-27 20:55:56 +03:00
ok - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2010-07-31 04:38:12 +03:00
deal = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 595 ] , boost : : bind ( & CMarketplaceWindow : : makeDeal , this ) , 307 , 520 , " TPMRKB.DEF " ) ;
2010-06-27 19:03:01 +03:00
deal - > block ( true ) ;
//slider and buttons must be created after bg
if ( sliderNeeded )
{
slider = new CSlider ( 231 , 490 , 137 , 0 , 0 , 0 ) ;
slider - > moved = boost : : bind ( & CMarketplaceWindow : : sliderMoved , this , _1 ) ;
2010-07-31 04:38:12 +03:00
max = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 596 ] , boost : : bind ( & CMarketplaceWindow : : setMax , this ) , 229 , 520 , " IRCBTNS.DEF " ) ;
2010-06-27 19:03:01 +03:00
max - > block ( true ) ;
}
else
{
slider = NULL ;
max = NULL ;
2011-04-23 00:51:10 +03:00
deal - > moveBy ( Point ( - 30 , 0 ) ) ;
2010-06-27 19:03:01 +03:00
}
2010-05-08 01:10:32 +03:00
2010-07-31 04:38:12 +03:00
Rect traderTextRect ;
2010-05-26 12:47:53 +03:00
//left side
2010-05-08 01:10:32 +03:00
switch ( Mode )
{
case RESOURCE_RESOURCE :
2010-05-26 12:47:53 +03:00
case RESOURCE_PLAYER :
2010-06-27 19:03:01 +03:00
case RESOURCE_ARTIFACT :
2010-05-26 12:47:53 +03:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 270 ] , 154 , 148 , FONT_SMALL , zwykly , * bg ) ; //kingdom res.
break ;
case CREATURE_RESOURCE :
printAtMiddle ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 272 ] ) % hero - > name ) , 152 , 102 , FONT_SMALL , zwykly , * bg ) ; //%s's Creatures
break ;
2011-04-23 00:51:10 +03:00
case ARTIFACT_RESOURCE :
printAtMiddle ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 271 ] ) % hero - > name ) , 152 , 57 , FONT_SMALL , zwykly , * bg ) ; //%s's Artifacts
break ;
2010-05-26 12:47:53 +03:00
}
//right side
switch ( Mode )
{
case RESOURCE_RESOURCE :
case CREATURE_RESOURCE :
2010-06-27 19:03:01 +03:00
case RESOURCE_ARTIFACT :
2011-04-23 00:51:10 +03:00
case ARTIFACT_RESOURCE :
2010-05-26 12:47:53 +03:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 168 ] , 445 , 148 , FONT_SMALL , zwykly , * bg ) ; //available for trade
2010-07-31 04:38:12 +03:00
traderTextRect = Rect ( 316 , 48 , 260 , 75 ) ;
2010-05-08 01:10:32 +03:00
break ;
case RESOURCE_PLAYER :
2010-05-26 12:47:53 +03:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 169 ] , 445 , 55 , FONT_SMALL , zwykly , * bg ) ; //players
2010-07-31 04:38:12 +03:00
traderTextRect = Rect ( 28 , 48 , 260 , 75 ) ;
2010-05-08 01:10:32 +03:00
break ;
}
2009-05-19 21:23:04 +03:00
2010-07-31 04:38:12 +03:00
traderText = new CTextBox ( " " , traderTextRect , 0 , FONT_SMALL , CENTER ) ;
2011-04-23 00:51:10 +03:00
int specialOffset = mode = = ARTIFACT_RESOURCE ? 35 : 0 ; //in selling artifacts mode we need to move res-res and art-res buttons down
2010-07-31 04:38:12 +03:00
2010-05-26 12:47:53 +03:00
if ( printButtonFor ( RESOURCE_PLAYER ) )
2010-07-31 04:38:12 +03:00
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 612 ] , boost : : bind ( & CMarketplaceWindow : : setMode , this , RESOURCE_PLAYER ) , 18 , 520 , " TPMRKBU1.DEF " ) ;
2010-05-26 12:47:53 +03:00
if ( printButtonFor ( RESOURCE_RESOURCE ) )
2011-04-23 00:51:10 +03:00
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 605 ] , boost : : bind ( & CMarketplaceWindow : : setMode , this , RESOURCE_RESOURCE ) , 516 , 450 + specialOffset , " TPMRKBU5.DEF " ) ;
2010-05-26 12:47:53 +03:00
if ( printButtonFor ( CREATURE_RESOURCE ) )
2010-07-31 04:38:12 +03:00
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 599 ] , boost : : bind ( & CMarketplaceWindow : : setMode , this , CREATURE_RESOURCE ) , 516 , 485 , " TPMRKBU4.DEF " ) ; //was y=450, changed to not overlap res-res in some conditions
2010-07-06 05:10:26 +03:00
if ( printButtonFor ( RESOURCE_ARTIFACT ) )
2011-04-23 00:51:10 +03:00
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 598 ] , boost : : bind ( & CMarketplaceWindow : : setMode , this , RESOURCE_ARTIFACT ) , 18 , 450 + specialOffset , " TPMRKBU2.DEF " ) ;
if ( printButtonFor ( ARTIFACT_RESOURCE ) )
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 613 ] , boost : : bind ( & CMarketplaceWindow : : setMode , this , ARTIFACT_RESOURCE ) , 18 , 485 , " TPMRKBU3.DEF " ) ; //was y=450, changed to not overlap res-art in some conditions
2010-05-26 12:47:53 +03:00
2010-07-31 04:38:12 +03:00
updateTraderText ( ) ;
2009-05-19 21:23:04 +03:00
}
CMarketplaceWindow : : ~ CMarketplaceWindow ( )
{
2010-05-08 01:10:32 +03:00
hLeft = hRight = NULL ;
2010-07-20 09:05:45 +03:00
for ( int i = 0 ; i < items [ 1 ] . size ( ) ; i + + )
delChild ( items [ 1 ] [ i ] ) ;
for ( int i = 0 ; i < items [ 0 ] . size ( ) ; i + + )
delChild ( items [ 0 ] [ i ] ) ;
2010-05-08 01:10:32 +03:00
2010-07-20 09:05:45 +03:00
items [ 1 ] . clear ( ) ;
items [ 0 ] . clear ( ) ;
2010-05-08 01:10:32 +03:00
delChild ( bg ) ;
bg = NULL ;
2009-05-19 21:23:04 +03:00
}
2010-05-08 01:10:32 +03:00
2009-05-19 21:23:04 +03:00
void CMarketplaceWindow : : setMax ( )
{
2010-10-24 14:35:14 +03:00
slider - > moveToMax ( ) ;
2009-05-19 21:23:04 +03:00
}
void CMarketplaceWindow : : makeDeal ( )
{
2010-06-27 19:03:01 +03:00
int sliderValue = 0 ;
if ( slider )
sliderValue = slider - > value ;
else
2011-02-20 11:24:53 +02:00
sliderValue = ! deal - > isBlocked ( ) ; //should always be 1
2010-06-27 19:03:01 +03:00
if ( ! sliderValue )
2010-05-26 12:47:53 +03:00
return ;
int leftIdToSend = - 1 ;
if ( mode = = CREATURE_RESOURCE )
leftIdToSend = hLeft - > serial ;
2011-04-23 00:51:10 +03:00
else if ( mode = = ARTIFACT_RESOURCE )
leftIdToSend = hLeft - > getArtInstance ( ) - > id ;
2010-05-26 12:47:53 +03:00
else
leftIdToSend = hLeft - > id ;
2011-04-23 00:51:10 +03:00
if ( slider )
2010-06-27 19:03:01 +03:00
{
LOCPLINT - > cb - > trade ( market - > o , mode , leftIdToSend , hRight - > id , slider - > value * r1 , hero ) ;
slider - > moveTo ( 0 ) ;
}
else
{
LOCPLINT - > cb - > trade ( market - > o , mode , leftIdToSend , hRight - > id , r2 , hero ) ;
}
2010-07-31 04:38:12 +03:00
madeTransaction = true ;
2010-06-27 19:03:01 +03:00
2009-05-19 21:23:04 +03:00
hLeft = NULL ;
2010-05-26 12:47:53 +03:00
hRight = NULL ;
2009-05-19 21:23:04 +03:00
selectionChanged ( true ) ;
}
void CMarketplaceWindow : : sliderMoved ( int to )
{
2010-05-26 12:47:53 +03:00
redraw ( ) ;
2009-05-19 21:23:04 +03:00
}
void CMarketplaceWindow : : selectionChanged ( bool side )
{
2011-04-23 00:51:10 +03:00
readyToTrade = hLeft & & hRight ;
if ( mode = = RESOURCE_RESOURCE )
readyToTrade = readyToTrade & & ( hLeft - > id ! = hRight - > id ) ; //for resource trade, two DIFFERENT resources must be selected
2010-05-26 12:47:53 +03:00
2011-04-23 00:51:10 +03:00
if ( mode = = ARTIFACT_RESOURCE & & ! hLeft )
arts - > unmarkSlots ( false ) ;
2010-05-26 12:47:53 +03:00
if ( readyToTrade )
2009-05-19 21:23:04 +03:00
{
2011-04-23 00:51:10 +03:00
int soldItemId = hLeft - > id ;
market - > getOffer ( soldItemId , hRight - > id , r1 , r2 , mode ) ;
2010-05-26 12:47:53 +03:00
2010-06-27 19:03:01 +03:00
if ( slider )
{
2011-04-23 00:51:10 +03:00
int newAmount = - 1 ;
if ( itemsType [ 1 ] = = RESOURCE )
newAmount = LOCPLINT - > cb - > getResourceAmount ( soldItemId ) ;
else if ( itemsType [ 1 ] = = CREATURE )
newAmount = hero - > getStackCount ( hLeft - > serial ) - ( hero - > Slots ( ) . size ( ) = = 1 & & hero - > needsLastStack ( ) ) ;
else
assert ( 0 ) ;
2010-06-27 19:03:01 +03:00
slider - > setAmount ( newAmount / r1 ) ;
slider - > moveTo ( 0 ) ;
max - > block ( false ) ;
deal - > block ( false ) ;
}
2011-04-23 00:51:10 +03:00
else if ( itemsType [ 1 ] = = RESOURCE ) //buying -> check if we can afford transaction
2010-06-27 19:03:01 +03:00
{
2011-04-23 00:51:10 +03:00
deal - > block ( LOCPLINT - > cb - > getResourceAmount ( soldItemId ) < r1 ) ;
2010-06-27 19:03:01 +03:00
}
2011-04-23 00:51:10 +03:00
else
deal - > block ( false ) ;
2009-05-19 21:23:04 +03:00
}
else
{
2010-06-27 19:03:01 +03:00
if ( slider )
{
max - > block ( true ) ;
slider - > setAmount ( 0 ) ;
slider - > moveTo ( 0 ) ;
}
2009-05-19 21:23:04 +03:00
deal - > block ( true ) ;
}
2010-06-27 19:03:01 +03:00
2010-07-20 09:05:45 +03:00
if ( side & & itemsType [ 0 ] ! = PLAYER ) //items[1] selection changed, recalculate offers
initSubs ( false ) ;
2010-07-31 04:38:12 +03:00
updateTraderText ( ) ;
2010-07-20 09:05:45 +03:00
redraw ( ) ;
}
bool CMarketplaceWindow : : printButtonFor ( EMarketMode M ) const
{
2010-11-15 17:15:00 +02:00
return market - > allowsTrade ( M ) & & M ! = mode & & ( hero | | ( M ! = CREATURE_RESOURCE & & M ! = RESOURCE_ARTIFACT & & M ! = ARTIFACT_RESOURCE ) ) ;
2010-07-20 09:05:45 +03:00
}
void CMarketplaceWindow : : garrisonChanged ( )
{
if ( mode ! = CREATURE_RESOURCE )
return ;
std : : set < CTradeableItem * > toRemove ;
getEmptySlots ( toRemove ) ;
removeItems ( toRemove ) ;
initSubs ( true ) ;
}
void CMarketplaceWindow : : artifactsChanged ( bool Left )
{
assert ( ! Left ) ;
if ( mode ! = RESOURCE_ARTIFACT )
return ;
std : : vector < int > available = market - > availableItemsIds ( mode ) ;
std : : set < CTradeableItem * > toRemove ;
BOOST_FOREACH ( CTradeableItem * t , items [ 0 ] )
if ( ! vstd : : contains ( available , t - > id ) )
toRemove . insert ( t ) ;
removeItems ( toRemove ) ;
2010-07-31 04:38:12 +03:00
redraw ( ) ;
2010-07-20 09:05:45 +03:00
}
std : : string CMarketplaceWindow : : selectionSubtitle ( bool Left ) const
{
if ( Left )
2009-05-19 21:23:04 +03:00
{
2011-04-23 00:51:10 +03:00
switch ( itemsType [ 1 ] )
{
case RESOURCE :
case CREATURE :
{
int val = slider
? slider - > value * r1
: ( ( ( deal - > isBlocked ( ) ) ) ? 0 : r1 ) ;
2010-07-20 09:05:45 +03:00
2011-04-23 00:51:10 +03:00
return boost : : lexical_cast < std : : string > ( val ) ;
}
case ARTIFACT_INSTANCE :
return ( ( deal - > isBlocked ( ) ) ? " 0 " : " 1 " ) ;
}
2010-07-20 09:05:45 +03:00
}
else
{
switch ( itemsType [ 0 ] )
2009-05-19 21:23:04 +03:00
{
2010-07-20 09:05:45 +03:00
case RESOURCE :
2011-04-23 00:51:10 +03:00
if ( slider )
return boost : : lexical_cast < std : : string > ( slider - > value * r2 ) ;
else
return boost : : lexical_cast < std : : string > ( r2 ) ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2011-02-20 11:24:53 +02:00
return ( ( deal - > isBlocked ( ) ) ? " 0 " : " 1 " ) ;
2010-07-20 09:05:45 +03:00
case PLAYER :
return ( hRight ? CGI - > generaltexth - > capColors [ hRight - > id ] : " " ) ;
}
}
return " ??? " ;
}
2010-05-18 10:01:54 +03:00
2010-07-20 09:05:45 +03:00
Point CMarketplaceWindow : : selectionOffset ( bool Left ) const
{
if ( Left )
{
switch ( itemsType [ 1 ] )
{
case RESOURCE :
return Point ( 122 , 446 ) ;
case CREATURE :
return Point ( 128 , 450 ) ;
2011-04-23 00:51:10 +03:00
case ARTIFACT_INSTANCE :
return Point ( 134 , 466 ) ;
2009-05-19 21:23:04 +03:00
}
}
2010-07-20 09:05:45 +03:00
else
{
switch ( itemsType [ 0 ] )
{
case RESOURCE :
2011-04-23 00:51:10 +03:00
if ( mode = = ARTIFACT_RESOURCE )
return Point ( 410 , 469 ) ;
else
return Point ( 410 , 446 ) ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE :
2010-07-20 09:05:45 +03:00
return Point ( 425 , 447 ) ;
case PLAYER :
return Point ( 417 , 451 ) ;
}
}
assert ( 0 ) ;
return Point ( 0 , 0 ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-20 09:05:45 +03:00
void CMarketplaceWindow : : resourceChanged ( int type , int val )
{
initSubs ( true ) ;
}
void CMarketplaceWindow : : getBaseForPositions ( EType type , int & dx , int & dy , int & x , int & y , int & h , int & w , bool Right , int & leftToRightOffset ) const
2010-05-08 01:10:32 +03:00
{
2010-05-26 12:47:53 +03:00
switch ( type )
2010-05-08 01:10:32 +03:00
{
2010-05-26 12:47:53 +03:00
case RESOURCE :
dx = 82 ;
dy = 79 ;
x = 39 ;
y = 180 ;
h = 66 ;
w = 74 ;
break ;
case PLAYER :
dx = 83 ;
dy = 118 ;
h = 64 ;
w = 58 ;
x = 44 ;
y = 83 ;
2010-05-08 01:10:32 +03:00
assert ( Right ) ;
2010-05-26 12:47:53 +03:00
break ;
case CREATURE : //45,123
x = 45 ;
y = 123 ;
w = 58 ;
h = 64 ;
dx = 83 ;
dy = 98 ;
assert ( ! Right ) ;
2010-07-20 09:05:45 +03:00
break ;
2010-12-29 23:04:22 +02:00
case ARTIFACT_TYPE : //45,123
2010-07-26 18:37:58 +03:00
x = 340 - 289 ;
y = 180 ;
2010-06-27 19:03:01 +03:00
w = 44 ;
h = 44 ;
dx = 83 ;
dy = 79 ;
2010-07-20 09:05:45 +03:00
break ;
2010-05-08 01:10:32 +03:00
}
2010-05-26 12:47:53 +03:00
2010-07-26 18:37:58 +03:00
leftToRightOffset = 289 ;
2010-07-20 09:05:45 +03:00
}
2010-07-31 04:38:12 +03:00
void CMarketplaceWindow : : updateTraderText ( )
{
if ( readyToTrade )
{
if ( mode = = RESOURCE_PLAYER )
{
//I can give %s to the %s player.
traderText - > setTxt ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 165 ] ) % hLeft - > getName ( ) % hRight - > getName ( ) ) ) ;
}
else if ( mode = = RESOURCE_ARTIFACT )
{
//I can offer you the %s for %d %s of %s.
traderText - > setTxt ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 267 ] ) % hRight - > getName ( ) % r1 % CGI - > generaltexth - > allTexts [ 160 + ( r1 = = 1 ) ] % hLeft - > getName ( ) ) ) ;
}
else if ( mode = = RESOURCE_RESOURCE )
{
//I can offer you %d %s of %s for %d %s of %s.
traderText - > setTxt ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 157 ] ) % r2 % CGI - > generaltexth - > allTexts [ 160 + ( r2 = = 1 ) ] % hRight - > getName ( ) % r1 % CGI - > generaltexth - > allTexts [ 160 + ( r1 = = 1 ) ] % hLeft - > getName ( ) ) ) ;
}
else if ( mode = = CREATURE_RESOURCE )
{
//I can offer you %d %s of %s for %d %s.
traderText - > setTxt ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 269 ] ) % r2 % CGI - > generaltexth - > allTexts [ 160 + ( r2 = = 1 ) ] % hRight - > getName ( ) % r1 % hLeft - > getName ( r1 ) ) ) ;
}
2011-04-23 00:51:10 +03:00
else if ( mode = = ARTIFACT_RESOURCE )
{
//I can offer you %d %s of %s for your %s.
traderText - > setTxt ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 268 ] ) % r2 % CGI - > generaltexth - > allTexts [ 160 + ( r2 = = 1 ) ] % hRight - > getName ( ) % hLeft - > getName ( r1 ) ) ) ;
}
2010-07-31 04:38:12 +03:00
return ;
}
int gnrtxtnr = - 1 ;
if ( madeTransaction )
{
if ( mode = = RESOURCE_PLAYER )
gnrtxtnr = 166 ; //Are there any other resources you'd like to give away?
else
gnrtxtnr = 162 ; //You have received quite a bargain. I expect to make no profit on the deal. Can I interest you in any of my other wares?
}
else
{
if ( mode = = RESOURCE_PLAYER )
gnrtxtnr = 167 ; //If you'd like to give any of your resources to another player, click on the item you wish to give and to whom.
else
gnrtxtnr = 163 ; //Please inspect our fine wares. If you feel like offering a trade, click on the items you wish to trade with and for.
}
traderText - > setTxt ( CGI - > generaltexth - > allTexts [ gnrtxtnr ] ) ;
}
2010-07-20 09:05:45 +03:00
CAltarWindow : : CAltarWindow ( const IMarket * Market , const CGHeroInstance * Hero /*= NULL*/ , EMarketMode Mode )
: CTradeWindow ( Market , Hero , Mode )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2011-04-23 00:51:10 +03:00
bg = new CPicture ( Mode = = CREATURE_EXP ? " ALTARMON.bmp " : " ALTRART2.bmp " ) ;
2010-07-20 09:05:45 +03:00
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
pos = bg - > center ( ) ;
2010-05-26 12:47:53 +03:00
2010-07-20 09:05:45 +03:00
if ( Mode = = CREATURE_EXP )
{
printAtMiddle ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 272 ] ) % hero - > name ) , 155 , 30 , FONT_SMALL , tytulowy , * bg ) ; //%s's Creatures
printAtMiddle ( CGI - > generaltexth - > allTexts [ 479 ] , 450 , 30 , FONT_SMALL , tytulowy , * bg ) ; //Altar of Sacrifice
printAtMiddleWB ( CGI - > generaltexth - > allTexts [ 480 ] , 450 , 70 , FONT_SMALL , 45 , tytulowy , * bg ) ; //To sacrifice creatures, move them from your army on to the Altar and click Sacrifice
slider = new CSlider ( 231 , 481 , 137 , 0 , 0 , 0 ) ;
slider - > moved = boost : : bind ( & CAltarWindow : : sliderMoved , this , _1 ) ;
2010-10-24 14:35:14 +03:00
max = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 578 ] , boost : : bind ( & CSlider : : moveToMax , slider ) , 147 , 520 , " IRCBTNS.DEF " ) ;
2010-07-20 09:05:45 +03:00
sacrificedUnits . resize ( ARMY_SIZE , 0 ) ;
sacrificeAll = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 579 ] , boost : : bind ( & CAltarWindow : : SacrificeAll , this ) , 393 , 520 , " ALTARMY.DEF " ) ;
sacrificeBackpack = NULL ;
initItems ( true ) ;
mimicCres ( ) ;
}
else
{
printAtMiddle ( CGI - > generaltexth - > allTexts [ 477 ] , 450 , 34 , FONT_SMALL , tytulowy , * bg ) ; //Sacrifice artifacts for experience
printAtMiddle ( CGI - > generaltexth - > allTexts [ 478 ] , 302 , 423 , FONT_SMALL , tytulowy , * bg ) ; //%s's Creatures
sacrificeAll = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 571 ] , boost : : bind ( & CAltarWindow : : SacrificeAll , this ) , 393 , 520 , " ALTFILL.DEF " ) ;
2011-01-18 20:56:14 +02:00
sacrificeAll - > block ( ! hero - > artifactsInBackpack . size ( ) & & ! hero - > artifactsWorn . size ( ) ) ;
2010-07-20 09:05:45 +03:00
sacrificeBackpack = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 570 ] , boost : : bind ( & CAltarWindow : : SacrificeBackpack , this ) , 147 , 520 , " ALTEMBK.DEF " ) ;
2011-01-18 20:56:14 +02:00
sacrificeBackpack - > block ( ! hero - > artifactsInBackpack . size ( ) ) ;
2010-07-20 09:05:45 +03:00
slider = NULL ;
max = NULL ;
2011-04-23 00:51:10 +03:00
initItems ( true ) ;
2010-07-20 09:05:45 +03:00
initItems ( false ) ;
}
printAtMiddleWB ( CGI - > generaltexth - > allTexts [ 475 ] , 72 , 437 , FONT_SMALL , 17 , tytulowy , * bg ) ; //Experience needed to reach next level
printAtMiddleWB ( CGI - > generaltexth - > allTexts [ 476 ] , 72 , 505 , FONT_SMALL , 17 , tytulowy , * bg ) ; //Total experience on the Altar
new CGStatusBar ( 302 , 576 ) ;
ok = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 568 ] , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 516 , 520 , " IOK6432.DEF " , SDLK_RETURN ) ;
ok - > assignedKeys . insert ( SDLK_ESCAPE ) ;
deal = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 585 ] , boost : : bind ( & CAltarWindow : : makeDeal , this ) , 269 , 520 , " ALTSACR.DEF " ) ;
2010-07-23 15:02:15 +03:00
if ( Hero - > getAlignment ( ) ! = EVIL & & Mode = = CREATURE_EXP )
2010-07-20 09:05:45 +03:00
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 580 ] , boost : : bind ( & CTradeWindow : : setMode , this , ARTIFACT_EXP ) , 516 , 421 , " ALTART.DEF " ) ;
2010-07-23 15:02:15 +03:00
if ( Hero - > getAlignment ( ) ! = GOOD & & Mode = = ARTIFACT_EXP )
2010-07-20 09:05:45 +03:00
new AdventureMapButton ( CGI - > generaltexth - > zelp [ 572 ] , boost : : bind ( & CTradeWindow : : setMode , this , CREATURE_EXP ) , 516 , 421 , " ALTSACC.DEF " ) ;
expPerUnit . resize ( ARMY_SIZE , 0 ) ;
getExpValues ( ) ;
expToLevel = new CLabel ( 73 , 475 , FONT_SMALL , CENTER ) ;
expOnAltar = new CLabel ( 73 , 543 , FONT_SMALL , CENTER ) ;
setExpToLevel ( ) ;
calcTotalExp ( ) ;
blockTrade ( ) ;
2010-05-08 01:10:32 +03:00
}
2010-07-20 09:05:45 +03:00
CAltarWindow : : ~ CAltarWindow ( )
2010-05-08 01:10:32 +03:00
{
2010-07-20 09:05:45 +03:00
2010-05-08 01:10:32 +03:00
}
2010-07-20 09:05:45 +03:00
void CAltarWindow : : getBaseForPositions ( EType type , int & dx , int & dy , int & x , int & y , int & h , int & w , bool Right , int & leftToRightOffset ) const
2010-05-26 12:47:53 +03:00
{
2010-07-20 09:05:45 +03:00
leftToRightOffset = 289 ;
x = 45 ;
y = 110 ;
w = 58 ;
h = 64 ;
dx = 83 ;
dy = 98 ;
2010-05-26 12:47:53 +03:00
}
2010-07-20 09:05:45 +03:00
void CAltarWindow : : sliderMoved ( int to )
2010-05-26 12:47:53 +03:00
{
2010-07-20 09:05:45 +03:00
sacrificedUnits [ hLeft - > serial ] = to ;
updateRight ( hRight ) ;
deal - > block ( ! to ) ;
calcTotalExp ( ) ;
redraw ( ) ;
}
void CAltarWindow : : makeDeal ( )
{
2010-07-23 15:02:15 +03:00
if ( mode = = CREATURE_EXP )
2010-07-20 09:05:45 +03:00
{
2010-07-23 15:02:15 +03:00
blockTrade ( ) ;
slider - > value = 0 ;
std : : vector < int > toSacrifice = sacrificedUnits ;
for ( int i = 0 ; i < toSacrifice . size ( ) ; i + + )
{
if ( toSacrifice [ i ] )
LOCPLINT - > cb - > trade ( market - > o , mode , i , 0 , toSacrifice [ i ] , hero ) ;
}
2010-07-20 09:05:45 +03:00
2010-07-23 15:02:15 +03:00
BOOST_FOREACH ( int & val , sacrificedUnits )
val = 0 ;
2010-07-20 09:05:45 +03:00
2010-07-23 15:02:15 +03:00
BOOST_FOREACH ( CTradeableItem * t , items [ 0 ] )
{
t - > type = CREATURE_PLACEHOLDER ;
t - > subtitle = " " ;
}
}
else
2010-07-20 09:05:45 +03:00
{
2011-01-15 04:17:56 +02:00
BOOST_FOREACH ( const CArtifactInstance * art , arts - > artifactsOnAltar ) //sacrifice each artifact on the list
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
LOCPLINT - > cb - > trade ( market - > o , mode , hero - > getArtPos ( art ) , - 1 , 1 , hero ) ;
2010-07-23 15:02:15 +03:00
}
arts - > artifactsOnAltar . clear ( ) ;
BOOST_FOREACH ( CTradeableItem * t , items [ 0 ] )
{
t - > id = - 1 ;
t - > subtitle = " " ;
}
arts - > commonInfo - > reset ( ) ;
2011-02-05 15:39:10 +02:00
//arts->scrollBackpack(0);
2010-07-23 15:02:15 +03:00
deal - > block ( true ) ;
2010-07-20 09:05:45 +03:00
}
calcTotalExp ( ) ;
}
void CAltarWindow : : SacrificeAll ( )
{
2010-07-23 15:02:15 +03:00
if ( mode = = CREATURE_EXP )
{
bool movedAnything = false ;
BOOST_FOREACH ( CTradeableItem * t , items [ 1 ] )
2010-11-27 03:46:19 +02:00
sacrificedUnits [ t - > serial ] = hero - > getStackCount ( t - > serial ) ;
2010-07-20 09:05:45 +03:00
2010-07-23 15:02:15 +03:00
sacrificedUnits [ items [ 1 ] . front ( ) - > serial ] - - ;
2010-07-20 09:05:45 +03:00
2010-07-23 15:02:15 +03:00
BOOST_FOREACH ( CTradeableItem * t , items [ 0 ] )
{
updateRight ( t ) ;
if ( t - > type = = CREATURE )
movedAnything = true ;
}
deal - > block ( ! movedAnything ) ;
calcTotalExp ( ) ;
}
else
{
2011-01-15 04:17:56 +02:00
for ( std : : map < ui16 , ArtSlotInfo > : : const_iterator i = hero - > artifactsWorn . begin ( ) ; i ! = hero - > artifactsWorn . end ( ) ; i + + )
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
if ( i - > second . artifact - > artType - > id ! = 145 ) //ignore locks from assembled artifacts
moveFromSlotToAltar ( i - > first , NULL , i - > second . artifact ) ;
2010-07-23 15:02:15 +03:00
}
2010-07-20 09:05:45 +03:00
2010-07-23 15:02:15 +03:00
SacrificeBackpack ( ) ;
}
2010-07-20 09:05:45 +03:00
redraw ( ) ;
}
void CAltarWindow : : selectionChanged ( bool side )
{
if ( mode ! = CREATURE_EXP )
2010-05-26 12:47:53 +03:00
return ;
2010-07-20 09:05:45 +03:00
CTradeableItem * & selected = side ? hLeft : hRight ;
CTradeableItem * & theOther = side ? hRight : hLeft ;
2010-05-26 12:47:53 +03:00
2010-07-20 09:05:45 +03:00
theOther = * std : : find_if ( items [ ! side ] . begin ( ) , items [ ! side ] . end ( ) , boost : : bind ( & CTradeableItem : : serial , _1 ) = = selected - > serial ) ;
2010-07-23 15:02:15 +03:00
int stackCount = 0 ;
for ( int i = 0 ; i < ARMY_SIZE ; i + + )
2010-11-27 03:46:19 +02:00
if ( hero - > getStackCount ( i ) > sacrificedUnits [ i ] )
2010-07-23 15:02:15 +03:00
stackCount + + ;
2010-11-27 03:46:19 +02:00
slider - > setAmount ( hero - > getStackCount ( hLeft - > serial ) - ( stackCount = = 1 ) ) ;
2010-07-20 09:05:45 +03:00
slider - > block ( ! slider - > amount ) ;
slider - > value = sacrificedUnits [ hLeft - > serial ] ;
max - > block ( ! slider - > amount ) ;
readyToTrade = true ;
redraw ( ) ;
}
void CAltarWindow : : mimicCres ( )
{
std : : vector < Rect > positions ;
getPositionsFor ( positions , false , CREATURE ) ;
BOOST_FOREACH ( CTradeableItem * t , items [ 1 ] )
2010-05-26 12:47:53 +03:00
{
2010-07-20 09:05:45 +03:00
CTradeableItem * hlp = new CTradeableItem ( CREATURE_PLACEHOLDER , t - > id , false , t - > serial ) ;
hlp - > pos = positions [ t - > serial ] + hlp - > pos ;
items [ 0 ] . push_back ( hlp ) ;
2010-05-26 12:47:53 +03:00
}
}
2010-07-20 09:05:45 +03:00
Point CAltarWindow : : selectionOffset ( bool Left ) const
2010-06-27 19:03:01 +03:00
{
2010-07-20 09:05:45 +03:00
if ( Left )
return Point ( 150 , 421 ) ;
else
return Point ( 396 , 421 ) ;
}
std : : string CAltarWindow : : selectionSubtitle ( bool Left ) const
{
if ( Left & & slider & & hLeft )
return boost : : lexical_cast < std : : string > ( slider - > value ) ;
else if ( ! Left & & hRight )
return hRight - > subtitle ;
else
return " " ;
}
void CAltarWindow : : artifactsChanged ( bool left )
{
}
void CAltarWindow : : garrisonChanged ( )
{
if ( mode ! = CREATURE_EXP )
2010-06-27 19:03:01 +03:00
return ;
2010-07-20 09:05:45 +03:00
std : : set < CTradeableItem * > empty ;
getEmptySlots ( empty ) ;
2010-06-27 19:03:01 +03:00
2010-07-20 09:05:45 +03:00
BOOST_FOREACH ( CTradeableItem * t , empty )
2010-06-27 19:03:01 +03:00
{
2010-07-20 09:05:45 +03:00
removeItem ( * std : : find_if ( items [ 0 ] . begin ( ) , items [ 0 ] . end ( ) , boost : : bind ( & CTradeableItem : : serial , _1 ) = = t - > serial ) ) ;
removeItem ( t ) ;
2010-06-27 19:03:01 +03:00
}
2010-07-20 09:05:45 +03:00
initSubs ( true ) ;
getExpValues ( ) ;
}
void CAltarWindow : : getExpValues ( )
{
int dump ;
BOOST_FOREACH ( CTradeableItem * t , items [ 1 ] )
if ( t - > id > = 0 )
market - > getOffer ( t - > id , 0 , dump , expPerUnit [ t - > serial ] , CREATURE_EXP ) ;
}
void CAltarWindow : : calcTotalExp ( )
{
int val = 0 ;
2010-07-23 15:02:15 +03:00
if ( mode = = CREATURE_EXP )
2010-07-20 09:05:45 +03:00
{
2010-07-23 15:02:15 +03:00
for ( int i = 0 ; i < sacrificedUnits . size ( ) ; i + + )
{
val + = expPerUnit [ i ] * sacrificedUnits [ i ] ;
}
}
else
{
2011-01-15 04:17:56 +02:00
BOOST_FOREACH ( const CArtifactInstance * art , arts - > artifactsOnAltar )
2010-07-23 15:02:15 +03:00
{
int dmp , valOfArt ;
2011-01-15 04:17:56 +02:00
market - > getOffer ( art - > artType - > id , 0 , dmp , valOfArt , mode ) ;
val + = valOfArt ; //WAS val += valOfArt * arts->artifactsOnAltar.count(*i);
2010-07-23 15:02:15 +03:00
}
2010-07-20 09:05:45 +03:00
}
2010-12-23 22:18:10 +02:00
val * = ( 100 + hero - > getSecSkillLevel ( CGHeroInstance : : LEARNING ) * 5 ) / 100.0f ;
2010-07-20 09:05:45 +03:00
expOnAltar - > setTxt ( boost : : lexical_cast < std : : string > ( val ) ) ;
}
void CAltarWindow : : setExpToLevel ( )
{
2010-07-23 15:02:15 +03:00
expToLevel - > setTxt ( boost : : lexical_cast < std : : string > ( CGI - > heroh - > reqExp ( CGI - > heroh - > level ( hero - > exp ) + 1 ) - hero - > exp ) ) ;
2010-07-20 09:05:45 +03:00
}
void CAltarWindow : : blockTrade ( )
{
hLeft = hRight = NULL ;
readyToTrade = false ;
if ( slider )
{
slider - > block ( true ) ;
max - > block ( true ) ;
}
deal - > block ( true ) ;
}
void CAltarWindow : : updateRight ( CTradeableItem * toUpdate )
{
int val = sacrificedUnits [ toUpdate - > serial ] ;
toUpdate - > type = val ? CREATURE : CREATURE_PLACEHOLDER ;
toUpdate - > subtitle = val ? boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 122 ] ) % boost : : lexical_cast < std : : string > ( val * expPerUnit [ toUpdate - > serial ] ) ) : " " ; //%s exp
}
2010-07-23 15:02:15 +03:00
int CAltarWindow : : firstFreeSlot ( )
{
int ret = - 1 ;
while ( items [ 0 ] [ + + ret ] - > id > = 0 & & ret + 1 < items [ 0 ] . size ( ) ) ;
return ret < items [ 0 ] . size ( ) ? ret : - 1 ;
}
2010-07-20 09:05:45 +03:00
void CAltarWindow : : SacrificeBackpack ( )
{
2011-01-15 04:17:56 +02:00
std : : multiset < const CArtifactInstance * > toOmmit = arts - > artifactsOnAltar ;
2010-07-20 09:05:45 +03:00
2011-01-15 04:17:56 +02:00
for ( int i = 0 ; i < hero - > artifactsInBackpack . size ( ) ; i + + )
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
if ( vstd : : contains ( toOmmit , hero - > artifactsInBackpack [ i ] . artifact ) )
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
toOmmit - = hero - > artifactsInBackpack [ i ] . artifact ;
2010-07-23 15:02:15 +03:00
continue ;
}
2011-01-15 04:17:56 +02:00
putOnAltar ( NULL , hero - > artifactsInBackpack [ i ] . artifact ) ;
2010-07-23 15:02:15 +03:00
}
2011-01-15 04:17:56 +02:00
2010-07-23 15:02:15 +03:00
arts - > scrollBackpack ( 0 ) ;
calcTotalExp ( ) ;
}
void CAltarWindow : : artifactPicked ( )
{
redraw ( ) ;
}
void CAltarWindow : : showAll ( SDL_Surface * to )
{
CTradeWindow : : showAll ( to ) ;
2011-01-06 22:00:19 +02:00
if ( mode = = ARTIFACT_EXP & & arts & & arts - > commonInfo - > src . art )
2010-07-23 15:02:15 +03:00
{
2011-01-06 22:00:19 +02:00
blitAtLoc ( graphics - > artDefs - > ourImages [ arts - > commonInfo - > src . art - > artType - > id ] . bitmap , 281 , 442 , to ) ;
2010-07-23 15:02:15 +03:00
int dmp , val ;
2011-01-06 22:00:19 +02:00
market - > getOffer ( arts - > commonInfo - > src . art - > artType - > id , 0 , dmp , val , ARTIFACT_EXP ) ;
2010-07-23 15:02:15 +03:00
printAtMiddleLoc ( boost : : lexical_cast < std : : string > ( val ) , 304 , 498 , FONT_SMALL , zwykly , to ) ;
}
}
2011-01-15 04:17:56 +02:00
bool CAltarWindow : : putOnAltar ( CTradeableItem * altarSlot , const CArtifactInstance * art )
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
int artID = art - > artType - > id ;
2010-07-23 15:02:15 +03:00
if ( artID ! = 1 & & artID < 7 ) //special art
2011-01-15 04:17:56 +02:00
{
tlog2 < < " Cannot put special artifact on altar! \n " ;
2010-07-23 15:02:15 +03:00
return false ;
2011-01-15 04:17:56 +02:00
}
2010-07-23 15:02:15 +03:00
if ( ! altarSlot )
{
int slotIndex = firstFreeSlot ( ) ;
if ( slotIndex < 0 )
{
tlog2 < < " No free slots on altar! \n " ;
return false ;
}
altarSlot = items [ 0 ] [ slotIndex ] ;
}
int dmp , val ;
market - > getOffer ( artID , 0 , dmp , val , ARTIFACT_EXP ) ;
2011-01-15 04:17:56 +02:00
arts - > artifactsOnAltar . insert ( art ) ;
2011-04-23 00:51:10 +03:00
altarSlot - > setArtInstance ( art ) ;
2010-07-23 15:02:15 +03:00
altarSlot - > subtitle = boost : : lexical_cast < std : : string > ( val ) ;
deal - > block ( false ) ;
return true ;
}
2011-01-15 04:17:56 +02:00
void CAltarWindow : : moveFromSlotToAltar ( int slotID , CTradeableItem * altarSlot , const CArtifactInstance * art )
2010-07-23 15:02:15 +03:00
{
2011-01-28 04:11:58 +02:00
int freeBackpackSlot = hero - > artifactsInBackpack . size ( ) + Arts : : BACKPACK_START ;
2011-01-06 22:00:19 +02:00
if ( arts - > commonInfo - > src . art )
2010-07-23 15:02:15 +03:00
{
2011-01-28 04:11:58 +02:00
arts - > commonInfo - > dst . slotID = freeBackpackSlot ;
2011-01-06 22:00:19 +02:00
arts - > commonInfo - > dst . AOH = arts ;
2010-07-23 15:02:15 +03:00
}
2011-01-15 04:17:56 +02:00
if ( putOnAltar ( altarSlot , art ) )
2011-01-28 04:11:58 +02:00
{
if ( slotID < Arts : : BACKPACK_START )
LOCPLINT - > cb - > swapArtifacts ( hero , slotID , hero , freeBackpackSlot ) ;
else
{
arts - > commonInfo - > src . clear ( ) ;
arts - > commonInfo - > dst . clear ( ) ;
2011-02-14 12:38:33 +02:00
CCS - > curh - > dragAndDropCursor ( NULL ) ;
arts - > unmarkSlots ( false ) ;
2011-01-28 04:11:58 +02:00
}
}
2010-06-27 19:03:01 +03:00
}
2009-05-19 21:23:04 +03:00
CSystemOptionsWindow : : CSystemOptionsWindow ( const SDL_Rect & pos , CPlayerInterface * owner )
{
this - > pos = pos ;
2010-02-02 18:24:53 +02:00
SDL_Surface * hhlp = BitmapHandler : : loadBitmap ( " SysOpbck.bmp " , true ) ;
graphics - > blueToPlayersAdv ( hhlp , LOCPLINT - > playerID ) ;
background = SDL_ConvertSurface ( hhlp , screen - > format , 0 ) ;
SDL_SetColorKey ( background , SDL_SRCCOLORKEY , SDL_MapRGB ( background - > format , 0 , 255 , 255 ) ) ;
SDL_FreeSurface ( hhlp ) ;
2009-05-19 21:23:04 +03:00
//printing texts
2010-02-02 18:24:53 +02:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 568 ] , 242 , 32 , FONT_BIG , tytulowy , background ) ; //window title
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 569 ] , 122 , 64 , FONT_MEDIUM , tytulowy , background ) ; //hero speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 570 ] , 122 , 130 , FONT_MEDIUM , tytulowy , background ) ; //enemy speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 571 ] , 122 , 196 , FONT_MEDIUM , tytulowy , background ) ; //map scroll speed
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 20 ] , 122 , 262 , FONT_MEDIUM , tytulowy , background ) ; //video quality
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 394 ] , 122 , 347 , FONT_MEDIUM , tytulowy , background ) ; //music volume
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 395 ] , 122 , 412 , FONT_MEDIUM , tytulowy , background ) ; //effects volume
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 572 ] , 282 , 57 , FONT_MEDIUM , zwykly , background ) ; //show move path
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 573 ] , 282 , 89 , FONT_MEDIUM , zwykly , background ) ; //show hero reminder
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 574 ] , 282 , 121 , FONT_MEDIUM , zwykly , background ) ; //quick combat
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 575 ] , 282 , 153 , FONT_MEDIUM , zwykly , background ) ; //video subtitles
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 576 ] , 282 , 185 , FONT_MEDIUM , zwykly , background ) ; //town building outlines
CSDL_Ext : : printAt ( CGI - > generaltexth - > allTexts [ 577 ] , 282 , 217 , FONT_MEDIUM , zwykly , background ) ; //spell book animation
2009-05-19 21:23:04 +03:00
//setting up buttons
2009-12-11 06:52:51 +02:00
// load = new AdventureMapButton (CGI->generaltexth->zelp[321].first, CGI->generaltexth->zelp[321].second, boost::bind(&CSystemOptionsWindow::loadf, this), pos.x+246, pos.y+298, "SOLOAD.DEF", SDLK_l);
// std::swap(save->imgs[0][0], load->imgs[0][1]);
save = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 322 ] . first , CGI - > generaltexth - > zelp [ 322 ] . second , boost : : bind ( & CSystemOptionsWindow : : bsavef , this ) , pos . x + 357 , pos . y + 298 , " SOSAVE.DEF " , SDLK_s ) ;
2011-02-20 11:24:53 +02:00
save - > swappedImages = true ;
save - > update ( ) ;
2009-12-11 06:52:51 +02:00
// restart = new AdventureMapButton (CGI->generaltexth->zelp[323].first, CGI->generaltexth->zelp[323].second, boost::bind(&CSystemOptionsWindow::bmainmenuf, this), pos.x+346, pos.y+357, "SORSTRT", SDLK_r);
// std::swap(save->imgs[0][0], restart->imgs[0][1]);
mainMenu = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 320 ] . first , CGI - > generaltexth - > zelp [ 320 ] . second , boost : : bind ( & CSystemOptionsWindow : : bmainmenuf , this ) , pos . x + 357 , pos . y + 357 , " SOMAIN.DEF " , SDLK_m ) ;
2011-02-20 11:24:53 +02:00
mainMenu - > swappedImages = true ;
mainMenu - > update ( ) ;
2009-12-11 06:52:51 +02:00
quitGame = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 324 ] . first , CGI - > generaltexth - > zelp [ 324 ] . second , boost : : bind ( & CSystemOptionsWindow : : bquitf , this ) , pos . x + 246 , pos . y + 415 , " soquit.def " , SDLK_q ) ;
2011-02-20 11:24:53 +02:00
quitGame - > swappedImages = true ;
quitGame - > update ( ) ;
2009-12-11 06:52:51 +02:00
backToMap = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 325 ] . first , CGI - > generaltexth - > zelp [ 325 ] . second , boost : : bind ( & CSystemOptionsWindow : : breturnf , this ) , pos . x + 357 , pos . y + 415 , " soretrn.def " , SDLK_RETURN ) ;
2011-02-20 11:24:53 +02:00
backToMap - > swappedImages = true ;
backToMap - > update ( ) ;
2009-12-11 06:52:51 +02:00
backToMap - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2009-05-19 21:23:04 +03:00
heroMoveSpeed = new CHighlightableButtonsGroup ( 0 ) ;
2009-10-23 04:20:16 +03:00
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 349 ] . second ) , CGI - > generaltexth - > zelp [ 349 ] . second , " sysopb1.def " , pos . x + 28 , pos . y + 77 , 1 ) ;
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 350 ] . second ) , CGI - > generaltexth - > zelp [ 350 ] . second , " sysopb2.def " , pos . x + 76 , pos . y + 77 , 2 ) ;
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 351 ] . second ) , CGI - > generaltexth - > zelp [ 351 ] . second , " sysopb3.def " , pos . x + 124 , pos . y + 77 , 4 ) ;
heroMoveSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 352 ] . second ) , CGI - > generaltexth - > zelp [ 352 ] . second , " sysopb4.def " , pos . x + 172 , pos . y + 77 , 8 ) ;
2009-07-18 06:13:13 +03:00
heroMoveSpeed - > select ( owner - > sysOpts . heroMoveSpeed , 1 ) ;
2009-07-26 14:42:00 +03:00
heroMoveSpeed - > onChange = boost : : bind ( & SystemOptions : : setHeroMoveSpeed , & owner - > sysOpts , _1 ) ;
2009-05-19 21:23:04 +03:00
mapScrollSpeed = new CHighlightableButtonsGroup ( 0 ) ;
2009-10-23 04:20:16 +03:00
mapScrollSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 357 ] . second ) , CGI - > generaltexth - > zelp [ 357 ] . second , " sysopb9.def " , pos . x + 28 , pos . y + 210 , 1 ) ;
mapScrollSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 358 ] . second ) , CGI - > generaltexth - > zelp [ 358 ] . second , " sysob10.def " , pos . x + 92 , pos . y + 210 , 2 ) ;
mapScrollSpeed - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 359 ] . second ) , CGI - > generaltexth - > zelp [ 359 ] . second , " sysob11.def " , pos . x + 156 , pos . y + 210 , 4 ) ;
2009-07-18 06:13:13 +03:00
mapScrollSpeed - > select ( owner - > sysOpts . mapScrollingSpeed , 1 ) ;
2009-07-26 14:42:00 +03:00
mapScrollSpeed - > onChange = boost : : bind ( & SystemOptions : : setMapScrollingSpeed , & owner - > sysOpts , _1 ) ;
2009-05-19 21:23:04 +03:00
musicVolume = new CHighlightableButtonsGroup ( 0 , true ) ;
for ( int i = 0 ; i < 10 ; + + i )
{
2009-10-23 04:20:16 +03:00
musicVolume - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 326 + i ] . second ) , CGI - > generaltexth - > zelp [ 326 + i ] . second , " syslb.def " , pos . x + 29 + 19 * i , pos . y + 359 , i * 11 ) ;
2009-05-19 21:23:04 +03:00
}
2010-12-19 16:39:56 +02:00
musicVolume - > select ( CCS - > musich - > getVolume ( ) , 1 ) ;
2009-07-26 14:42:00 +03:00
musicVolume - > onChange = boost : : bind ( & SystemOptions : : setMusicVolume , & owner - > sysOpts , _1 ) ;
2009-05-19 21:23:04 +03:00
effectsVolume = new CHighlightableButtonsGroup ( 0 , true ) ;
for ( int i = 0 ; i < 10 ; + + i )
{
2009-10-23 04:20:16 +03:00
effectsVolume - > addButton ( boost : : assign : : map_list_of ( 0 , CGI - > generaltexth - > zelp [ 336 + i ] . second ) , CGI - > generaltexth - > zelp [ 336 + i ] . second , " syslb.def " , pos . x + 29 + 19 * i , pos . y + 425 , i * 11 ) ;
2009-05-19 21:23:04 +03:00
}
2010-12-19 16:39:56 +02:00
effectsVolume - > select ( CCS - > soundh - > getVolume ( ) , 1 ) ;
2009-07-26 14:42:00 +03:00
effectsVolume - > onChange = boost : : bind ( & SystemOptions : : setSoundVolume , & owner - > sysOpts , _1 ) ;
2009-05-19 21:23:04 +03:00
}
CSystemOptionsWindow : : ~ CSystemOptionsWindow ( )
{
SDL_FreeSurface ( background ) ;
delete save ;
delete quitGame ;
delete backToMap ;
2009-11-01 03:15:16 +02:00
delete mainMenu ;
2009-05-19 21:23:04 +03:00
delete heroMoveSpeed ;
delete mapScrollSpeed ;
delete musicVolume ;
delete effectsVolume ;
}
2009-11-01 03:15:16 +02:00
void CSystemOptionsWindow : : pushSDLEvent ( int type , int usercode )
2009-10-26 07:39:30 +02:00
{
2009-11-01 03:15:16 +02:00
GH . popIntTotally ( this ) ;
2009-10-26 07:39:30 +02:00
SDL_Event event ;
2009-11-01 03:15:16 +02:00
event . type = type ;
event . user . code = usercode ; // not necessarily used
2009-10-26 07:39:30 +02:00
SDL_PushEvent ( & event ) ;
}
2009-05-19 21:23:04 +03:00
void CSystemOptionsWindow : : bquitf ( )
{
2009-11-01 03:15:16 +02:00
LOCPLINT - > showYesNoDialog ( CGI - > generaltexth - > allTexts [ 578 ] , std : : vector < SComponent * > ( ) , boost : : bind ( & CSystemOptionsWindow : : pushSDLEvent , this , SDL_QUIT , 0 ) , 0 , false ) ;
2009-05-19 21:23:04 +03:00
}
void CSystemOptionsWindow : : breturnf ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
2009-11-01 03:15:16 +02:00
void CSystemOptionsWindow : : bmainmenuf ( )
{
LOCPLINT - > showYesNoDialog ( CGI - > generaltexth - > allTexts [ 578 ] , std : : vector < SComponent * > ( ) , boost : : bind ( & CSystemOptionsWindow : : pushSDLEvent , this , SDL_USEREVENT , 2 ) , 0 , false ) ;
}
2009-05-19 21:23:04 +03:00
void CSystemOptionsWindow : : bsavef ( )
{
2009-09-07 05:29:44 +03:00
GH . popIntTotally ( this ) ;
2010-05-27 00:59:58 +03:00
GH . pushInt ( new CSavingScreen ( CPlayerInterface : : howManyPeople > 1 ) ) ;
2009-09-07 05:29:44 +03:00
/*using namespace boost::posix_time;
2009-05-19 21:23:04 +03:00
std : : ostringstream fnameStream ;
fnameStream < < second_clock : : local_time ( ) ;
std : : string fname = fnameStream . str ( ) ;
boost : : algorithm : : replace_all ( fname , " : " , " " ) ;
boost : : algorithm : : replace_all ( fname , " " , " - " ) ;
2009-09-07 05:29:44 +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-05-19 21:23:04 +03:00
}
void CSystemOptionsWindow : : activate ( )
{
save - > activate ( ) ;
quitGame - > activate ( ) ;
backToMap - > activate ( ) ;
2009-11-01 03:15:16 +02:00
mainMenu - > activate ( ) ;
2009-05-19 21:23:04 +03:00
heroMoveSpeed - > activate ( ) ;
mapScrollSpeed - > activate ( ) ;
musicVolume - > activate ( ) ;
effectsVolume - > activate ( ) ;
}
void CSystemOptionsWindow : : deactivate ( )
{
save - > deactivate ( ) ;
quitGame - > deactivate ( ) ;
backToMap - > deactivate ( ) ;
2009-11-01 03:15:16 +02:00
mainMenu - > deactivate ( ) ;
2009-05-19 21:23:04 +03:00
heroMoveSpeed - > deactivate ( ) ;
mapScrollSpeed - > deactivate ( ) ;
musicVolume - > deactivate ( ) ;
effectsVolume - > deactivate ( ) ;
}
void CSystemOptionsWindow : : show ( SDL_Surface * to )
{
2010-08-23 18:16:40 +03:00
CSDL_Ext : : blitSurface ( background , NULL , to , & pos ) ;
2009-05-19 21:23:04 +03:00
2011-02-20 11:24:53 +02:00
save - > showAll ( to ) ;
quitGame - > showAll ( to ) ;
backToMap - > showAll ( to ) ;
mainMenu - > showAll ( to ) ;
heroMoveSpeed - > showAll ( to ) ;
mapScrollSpeed - > showAll ( to ) ;
musicVolume - > showAll ( to ) ;
effectsVolume - > showAll ( to ) ;
2009-05-19 21:23:04 +03:00
}
2010-07-09 02:03:27 +03:00
CTavernWindow : : CTavernWindow ( const CGObjectInstance * TavernObj )
: tavernObj ( TavernObj )
2009-05-19 21:23:04 +03:00
{
2010-07-09 02:03:27 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
std : : vector < const CGHeroInstance * > h = LOCPLINT - > cb - > getAvailableHeroes ( TavernObj ) ;
assert ( h . size ( ) = = 2 ) ;
h1 = new HeroPortrait ( selected , 0 , 72 , 299 , h [ 0 ] ) ;
h2 = new HeroPortrait ( selected , 1 , 162 , 299 , h [ 1 ] ) ;
if ( h [ 0 ] )
2009-05-19 21:23:04 +03:00
selected = 0 ;
else
selected = - 1 ;
2009-05-30 19:17:44 +03:00
oldSelected = - 1 ;
2010-02-02 18:24:53 +02:00
2010-07-09 02:03:27 +03:00
bg = new CPicture ( " TPTAVERN.bmp " ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
pos = center ( bg - > pos ) ;
2010-02-02 18:24:53 +02:00
2010-07-09 02:03:27 +03:00
printAtMiddle ( CGI - > generaltexth - > jktexts [ 37 ] , 200 , 35 , FONT_BIG , tytulowy , * bg ) ;
printAtMiddle ( " 2500 " , 320 , 328 , FONT_SMALL , zwykly , * bg ) ;
2010-02-02 18:24:53 +02:00
// printAtMiddle(CGI->generaltexth->jktexts[38],146,283,FONT_BIG,tytulowy,bg); //what is this???
2010-07-09 02:03:27 +03:00
printAtMiddleWB ( LOCPLINT - > cb - > getTavernGossip ( tavernObj ) , 200 , 220 , FONT_SMALL , 50 , zwykly , * bg ) ;
bar = new CGStatusBar ( 8 , 478 , " APHLFTRT.bmp " , 380 ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > tavernInfo [ 7 ] , " " , boost : : bind ( & CTavernWindow : : close , this ) , 310 , 428 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
recruit = new AdventureMapButton ( " " , " " , boost : : bind ( & CTavernWindow : : recruitb , this ) , 272 , 355 , " TPTAV01.DEF " , SDLK_RETURN ) ;
thiefGuild = new AdventureMapButton ( CGI - > generaltexth - > tavernInfo [ 5 ] , " " , boost : : bind ( & CTavernWindow : : thievesguildb , this ) , 22 , 428 , " TPTAV02.DEF " , SDLK_t ) ;
2009-05-19 21:23:04 +03:00
if ( LOCPLINT - > cb - > getResourceAmount ( 6 ) < 2500 ) //not enough gold
{
recruit - > hoverTexts [ 0 ] = CGI - > generaltexth - > tavernInfo [ 0 ] ; //Cannot afford a Hero
recruit - > block ( 2 ) ;
}
else if ( LOCPLINT - > cb - > howManyHeroes ( false ) > = 8 )
{
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
{
2010-07-09 02:03:27 +03:00
if ( ! h [ 0 ] )
2009-05-19 21:23:04 +03:00
recruit - > block ( 1 ) ;
}
2009-06-24 12:17:33 +03:00
# ifdef _WIN32
2010-12-19 16:39:56 +02:00
CCS - > videoh - > open ( " TAVERN.BIK " ) ;
2009-06-28 02:33:59 +03:00
# else
2010-12-19 16:39:56 +02:00
CCS - > videoh - > open ( " tavern.mjpg " , true , false ) ;
2009-06-24 12:17:33 +03:00
# endif
2009-05-19 21:23:04 +03:00
}
void CTavernWindow : : recruitb ( )
{
2010-07-09 02:03:27 +03:00
const CGHeroInstance * toBuy = ( selected ? h2 : h1 ) - > h ;
const CGObjectInstance * obj = tavernObj ;
2009-05-19 21:23:04 +03:00
close ( ) ;
2010-07-09 02:03:27 +03:00
LOCPLINT - > cb - > recruitHero ( obj , toBuy ) ;
2009-05-19 21:23:04 +03:00
}
2010-01-31 20:41:22 +02:00
void CTavernWindow : : thievesguildb ( )
{
2010-07-09 02:03:27 +03:00
GH . pushInt ( new CThievesGuildWindow ( tavernObj ) ) ;
2010-01-31 20:41:22 +02:00
}
2009-05-19 21:23:04 +03:00
CTavernWindow : : ~ CTavernWindow ( )
{
2010-12-19 16:39:56 +02:00
CCS - > videoh - > close ( ) ;
2009-05-19 21:23:04 +03:00
}
void CTavernWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
void CTavernWindow : : show ( SDL_Surface * to )
{
2010-07-09 02:03:27 +03:00
CIntObject : : show ( to ) ;
2009-05-19 21:23:04 +03:00
2010-12-19 16:39:56 +02:00
CCS - > videoh - > update ( pos . x + 70 , pos . y + 56 , to , true , false ) ;
2009-05-19 21:23:04 +03:00
if ( selected > = 0 )
{
2010-07-09 02:03:27 +03:00
HeroPortrait * sel = selected ? h2 : h1 ;
2009-05-30 19:17:44 +03:00
2011-02-20 11:24:53 +02:00
if ( selected ! = oldSelected & & ! recruit - > isBlocked ( ) )
2009-06-10 23:48:55 +03:00
{
// Selected hero just changed. Update RECRUIT button hover text if recruitment is allowed.
2009-05-30 19:17:44 +03:00
oldSelected = selected ;
recruit - > hoverTexts [ 0 ] = CGI - > generaltexth - > tavernInfo [ 3 ] ; //Recruit %s the %s
boost : : algorithm : : replace_first ( recruit - > hoverTexts [ 0 ] , " %s " , sel - > h - > name ) ;
boost : : algorithm : : replace_first ( recruit - > hoverTexts [ 0 ] , " %s " , sel - > h - > type - > heroClass - > name ) ;
}
2009-05-30 18:58:28 +03:00
2010-02-02 18:24:53 +02:00
printAtMiddleWB ( sel - > descr , pos . x + 146 , pos . y + 389 , FONT_SMALL , 40 , zwykly , to ) ;
2009-05-19 21:23:04 +03:00
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-08-11 19:05:33 +03:00
void CTavernWindow : : HeroPortrait : : clickLeft ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
2010-07-09 02:03:27 +03:00
if ( previousState & & ! down & & h )
2009-05-19 21:23:04 +03:00
as ( ) ;
2009-08-11 19:05:33 +03:00
//ClickableL::clickLeft(down);
2009-05-19 21:23:04 +03:00
}
2009-11-28 21:55:40 +02:00
2009-08-11 19:05:33 +03:00
void CTavernWindow : : HeroPortrait : : clickRight ( tribool down , bool previousState )
2009-05-19 21:23:04 +03:00
{
2010-07-09 02:03:27 +03:00
if ( down & & h )
2009-05-19 21:23:04 +03:00
{
2011-01-06 22:00:19 +02:00
GH . pushInt ( new CRClickPopupInt ( new CHeroWindow ( h ) , true ) ) ;
2009-05-19 21:23:04 +03:00
}
}
2009-11-28 21:55:40 +02:00
2009-05-19 21:23:04 +03:00
CTavernWindow : : HeroPortrait : : HeroPortrait ( int & sel , int id , int x , int y , const CGHeroInstance * H )
2010-07-09 02:03:27 +03:00
: as ( sel , id ) , h ( H )
2009-05-19 21:23:04 +03:00
{
2010-07-09 02:03:27 +03:00
used = LCLICK | RCLICK | HOVER ;
2009-05-19 21:23:04 +03:00
h = H ;
pos . x = x ;
pos . y = y ;
pos . w = 58 ;
pos . h = 64 ;
2010-07-09 02:03:27 +03:00
2009-05-19 21:23:04 +03:00
if ( H )
{
hoverName = CGI - > generaltexth - > tavernInfo [ 4 ] ;
boost : : algorithm : : replace_first ( hoverName , " %s " , H - > name ) ;
2009-07-16 02:58:47 +03:00
2011-01-18 20:56:14 +02:00
int artifs = h - > artifactsWorn . size ( ) + h - > artifactsInBackpack . size ( ) ;
2009-07-16 02:58:47 +03:00
for ( int i = 13 ; i < = 17 ; i + + ) //war machines and spellbook don't count
2011-01-18 20:56:14 +02:00
if ( vstd : : contains ( h - > artifactsWorn , i ) )
2009-07-16 02:58:47 +03:00
artifs - - ;
sprintf_s ( descr , sizeof ( descr ) , CGI - > generaltexth - > allTexts [ 215 ] . c_str ( ) ,
h - > name . c_str ( ) , h - > level , h - > type - > heroClass - > name . c_str ( ) , artifs ) ;
descr [ sizeof ( descr ) - 1 ] = ' \0 ' ;
2009-05-19 21:23:04 +03:00
}
2009-05-30 18:58:28 +03:00
2009-05-19 21:23:04 +03:00
}
void CTavernWindow : : HeroPortrait : : show ( SDL_Surface * to )
{
blitAt ( graphics - > portraitLarge [ h - > subID ] , pos , to ) ;
}
void CTavernWindow : : HeroPortrait : : hover ( bool on )
{
2009-08-11 19:05:33 +03:00
//Hoverable::hover(on);
2009-05-19 21:23:04 +03:00
if ( on )
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( hoverName ) ;
2009-05-19 21:23:04 +03:00
else
2010-02-15 08:54:57 +02:00
GH . statusbar - > clear ( ) ;
2009-05-19 21:23:04 +03:00
}
void CInGameConsole : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateKeys ( ) ;
2009-05-19 21:23:04 +03:00
}
void CInGameConsole : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateKeys ( ) ;
2009-05-19 21:23:04 +03:00
}
void CInGameConsole : : show ( SDL_Surface * to )
{
int number = 0 ;
std : : vector < std : : list < std : : pair < std : : string , int > > : : iterator > toDel ;
2009-06-09 06:53:29 +03:00
texts_mx . lock ( ) ;
2009-05-19 21:23:04 +03:00
for ( std : : list < std : : pair < std : : string , int > > : : iterator it = texts . begin ( ) ; it ! = texts . end ( ) ; + + it , + + number )
{
SDL_Color green = { 0 , 0xff , 0 , 0 } ;
Point leftBottomCorner ( 0 , screen - > h ) ;
if ( LOCPLINT - > battleInt )
{
leftBottomCorner = LOCPLINT - > battleInt - > pos . bottomLeft ( ) ;
}
2010-02-02 18:24:53 +02:00
CSDL_Ext : : printAt ( it - > first , leftBottomCorner . x + 50 , leftBottomCorner . y - texts . size ( ) * 20 - 80 + number * 20 , FONT_MEDIUM , green ) ;
2009-05-19 21:23:04 +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-06-09 06:53:29 +03:00
texts_mx . unlock ( ) ;
2009-05-19 21:23:04 +03:00
}
void CInGameConsole : : print ( const std : : string & txt )
{
2009-06-09 06:53:29 +03:00
texts_mx . lock ( ) ;
2009-10-18 17:39:53 +03:00
int lineLen = conf . go ( ) - > ac . outputLineLength ;
2009-06-09 06:53:29 +03:00
2009-10-18 17:39:53 +03:00
if ( txt . size ( ) < lineLen )
2009-05-19 21:23:04 +03:00
{
2009-10-18 17:39:53 +03:00
texts . push_back ( std : : make_pair ( txt , SDL_GetTicks ( ) ) ) ;
if ( texts . size ( ) > maxDisplayedTexts )
{
texts . pop_front ( ) ;
}
}
else
{
2009-12-02 00:14:25 +02:00
assert ( lineLen ) ;
2009-10-18 17:39:53 +03:00
for ( int g = 0 ; g < txt . size ( ) / lineLen + 1 ; + + g )
{
std : : string part = txt . substr ( g * lineLen , lineLen ) ;
if ( part . size ( ) = = 0 )
break ;
texts . push_back ( std : : make_pair ( part , SDL_GetTicks ( ) ) ) ;
if ( texts . size ( ) > maxDisplayedTexts )
{
texts . pop_front ( ) ;
}
}
2009-05-19 21:23:04 +03:00
}
2009-06-09 06:53:29 +03:00
texts_mx . unlock ( ) ;
2009-05-19 21:23:04 +03:00
}
void CInGameConsole : : keyPressed ( const SDL_KeyboardEvent & key )
{
if ( key . type ! = SDL_KEYDOWN ) return ;
if ( ! captureAllKeys & & key . keysym . sym ! = SDLK_TAB ) return ; //because user is not entering any text
switch ( key . keysym . sym )
{
case SDLK_TAB :
2009-08-27 11:04:32 +03:00
case SDLK_ESCAPE :
2009-05-19 21:23:04 +03:00
{
if ( captureAllKeys )
{
captureAllKeys = false ;
endEnteringText ( false ) ;
}
2009-08-27 11:04:32 +03:00
else if ( SDLK_TAB )
2009-05-19 21:23:04 +03:00
{
captureAllKeys = true ;
startEnteringText ( ) ;
}
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 ;
}
case SDLK_UP : //up arrow
{
2009-08-07 12:45:21 +03:00
if ( previouslyEntered . size ( ) = = 0 )
break ;
2009-05-19 21:23:04 +03:00
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 ;
}
default :
{
2009-10-18 17:39:53 +03:00
if ( enteredText . size ( ) > 0 & & enteredText . size ( ) < conf . go ( ) - > ac . inputLineLength )
2009-05-19 21:23:04 +03:00
{
if ( key . keysym . unicode < 0x80 & & key . keysym . unicode > 0 )
{
enteredText [ enteredText . size ( ) - 1 ] = ( char ) key . keysym . unicode ;
enteredText + = " _ " ;
refreshEnteredText ( ) ;
}
}
break ;
}
}
}
void CInGameConsole : : startEnteringText ( )
{
enteredText = " _ " ;
2010-02-20 15:24:38 +02:00
if ( GH . topInt ( ) = = adventureInt )
2009-05-19 21:23:04 +03:00
{
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( enteredText ) ;
2009-05-19 21:23:04 +03:00
}
else if ( LOCPLINT - > battleInt )
{
LOCPLINT - > battleInt - > console - > ingcAlter = enteredText ;
}
}
void CInGameConsole : : endEnteringText ( bool printEnteredText )
{
prevEntDisp = - 1 ;
if ( printEnteredText )
{
std : : string txt = enteredText . substr ( 0 , enteredText . size ( ) - 1 ) ;
LOCPLINT - > cb - > sendMessage ( txt ) ;
previouslyEntered . push_back ( txt ) ;
print ( txt ) ;
}
enteredText = " " ;
2010-02-20 15:24:38 +02:00
if ( GH . topInt ( ) = = adventureInt )
2009-05-19 21:23:04 +03:00
{
2010-02-15 08:54:57 +02:00
GH . statusbar - > clear ( ) ;
2009-05-19 21:23:04 +03:00
}
else if ( LOCPLINT - > battleInt )
{
LOCPLINT - > battleInt - > console - > ingcAlter = " " ;
}
}
void CInGameConsole : : refreshEnteredText ( )
{
2010-02-20 15:24:38 +02:00
if ( GH . topInt ( ) = = adventureInt )
2009-05-19 21:23:04 +03:00
{
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( enteredText ) ;
2009-05-19 21:23:04 +03:00
}
else if ( LOCPLINT - > battleInt )
{
LOCPLINT - > battleInt - > console - > ingcAlter = enteredText ;
}
}
CInGameConsole : : CInGameConsole ( ) : prevEntDisp ( - 1 ) , defaultTimeout ( 10000 ) , maxDisplayedTexts ( 10 )
{
}
void CGarrisonWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-19 21:23:04 +03:00
}
2011-02-05 15:39:10 +02:00
CGarrisonWindow : : CGarrisonWindow ( const CArmedInstance * up , const CGHeroInstance * down , bool removableUnits )
2009-05-19 21:23:04 +03:00
{
2011-02-05 15:39:10 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
bg = new CPicture ( " GARRISON.bmp " ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
pos = bg - > center ( ) ;
garr = new CGarrisonInt ( 92 , 127 , 4 , Point ( 0 , 96 ) , bg - > bg , Point ( 93 , 127 ) , up , down , removableUnits ) ;
{
AdventureMapButton * split = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 3 ] , " " , boost : : bind ( & CGarrisonInt : : splitClick , garr ) , 88 , 314 , " IDV6432.DEF " ) ;
removeChild ( split ) ;
garr - > addSplitBtn ( split ) ;
}
quit = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CGarrisonWindow : : close , this ) , 399 , 314 , " IOK6432.DEF " , SDLK_RETURN ) ;
2009-05-19 21:23:04 +03:00
}
2011-02-05 15:39:10 +02:00
CGarrisonWindow : : ~ CGarrisonWindow ( )
2009-05-19 21:23:04 +03:00
{
}
2011-02-05 15:39:10 +02:00
void CGarrisonWindow : : showAll ( SDL_Surface * to )
2009-05-19 21:23:04 +03:00
{
2011-02-05 15:39:10 +02:00
CIntObject : : showAll ( to ) ;
2009-05-19 21:23:04 +03:00
2010-11-15 14:51:53 +02:00
std : : string title ;
2011-02-05 15:39:10 +02:00
if ( garr - > armedObjs [ 1 ] - > tempOwner = = garr - > armedObjs [ 0 ] - > tempOwner )
2010-11-15 14:51:53 +02:00
title = CGI - > generaltexth - > allTexts [ 709 ] ;
else
{
title = CGI - > generaltexth - > allTexts [ 35 ] ;
2011-02-05 15:39:10 +02:00
boost : : algorithm : : replace_first ( title , " %s " , garr - > armedObjs [ 0 ] - > Slots ( ) . begin ( ) - > second - > type - > namePl ) ;
2010-11-15 14:51:53 +02:00
}
2011-02-05 15:39:10 +02:00
blitAtLoc ( graphics - > flags - > ourImages [ garr - > armedObjs [ 1 ] - > getOwner ( ) ] . bitmap , 28 , 124 , to ) ;
blitAtLoc ( graphics - > portraitLarge [ static_cast < const CGHeroInstance * > ( garr - > armedObjs [ 1 ] ) - > portrait ] , 29 , 222 , to ) ;
printAtMiddleLoc ( title , 275 , 30 , FONT_BIG , tytulowy , to ) ;
2009-05-19 21:23:04 +03:00
}
IShowActivable : : IShowActivable ( )
{
type = 0 ;
}
2010-07-22 03:32:45 +03:00
CGarrisonHolder : : CGarrisonHolder ( )
2009-05-19 21:23:04 +03:00
{
type | = WITH_GARRISON ;
}
2010-07-22 03:32:45 +03:00
void CWindowWithGarrison : : updateGarrisons ( )
{
garr - > recreateSlots ( ) ;
}
2009-05-19 21:23:04 +03:00
void CRClickPopupInt : : show ( SDL_Surface * to )
{
inner - > show ( to ) ;
}
CRClickPopupInt : : CRClickPopupInt ( IShowActivable * our , bool deleteInt )
{
2010-12-19 16:39:56 +02:00
CCS - > curh - > hide ( ) ;
2009-05-19 21:23:04 +03:00
inner = our ;
delInner = deleteInt ;
}
CRClickPopupInt : : ~ CRClickPopupInt ( )
{
2010-12-17 00:32:53 +02:00
// //workaround for hero window issue - if it's our interface, call dispose to properly reset it's state
// //TODO? it might be better to rewrite hero window so it will bee newed/deleted on opening / closing (not effort-worthy now, but on some day...?)
// if(LOCPLINT && inner == adventureInt->heroWindow)
// adventureInt->heroWindow->dispose();
2009-06-10 23:48:55 +03:00
2009-05-19 21:23:04 +03:00
if ( delInner )
delete inner ;
2009-10-22 05:41:09 +03:00
2010-12-19 16:39:56 +02:00
CCS - > curh - > show ( ) ;
2009-05-19 21:23:04 +03:00
}
2009-06-16 14:18:14 +03:00
2011-01-28 04:11:58 +02:00
void CRClickPopupInt : : showAll ( SDL_Surface * to )
{
inner - > showAll ( to ) ;
}
2010-12-29 23:04:22 +02:00
CArtPlace : : CArtPlace ( const CArtifactInstance * Art )
2011-02-20 11:24:53 +02:00
: picked ( false ) , marked ( false ) , locked ( false ) , ourArt ( Art )
2009-11-28 21:55:40 +02:00
{
}
2011-04-23 13:27:44 +03:00
CArtPlace : : CArtPlace ( Point position , const CArtifactInstance * Art ) :
picked ( false ) , marked ( false ) , locked ( false ) , ourArt ( Art )
{
pos + = position ;
pos . w = pos . h = 44 ;
}
2009-06-18 18:05:00 +03:00
void CArtPlace : : activate ( )
{
if ( ! active )
{
LRClickableAreaWTextComp : : activate ( ) ;
}
}
2009-11-28 21:55:40 +02:00
2009-08-11 19:05:33 +03:00
void CArtPlace : : clickLeft ( tribool down , bool previousState )
2009-06-18 18:05:00 +03:00
{
//LRClickableAreaWTextComp::clickLeft(down);
2011-01-15 04:17:56 +02:00
bool inBackpack = slotID > = Arts : : BACKPACK_START ,
srcInBackpack = ourOwner - > commonInfo - > src . slotID > = Arts : : BACKPACK_START ,
srcInSameHero = ourOwner - > commonInfo - > src . AOH = = ourOwner ;
2009-06-18 18:05:00 +03:00
2011-04-23 00:51:10 +03:00
if ( ourOwner - > highlightModeCallback & & ourArt )
{
if ( down )
{
if ( ourArt - > artType - > id < 7 ) //War Machine or Spellbook
{
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 21 ] ) ; //This item can't be traded.
}
else
{
ourOwner - > unmarkSlots ( false ) ;
marked = true ;
ourOwner - > highlightModeCallback ( this ) ;
}
}
return ;
}
2009-11-28 21:55:40 +02:00
// If clicked on spellbook, open it only if no artifact is held at the moment.
2011-01-06 22:00:19 +02:00
if ( ourArt & & ! down & & previousState & & ! ourOwner - > commonInfo - > src . AOH )
2009-06-18 18:05:00 +03:00
{
2010-12-29 23:04:22 +02:00
if ( ourArt - > artType - > id = = 0 )
2009-06-18 18:05:00 +03:00
{
2010-07-21 13:20:32 +03:00
CSpellWindow * spellWindow = new CSpellWindow ( genRect ( 595 , 620 , ( conf . cc . resx - 620 ) / 2 , ( conf . cc . resy - 595 ) / 2 ) , ourOwner - > curHero , LOCPLINT , LOCPLINT - > battleInt ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( spellWindow ) ;
2009-06-18 18:05:00 +03:00
}
}
2010-07-20 21:34:32 +03:00
2009-12-02 01:19:43 +02:00
if ( ! down & & previousState )
2009-06-18 18:05:00 +03:00
{
2011-02-15 20:40:06 +02:00
if ( ourArt & & ourArt - > artType - > id = = 0 ) //spellbook
2009-06-18 18:05:00 +03:00
return ; //this is handled separately
2010-07-20 21:34:32 +03:00
2011-01-06 22:00:19 +02:00
if ( ! ourOwner - > commonInfo - > src . AOH ) //nothing has been clicked
2009-06-18 18:05:00 +03:00
{
2010-08-12 18:54:25 +03:00
if ( ourArt //to prevent selecting empty slots (bugfix to what GrayFace reported)
& & ourOwner - > curHero - > tempOwner = = LOCPLINT - > playerID ) //can't take art from another player
2009-06-18 18:05:00 +03:00
{
2011-01-15 04:17:56 +02:00
if ( ourArt - > artType - > id = = 3 ) //catapult cannot be highlighted
2009-09-11 08:45:40 +03:00
{
std : : vector < SComponent * > catapult ( 1 , new SComponent ( SComponent : : artifact , 3 , 0 ) ) ;
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 312 ] , catapult ) ; //The Catapult must be equipped.
return ;
}
2009-11-28 21:55:40 +02:00
select ( ) ;
2009-06-18 18:05:00 +03:00
}
}
2011-01-06 22:00:19 +02:00
else if ( ourArt = = ourOwner - > commonInfo - > src . art ) //restore previously picked artifact
{
deselect ( ) ;
}
2011-01-15 04:17:56 +02:00
else //perform artifact transition
2009-06-18 18:05:00 +03:00
{
2011-01-15 04:17:56 +02:00
if ( inBackpack ) // Backpack destination.
2009-11-10 05:10:14 +02:00
{
2011-01-15 19:58:08 +02:00
if ( srcInBackpack & & slotID = = ourOwner - > commonInfo - > src . slotID + 1 ) //next slot (our is not visible, so visually same as "old" place) to the art -> make nothing, return artifact to slot
2009-09-11 08:45:40 +03:00
{
2011-01-15 04:17:56 +02:00
deselect ( ) ;
}
else
{
const CArtifact * const cur = ourOwner - > commonInfo - > src . art - > artType ;
2010-12-29 23:04:22 +02:00
2011-01-15 04:17:56 +02:00
switch ( cur - > id )
{
case 3 :
//should not happen, catapult cannot be selected
assert ( cur - > id ! = 3 ) ;
break ;
case 4 : case 5 : case 6 : //war machines cannot go to backpack
LOCPLINT - > showInfoDialog ( boost : : str ( boost : : format ( CGI - > generaltexth - > allTexts [ 153 ] ) % cur - > Name ( ) ) ) ;
break ;
default :
setMeAsDest ( ) ;
amin ( ourOwner - > commonInfo - > dst . slotID , ourOwner - > curHero - > artifactsInBackpack . size ( ) + Arts : : BACKPACK_START ) ;
2011-01-15 19:58:08 +02:00
if ( srcInBackpack & & srcInSameHero )
{
if ( ! ourArt //cannot move from backpack to AFTER backpack -> combined with amin above it will guarantee that dest is at most the last artifact
| | ourOwner - > commonInfo - > src . slotID < ourOwner - > commonInfo - > dst . slotID ) //rearranging arts in backpack after taking src artifact, the dest id will be shifted
ourOwner - > commonInfo - > dst . slotID - - ;
}
2011-01-15 04:17:56 +02:00
if ( srcInSameHero & & ourOwner - > commonInfo - > dst . slotID = = ourOwner - > commonInfo - > src . slotID ) //we came to src == dst
deselect ( ) ;
else
ourOwner - > realizeCurrentTransaction ( ) ;
break ;
}
2009-09-11 08:45:40 +03:00
}
2009-06-18 18:05:00 +03:00
}
//check if swap is possible
2011-01-06 22:00:19 +02:00
else if ( fitsHere ( ourOwner - > commonInfo - > src . art ) & &
2010-08-12 18:54:25 +03:00
( ! ourArt | | ourOwner - > curHero - > tempOwner = = LOCPLINT - > playerID ) )
2009-06-18 18:05:00 +03:00
{
2010-12-29 23:04:22 +02:00
setMeAsDest ( ) ;
2011-01-06 22:00:19 +02:00
//
// // Special case when the dest artifact can't be fit into the src slot.
// //CGI->arth->unequipArtifact(ourOwner->curHero->artifWorn, slotID);
// const CArtifactsOfHero* srcAOH = ourOwner->commonInfo->src.AOH;
// ui16 srcSlotID = ourOwner->commonInfo->src.slotID;
// if (ourArt && srcSlotID < 19 && !ourArt->canBePutAt(ArtifactLocation(srcAOH->curHero, srcSlotID)))
// {
// // Put dest artifact into owner's backpack.
// ourOwner->commonInfo->src.AOH = ourOwner;
// ourOwner->commonInfo->src.slotID = ourOwner->curHero->artifacts.size() + 19;
// }
2010-02-08 23:17:22 +02:00
2010-12-29 23:04:22 +02:00
ourOwner - > realizeCurrentTransaction ( ) ;
2009-06-18 18:05:00 +03:00
}
}
}
}
2009-11-28 21:55:40 +02:00
2009-08-11 19:05:33 +03:00
void CArtPlace : : clickRight ( tribool down , bool previousState )
2009-06-18 18:05:00 +03:00
{
2011-01-22 05:43:20 +02:00
if ( down & & ourArt & & ! locked & & text . size ( ) ) //if there is no description or it's a lock, do nothing ;]
2010-07-20 21:34:32 +03:00
{
if ( slotID < 19 )
{
2010-07-23 15:02:15 +03:00
if ( ourOwner - > allowedAssembling )
{
2010-12-29 23:04:22 +02:00
std : : vector < const CArtifact * > assemblyPossibilities = ourArt - > assemblyPossibilities ( ourOwner - > curHero ) ;
2010-07-23 15:02:15 +03:00
// If the artifact can be assembled, display dialog.
2010-12-29 23:04:22 +02:00
BOOST_FOREACH ( const CArtifact * combination , assemblyPossibilities )
2010-07-23 15:02:15 +03:00
{
2010-12-29 23:04:22 +02:00
LOCPLINT - > showArtifactAssemblyDialog (
ourArt - > artType - > id ,
combination - > id ,
true ,
boost : : bind ( & CCallback : : assembleArtifacts , LOCPLINT - > cb , ourOwner - > curHero , slotID , true , combination - > id ) ,
0 ) ;
2011-01-24 01:49:17 +02:00
if ( assemblyPossibilities . size ( ) > 2 )
2010-07-23 15:02:15 +03:00
{
2010-12-29 23:04:22 +02:00
tlog3 < < " More than one possibility of assembling... taking only first \n " ;
break ;
2010-02-27 03:05:39 +02:00
}
}
2010-02-16 16:39:56 +02:00
2010-07-23 15:02:15 +03:00
// Otherwise if the artifact can be diasassembled, display dialog.
2010-12-29 23:04:22 +02:00
if ( ourArt - > canBeDisassembled ( ) )
2010-07-23 15:02:15 +03:00
{
LOCPLINT - > showArtifactAssemblyDialog (
2010-12-29 23:04:22 +02:00
ourArt - > artType - > id ,
2010-07-23 15:02:15 +03:00
0 ,
false ,
boost : : bind ( & CCallback : : assembleArtifacts , LOCPLINT - > cb , ourOwner - > curHero , slotID , false , 0 ) ,
2010-12-29 23:04:22 +02:00
0 ) ;
2010-07-23 15:02:15 +03:00
}
2010-02-16 16:39:56 +02:00
}
}
2010-02-27 03:05:39 +02:00
// Lastly just show the artifact description.
LRClickableAreaWTextComp : : clickRight ( down , previousState ) ;
2010-02-16 16:39:56 +02:00
}
2009-06-18 18:05:00 +03:00
}
2009-11-28 21:55:40 +02:00
/**
* Selects artifact slot so that the containing artifact looks like it ' s picked up .
*/
void CArtPlace : : select ( )
{
2011-01-22 05:43:20 +02:00
if ( locked )
2010-02-08 23:17:22 +02:00
return ;
2011-01-15 04:17:56 +02:00
picked = true ;
2011-01-28 04:11:58 +02:00
//int backpackCorrection = -(slotID - Arts::BACKPACK_START < ourOwner->backpackPos);
2010-02-28 04:44:37 +02:00
2011-01-06 22:00:19 +02:00
CCS - > curh - > dragAndDropCursor ( graphics - > artDefs - > ourImages [ ourArt - > artType - > id ] . bitmap ) ;
ourOwner - > commonInfo - > src . setTo ( this , false ) ;
2010-07-20 21:34:32 +03:00
ourOwner - > markPossibleSlots ( ourArt ) ;
2011-01-15 04:17:56 +02:00
if ( slotID > = Arts : : BACKPACK_START )
ourOwner - > scrollBackpack ( 0 ) ; //will update slots
2010-07-23 15:02:15 +03:00
ourOwner - > updateParentWindow ( ) ;
ourOwner - > safeRedraw ( ) ;
2009-11-28 21:55:40 +02:00
}
/**
2010-02-28 04:44:37 +02:00
* Deselects the artifact slot . FIXME : Not used . Maybe it should ?
2009-11-28 21:55:40 +02:00
*/
void CArtPlace : : deselect ( )
{
2011-01-15 04:17:56 +02:00
picked = false ;
2010-12-19 16:39:56 +02:00
CCS - > curh - > dragAndDropCursor ( NULL ) ;
2009-11-28 21:55:40 +02:00
ourOwner - > unmarkSlots ( ) ;
2011-01-06 22:00:19 +02:00
ourOwner - > commonInfo - > src . clear ( ) ;
2011-01-15 04:17:56 +02:00
if ( slotID > = Arts : : BACKPACK_START )
ourOwner - > scrollBackpack ( 0 ) ; //will update slots
2011-01-06 22:00:19 +02:00
ourOwner - > updateParentWindow ( ) ;
ourOwner - > safeRedraw ( ) ;
2009-11-28 21:55:40 +02:00
}
2009-06-18 18:05:00 +03:00
void CArtPlace : : deactivate ( )
{
if ( active )
{
LRClickableAreaWTextComp : : deactivate ( ) ;
}
}
2009-11-28 21:55:40 +02:00
2010-07-23 15:02:15 +03:00
void CArtPlace : : showAll ( SDL_Surface * to )
2009-06-18 18:05:00 +03:00
{
2011-03-19 02:06:54 +02:00
if ( ourArt & & ! picked & & ourArt = = ourOwner - > curHero - > getArt ( slotID , false ) ) //last condition is needed for disassembling -> artifact may be gone, but we don't know yet TODO: real, nice solution
2011-01-22 05:43:20 +02:00
{
int graphic = locked ? 145 : ourArt - > artType - > id ;
blitAt ( graphics - > artDefs - > ourImages [ graphic ] . bitmap , pos . x , pos . y , to ) ;
}
2009-12-02 01:19:43 +02:00
2009-11-28 21:55:40 +02:00
if ( marked & & active )
2009-06-18 18:05:00 +03:00
{
2009-11-28 21:55:40 +02:00
// Draw vertical bars.
2010-07-20 09:05:45 +03:00
for ( int i = 0 ; i < pos . h ; + + i )
{
2009-11-28 21:55:40 +02:00
CSDL_Ext : : SDL_PutPixelWithoutRefresh ( to , pos . x , pos . y + i , 240 , 220 , 120 ) ;
CSDL_Ext : : SDL_PutPixelWithoutRefresh ( to , pos . x + pos . w - 1 , pos . y + i , 240 , 220 , 120 ) ;
}
// Draw horizontal bars.
2010-07-20 09:05:45 +03:00
for ( int i = 0 ; i < pos . w ; + + i )
{
2009-11-28 21:55:40 +02:00
CSDL_Ext : : SDL_PutPixelWithoutRefresh ( to , pos . x + i , pos . y , 240 , 220 , 120 ) ;
CSDL_Ext : : SDL_PutPixelWithoutRefresh ( to , pos . x + i , pos . y + pos . h - 1 , 240 , 220 , 120 ) ;
2009-06-18 18:05:00 +03:00
}
}
}
2009-11-28 21:55:40 +02:00
2010-12-29 23:04:22 +02:00
bool CArtPlace : : fitsHere ( const CArtifactInstance * art ) const
2009-06-18 18:05:00 +03:00
{
2009-11-28 21:55:40 +02:00
// You can place 'no artifact' anywhere.
2009-06-18 18:05:00 +03:00
if ( ! art )
2009-11-28 21:55:40 +02:00
return true ;
2009-12-30 17:33:28 +02:00
// Anything can but War Machines can be placed in backpack.
2010-02-08 23:17:22 +02:00
if ( slotID > = 19 )
2009-12-30 17:33:28 +02:00
return ! CGI - > arth - > isBigArtifact ( art - > id ) ;
2009-09-11 08:45:40 +03:00
2011-01-06 22:00:19 +02:00
return art - > canBePutAt ( ArtifactLocation ( ourOwner - > curHero , slotID ) , true ) ;
2009-06-18 18:05:00 +03:00
}
2009-11-28 21:55:40 +02:00
2009-06-18 18:05:00 +03:00
CArtPlace : : ~ CArtPlace ( )
{
deactivate ( ) ;
}
2010-12-29 23:04:22 +02:00
void CArtPlace : : setMeAsDest ( bool backpackAsVoid /*= true*/ )
{
2011-01-06 22:00:19 +02:00
ourOwner - > commonInfo - > dst . setTo ( this , backpackAsVoid ) ;
2010-12-29 23:04:22 +02:00
}
2011-01-15 04:17:56 +02:00
void CArtPlace : : setArtifact ( const CArtifactInstance * art )
{
2011-03-12 23:55:31 +02:00
baseType = - 1 ; //by default we don't store any component
2011-01-15 04:17:56 +02:00
ourArt = art ;
if ( ! art )
{
text = std : : string ( ) ;
hoverText = CGI - > generaltexth - > allTexts [ 507 ] ;
}
else
{
text = ourArt - > artType - > Description ( ) ;
2011-03-12 23:55:31 +02:00
if ( art - > artType - > id = = 1 ) //spell scroll
{
// we expect scroll description to be like this: This scroll contains the [spell name] spell which is added into your spell book for as long as you carry the scroll.
// so we want to replace text in [...] with a spell name
// however other language versions don't have name placeholder at all, so we have to be careful
int spellID = art - > getGivenSpellID ( ) ;
int nameStart = text . find_first_of ( ' [ ' ) ;
int nameEnd = text . find_first_of ( ' ] ' , nameStart ) ;
if ( spellID > = 0 )
{
if ( nameStart ! = std : : string : : npos & & nameEnd ! = std : : string : : npos )
text = text . replace ( nameStart , nameEnd - nameStart + 1 , CGI - > spellh - > spells [ spellID ] - > name ) ;
//add spell component info (used to provide a pic in r-click popup)
baseType = SComponent : : spell ;
type = spellID ;
bonusValue = 0 ;
}
}
2011-01-22 05:43:20 +02:00
if ( locked ) // Locks should appear as empty.
2011-01-15 04:17:56 +02:00
hoverText = CGI - > generaltexth - > allTexts [ 507 ] ;
else
hoverText = boost : : str ( boost : : format ( CGI - > generaltexth - > heroscrn [ 1 ] ) % ourArt - > artType - > Name ( ) ) ;
}
}
2010-01-28 18:15:46 +02:00
void HoverableArea : : hover ( bool on )
{
if ( on )
2010-02-15 08:54:57 +02:00
GH . statusbar - > print ( hoverText ) ;
else if ( GH . statusbar - > getCurrent ( ) = = hoverText )
GH . statusbar - > clear ( ) ;
2010-01-28 18:15:46 +02:00
}
2010-07-13 08:25:40 +03:00
HoverableArea : : HoverableArea ( )
2010-01-28 18:15:46 +02:00
{
2010-07-13 08:25:40 +03:00
used | = HOVER ;
2010-01-28 18:15:46 +02:00
}
2010-07-13 08:25:40 +03:00
HoverableArea : : ~ HoverableArea ( )
2010-01-28 18:15:46 +02:00
{
2009-06-18 18:05:00 +03:00
}
2009-08-11 19:05:33 +03:00
void LRClickableAreaWText : : clickLeft ( tribool down , bool previousState )
2009-06-18 18:05:00 +03:00
{
2009-08-11 19:05:33 +03:00
if ( ! down & & previousState )
2009-06-18 18:05:00 +03:00
{
2010-07-13 08:25:40 +03:00
LOCPLINT - > showInfoDialog ( text ) ;
2009-06-18 18:05:00 +03:00
}
}
2009-08-11 19:05:33 +03:00
void LRClickableAreaWText : : clickRight ( tribool down , bool previousState )
2009-06-18 18:05:00 +03:00
{
2010-03-21 00:17:19 +02:00
adventureInt - > handleRightClick ( text , down ) ;
2009-06-18 18:05:00 +03:00
}
2010-07-13 08:25:40 +03:00
LRClickableAreaWText : : LRClickableAreaWText ( )
2009-06-18 18:05:00 +03:00
{
2010-12-17 00:32:53 +02:00
init ( ) ;
}
LRClickableAreaWText : : LRClickableAreaWText ( const Rect & Pos , const std : : string & HoverText /*= ""*/ , const std : : string & ClickText /*= ""*/ )
{
init ( ) ;
pos = Pos + pos ;
hoverText = HoverText ;
text = ClickText ;
2009-06-18 18:05:00 +03:00
}
2010-07-13 08:25:40 +03:00
LRClickableAreaWText : : ~ LRClickableAreaWText ( )
2009-06-18 18:05:00 +03:00
{
}
2010-12-17 00:32:53 +02:00
void LRClickableAreaWText : : init ( )
{
used = LCLICK | RCLICK | HOVER ;
}
2009-08-11 19:05:33 +03:00
void LRClickableAreaWTextComp : : clickLeft ( tribool down , bool previousState )
2009-06-18 18:05:00 +03:00
{
2009-08-11 19:05:33 +03:00
if ( ( ! down ) & & previousState )
2009-06-18 18:05:00 +03:00
{
2011-03-12 23:55:31 +02:00
std : : vector < SComponent * > comp ( 1 , createComponent ( ) ) ;
2010-07-13 08:25:40 +03:00
LOCPLINT - > showInfoDialog ( text , comp ) ;
2009-06-18 18:05:00 +03:00
}
}
2010-12-17 00:32:53 +02:00
LRClickableAreaWTextComp : : LRClickableAreaWTextComp ( const Rect & Pos , int BaseType )
: LRClickableAreaWText ( Pos ) , baseType ( BaseType ) , bonusValue ( - 1 )
{
}
2011-03-12 23:55:31 +02:00
SComponent * LRClickableAreaWTextComp : : createComponent ( ) const
{
if ( baseType > = 0 )
return new SComponent ( SComponent : : Etype ( baseType ) , type , bonusValue ) ;
else
return NULL ;
}
void LRClickableAreaWTextComp : : clickRight ( tribool down , bool previousState )
{
if ( down )
{
if ( SComponent * comp = createComponent ( ) )
{
CRClickPopup : : createAndPush ( text , CInfoWindow : : TCompsInfo ( 1 , comp ) ) ;
return ;
}
}
LRClickableAreaWText : : clickRight ( down , previousState ) ; //only if with-component variant not occured
}
2010-07-22 03:32:45 +03:00
CHeroArea : : CHeroArea ( int x , int y , const CGHeroInstance * _hero ) : hero ( _hero )
{
used = LCLICK | RCLICK | HOVER ;
pos . x + = x ; pos . w = 58 ;
pos . y + = y ; pos . h = 64 ;
}
void CHeroArea : : clickLeft ( tribool down , bool previousState )
2010-02-04 17:50:59 +02:00
{
if ( ( ! down ) & & previousState & & hero )
LOCPLINT - > openHeroWindow ( hero ) ;
}
2010-07-22 03:32:45 +03:00
void CHeroArea : : clickRight ( tribool down , bool previousState )
2010-02-04 17:50:59 +02:00
{
if ( ( ! down ) & & previousState & & hero )
LOCPLINT - > openHeroWindow ( hero ) ;
}
2010-07-22 03:32:45 +03:00
void CHeroArea : : hover ( bool on )
{
if ( on & & hero )
GH . statusbar - > print ( hero - > hoverName ) ;
else
GH . statusbar - > clear ( ) ;
}
void CHeroArea : : showAll ( SDL_Surface * to )
{
2010-08-12 18:54:25 +03:00
if ( hero )
blitAtLoc ( graphics - > portraitLarge [ hero - > portrait ] , 0 , 0 , to ) ;
2010-07-22 03:32:45 +03:00
}
2010-02-04 17:50:59 +02:00
void LRClickableAreaOpenTown : : clickLeft ( tribool down , bool previousState )
{
if ( ( ! down ) & & previousState & & town )
2010-02-28 12:01:36 +02:00
{
2010-02-04 17:50:59 +02:00
LOCPLINT - > openTownWindow ( town ) ;
2010-02-28 12:01:36 +02:00
if ( type = = 2 )
2011-03-22 15:19:07 +02:00
LOCPLINT - > castleInt - > builds - > buildingClicked ( 10 ) ;
2010-02-28 12:01:36 +02:00
else if ( type = = 3 & & town - > fortLevel ( ) )
2011-03-22 15:19:07 +02:00
LOCPLINT - > castleInt - > builds - > buildingClicked ( 7 ) ;
2010-02-28 12:01:36 +02:00
}
2010-02-04 17:50:59 +02:00
}
void LRClickableAreaOpenTown : : clickRight ( tribool down , bool previousState )
{
if ( ( ! down ) & & previousState & & town )
2010-02-28 12:01:36 +02:00
LOCPLINT - > openTownWindow ( town ) ; //TODO: popup?
2010-02-04 17:50:59 +02:00
}
2010-12-17 00:32:53 +02:00
LRClickableAreaOpenTown : : LRClickableAreaOpenTown ( )
: LRClickableAreaWTextComp ( Rect ( 0 , 0 , 0 , 0 ) , - 1 )
{
}
2010-07-20 21:34:32 +03:00
void CArtifactsOfHero : : SCommonPart : : reset ( )
2009-06-18 18:05:00 +03:00
{
2011-01-06 22:00:19 +02:00
src . clear ( ) ;
dst . clear ( ) ;
2010-12-19 16:39:56 +02:00
CCS - > curh - > dragAndDropCursor ( NULL ) ;
2009-06-18 18:05:00 +03:00
}
void CArtifactsOfHero : : setHero ( const CGHeroInstance * hero )
{
2011-01-06 22:00:19 +02:00
// // An update is made, rather than initialization.
// if (curHero && curHero->id == hero->id)
// {
// if(curHero != hero)
// {
// //delete curHero;
// curHero = hero; //was: creating a copy
// }
//
// // Compensate backpack pos if an artifact was insertad before it.
// if (commonInfo->dst.slotID >= 19 && commonInfo->destAOH == this
// && commonInfo->dst.slotID - 19 < backpackPos)
// {
// backpackPos++;
// }
//
// if (updateState && commonInfo->srcAOH == this)
// {
// // A swap was made, make the replaced artifact the current selected.
// if (commonInfo->dst.slotID < 19 && commonInfo->destArtifact)
// {
// // // Temporarily remove artifact from hero.
// // if (commonInfo->srcSlotID < 19)
// // CGI->arth->unequipArtifact(curHero->artifWorn, commonInfo->srcSlotID);
// // else
// // curHero->artifacts.erase(curHero->artifacts.begin() + (commonInfo->srcSlotID - 19));
//
// updateParentWindow(); //TODO: evil! but does the thing
//
// // Source <- Dest
// commonInfo->srcArtifact = commonInfo->destArtifact;
//
// // Reset destination parameters.
// commonInfo->dst.clear();
//
// CCS->curh->dragAndDropCursor(graphics->artDefs->ourImages[commonInfo->srcArtifact->id].bitmap);
// markPossibleSlots(commonInfo->srcArtifact);
// }
// else if (commonInfo->destAOH != NULL)
// {
// // Reset all parameters.
// commonInfo->reset();
// unmarkSlots();
// }
// }
// }
// else
// {
// commonInfo->reset();
// }
//
// if(hero != curHero)
// {
// // delete curHero;
// // curHero = new CGHeroInstance(*hero);
// curHero = hero; //was: creating a copy
// }
2009-06-18 18:05:00 +03:00
2011-01-06 22:00:19 +02:00
curHero = hero ;
2011-01-18 20:56:14 +02:00
if ( curHero - > artifactsInBackpack . size ( ) > 0 )
backpackPos % = curHero - > artifactsInBackpack . size ( ) ;
2009-11-28 21:55:40 +02:00
else
backpackPos = 0 ;
2009-06-18 18:05:00 +03:00
2009-12-02 01:19:43 +02:00
// Fill the slots for worn artifacts and backpack.
2011-04-23 13:27:44 +03:00
for ( int g = 0 ; g < artWorn . size ( ) ; g + + )
2009-11-28 21:55:40 +02:00
setSlotData ( artWorn [ g ] , g ) ;
2009-12-02 01:19:43 +02:00
scrollBackpack ( 0 ) ;
}
2009-11-28 21:55:40 +02:00
2009-06-18 18:05:00 +03:00
void CArtifactsOfHero : : dispose ( )
{
2010-12-17 00:32:53 +02:00
//delNull(curHero);
2010-10-31 21:56:37 +02:00
unmarkSlots ( false ) ;
2010-12-19 16:39:56 +02:00
CCS - > curh - > dragAndDropCursor ( NULL ) ;
2009-06-18 18:05:00 +03:00
}
void CArtifactsOfHero : : scrollBackpack ( int dir )
{
2011-01-15 04:17:56 +02:00
int artsInBackpack = curHero - > artifactsInBackpack . size ( ) ;
2009-11-28 21:55:40 +02:00
backpackPos + = dir ;
2011-01-15 04:17:56 +02:00
if ( backpackPos < 0 ) // No guarantee of modulus behavior with negative operands -> we keep it positive
backpackPos + = artsInBackpack ;
2009-06-18 18:05:00 +03:00
2011-01-15 04:17:56 +02:00
if ( artsInBackpack )
backpackPos % = artsInBackpack ;
std : : multiset < const CArtifactInstance * > toOmit = artifactsOnAltar ;
if ( commonInfo - > src . art ) //if we picked an art from backapck, its slot has to be omitted
toOmit . insert ( commonInfo - > src . art ) ;
int omitedSoFar = 0 ;
2010-07-23 15:02:15 +03:00
2009-11-28 21:55:40 +02:00
//set new data
2010-07-23 15:02:15 +03:00
size_t s = 0 ;
2011-01-15 04:17:56 +02:00
for ( ; s < artsInBackpack ; + + s )
2010-07-20 21:34:32 +03:00
{
2010-07-23 15:02:15 +03:00
2011-01-15 04:17:56 +02:00
if ( s < artsInBackpack )
2010-07-23 15:02:15 +03:00
{
2011-01-15 04:17:56 +02:00
int slotID = 19 + ( s + backpackPos ) % artsInBackpack ;
2010-12-29 23:04:22 +02:00
const CArtifactInstance * art = curHero - > getArt ( slotID ) ;
2010-07-23 15:02:15 +03:00
assert ( art ) ;
2011-01-15 04:17:56 +02:00
if ( ! vstd : : contains ( toOmit , art ) )
{
if ( s - omitedSoFar < 5 )
setSlotData ( backpack [ s - omitedSoFar ] , slotID ) ;
2010-07-23 15:02:15 +03:00
}
else
{
2011-01-15 04:17:56 +02:00
toOmit - = art ;
omitedSoFar + + ;
2010-07-23 15:02:15 +03:00
continue ;
}
}
2009-11-28 21:55:40 +02:00
}
2011-01-15 04:17:56 +02:00
for ( ; s - omitedSoFar < 5 ; s + + )
eraseSlotData ( backpack [ s - omitedSoFar ] , 19 + s ) ;
2010-07-23 15:02:15 +03:00
2011-04-23 00:51:10 +03:00
//in artifact merchant selling artifacts we may have highlight on one of backpack artifacts -> market needs update, cause artifact under highlight changed
if ( highlightModeCallback )
{
for ( int i = 0 ; i < 5 ; i + + )
{
if ( backpack [ i ] - > marked )
{
highlightModeCallback ( backpack [ i ] ) ;
break ;
}
}
}
2010-07-23 15:02:15 +03:00
//blocking scrolling if there is not enough artifacts to scroll
2011-01-15 04:17:56 +02:00
bool scrollingPossible = artsInBackpack - omitedSoFar > backpack . size ( ) ;
leftArtRoll - > block ( ! scrollingPossible ) ;
rightArtRoll - > block ( ! scrollingPossible ) ;
2010-07-23 15:02:15 +03:00
safeRedraw ( ) ;
2009-11-28 21:55:40 +02:00
}
/**
* Marks possible slots where a given artifact can be placed , except backpack .
*
* @ param art Artifact checked against .
*/
2010-12-29 23:04:22 +02:00
void CArtifactsOfHero : : markPossibleSlots ( const CArtifactInstance * art )
2009-11-28 21:55:40 +02:00
{
2011-01-06 22:00:19 +02:00
BOOST_FOREACH ( CArtifactsOfHero * aoh , commonInfo - > participants )
BOOST_FOREACH ( CArtPlace * place , aoh - > artWorn )
place - > marked = art - > canBePutAt ( ArtifactLocation ( aoh - > curHero , place - > slotID ) , true ) ;
2010-07-23 15:02:15 +03:00
safeRedraw ( ) ;
2009-11-28 21:55:40 +02:00
}
/**
* Unamarks all slots .
*/
2010-10-31 21:56:37 +02:00
void CArtifactsOfHero : : unmarkSlots ( bool withRedraw /*= true*/ )
2009-11-28 21:55:40 +02:00
{
2011-01-15 04:17:56 +02:00
if ( commonInfo )
BOOST_FOREACH ( CArtifactsOfHero * aoh , commonInfo - > participants )
2011-04-23 00:51:10 +03:00
aoh - > unmarkLocalSlots ( false ) ;
2011-01-15 04:17:56 +02:00
else
2011-04-23 00:51:10 +03:00
unmarkLocalSlots ( false ) ; \
if ( withRedraw )
safeRedraw ( ) ;
}
void CArtifactsOfHero : : unmarkLocalSlots ( bool withRedraw /*= true*/ )
{
BOOST_FOREACH ( CArtPlace * place , artWorn )
place - > marked = false ;
BOOST_FOREACH ( CArtPlace * place , backpack )
place - > marked = false ;
2010-07-23 15:02:15 +03:00
2010-10-31 21:56:37 +02:00
if ( withRedraw )
safeRedraw ( ) ;
2009-11-28 21:55:40 +02:00
}
/**
* Assigns an artifacts to an artifact place depending on it ' s new slot ID .
*/
2011-01-06 22:00:19 +02:00
void CArtifactsOfHero : : setSlotData ( CArtPlace * artPlace , int slotID )
2009-11-28 21:55:40 +02:00
{
2011-01-15 04:17:56 +02:00
if ( ! artPlace & & slotID > = Arts : : BACKPACK_START ) //spurious call from artifactMoved in attempt to update hidden backpack slot
2010-07-20 21:34:32 +03:00
{
2011-01-15 04:17:56 +02:00
return ;
2009-06-18 18:05:00 +03:00
}
2011-01-15 04:17:56 +02:00
artPlace - > picked = false ;
artPlace - > slotID = slotID ;
2011-01-22 05:43:20 +02:00
if ( const ArtSlotInfo * asi = curHero - > getSlot ( slotID ) )
{
artPlace - > setArtifact ( asi - > artifact ) ;
artPlace - > locked = asi - > locked ;
}
else
artPlace - > setArtifact ( NULL ) ;
2011-01-15 04:17:56 +02:00
}
2009-06-18 18:05:00 +03:00
2009-11-28 21:55:40 +02:00
/**
* Makes given artifact slot appear as empty with a certain slot ID .
*/
void CArtifactsOfHero : : eraseSlotData ( CArtPlace * artPlace , int slotID )
{
2011-01-15 04:17:56 +02:00
artPlace - > picked = false ;
2009-11-28 21:55:40 +02:00
artPlace - > slotID = slotID ;
2011-01-15 04:17:56 +02:00
artPlace - > setArtifact ( NULL ) ;
2009-11-28 21:55:40 +02:00
}
2011-04-23 13:27:44 +03:00
CArtifactsOfHero : : CArtifactsOfHero ( std : : vector < CArtPlace * > ArtWorn , std : : vector < CArtPlace * > Backpack ,
AdventureMapButton * leftScroll , AdventureMapButton * rightScroll , bool createCommonPart ) :
curHero ( NULL ) ,
artWorn ( ArtWorn ) , backpack ( Backpack ) ,
backpackPos ( 0 ) , commonInfo ( NULL ) , updateState ( false ) ,
leftArtRoll ( leftScroll ) , rightArtRoll ( rightScroll ) ,
allowedAssembling ( true ) , highlightModeCallback ( 0 )
{
if ( createCommonPart )
{
commonInfo = new CArtifactsOfHero : : SCommonPart ;
commonInfo - > participants . insert ( this ) ;
}
// Init slots for worn artifacts.
for ( size_t g = 0 ; g < artWorn . size ( ) ; g + + )
{
artWorn [ g ] - > ourOwner = this ;
eraseSlotData ( artWorn [ g ] , g ) ;
}
// Init slots for the backpack.
for ( size_t s = 0 ; s < backpack . size ( ) ; + + s )
{
backpack [ s ] - > ourOwner = this ;
eraseSlotData ( backpack [ s ] , 19 + s ) ;
}
}
2010-12-17 00:32:53 +02:00
CArtifactsOfHero : : CArtifactsOfHero ( const Point & position , bool createCommonPart /*= false*/ )
2011-04-23 00:51:10 +03:00
: curHero ( NULL ) , backpackPos ( 0 ) , commonInfo ( NULL ) , updateState ( false ) , allowedAssembling ( true ) , highlightModeCallback ( 0 )
2009-06-18 18:05:00 +03:00
{
2010-12-17 00:32:53 +02:00
if ( createCommonPart )
{
commonInfo = new CArtifactsOfHero : : SCommonPart ;
commonInfo - > participants . insert ( this ) ;
}
2010-07-20 21:34:32 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2010-07-20 09:05:45 +03:00
pos + = position ;
2009-06-18 18:05:00 +03:00
artWorn . resize ( 19 ) ;
2009-06-19 15:10:36 +03:00
2010-07-20 21:34:32 +03:00
std : : vector < Rect > slotPos ;
slotPos + = genRect ( 44 , 44 , 509 , 30 ) , genRect ( 44 , 44 , 567 , 240 ) , genRect ( 44 , 44 , 509 , 80 ) ,
genRect ( 44 , 44 , 383 , 68 ) , genRect ( 44 , 44 , 564 , 183 ) , genRect ( 44 , 44 , 509 , 130 ) ,
genRect ( 44 , 44 , 431 , 68 ) , genRect ( 44 , 44 , 610 , 183 ) , genRect ( 44 , 44 , 515 , 295 ) ,
genRect ( 44 , 44 , 383 , 143 ) , genRect ( 44 , 44 , 399 , 194 ) , genRect ( 44 , 44 , 415 , 245 ) ,
genRect ( 44 , 44 , 431 , 296 ) , genRect ( 44 , 44 , 564 , 30 ) , genRect ( 44 , 44 , 610 , 30 ) ,
genRect ( 44 , 44 , 610 , 76 ) , genRect ( 44 , 44 , 610 , 122 ) , genRect ( 44 , 44 , 610 , 310 ) ,
genRect ( 44 , 44 , 381 , 296 ) ;
2009-12-02 01:19:43 +02:00
// Create slots for worn artifacts.
2011-04-23 13:27:44 +03:00
for ( size_t g = 0 ; g < 19 ; g + + )
{
2009-12-02 01:19:43 +02:00
artWorn [ g ] = new CArtPlace ( NULL ) ;
2010-07-20 21:34:32 +03:00
artWorn [ g ] - > pos = slotPos [ g ] + pos ;
2009-12-02 01:19:43 +02:00
artWorn [ g ] - > ourOwner = this ;
eraseSlotData ( artWorn [ g ] , g ) ;
}
// Create slots for the backpack.
for ( size_t s = 0 ; s < 5 ; + + s )
{
CArtPlace * add = new CArtPlace ( NULL ) ;
add - > ourOwner = this ;
add - > pos . x = pos . x + 403 + 46 * s ;
add - > pos . y = pos . y + 365 ;
add - > pos . h = add - > pos . w = 44 ;
eraseSlotData ( add , 19 + s ) ;
backpack . push_back ( add ) ;
}
2010-07-20 21:34:32 +03:00
leftArtRoll = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CArtifactsOfHero : : scrollBackpack , this , - 1 ) , 379 , 364 , " hsbtns3.def " , SDLK_LEFT ) ;
rightArtRoll = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CArtifactsOfHero : : scrollBackpack , this , + 1 ) , 632 , 364 , " hsbtns5.def " , SDLK_RIGHT ) ;
2009-06-18 18:05:00 +03:00
}
CArtifactsOfHero : : ~ CArtifactsOfHero ( )
{
2009-06-19 15:10:36 +03:00
dispose ( ) ;
2009-06-18 18:05:00 +03:00
}
2010-07-21 22:50:15 +03:00
void CArtifactsOfHero : : updateParentWindow ( )
{
if ( CHeroWindow * chw = dynamic_cast < CHeroWindow * > ( GH . topInt ( ) ) )
{
if ( updateState )
chw - > curHero = curHero ;
else
2011-01-06 22:00:19 +02:00
chw - > update ( curHero , true ) ;
2010-07-21 22:50:15 +03:00
}
else if ( CExchangeWindow * cew = dynamic_cast < CExchangeWindow * > ( GH . topInt ( ) ) )
{
//use our copy of hero to draw window
if ( cew - > heroInst [ 0 ] - > id = = curHero - > id )
cew - > heroInst [ 0 ] = curHero ;
else
cew - > heroInst [ 1 ] = curHero ;
if ( ! updateState )
{
cew - > deactivate ( ) ;
2011-02-27 21:58:14 +02:00
// for(int g=0; g<ARRAY_COUNT(cew->heroInst); ++g)
// {
// if(cew->heroInst[g] == curHero)
// {
// cew->artifs[g]->setHero(curHero);
// }
// }
2010-07-21 22:50:15 +03:00
cew - > prepareBackground ( ) ;
2011-02-27 21:58:14 +02:00
cew - > redraw ( ) ;
2010-07-21 22:50:15 +03:00
cew - > activate ( ) ;
}
}
}
2010-07-23 15:02:15 +03:00
void CArtifactsOfHero : : safeRedraw ( )
{
if ( parent )
parent - > redraw ( ) ;
else
redraw ( ) ;
}
2010-12-29 23:04:22 +02:00
void CArtifactsOfHero : : realizeCurrentTransaction ( )
{
2011-01-06 22:00:19 +02:00
assert ( commonInfo - > src . AOH ) ;
assert ( commonInfo - > dst . AOH ) ;
LOCPLINT - > cb - > swapArtifacts ( commonInfo - > src . AOH - > curHero , commonInfo - > src . slotID ,
commonInfo - > dst . AOH - > curHero , commonInfo - > dst . slotID ) ;
}
void CArtifactsOfHero : : artifactMoved ( const ArtifactLocation & src , const ArtifactLocation & dst )
{
2011-01-24 01:49:17 +02:00
if ( src . hero = = curHero & & src . slot > = Arts : : BACKPACK_START )
2011-04-23 00:51:10 +03:00
updateSlot ( src . slot ) ;
2011-01-24 01:49:17 +02:00
if ( dst . hero = = curHero & & dst . slot > = Arts : : BACKPACK_START )
2011-04-23 00:51:10 +03:00
updateSlot ( dst . slot ) ;
2011-01-24 01:49:17 +02:00
if ( src . hero = = curHero | | dst . hero = = curHero ) //we need to update all slots, artifact might be combined and affect more slots
2011-02-27 21:58:14 +02:00
updateWornSlots ( false ) ;
2011-01-06 22:00:19 +02:00
if ( commonInfo - > src = = src ) //artifact was taken from us
{
assert ( commonInfo - > dst = = dst | | dst . slot = = dst . hero - > artifactsInBackpack . size ( ) + Arts : : BACKPACK_START ) ;
commonInfo - > reset ( ) ;
unmarkSlots ( ) ;
2011-02-27 21:58:14 +02:00
updateParentWindow ( ) ;
2011-01-06 22:00:19 +02:00
}
else if ( commonInfo - > dst = = src ) //the dest artifact was moved -> we are picking it
{
assert ( dst . slot > = Arts : : BACKPACK_START ) ;
commonInfo - > reset ( ) ;
CArtPlace * ap = NULL ;
BOOST_FOREACH ( CArtifactsOfHero * aoh , commonInfo - > participants )
{
if ( aoh - > curHero = = dst . hero )
{
commonInfo - > src . AOH = aoh ;
2011-02-20 11:24:53 +02:00
if ( ( ap = aoh - > getArtPlace ( dst . slot ) ) )
2011-01-06 22:00:19 +02:00
break ;
}
}
if ( ap )
{
ap - > select ( ) ;
}
else
{
2011-01-18 20:56:14 +02:00
commonInfo - > src . art = dst . getArt ( ) ;
commonInfo - > src . slotID = dst . slot ;
2011-01-06 22:00:19 +02:00
assert ( commonInfo - > src . AOH ) ;
2011-01-18 20:56:14 +02:00
CCS - > curh - > dragAndDropCursor ( graphics - > artDefs - > ourImages [ dst . getArt ( ) - > artType - > id ] . bitmap ) ;
2011-01-06 22:00:19 +02:00
markPossibleSlots ( dst . getArt ( ) ) ;
2011-03-19 02:06:54 +02:00
updateParentWindow ( ) ;
2011-01-06 22:00:19 +02:00
}
}
2011-01-18 20:56:14 +02:00
else if ( src . slot > = Arts : : BACKPACK_START & & src . slot < commonInfo - > src . slotID & & src . hero = = commonInfo - > src . AOH - > curHero ) //artifact taken from before currently picked one
{
2011-03-20 00:27:05 +02:00
//int fixedSlot = src.hero->getArtPos(commonInfo->src.art);
2011-01-18 20:56:14 +02:00
commonInfo - > src . slotID - - ;
assert ( commonInfo - > src . valid ( ) ) ;
2011-03-19 02:06:54 +02:00
updateParentWindow ( ) ;
2011-01-18 20:56:14 +02:00
}
2011-01-06 22:00:19 +02:00
else
{
tlog1 < < " Unexpected artifact movement... \n " ;
}
2011-01-15 04:17:56 +02:00
2011-01-28 04:11:58 +02:00
int shift = 0 ;
// if(dst.slot >= Arts::BACKPACK_START && dst.slot - Arts::BACKPACK_START < backpackPos)
// shift++;
//
if ( src . slot < Arts : : BACKPACK_START & & dst . slot - Arts : : BACKPACK_START < backpackPos )
shift + + ;
if ( dst . slot < Arts : : BACKPACK_START & & src . slot - Arts : : BACKPACK_START < backpackPos )
shift - - ;
2011-03-20 00:27:05 +02:00
if ( ( src . hero = = curHero & & src . slot > = Arts : : BACKPACK_START )
| | ( dst . hero = = curHero & & dst . slot > = Arts : : BACKPACK_START ) )
2011-01-28 04:11:58 +02:00
scrollBackpack ( shift ) ; //update backpack slots
2011-01-06 22:00:19 +02:00
}
2011-04-23 00:51:10 +03:00
void CArtifactsOfHero : : artifactRemoved ( const ArtifactLocation & al )
{
if ( al . hero = = curHero )
{
if ( al . slot < Arts : : BACKPACK_START )
updateWornSlots ( 0 ) ;
else
scrollBackpack ( 0 ) ; //update backpack slots
}
}
2011-01-06 22:00:19 +02:00
CArtPlace * CArtifactsOfHero : : getArtPlace ( int slot )
{
if ( slot < Arts : : BACKPACK_START )
{
return artWorn [ slot ] ;
}
else
{
BOOST_FOREACH ( CArtPlace * ap , backpack )
if ( ap - > slotID = = slot )
return ap ;
}
return NULL ;
2010-12-29 23:04:22 +02:00
}
2011-01-24 01:49:17 +02:00
void CArtifactsOfHero : : artifactAssembled ( const ArtifactLocation & al )
{
if ( al . hero = = curHero )
updateWornSlots ( ) ;
}
void CArtifactsOfHero : : artifactDisassembled ( const ArtifactLocation & al )
{
if ( al . hero = = curHero )
updateWornSlots ( ) ;
}
2011-02-27 21:58:14 +02:00
void CArtifactsOfHero : : updateWornSlots ( bool redrawParent /*= true*/ )
2011-01-24 01:49:17 +02:00
{
for ( int i = 0 ; i < Arts : : BACKPACK_START ; i + + )
2011-04-23 00:51:10 +03:00
updateSlot ( i ) ;
2011-01-24 01:49:17 +02:00
2011-02-27 21:58:14 +02:00
if ( redrawParent )
updateParentWindow ( ) ;
}
const CGHeroInstance * CArtifactsOfHero : : getHero ( ) const
{
return curHero ;
2011-01-24 01:49:17 +02:00
}
2011-04-23 00:51:10 +03:00
void CArtifactsOfHero : : updateSlot ( int slotID )
{
setSlotData ( getArtPlace ( slotID ) , slotID ) ;
}
2009-06-16 14:18:14 +03:00
void CExchangeWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-06-16 14:18:14 +03:00
}
void CExchangeWindow : : activate ( )
{
quit - > activate ( ) ;
2009-06-28 11:21:50 +03:00
garr - > activate ( ) ;
2009-06-18 18:05:00 +03:00
2011-02-27 21:58:14 +02:00
//artifs[0]->setHero(heroInst[0]);
2009-06-19 15:10:36 +03:00
artifs [ 0 ] - > activate ( ) ;
2011-02-27 21:58:14 +02:00
//artifs[1]->setHero(heroInst[1]);
2009-06-19 15:10:36 +03:00
artifs [ 1 ] - > activate ( ) ;
for ( int g = 0 ; g < ARRAY_COUNT ( secSkillAreas ) ; g + + )
{
for ( int b = 0 ; b < secSkillAreas [ g ] . size ( ) ; + + b )
{
secSkillAreas [ g ] [ b ] - > activate ( ) ;
}
}
for ( int b = 0 ; b < primSkillAreas . size ( ) ; + + b )
primSkillAreas [ b ] - > activate ( ) ;
2010-02-15 08:54:57 +02:00
GH . statusbar = ourBar ;
2009-06-19 15:10:36 +03:00
for ( int g = 0 ; g < ARRAY_COUNT ( questlogButton ) ; g + + )
questlogButton [ g ] - > activate ( ) ;
2009-06-26 18:41:19 +03:00
for ( int g = 0 ; g < ARRAY_COUNT ( morale ) ; g + + )
morale [ g ] - > activate ( ) ;
for ( int g = 0 ; g < ARRAY_COUNT ( luck ) ; g + + )
luck [ g ] - > activate ( ) ;
2010-02-01 01:30:47 +02:00
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( portrait ) ; g + + )
2010-02-01 01:30:47 +02:00
portrait [ g ] - > activate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( spellPoints ) ; g + + )
2010-02-01 01:30:47 +02:00
spellPoints [ g ] - > activate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( experience ) ; g + + )
2010-02-01 01:30:47 +02:00
experience [ g ] - > activate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( speciality ) ; g + + )
2010-02-01 01:30:47 +02:00
speciality [ g ] - > activate ( ) ;
2009-06-16 14:18:14 +03:00
}
void CExchangeWindow : : deactivate ( )
{
quit - > deactivate ( ) ;
2009-06-28 11:21:50 +03:00
garr - > deactivate ( ) ;
2009-06-18 18:05:00 +03:00
2009-06-19 15:10:36 +03:00
artifs [ 0 ] - > deactivate ( ) ;
artifs [ 1 ] - > deactivate ( ) ;
for ( int g = 0 ; g < ARRAY_COUNT ( secSkillAreas ) ; g + + )
{
for ( int b = 0 ; b < secSkillAreas [ g ] . size ( ) ; + + b )
{
secSkillAreas [ g ] [ b ] - > deactivate ( ) ;
}
}
for ( int b = 0 ; b < primSkillAreas . size ( ) ; + + b )
primSkillAreas [ b ] - > deactivate ( ) ;
for ( int g = 0 ; g < ARRAY_COUNT ( questlogButton ) ; g + + )
questlogButton [ g ] - > deactivate ( ) ;
2009-06-26 18:41:19 +03:00
for ( int g = 0 ; g < ARRAY_COUNT ( morale ) ; g + + )
morale [ g ] - > deactivate ( ) ;
for ( int g = 0 ; g < ARRAY_COUNT ( luck ) ; g + + )
2010-02-01 01:30:47 +02:00
luck [ g ] - > deactivate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( portrait ) ; g + + )
2010-02-01 01:30:47 +02:00
portrait [ g ] - > deactivate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( spellPoints ) ; g + + )
2010-02-01 01:30:47 +02:00
spellPoints [ g ] - > deactivate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( experience ) ; g + + )
2010-02-01 01:30:47 +02:00
experience [ g ] - > deactivate ( ) ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( speciality ) ; g + + )
speciality [ g ] - > deactivate ( ) ;
2009-06-16 14:18:14 +03:00
}
void CExchangeWindow : : show ( SDL_Surface * to )
{
blitAt ( bg , pos , to ) ;
2011-02-20 11:24:53 +02:00
quit - > showAll ( to ) ;
2009-06-16 14:18:14 +03:00
//printing border around window
if ( screen - > w ! = 800 | | screen - > h ! = 600 )
CMessage : : drawBorder ( LOCPLINT - > playerID , to , 828 , 628 , pos . x - 14 , pos . y - 15 ) ;
2009-06-18 18:05:00 +03:00
2010-07-23 15:02:15 +03:00
artifs [ 0 ] - > showAll ( to ) ;
artifs [ 1 ] - > showAll ( to ) ;
2009-06-19 15:10:36 +03:00
2011-02-24 15:57:47 +02:00
ourBar - > showAll ( to ) ;
2009-06-19 15:10:36 +03:00
for ( int g = 0 ; g < ARRAY_COUNT ( secSkillAreas ) ; g + + )
{
2011-02-24 15:57:47 +02:00
questlogButton [ g ] - > showAll ( to ) ; //FIXME: for array count(secondary skill) show quest log button? WTF?
2009-06-19 15:10:36 +03:00
}
2009-06-28 11:21:50 +03:00
2011-02-24 15:57:47 +02:00
garr - > showAll ( to ) ;
2009-06-19 15:10:36 +03:00
}
void CExchangeWindow : : questlog ( int whichHero )
{
2010-12-19 16:39:56 +02:00
CCS - > curh - > dragAndDropCursor ( NULL ) ;
2009-06-16 14:18:14 +03:00
}
2009-06-28 16:49:39 +03:00
void CExchangeWindow : : prepareBackground ( )
2009-06-16 14:18:14 +03:00
{
2009-06-28 16:49:39 +03:00
if ( bg )
SDL_FreeSurface ( bg ) ;
2009-06-18 18:05:00 +03:00
2009-06-17 12:38:03 +03:00
SDL_Surface * bgtemp ; //loaded as 8bpp surface
bgtemp = BitmapHandler : : loadBitmap ( " TRADE2.BMP " ) ;
2009-06-19 15:10:36 +03:00
graphics - > blueToPlayersAdv ( bgtemp , heroInst [ 0 ] - > tempOwner ) ;
2009-06-17 12:38:03 +03:00
bg = SDL_ConvertSurface ( bgtemp , screen - > format , screen - > flags ) ; //to 24 bpp
SDL_FreeSurface ( bgtemp ) ;
//printing heroes' names and levels
std : : ostringstream os , os2 ;
2009-06-19 15:10:36 +03:00
os < < heroInst [ 0 ] - > name < < " , Level " < < heroInst [ 0 ] - > level < < " " < < heroInst [ 0 ] - > type - > heroClass - > name ;
2010-02-02 18:24:53 +02:00
CSDL_Ext : : printAtMiddle ( os . str ( ) , 147 , 25 , FONT_SMALL , zwykly , bg ) ;
2009-06-19 15:10:36 +03:00
os2 < < heroInst [ 1 ] - > name < < " , Level " < < heroInst [ 1 ] - > level < < " " < < heroInst [ 1 ] - > type - > heroClass - > name ;
2010-02-02 18:24:53 +02:00
CSDL_Ext : : printAtMiddle ( os2 . str ( ) , 653 , 25 , FONT_SMALL , zwykly , bg ) ;
2009-06-17 12:38:03 +03:00
2009-06-19 15:10:36 +03:00
//printing primary skills
2009-06-17 12:38:03 +03:00
CDefHandler * skilldef = CDefHandler : : giveDef ( " PSKIL32.DEF " ) ;
for ( int g = 0 ; g < 4 ; + + g )
{
2009-06-19 15:10:36 +03:00
//graphics
2009-06-17 12:38:03 +03:00
blitAt ( skilldef - > ourImages [ g ] . bitmap , genRect ( 32 , 32 , 385 , 19 + 36 * g ) , bg ) ;
}
2009-06-17 19:46:16 +03:00
2009-06-19 15:10:36 +03:00
CDefHandler * un32 = CDefHandler : : giveDef ( " UN32.DEF " ) ;
//heroes related thing
for ( int b = 0 ; b < ARRAY_COUNT ( heroInst ) ; b + + )
2009-06-17 19:46:16 +03:00
{
2011-02-27 21:58:14 +02:00
CHeroWithMaybePickedArtifact heroWArt = CHeroWithMaybePickedArtifact ( this , heroInst [ b ] ) ;
2009-06-17 19:46:16 +03:00
//printing primary skills' amounts
for ( int m = 0 ; m < 4 ; + + m )
{
std : : ostringstream primarySkill ;
2011-02-27 21:58:14 +02:00
primarySkill < < heroWArt . getPrimSkillLevel ( m ) ;
2010-02-02 18:24:53 +02:00
CSDL_Ext : : printAtMiddle ( primarySkill . str ( ) , 352 + 93 * b , 35 + 36 * m , FONT_SMALL , zwykly , bg ) ;
2009-06-17 19:46:16 +03:00
}
//printing secondary skills
2009-06-19 15:10:36 +03:00
for ( int m = 0 ; m < heroInst [ b ] - > secSkills . size ( ) ; + + m )
2009-06-17 19:46:16 +03:00
{
2009-07-27 20:55:56 +03:00
blitAt ( graphics - > abils32 - > ourImages [ heroInst [ b ] - > secSkills [ m ] . first * 3 + heroInst [ b ] - > secSkills [ m ] . second + 2 ] . bitmap , genRect ( 32 , 32 , 32 + 36 * m + 454 * b , 88 ) , bg ) ;
2009-06-17 19:46:16 +03:00
}
2009-06-19 15:10:36 +03:00
2009-06-28 16:49:39 +03:00
//hero's specialty
blitAt ( un32 - > ourImages [ heroInst [ b ] - > subID ] . bitmap , 67 + 490 * b , 45 , bg ) ;
//experience
blitAt ( skilldef - > ourImages [ 4 ] . bitmap , 103 + 490 * b , 45 , bg ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( makeNumberShort ( heroInst [ b ] - > exp ) , 119 + 490 * b , 71 , FONT_SMALL , zwykly , bg ) ;
2009-06-28 16:49:39 +03:00
//mana points
blitAt ( skilldef - > ourImages [ 5 ] . bitmap , 139 + 490 * b , 45 , bg ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( makeNumberShort ( heroInst [ b ] - > mana ) , 155 + 490 * b , 71 , FONT_SMALL , zwykly , bg ) ;
2009-06-28 16:49:39 +03:00
//setting morale
2011-02-27 21:58:14 +02:00
blitAt ( graphics - > morale30 - > ourImages [ heroWArt . MoraleVal ( ) + 3 ] . bitmap , 177 + 490 * b , 45 , bg ) ;
2009-06-28 16:49:39 +03:00
//setting luck
2011-02-27 21:58:14 +02:00
blitAt ( graphics - > luck30 - > ourImages [ heroWArt . LuckVal ( ) + 3 ] . bitmap , 213 + 490 * b , 45 , bg ) ;
2009-06-28 16:49:39 +03:00
}
//printing portraits
blitAt ( graphics - > portraitLarge [ heroInst [ 0 ] - > portrait ] , 257 , 13 , bg ) ;
blitAt ( graphics - > portraitLarge [ heroInst [ 1 ] - > portrait ] , 485 , 13 , bg ) ;
delete un32 ;
delete skilldef ;
}
CExchangeWindow : : CExchangeWindow ( si32 hero1 , si32 hero2 ) : bg ( NULL )
{
char bufor [ 400 ] ;
heroInst [ 0 ] = LOCPLINT - > cb - > getHeroInfo ( hero1 , 2 ) ;
heroInst [ 1 ] = LOCPLINT - > cb - > getHeroInfo ( hero2 , 2 ) ;
2009-07-27 20:55:56 +03:00
prepareBackground ( ) ;
pos . x = screen - > w / 2 - bg - > w / 2 ;
pos . y = screen - > h / 2 - bg - > h / 2 ;
pos . w = screen - > w ;
pos . h = screen - > h ;
2011-01-15 04:17:56 +02:00
2010-07-20 09:05:45 +03:00
artifs [ 0 ] = new CArtifactsOfHero ( Point ( pos . x + - 334 , pos . y + 150 ) ) ;
2009-07-26 18:37:27 +03:00
artifs [ 0 ] - > commonInfo = new CArtifactsOfHero : : SCommonPart ;
2009-11-28 21:55:40 +02:00
artifs [ 0 ] - > commonInfo - > participants . insert ( artifs [ 0 ] ) ;
artifs [ 0 ] - > setHero ( heroInst [ 0 ] ) ;
2010-07-20 09:05:45 +03:00
artifs [ 1 ] = new CArtifactsOfHero ( Point ( pos . x + 96 , pos . y + 150 ) ) ;
2009-07-26 18:37:27 +03:00
artifs [ 1 ] - > commonInfo = artifs [ 0 ] - > commonInfo ;
2009-11-28 21:55:40 +02:00
artifs [ 1 ] - > commonInfo - > participants . insert ( artifs [ 1 ] ) ;
2009-06-28 16:49:39 +03:00
artifs [ 1 ] - > setHero ( heroInst [ 1 ] ) ;
2011-01-15 04:17:56 +02:00
artSets . push_back ( artifs [ 0 ] ) ;
artSets . push_back ( artifs [ 1 ] ) ;
2009-06-28 16:49:39 +03:00
//primary skills
for ( int g = 0 ; g < 4 ; + + g )
{
//primary skill's clickable areas
primSkillAreas . push_back ( new LRClickableAreaWTextComp ( ) ) ;
2010-02-01 01:22:25 +02:00
primSkillAreas [ g ] - > pos = genRect ( 32 , 140 , pos . x + 329 , pos . y + 19 + 36 * g ) ;
2009-06-28 16:49:39 +03:00
primSkillAreas [ g ] - > text = CGI - > generaltexth - > arraytxt [ 2 + g ] ;
primSkillAreas [ g ] - > type = g ;
2010-07-13 08:25:40 +03:00
primSkillAreas [ g ] - > bonusValue = - 1 ;
2010-02-01 01:30:47 +02:00
primSkillAreas [ g ] - > baseType = 0 ;
2010-02-01 01:22:25 +02:00
sprintf ( bufor , CGI - > generaltexth - > heroscrn [ 1 ] . c_str ( ) , CGI - > generaltexth - > primarySkillNames [ g ] . c_str ( ) ) ;
primSkillAreas [ g ] - > hoverText = std : : string ( bufor ) ;
2009-06-28 16:49:39 +03:00
}
//heroes related thing
for ( int b = 0 ; b < ARRAY_COUNT ( heroInst ) ; b + + )
{
2009-06-19 15:10:36 +03:00
//secondary skill's clickable areas
for ( int g = 0 ; g < heroInst [ b ] - > secSkills . size ( ) ; + + g )
{
2009-11-13 18:02:25 +02:00
int skill = heroInst [ b ] - > secSkills [ g ] . first ,
level = heroInst [ b ] - > secSkills [ g ] . second ; // <1, 3>
2009-06-19 15:10:36 +03:00
secSkillAreas [ b ] . push_back ( new LRClickableAreaWTextComp ( ) ) ;
secSkillAreas [ b ] [ g ] - > pos = genRect ( 32 , 32 , pos . x + 32 + g * 36 + b * 454 , pos . y + 88 ) ;
secSkillAreas [ b ] [ g ] - > baseType = 1 ;
2009-11-13 18:02:25 +02:00
secSkillAreas [ b ] [ g ] - > type = skill ;
2010-07-13 08:25:40 +03:00
secSkillAreas [ b ] [ g ] - > bonusValue = level ;
2009-11-13 18:02:25 +02:00
secSkillAreas [ b ] [ g ] - > text = CGI - > generaltexth - > skillInfoTexts [ skill ] [ level - 1 ] ;
2009-06-19 15:10:36 +03:00
2009-11-13 18:02:25 +02:00
sprintf ( bufor , CGI - > generaltexth - > heroscrn [ 21 ] . c_str ( ) , CGI - > generaltexth - > levels [ level - 1 ] . c_str ( ) , CGI - > generaltexth - > skillName [ skill ] . c_str ( ) ) ;
2009-06-19 15:10:36 +03:00
secSkillAreas [ b ] [ g ] - > hoverText = std : : string ( bufor ) ;
}
2010-02-01 01:30:47 +02:00
2010-07-22 03:32:45 +03:00
portrait [ b ] = new CHeroArea ( pos . x + 257 + 228 * b , pos . y + 13 , heroInst [ b ] ) ;
2010-02-01 01:30:47 +02:00
2010-02-01 01:22:25 +02:00
speciality [ b ] = new LRClickableAreaWText ( ) ;
speciality [ b ] - > pos = genRect ( 32 , 32 , pos . x + 69 + 490 * b , pos . y + 45 ) ;
2010-02-01 01:30:47 +02:00
speciality [ b ] - > hoverText = CGI - > generaltexth - > heroscrn [ 27 ] ;
speciality [ b ] - > text = CGI - > generaltexth - > hTxts [ heroInst [ b ] - > subID ] . longBonus ;
2010-02-01 01:22:25 +02:00
experience [ b ] = new LRClickableAreaWText ( ) ;
experience [ b ] - > pos = genRect ( 32 , 32 , pos . x + 105 + 490 * b , pos . y + 45 ) ;
2010-02-01 01:30:47 +02:00
experience [ b ] - > hoverText = CGI - > generaltexth - > heroscrn [ 9 ] ;
2010-02-01 01:22:25 +02:00
experience [ b ] - > text = CGI - > generaltexth - > allTexts [ 2 ] . c_str ( ) ;
boost : : replace_first ( experience [ b ] - > text , " %d " , boost : : lexical_cast < std : : string > ( heroInst [ b ] - > level ) ) ;
boost : : replace_first ( experience [ b ] - > text , " %d " , boost : : lexical_cast < std : : string > ( CGI - > heroh - > reqExp ( heroInst [ b ] - > level + 1 ) ) ) ;
2010-02-01 01:30:47 +02:00
boost : : replace_first ( experience [ b ] - > text , " %d " , boost : : lexical_cast < std : : string > ( heroInst [ b ] - > exp ) ) ;
2010-02-01 01:22:25 +02:00
spellPoints [ b ] = new LRClickableAreaWText ( ) ;
spellPoints [ b ] - > pos = genRect ( 32 , 32 , pos . x + 141 + 490 * b , pos . y + 45 ) ;
2010-02-01 01:30:47 +02:00
spellPoints [ b ] - > hoverText = CGI - > generaltexth - > heroscrn [ 22 ] ;
sprintf ( bufor , CGI - > generaltexth - > allTexts [ 205 ] . c_str ( ) , heroInst [ b ] - > name . c_str ( ) , heroInst [ b ] - > mana , heroInst [ b ] - > manaLimit ( ) ) ;
spellPoints [ b ] - > text = std : : string ( bufor ) ;
2009-06-19 15:10:36 +03:00
2009-06-26 18:41:19 +03:00
//setting morale
2010-12-17 00:32:53 +02:00
morale [ b ] = new MoraleLuckBox ( true , genRect ( 32 , 32 , pos . x + 177 + 490 * b , pos . y + 45 ) ) ;
2010-07-13 08:25:40 +03:00
morale [ b ] - > set ( heroInst [ b ] ) ;
2009-06-26 18:41:19 +03:00
//setting luck
2010-12-17 00:32:53 +02:00
luck [ b ] = new MoraleLuckBox ( false , genRect ( 32 , 32 , pos . x + 213 + 490 * b , pos . y + 45 ) ) ;
2010-07-13 08:25:40 +03:00
luck [ b ] - > set ( heroInst [ b ] ) ;
2009-06-17 19:46:16 +03:00
}
2009-06-17 12:38:03 +03:00
//buttons
2009-06-16 14:18:14 +03:00
quit = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CExchangeWindow : : close , this ) , pos . x + 732 , pos . y + 567 , " IOKAY.DEF " , SDLK_RETURN ) ;
2009-06-19 15:10:36 +03:00
questlogButton [ 0 ] = new AdventureMapButton ( CGI - > generaltexth - > heroscrn [ 0 ] , std : : string ( ) , boost : : bind ( & CExchangeWindow : : questlog , this , 0 ) , pos . x + 10 , pos . y + 44 , " hsbtns4.def " ) ;
questlogButton [ 1 ] = new AdventureMapButton ( CGI - > generaltexth - > heroscrn [ 0 ] , std : : string ( ) , boost : : bind ( & CExchangeWindow : : questlog , this , 1 ) , pos . x + 740 , pos . y + 44 , " hsbtns4.def " ) ;
//statusbar
ourBar = new CStatusBar ( pos . x + 3 , pos . y + 577 , " TSTATBAR.bmp " , 726 ) ;
2009-06-28 11:21:50 +03:00
//garrison interface
2009-09-11 08:45:40 +03:00
garr = new CGarrisonInt ( pos . x + 69 , pos . y + 131 , 4 , Point ( 418 , 0 ) , bg , Point ( 69 , 131 ) , heroInst [ 0 ] , heroInst [ 1 ] , true , true ) ;
2009-08-01 22:25:12 +03:00
2010-08-27 19:20:35 +03:00
garr - > addSplitBtn ( new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 3 ] , " " , boost : : bind ( & CGarrisonInt : : splitClick , garr ) , pos . x + 10 , pos . y + 132 , " TSBTNS.DEF " ) ) ;
garr - > addSplitBtn ( new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 3 ] , " " , boost : : bind ( & CGarrisonInt : : splitClick , garr ) , pos . x + 740 , pos . y + 132 , " TSBTNS.DEF " ) ) ;
2009-06-16 14:18:14 +03:00
}
CExchangeWindow : : ~ CExchangeWindow ( ) //d-tor
{
SDL_FreeSurface ( bg ) ;
delete quit ;
2009-07-26 18:37:27 +03:00
//warning: don't experiment with these =NULL lines, they prevent heap corruption!
delete artifs [ 0 ] - > commonInfo ;
artifs [ 0 ] - > commonInfo = NULL ;
2009-06-19 15:10:36 +03:00
delete artifs [ 0 ] ;
2009-07-26 18:37:27 +03:00
artifs [ 1 ] - > commonInfo = NULL ;
2009-06-19 15:10:36 +03:00
delete artifs [ 1 ] ;
2009-06-28 11:21:50 +03:00
delete garr ;
2009-06-19 15:10:36 +03:00
delete ourBar ;
for ( int g = 0 ; g < ARRAY_COUNT ( secSkillAreas ) ; g + + )
{
for ( int b = 0 ; b < secSkillAreas [ g ] . size ( ) ; + + b )
{
delete secSkillAreas [ g ] [ b ] ;
}
}
for ( int b = 0 ; b < primSkillAreas . size ( ) ; + + b )
{
delete primSkillAreas [ b ] ;
}
for ( int g = 0 ; g < ARRAY_COUNT ( questlogButton ) ; g + + )
{
delete questlogButton [ g ] ;
}
2009-06-26 18:41:19 +03:00
for ( int g = 0 ; g < ARRAY_COUNT ( morale ) ; g + + )
delete morale [ g ] ;
for ( int g = 0 ; g < ARRAY_COUNT ( luck ) ; g + + )
delete luck [ g ] ;
2010-02-01 01:30:47 +02:00
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( portrait ) ; g + + )
2010-02-01 01:30:47 +02:00
delete portrait [ g ] ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( spellPoints ) ; g + + )
2010-02-01 01:30:47 +02:00
delete spellPoints [ g ] ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( experience ) ; g + + )
2010-02-01 01:30:47 +02:00
delete experience [ g ] ;
2010-02-01 01:22:25 +02:00
for ( int g = 0 ; g < ARRAY_COUNT ( speciality ) ; g + + )
delete speciality [ g ] ;
2009-06-18 18:05:00 +03:00
}
2009-07-26 06:33:13 +03:00
void CShipyardWindow : : activate ( )
{
build - > activate ( ) ;
quit - > activate ( ) ;
}
void CShipyardWindow : : deactivate ( )
{
build - > deactivate ( ) ;
quit - > deactivate ( ) ;
}
void CShipyardWindow : : show ( SDL_Surface * to )
{
blitAt ( bg , pos , to ) ;
2011-04-07 20:54:08 +03:00
Rect clipRect = genRect ( 64 , 96 , pos . x + 110 , pos . y + 85 ) ;
CSDL_Ext : : blit8bppAlphaTo24bpp ( graphics - > boatAnims [ boat ] - > ourImages [ 21 + frame + + / 8 % 8 ] . bitmap , NULL , to , & clipRect ) ;
2011-02-20 11:24:53 +02:00
build - > showAll ( to ) ;
quit - > showAll ( to ) ;
2009-07-26 06:33:13 +03:00
}
CShipyardWindow : : ~ CShipyardWindow ( )
{
delete build ;
delete quit ;
}
2009-06-18 18:05:00 +03:00
2010-02-13 06:47:31 +02:00
CShipyardWindow : : CShipyardWindow ( const std : : vector < si32 > & cost , int state , int boatType , const boost : : function < void ( ) > & onBuy )
2009-07-26 06:33:13 +03:00
{
2010-02-13 06:47:31 +02:00
boat = boatType ;
2009-07-26 06:33:13 +03:00
frame = 0 ;
SDL_Surface * bgtemp ; //loaded as 8bpp surface
bgtemp = BitmapHandler : : loadBitmap ( " TPSHIP.bmp " ) ;
pos . x = screen - > w / 2 - bgtemp - > w / 2 ;
pos . y = screen - > h / 2 - bgtemp - > h / 2 ;
pos . w = bgtemp - > w ;
pos . h = bgtemp - > h ;
SDL_SetColorKey ( bgtemp , SDL_SRCCOLORKEY , SDL_MapRGB ( bgtemp - > format , 0 , 255 , 255 ) ) ;
graphics - > blueToPlayersAdv ( bgtemp , LOCPLINT - > playerID ) ;
bg = SDL_ConvertSurface ( bgtemp , screen - > format , screen - > flags ) ; //to 24 bpp
SDL_FreeSurface ( bgtemp ) ;
bgtemp = BitmapHandler : : loadBitmap ( " TPSHIPBK.bmp " ) ;
blitAt ( bgtemp , 100 , 69 , bg ) ;
SDL_FreeSurface ( bgtemp ) ;
2009-08-17 20:19:09 +03:00
// Draw resource icons and costs.
std : : string goldCost = boost : : lexical_cast < std : : string > ( 1000 ) ;
2009-08-19 18:47:00 +03:00
std : : string woodCost = boost : : lexical_cast < std : : string > ( 10 ) ;
blitAt ( graphics - > resources32 - > ourImages [ 6 ] . bitmap , 100 , 244 , bg ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( goldCost . c_str ( ) , 118 , 294 , FONT_SMALL , zwykly , bg ) ;
2009-08-19 18:47:00 +03:00
blitAt ( graphics - > resources32 - > ourImages [ 0 ] . bitmap , 196 , 244 , bg ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( woodCost . c_str ( ) , 212 , 294 , FONT_SMALL , zwykly , bg ) ;
2009-08-17 20:19:09 +03:00
2009-07-26 06:33:13 +03:00
bool affordable = true ;
for ( int i = 0 ; i < cost . size ( ) ; i + + )
{
if ( cost [ i ] > LOCPLINT - > cb - > getResourceAmount ( i ) )
{
affordable = false ;
break ;
}
}
2009-08-07 01:36:51 +03:00
quit = new AdventureMapButton ( CGI - > generaltexth - > allTexts [ 599 ] , " " , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , pos . x + 224 , pos . y + 312 , " ICANCEL.DEF " , SDLK_RETURN ) ;
build = new AdventureMapButton ( CGI - > generaltexth - > allTexts [ 598 ] , " " , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , pos . x + 42 , pos . y + 312 , " IBY6432.DEF " , SDLK_RETURN ) ;
2009-07-26 06:33:13 +03:00
build - > callback + = onBuy ;
if ( ! affordable )
build - > block ( true ) ;
2010-02-02 18:24:53 +02:00
printAtMiddle ( CGI - > generaltexth - > jktexts [ 13 ] , 164 , 27 , FONT_BIG , tytulowy , bg ) ; //Build A New Ship
printAtMiddle ( CGI - > generaltexth - > jktexts [ 14 ] , 164 , 220 , FONT_MEDIUM , zwykly , bg ) ; //Resource cost:
2009-07-26 06:33:13 +03:00
}
2009-08-31 18:57:15 +03:00
2010-02-10 04:56:00 +02:00
CPuzzleWindow : : CPuzzleWindow ( const int3 & grailPos , float discoveredRatio )
2009-08-31 18:57:15 +03:00
: animCount ( 0 )
{
SDL_Surface * back = BitmapHandler : : loadBitmap ( " PUZZLE.BMP " , false ) ;
2009-09-05 13:23:29 +03:00
graphics - > blueToPlayersAdv ( back , LOCPLINT - > playerID ) ;
2009-08-31 18:57:15 +03:00
//make transparency black
back - > format - > palette - > colors [ 0 ] . b = back - > format - > palette - > colors [ 0 ] . r = back - > format - > palette - > colors [ 0 ] . g = 0 ;
//the rest
background = SDL_ConvertSurface ( back , screen - > format , back - > flags ) ;
SDL_FreeSurface ( back ) ;
pos = genRect ( background - > h , background - > w , ( conf . cc . resx - background - > w ) / 2 , ( conf . cc . resy - background - > h ) / 2 ) ;
quitb = new AdventureMapButton ( CGI - > generaltexth - > allTexts [ 599 ] , " " , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , pos . x + 670 , pos . y + 538 , " IOK6432.DEF " , SDLK_RETURN ) ;
2011-03-19 02:06:54 +02:00
quitb - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2009-09-05 13:23:29 +03:00
resdatabar = new CResDataBar ( " ZRESBAR.bmp " , pos . x + 3 , pos . y + 575 , 32 , 2 , 85 , 85 ) ;
2009-08-31 18:57:15 +03:00
resdatabar - > pos . x = pos . x + 3 ; resdatabar - > pos . y = pos . y + 575 ;
2010-02-18 16:09:16 +02:00
//printing necessary things to background
int3 moveInt = int3 ( 8 , 9 , 0 ) ;
2011-02-20 11:24:53 +02:00
Rect mapRect = genRect ( 544 , 591 , 8 , 8 ) ;
2009-08-31 18:57:15 +03:00
CGI - > mh - > terrainRect
2010-02-20 15:24:38 +02:00
( grailPos - moveInt , adventureInt - > anim ,
& LOCPLINT - > cb - > getVisibilityMap ( ) , true , adventureInt - > heroAnim ,
2011-02-23 20:21:51 +02:00
background , & mapRect , 0 , 0 , true , moveInt ) ;
2010-02-18 16:09:16 +02:00
2010-08-03 14:36:52 +03:00
int faction = LOCPLINT - > cb - > getStartInfo ( ) - > playerInfos . find ( LOCPLINT - > playerID ) - > second . castle ;
2009-08-31 18:57:15 +03:00
std : : vector < SPuzzleInfo > puzzlesToPrint ;
for ( int g = 0 ; g < PUZZLES_PER_FACTION ; + + g )
{
2010-02-10 04:56:00 +02:00
if ( CGI - > heroh - > puzzleInfo [ faction ] [ g ] . whenUncovered > PUZZLES_PER_FACTION * discoveredRatio )
2009-08-31 18:57:15 +03:00
{
puzzlesToPrint . push_back ( CGI - > heroh - > puzzleInfo [ faction ] [ g ] ) ;
}
else
{
SDL_Surface * buf = BitmapHandler : : loadBitmap ( CGI - > heroh - > puzzleInfo [ faction ] [ g ] . filename ) ;
puzzlesToPullBack . push_back ( std : : make_pair ( buf , & CGI - > heroh - > puzzleInfo [ faction ] [ g ] ) ) ;
}
}
for ( int b = 0 ; b < puzzlesToPrint . size ( ) ; + + b )
{
SDL_Surface * puzzle = BitmapHandler : : loadBitmap ( puzzlesToPrint [ b ] . filename ) ;
blitAt ( puzzle , puzzlesToPrint [ b ] . x , puzzlesToPrint [ b ] . y , background ) ;
SDL_FreeSurface ( puzzle ) ;
}
}
CPuzzleWindow : : ~ CPuzzleWindow ( )
{
delete quitb ;
delete resdatabar ;
SDL_FreeSurface ( background ) ;
for ( int g = 0 ; g < puzzlesToPullBack . size ( ) ; + + g )
SDL_FreeSurface ( puzzlesToPullBack [ g ] . first ) ;
}
void CPuzzleWindow : : activate ( )
{
quitb - > activate ( ) ;
}
void CPuzzleWindow : : deactivate ( )
{
quitb - > deactivate ( ) ;
}
void CPuzzleWindow : : show ( SDL_Surface * to )
{
blitAt ( background , pos . x , pos . y , to ) ;
2011-02-20 11:24:53 +02:00
quitb - > showAll ( to ) ;
2009-08-31 18:57:15 +03:00
resdatabar - > draw ( to ) ;
//blitting disappearing puzzles
for ( int g = 0 ; g < 2 ; + + g )
if ( animCount ! = 255 )
+ + animCount ;
if ( animCount ! = 255 )
{
for ( int b = 0 ; b < puzzlesToPullBack . size ( ) ; + + b )
{
2009-09-05 13:23:29 +03:00
int xPos = puzzlesToPullBack [ b ] . second - > x + pos . x ,
yPos = puzzlesToPullBack [ b ] . second - > y + pos . y ;
2009-08-31 18:57:15 +03:00
SDL_Surface * from = puzzlesToPullBack [ b ] . first ;
SDL_SetAlpha ( from , SDL_SRCALPHA , 255 - animCount ) ;
blitAt ( from , xPos , yPos , to ) ;
}
}
//disappearing puzzles blitted
2009-09-05 13:23:29 +03:00
//printing border around window
if ( screen - > w ! = 800 | | screen - > h ! = 600 )
CMessage : : drawBorder ( LOCPLINT - > playerID , to , 828 , 628 , pos . x - 14 , pos . y - 15 ) ;
2009-08-31 18:57:15 +03:00
}
2009-09-21 12:00:33 +03:00
2010-07-03 15:00:53 +03:00
void CTransformerWindow : : CItem : : showAll ( SDL_Surface * to )
{
SDL_Surface * backgr = graphics - > bigImgs [ parent - > army - > getCreature ( id ) - > idNumber ] ;
blitAt ( backgr , pos . x , pos . y , to ) ;
printAtMiddle ( boost : : lexical_cast < std : : string > ( size ) , pos . x + 28 , pos . y + 76 , FONT_SMALL , zwykly , to ) ; //stack size
}
void CTransformerWindow : : CItem : : move ( )
{
if ( left )
pos . x + = 289 ;
else
pos . x - = 289 ;
left = ! left ;
}
void CTransformerWindow : : CItem : : clickLeft ( tribool down , bool previousState )
{
if ( previousState & & ( ! down ) )
{
move ( ) ;
parent - > showAll ( screen2 ) ;
}
}
CTransformerWindow : : CItem : : CItem ( CTransformerWindow * _parent , int _size , int _id ) :
2010-08-27 19:20:35 +03:00
id ( _id ) , size ( _size ) , parent ( _parent )
2010-07-03 15:00:53 +03:00
{
used = LCLICK ;
2010-07-20 09:05:45 +03:00
left = true ;
2010-07-03 15:00:53 +03:00
pos . w = 58 ;
pos . h = 64 ;
pos . x + = 45 + ( id % 3 ) * 83 + id / 6 * 83 ;
pos . y + = 109 + ( id / 3 ) * 98 ;
}
CTransformerWindow : : CItem : : ~ CItem ( )
{
}
void CTransformerWindow : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
printAtMiddleLoc ( CGI - > generaltexth - > allTexts [ 485 ] , 153 , 29 , FONT_SMALL , tytulowy , to ) ; //holding area
printAtMiddleLoc ( CGI - > generaltexth - > allTexts [ 486 ] , 153 + 295 , 29 , FONT_SMALL , tytulowy , to ) ; //transformer
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 487 ] , 153 , 75 , FONT_MEDIUM , 32 , tytulowy , to ) ; //move creatures to create skeletons
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 488 ] , 153 + 295 , 75 , FONT_MEDIUM , 32 , tytulowy , to ) ; //creatures here will become skeletons
}
void CTransformerWindow : : makeDeal ( )
{
for ( int i = 0 ; i < items . size ( ) ; i + + )
if ( ! items [ i ] - > left )
LOCPLINT - > cb - > trade ( town , CREATURE_UNDEAD , items [ i ] - > id , 0 , 0 , hero ) ;
}
void CTransformerWindow : : addAll ( )
{
for ( int i = 0 ; i < items . size ( ) ; i + + )
if ( items [ i ] - > left )
items [ i ] - > move ( ) ;
showAll ( screen2 ) ;
}
CTransformerWindow : : CTransformerWindow ( const CGHeroInstance * _hero , const CGTownInstance * _town ) : hero ( _hero ) , town ( _town )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
bg = new CPicture ( " SKTRNBK.PCX " ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
2010-07-07 05:29:07 +03:00
pos = center ( bg - > pos ) ;
2010-07-03 15:00:53 +03:00
if ( hero )
army = hero ;
else
army = town ;
for ( int i = 0 ; i < 7 ; i + + )
if ( army - > getCreature ( i ) )
2010-11-27 03:46:19 +02:00
items . push_back ( new CItem ( this , army - > getStackCount ( i ) , i ) ) ;
2010-07-03 15:00:53 +03:00
all = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 590 ] , boost : : bind ( & CTransformerWindow : : addAll , this ) , 146 , 416 , " ALTARMY.DEF " , SDLK_a ) ;
convert = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 591 ] , boost : : bind ( & CTransformerWindow : : makeDeal , this ) , 269 , 416 , " ALTSACR.DEF " , SDLK_RETURN ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 592 ] , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 392 , 416 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
2010-07-07 05:29:07 +03:00
bar = new CGStatusBar ( 304 , 469 ) ;
2010-07-03 15:00:53 +03:00
}
CTransformerWindow : : ~ CTransformerWindow ( )
{
}
2010-07-20 17:08:13 +03:00
void CUniversityWindow : : CItem : : clickLeft ( tribool down , bool previousState )
{
if ( previousState & & ( ! down ) )
{
if ( state ( ) ! = 2 )
return ;
CUnivConfirmWindow * win = new CUnivConfirmWindow ( parent , ID , LOCPLINT - > cb - > getResourceAmount ( 6 ) > = 2000 ) ;
GH . pushInt ( win ) ;
}
}
void CUniversityWindow : : CItem : : clickRight ( tribool down , bool previousState )
{
if ( down )
{
CInfoPopup * message = new CInfoPopup ( ) ;
message - > free = true ;
message - > bitmap = CMessage : : drawBoxTextBitmapSub
( LOCPLINT - > playerID ,
CGI - > generaltexth - > skillInfoTexts [ ID ] [ 0 ] ,
graphics - > abils82 - > ourImages [ ID * 3 + 3 ] . bitmap ,
CGI - > generaltexth - > skillName [ ID ] ) ;
message - > pos . x = screen - > w / 2 - message - > bitmap - > w / 2 ;
message - > pos . y = screen - > h / 2 - message - > bitmap - > h / 2 ;
GH . pushInt ( message ) ;
}
}
void CUniversityWindow : : CItem : : hover ( bool on )
{
if ( on )
GH . statusbar - > print ( CGI - > generaltexth - > skillName [ ID ] ) ;
else
GH . statusbar - > clear ( ) ;
}
int CUniversityWindow : : CItem : : state ( )
{
2010-12-23 22:18:10 +02:00
if ( parent - > hero - > getSecSkillLevel ( static_cast < CGHeroInstance : : SecondarySkill > ( ID ) ) ) //hero know this skill
2010-07-20 17:08:13 +03:00
return 1 ;
if ( parent - > hero - > secSkills . size ( ) > = SKILL_PER_HERO ) //can't learn more skills
return 0 ;
2010-07-22 03:32:45 +03:00
if ( parent - > hero - > type - > heroClass - > proSec [ ID ] = = 0 ) //can't learn this skill (like necromancy for most of non-necros)
return 0 ;
2010-07-20 17:08:13 +03:00
/* if (LOCPLINT->cb->getResourceAmount(6) < 2000 )//no gold - allowed in H3, confirm button is blocked instead
return 0 ; */
return 2 ;
}
void CUniversityWindow : : CItem : : showAll ( SDL_Surface * to )
{
2010-08-06 16:14:10 +03:00
CPicture * bar ;
2010-07-20 17:08:13 +03:00
switch ( state ( ) )
{
case 0 : bar = parent - > red ;
break ;
case 1 : bar = parent - > yellow ;
break ;
case 2 : bar = parent - > green ;
break ;
2011-01-01 22:26:39 +02:00
default : bar = NULL ;
break ;
2010-07-20 17:08:13 +03:00
}
2011-01-01 22:26:39 +02:00
assert ( bar ) ;
2010-07-20 17:08:13 +03:00
2010-08-06 16:14:10 +03:00
blitAtLoc ( bar - > bg , - 28 , - 22 , to ) ;
blitAtLoc ( bar - > bg , - 28 , 48 , to ) ;
2010-07-20 17:08:13 +03:00
printAtMiddleLoc ( CGI - > generaltexth - > skillName [ ID ] , 22 , - 13 , FONT_SMALL , zwykly , to ) ; //Name
printAtMiddleLoc ( CGI - > generaltexth - > levels [ 0 ] , 22 , 57 , FONT_SMALL , zwykly , to ) ; //Level(always basic)
CPicture : : showAll ( to ) ;
}
2010-08-27 19:20:35 +03:00
CUniversityWindow : : CItem : : CItem ( CUniversityWindow * _parent , int _ID , int X , int Y ) :
CPicture ( graphics - > abils44 - > ourImages [ _ID * 3 + 3 ] . bitmap , X , Y , false ) , ID ( _ID ) , parent ( _parent )
2010-07-20 17:08:13 +03:00
{
used = LCLICK | RCLICK | HOVER ;
}
CUniversityWindow : : CUniversityWindow ( const CGHeroInstance * _hero , const IMarket * _market ) : hero ( _hero ) , market ( _market )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
bg = new CPicture ( " UNIVERS1.PCX " ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
2010-08-06 16:14:10 +03:00
green = new CPicture ( " UNIVGREN.PCX " ) ;
yellow = new CPicture ( " UNIVGOLD.PCX " ) ; //bars
red = new CPicture ( " UNIVRED.PCX " ) ;
green - > recActions =
yellow - > recActions =
red - > recActions = DISPOSE ;
2010-07-20 17:08:13 +03:00
if ( market - > o - > ID = = 104 ) // this is adventure map university
{
SDL_Surface * titleImage = BitmapHandler : : loadBitmap ( " UNIVBLDG.PCX " ) ;
blitAtLoc ( titleImage , 232 - titleImage - > w / 2 , 76 - titleImage - > h / 2 , bg - > bg ) ;
SDL_FreeSurface ( titleImage ) ;
}
else if ( LOCPLINT - > castleInt & & LOCPLINT - > castleInt - > town - > subID = = 8 ) // this is town university
{
SDL_Surface * titleImage = LOCPLINT - > castleInt - > bicons - > ourImages [ 21 ] . bitmap ;
blitAtLoc ( titleImage , 232 - titleImage - > w / 2 , 76 - titleImage - > h / 2 , bg - > bg ) ;
}
else
tlog0 < < " Error: Image for university was not found! \n " ; //This should not happen
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 603 ] , 232 , 153 , FONT_SMALL , 70 , zwykly , bg - > bg ) ; //Clerk speech
printAtMiddleLoc ( CGI - > generaltexth - > allTexts [ 602 ] , 231 , 26 , FONT_MEDIUM , tytulowy , bg - > bg ) ; //University
std : : vector < int > list = market - > availableItemsIds ( RESOURCE_SKILL ) ;
if ( list . size ( ) ! = 4 )
tlog0 < < " \t \t Incorrect size of available items vector! \n " ;
for ( int i = 0 ; i < list . size ( ) ; i + + ) //prepare clickable items
items . push_back ( new CItem ( this , list [ i ] , pos . x + 54 + i * 104 , pos . y + 234 ) ) ;
pos = center ( bg - > pos ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 632 ] ,
boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 200 , 313 , " IOKAY.DEF " , SDLK_RETURN ) ;
bar = new CGStatusBar ( 232 , 371 ) ;
}
CUniversityWindow : : ~ CUniversityWindow ( )
{
2010-08-06 16:14:10 +03:00
2010-07-20 17:08:13 +03:00
}
CUnivConfirmWindow : : CUnivConfirmWindow ( CUniversityWindow * PARENT , int SKILL , bool available ) : parent ( PARENT )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
bg = new CPicture ( " UNIVERS2.PCX " ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
std : : string text = CGI - > generaltexth - > allTexts [ 608 ] ;
boost : : replace_first ( text , " %s " , CGI - > generaltexth - > levels [ 0 ] ) ;
boost : : replace_first ( text , " %s " , CGI - > generaltexth - > skillName [ SKILL ] ) ;
boost : : replace_first ( text , " %d " , " 2000 " ) ;
printAtMiddleWBLoc ( text , 230 , 163 , FONT_SMALL , 65 , zwykly , bg - > bg ) ; //Clerk speech
printAtMiddleLoc ( CGI - > generaltexth - > skillName [ SKILL ] , 230 , 37 , FONT_SMALL , zwykly , bg - > bg ) ; //Skill name
printAtMiddleLoc ( CGI - > generaltexth - > levels [ 1 ] , 230 , 107 , FONT_SMALL , zwykly , bg - > bg ) ; //Skill level
printAtMiddleLoc ( " 2000 " , 230 , 267 , FONT_SMALL , zwykly , bg - > bg ) ; //Cost
blitAtLoc ( graphics - > abils44 - > ourImages [ SKILL * 3 + 3 ] . bitmap , 211 , 51 , bg - > bg ) ; //skill
blitAtLoc ( graphics - > resources32 - > ourImages [ 6 ] . bitmap , 210 , 210 , bg - > bg ) ; //gold
pos = center ( bg - > pos ) ;
std : : string hoverText = CGI - > generaltexth - > allTexts [ 609 ] ;
boost : : replace_first ( hoverText , " %s " , CGI - > generaltexth - > levels [ 0 ] + " " + CGI - > generaltexth - > skillName [ SKILL ] ) ;
text = CGI - > generaltexth - > zelp [ 633 ] . second ;
boost : : replace_first ( text , " %s " , CGI - > generaltexth - > levels [ 0 ] ) ;
boost : : replace_first ( text , " %s " , CGI - > generaltexth - > skillName [ SKILL ] ) ;
boost : : replace_first ( text , " %d " , " 2000 " ) ;
confirm = new AdventureMapButton ( hoverText , text , boost : : bind ( & CUnivConfirmWindow : : makeDeal , this , SKILL ) ,
148 , 299 , " IBY6432.DEF " , SDLK_RETURN ) ;
confirm - > block ( ! available ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 631 ] , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) ,
252 , 299 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
bar = new CGStatusBar ( 232 , 371 ) ;
}
void CUnivConfirmWindow : : makeDeal ( int skill )
{
LOCPLINT - > cb - > trade ( parent - > market - > o , RESOURCE_SKILL , 6 , skill , 1 , parent - > hero ) ;
GH . popIntTotally ( this ) ;
}
2010-07-22 03:32:45 +03:00
CHillFortWindow : : CHillFortWindow ( const CGHeroInstance * visitor , const CGObjectInstance * object ) :
2010-08-27 19:20:35 +03:00
fort ( object ) , hero ( visitor )
2010-07-22 03:32:45 +03:00
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
slotsCount = 7 ;
resources = CDefHandler : : giveDefEss ( " SMALRES.DEF " ) ;
bg = new CPicture ( " APHLFTBK.PCX " ) ;
bg - > colorizeAndConvert ( LOCPLINT - > playerID ) ;
printAtMiddleLoc ( fort - > hoverName , 325 , 32 , FONT_BIG , tytulowy , bg - > bg ) ; //Hill Fort
pos = center ( bg - > pos ) ;
heroPic = new CHeroArea ( 30 , 60 , hero ) ;
currState . resize ( slotsCount + 1 ) ;
costs . resize ( slotsCount ) ;
totalSumm . resize ( RESOURCE_QUANTITY ) ;
2011-02-20 11:24:53 +02:00
std : : vector < std : : string > files ;
files + = " APHLF1R.DEF " , " APHLF1Y.DEF " , " APHLF1G.DEF " ;
2010-07-22 03:32:45 +03:00
for ( int i = 0 ; i < slotsCount ; i + + )
{
currState [ i ] = getState ( i ) ;
2011-02-20 11:24:53 +02:00
upgrade [ i ] = new AdventureMapButton ( getTextForSlot ( i ) , " " , boost : : bind ( & CHillFortWindow : : makeDeal , this , i ) ,
107 + i * 76 , 171 , " " , SDLK_1 + i , & files ) ;
2010-07-22 03:32:45 +03:00
upgrade [ i ] - > block ( currState [ i ] = = - 1 ) ;
}
2011-02-20 11:24:53 +02:00
files . clear ( ) ;
files + = " APHLF4R.DEF " , " APHLF4Y.DEF " , " APHLF4G.DEF " ;
2010-07-22 03:32:45 +03:00
currState [ slotsCount ] = getState ( slotsCount ) ;
2011-02-20 11:24:53 +02:00
upgradeAll = new AdventureMapButton ( CGI - > generaltexth - > allTexts [ 432 ] , " " , boost : : bind ( & CHillFortWindow : : makeDeal , this , slotsCount ) ,
30 , 231 , " " , SDLK_0 , & files ) ;
2010-07-22 03:32:45 +03:00
quit = new AdventureMapButton ( " " , " " , boost : : bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 294 , 275 , " IOKAY.DEF " , SDLK_RETURN ) ;
bar = new CGStatusBar ( 327 , 332 ) ;
2010-08-27 19:20:35 +03:00
2010-11-18 15:34:21 +02:00
garr = new CGarrisonInt ( 108 , 60 , 18 , Point ( ) , bg - > bg , Point ( 108 , 60 ) , hero , NULL ) ;
2010-07-22 03:32:45 +03:00
updateGarrisons ( ) ;
}
CHillFortWindow : : ~ CHillFortWindow ( )
{
2010-11-18 15:34:21 +02:00
2010-07-22 03:32:45 +03:00
}
void CHillFortWindow : : activate ( )
{
CIntObject : : activate ( ) ;
GH . statusbar = bar ;
}
void CHillFortWindow : : updateGarrisons ( )
{
for ( int i = 0 ; i < RESOURCE_QUANTITY ; i + + )
totalSumm [ i ] = 0 ;
for ( int i = 0 ; i < slotsCount ; i + + )
{
costs [ i ] . clear ( ) ;
int newState = getState ( i ) ;
if ( newState ! = - 1 )
{
UpgradeInfo info = LOCPLINT - > cb - > getUpgradeInfo ( hero , i ) ;
if ( info . newID . size ( ) ) //we have upgrades here - update costs
for ( std : : set < std : : pair < int , int > > : : iterator it = info . cost [ 0 ] . begin ( ) ; it ! = info . cost [ 0 ] . end ( ) ; it + + )
{
2010-11-27 03:46:19 +02:00
std : : pair < int , int > pair = std : : make_pair ( it - > first , it - > second * hero - > getStackCount ( i ) ) ;
2010-07-27 02:20:21 +03:00
costs [ i ] . insert ( pair ) ;
totalSumm [ pair . first ] + = pair . second ;
2010-07-22 03:32:45 +03:00
}
}
2011-02-20 11:24:53 +02:00
currState [ i ] = newState ;
upgrade [ i ] - > setIndex ( newState ) ;
upgrade [ i ] - > block ( currState [ i ] = = - 1 ) ;
upgrade [ i ] - > hoverTexts [ 0 ] = getTextForSlot ( i ) ;
2010-07-22 03:32:45 +03:00
}
int newState = getState ( slotsCount ) ;
2011-02-20 11:24:53 +02:00
currState [ slotsCount ] = newState ;
upgradeAll - > setIndex ( newState ) ;
2010-07-22 03:32:45 +03:00
garr - > recreateSlots ( ) ;
}
void CHillFortWindow : : makeDeal ( int slot )
{
int offset = ( slot = = slotsCount ) ? 2 : 0 ;
switch ( currState [ slot ] )
{
case 0 :
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 314 + offset ] ,
std : : vector < SComponent * > ( ) , soundBase : : sound_todo ) ;
break ;
case 1 :
2010-07-23 15:13:03 +03:00
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 313 + offset ] ,
2010-07-22 03:32:45 +03:00
std : : vector < SComponent * > ( ) , soundBase : : sound_todo ) ;
break ;
case 2 :
for ( int i = 0 ; i < slotsCount ; i + + )
if ( slot = = i | | ( slot = = slotsCount & & currState [ i ] = = 2 ) ) //this is activated slot or "upgrade all"
{
UpgradeInfo info = LOCPLINT - > cb - > getUpgradeInfo ( hero , i ) ;
LOCPLINT - > cb - > upgradeCreature ( hero , i , info . newID [ 0 ] ) ;
}
break ;
}
}
void CHillFortWindow : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
for ( int i = 0 ; i < slotsCount ; i + + )
{
if ( currState [ i ] = = 0 | | currState [ i ] = = 2 )
{
if ( costs [ i ] . size ( ) ) //we have several elements
{
int curY = 128 ; //reverse iterator is used to display gold as first element
for ( std : : map < int , int > : : reverse_iterator rit = costs [ i ] . rbegin ( ) ; rit ! = costs [ i ] . rend ( ) ; rit + + )
{
blitAtLoc ( resources - > ourImages [ rit - > first ] . bitmap , 104 + 76 * i , curY , to ) ;
printToLoc ( boost : : lexical_cast < std : : string > ( rit - > second ) , 168 + 76 * i , curY + 16 , FONT_SMALL , zwykly , to ) ;
curY + = 20 ;
}
}
else //free upgrade - print gold image and "Free" text
{
blitAtLoc ( resources - > ourImages [ 6 ] . bitmap , 104 + 76 * i , 128 , to ) ;
printToLoc ( CGI - > generaltexth - > allTexts [ 344 ] , 168 + 76 * i , 144 , FONT_SMALL , zwykly , to ) ;
}
}
}
for ( int i = 0 ; i < RESOURCE_QUANTITY ; i + + )
{
if ( totalSumm [ i ] ) //this resource is used - display it
{
blitAtLoc ( resources - > ourImages [ i ] . bitmap , 104 + 76 * i , 237 , to ) ;
printToLoc ( boost : : lexical_cast < std : : string > ( totalSumm [ i ] ) , 166 + 76 * i , 253 , FONT_SMALL , zwykly , to ) ;
}
}
}
2010-07-27 02:20:21 +03:00
std : : string CHillFortWindow : : getTextForSlot ( int slot )
{
if ( ! hero - > getCreature ( slot ) ) //we dont have creature here
return " " ;
std : : string str = CGI - > generaltexth - > allTexts [ 318 ] ;
2010-11-27 03:46:19 +02:00
int amount = hero - > getStackCount ( slot ) ;
2010-07-27 02:20:21 +03:00
if ( amount = = 1 )
boost : : algorithm : : replace_first ( str , " %s " , hero - > getCreature ( slot ) - > nameSing ) ;
else
boost : : algorithm : : replace_first ( str , " %s " , hero - > getCreature ( slot ) - > namePl ) ;
return str ;
}
2010-07-22 03:32:45 +03:00
int CHillFortWindow : : getState ( int slot )
{
if ( slot = = slotsCount ) //"Upgrade all" slot
{
bool allUpgraded = true ; //All creatures are upgraded?
for ( int i = 0 ; i < slotsCount ; i + + )
allUpgraded & = currState [ i ] = = 1 | | currState [ i ] = = - 1 ;
if ( allUpgraded )
return 1 ;
for ( int i = 0 ; i < RESOURCE_QUANTITY ; i + + ) //if we need more resources
if ( LOCPLINT - > cb - > getResourceAmount ( i ) < totalSumm [ i ] )
return 0 ;
return 2 ;
}
if ( hero - > slotEmpty ( slot ) ) //no creature here
return - 1 ;
UpgradeInfo info = LOCPLINT - > cb - > getUpgradeInfo ( hero , slot ) ;
if ( ! info . newID . size ( ) ) //already upgraded
return 1 ;
for ( std : : set < std : : pair < int , int > > : : iterator it = info . cost [ 0 ] . begin ( ) ; it ! = info . cost [ 0 ] . end ( ) ; it + + )
2010-11-27 03:46:19 +02:00
if ( LOCPLINT - > cb - > getResourceAmount ( it - > first ) < it - > second * hero - > getStackCount ( slot ) )
2010-07-22 03:32:45 +03:00
return 0 ;
return 2 ; //can upgrade
}
2010-01-31 20:41:22 +02:00
void CThievesGuildWindow : : activate ( )
{
2010-02-07 17:06:14 +02:00
CIntObject : : activate ( ) ;
2010-02-15 08:54:57 +02:00
GH . statusbar = statusBar ;
2010-01-31 20:41:22 +02:00
}
void CThievesGuildWindow : : show ( SDL_Surface * to )
{
blitAt ( background , pos . x , pos . y , to ) ;
statusBar - > show ( to ) ;
2011-02-20 11:24:53 +02:00
exitb - > showAll ( to ) ;
2010-01-31 20:41:22 +02:00
resdatabar - > show ( to ) ;
//showing border around window
if ( screen - > w ! = 800 | | screen - > h ! = 600 )
{
CMessage : : drawBorder ( LOCPLINT - > playerID , to , pos . w + 28 , pos . h + 28 , pos . x - 14 , pos . y - 15 ) ;
}
}
void CThievesGuildWindow : : bexitf ( )
{
GH . popIntTotally ( this ) ;
}
2010-02-01 19:51:33 +02:00
CThievesGuildWindow : : CThievesGuildWindow ( const CGObjectInstance * _owner )
: owner ( _owner )
2010-01-31 20:41:22 +02:00
{
2010-02-07 17:06:14 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2010-02-01 19:51:33 +02:00
SThievesGuildInfo tgi ; //info to be displayed
LOCPLINT - > cb - > getThievesGuildInfo ( tgi , owner ) ;
2010-02-07 17:06:14 +02:00
pos = center ( Rect ( 0 , 0 , 800 , 600 ) ) ; // Rect( (conf.cc.resx - 800) / 2, (conf.cc.resy - 600) / 2, 800, 600 );
2010-01-31 20:41:22 +02:00
//loading backround and converting to more bpp form
SDL_Surface * bg = background = BitmapHandler : : loadBitmap ( " TpRank.bmp " , false ) ;
2010-07-26 01:47:59 +03:00
graphics - > blueToPlayersAdv ( bg , LOCPLINT - > playerID ) ;
2010-01-31 20:41:22 +02:00
background = newSurface ( bg - > w , bg - > h ) ;
blitAt ( bg , 0 , 0 , background ) ;
SDL_FreeSurface ( bg ) ;
2010-07-26 01:47:59 +03:00
exitb = new AdventureMapButton ( std : : string ( ) , std : : string ( ) , boost : : bind ( & CThievesGuildWindow : : bexitf , this ) , 748 , 556 , " TPMAGE1.def " , SDLK_RETURN ) ;
2010-07-09 02:03:27 +03:00
statusBar = new CGStatusBar ( 3 , 555 , " TStatBar.bmp " , 742 ) ;
2010-01-31 20:41:22 +02:00
2010-02-04 20:40:40 +02:00
resdatabar = new CMinorResDataBar ( ) ;
2010-07-26 01:47:59 +03:00
resdatabar - > pos . x + = pos . x ;
2010-02-04 20:40:40 +02:00
resdatabar - > pos . y + = pos . y ;
static std : : vector < std : : list < ui8 > > SThievesGuildInfo : : * fields [ ] = { & SThievesGuildInfo : : numOfTowns , & SThievesGuildInfo : : numOfHeroes , & SThievesGuildInfo : : gold ,
& SThievesGuildInfo : : woodOre , & SThievesGuildInfo : : mercSulfCrystGems , & SThievesGuildInfo : : obelisks , & SThievesGuildInfo : : artifacts , & SThievesGuildInfo : : army ,
& SThievesGuildInfo : : income } ;
2010-01-31 20:41:22 +02:00
//printing texts & descriptions to background
for ( int g = 0 ; g < 12 ; + + g )
{
int y ;
2010-02-01 19:51:33 +02:00
if ( g = = 9 ) //best hero
2010-01-31 20:41:22 +02:00
{
y = 400 ;
}
2010-02-01 19:51:33 +02:00
else if ( g = = 10 ) //personality
2010-01-31 20:41:22 +02:00
{
y = 460 ;
}
2010-02-01 19:51:33 +02:00
else if ( g = = 11 ) //best monster
2010-01-31 20:41:22 +02:00
{
y = 510 ;
}
else
{
y = 52 + 32 * g ;
}
2010-07-26 01:47:59 +03:00
std : : string text = CGI - > generaltexth - > jktexts [ 24 + g ] ;
boost : : algorithm : : trim_if ( text , boost : : algorithm : : is_any_of ( " \" " ) ) ;
printAtMiddle ( text , 135 , y , FONT_MEDIUM , tytulowy , background ) ;
2010-01-31 20:41:22 +02:00
}
2010-02-01 19:51:33 +02:00
CDefHandler * strips = CDefHandler : : giveDef ( " PRSTRIPS.DEF " ) ;
2010-06-24 15:10:45 +03:00
static const std : : string colorToBox [ ] = { " PRRED.BMP " , " PRBLUE.BMP " , " PRTAN.BMP " , " PRGREEN.BMP " , " PRORANGE.BMP " , " PRPURPLE.BMP " , " PRTEAL.BMP " , " PRROSE.bmp " } ;
2010-02-01 19:51:33 +02:00
for ( int g = 0 ; g < tgi . playerColors . size ( ) ; + + g )
2010-01-31 20:41:22 +02:00
{
2010-02-01 19:51:33 +02:00
if ( g > 0 )
{
blitAt ( strips - > ourImages [ g - 1 ] . bitmap , 250 + 66 * g , 7 , background ) ;
}
2010-07-26 01:47:59 +03:00
printAtMiddle ( CGI - > generaltexth - > jktexts [ 16 + g ] , 283 + 66 * g , 24 , FONT_BIG , tytulowy , background ) ;
2010-02-01 19:51:33 +02:00
SDL_Surface * box = BitmapHandler : : loadBitmap ( colorToBox [ tgi . playerColors [ g ] ] ) ;
blitAt ( box , 253 + 66 * g , 334 , background ) ;
SDL_FreeSurface ( box ) ;
2010-01-31 20:41:22 +02:00
}
2010-02-01 19:51:33 +02:00
delete strips ;
2010-02-04 20:40:40 +02:00
CDefHandler * flagPictures = CDefHandler : : giveDef ( " itgflags.def " ) ;
//printing flags
for ( int g = 0 ; g < ARRAY_COUNT ( fields ) ; + + g ) //by lines
{
for ( int b = 0 ; b < ( tgi . * fields [ g ] ) . size ( ) ; + + b ) //by places (1st, 2nd, ...)
{
std : : list < ui8 > players = ( tgi . * fields [ g ] ) [ b ] ; //get players with this place in this line
//std::sort(players.begin(), players.end());
int counter = 0 ;
for ( std : : list < ui8 > : : const_iterator it = players . begin ( ) ; it ! = players . end ( ) ; + + it )
{
int xpos = 259 + 66 * b + 12 * ( counter % 4 ) + 6 * ( counter / 4 ) ;
int ypos = 41 + 32 * g + 4 * ( counter / 4 ) ;
blitAt ( flagPictures - > ourImages [ * it ] . bitmap , xpos , ypos , background ) ;
counter + + ;
}
}
}
delete flagPictures ;
flagPictures = NULL ;
//printing best hero
int counter = 0 ;
2010-02-07 17:06:14 +02:00
for ( std : : map < ui8 , InfoAboutHero > : : const_iterator it = tgi . colorToBestHero . begin ( ) ; it ! = tgi . colorToBestHero . end ( ) ; + + it )
2010-02-04 20:40:40 +02:00
{
2010-02-28 14:39:38 +02:00
if ( it - > second . portrait > = 0 )
blitAt ( graphics - > portraitSmall [ it - > second . portrait ] , 260 + 66 * counter , 360 , background ) ;
2010-02-04 20:40:40 +02:00
counter + + ;
2010-02-07 19:56:06 +02:00
//printing stats
if ( it - > second . details )
{
2010-07-26 01:47:59 +03:00
printAtWB ( CGI - > generaltexth - > allTexts [ 184 ] , 191 + 66 * counter , 396 , FONT_TINY , 10 , zwykly , background ) ;
2010-02-07 19:56:06 +02:00
for ( int i = 0 ; i < it - > second . details - > primskills . size ( ) ; + + i )
{
std : : ostringstream skill ;
skill < < it - > second . details - > primskills [ i ] ;
2010-07-26 01:47:59 +03:00
printTo ( skill . str ( ) , 244 + 66 * counter , 407 + 11 * i , FONT_TINY , zwykly , background ) ;
2010-02-07 19:56:06 +02:00
}
}
2010-02-04 20:40:40 +02:00
}
2010-02-06 15:49:14 +02:00
//printing best creature
counter = 0 ;
for ( std : : map < ui8 , si32 > : : const_iterator it = tgi . bestCreature . begin ( ) ; it ! = tgi . bestCreature . end ( ) ; + + it )
{
2010-02-28 14:39:38 +02:00
if ( it - > second > = 0 )
blitAt ( graphics - > bigImgs [ it - > second ] , 255 + 66 * counter , 479 , background ) ;
2010-02-06 15:49:14 +02:00
counter + + ;
}
2010-02-07 19:56:06 +02:00
//printing personality
counter = 0 ;
for ( std : : map < ui8 , si8 > : : const_iterator it = tgi . personality . begin ( ) ; it ! = tgi . personality . end ( ) ; + + it )
{
int toPrint = 0 ;
if ( it - > second = = - 1 )
{
toPrint = 172 ;
}
else
{
toPrint = 168 + it - > second ;
}
printAtMiddle ( CGI - > generaltexth - > arraytxt [ toPrint ] , 283 + 66 * counter , 459 , FONT_SMALL , zwykly , background ) ;
counter + + ;
}
2010-01-31 20:41:22 +02:00
}
CThievesGuildWindow : : ~ CThievesGuildWindow ( )
{
SDL_FreeSurface ( background ) ;
2010-02-07 17:06:14 +02:00
// delete exitb;
// delete statusBar;
// delete resdatabar;
2010-01-31 20:41:22 +02:00
}
2011-02-27 21:58:14 +02:00
void MoraleLuckBox : : set ( const IBonusBearer * node )
2010-07-13 08:25:40 +03:00
{
const int textId [ ] = { 62 , 88 } ; //eg %s \n\n\n {Current Luck Modifiers:}
2011-01-17 18:07:08 +02:00
const int noneTxtId = 108 ; //Russian version uses same text for neutral morale\luck
2010-07-13 08:25:40 +03:00
const int neutralDescr [ ] = { 60 , 86 } ; //eg {Neutral Morale} \n\n Neutral morale means your armies will neither be blessed with extra attacks or freeze in combat.
const int componentType [ ] = { SComponent : : luck , SComponent : : morale } ;
const int hoverTextBase [ ] = { 7 , 4 } ;
const Bonus : : BonusType bonusType [ ] = { Bonus : : LUCK , Bonus : : MORALE } ;
2011-02-27 21:58:14 +02:00
int ( IBonusBearer : : * getValue [ ] ) ( ) const = { & IBonusBearer : : LuckVal , & IBonusBearer : : MoraleVal } ;
2010-01-31 20:41:22 +02:00
2010-07-13 08:25:40 +03:00
int mrlt = - 9 ;
TModDescr mrl ;
2010-08-29 12:00:59 +03:00
if ( node )
2010-07-24 14:46:04 +03:00
{
2010-08-29 12:00:59 +03:00
node - > getModifiersWDescr ( mrl , bonusType [ morale ] ) ;
bonusValue = ( node - > * getValue [ morale ] ) ( ) ;
2010-07-24 14:46:04 +03:00
}
else
bonusValue = 0 ;
2010-07-13 08:25:40 +03:00
mrlt = ( bonusValue > 0 ) - ( bonusValue < 0 ) ; //signum: -1 - bad luck / morale, 0 - neutral, 1 - good
hoverText = CGI - > generaltexth - > heroscrn [ hoverTextBase [ morale ] - mrlt ] ;
baseType = componentType [ morale ] ;
text = CGI - > generaltexth - > arraytxt [ textId [ morale ] ] ;
boost : : algorithm : : replace_first ( text , " %s " , CGI - > generaltexth - > arraytxt [ neutralDescr [ morale ] - mrlt ] ) ;
if ( ! mrl . size ( ) )
2011-01-17 18:07:08 +02:00
text + = CGI - > generaltexth - > arraytxt [ noneTxtId ] ;
2010-07-13 08:25:40 +03:00
else
2010-08-29 12:00:59 +03:00
{
2011-02-27 21:58:14 +02:00
if ( node - > hasBonusOfType ( Bonus : : UNDEAD ) | | node - > hasBonusOfType ( Bonus : : BLOCK_MORALE ) | | node - > hasBonusOfType ( Bonus : : NON_LIVING ) ) //it's a creature window
2010-08-29 12:00:59 +03:00
{
text + = CGI - > generaltexth - > arraytxt [ 113 ] ; //unaffected by morale
}
else
{
for ( int it = 0 ; it < mrl . size ( ) ; it + + )
text + = " \n " + mrl [ it ] . second ;
}
}
2010-07-13 08:25:40 +03:00
}
2010-01-31 20:41:22 +02:00
2010-07-13 08:25:40 +03:00
void MoraleLuckBox : : showAll ( SDL_Surface * to )
{
CDefEssential * def = morale ? graphics - > morale42 : graphics - > luck42 ;
2011-01-06 22:00:19 +02:00
SDL_Surface * img = def - > ourImages [ bonusValue + 3 ] . bitmap ;
blitAt ( img , Rect ( img ) . centerIn ( pos ) , to ) ; //put img in the center of our pos
2010-07-13 08:25:40 +03:00
}
2010-01-31 20:41:22 +02:00
2010-12-17 00:32:53 +02:00
MoraleLuckBox : : MoraleLuckBox ( bool Morale , const Rect & r )
2010-07-13 08:25:40 +03:00
: morale ( Morale )
{
bonusValue = 0 ;
2010-12-17 00:32:53 +02:00
pos = r + pos ;
2010-07-13 08:25:40 +03:00
}
2010-01-31 20:41:22 +02:00
2010-07-13 08:25:40 +03:00
MoraleLuckBox : : ~ MoraleLuckBox ( )
2010-02-07 17:06:14 +02:00
{
2010-02-13 23:45:46 +02:00
}
2010-02-15 08:54:57 +02:00
void CLabel : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
2010-07-06 05:10:26 +03:00
std : : string * hlpText = NULL ; //if NULL, text field will be used
if ( ignoreLeadingWhitespace )
{
hlpText = new std : : string ( text ) ;
boost : : trim_left ( * hlpText ) ;
}
std : : string & toPrint = hlpText ? * hlpText : text ;
if ( ! toPrint . length ( ) )
2010-02-15 08:54:57 +02:00
return ;
2010-08-23 18:16:40 +03:00
static void ( * printer [ 3 ] ) ( const std : : string & , int , int , EFonts , SDL_Color , SDL_Surface * ) = { & CSDL_Ext : : printAt , & CSDL_Ext : : printAtMiddle , & CSDL_Ext : : printTo } ; //array of printing functions
printer [ alignment ] ( toPrint , pos . x + textOffset . x , pos . y + textOffset . y , font , color , to ) ;
2010-02-15 08:54:57 +02:00
}
CLabel : : CLabel ( int x , int y , EFonts Font /*= FONT_SMALL*/ , EAlignment Align , const SDL_Color & Color /*= zwykly*/ , const std : : string & Text /*= ""*/ )
2010-08-27 19:20:35 +03:00
: alignment ( Align ) , font ( Font ) , color ( Color ) , text ( Text )
2010-02-15 08:54:57 +02:00
{
autoRedraw = true ;
pos . x + = x ;
pos . y + = y ;
pos . w = pos . h = 0 ;
bg = NULL ;
}
void CLabel : : setTxt ( const std : : string & Txt )
{
text = Txt ;
if ( autoRedraw )
{
if ( bg | | ! parent )
redraw ( ) ;
else
parent - > redraw ( ) ;
}
}
2010-07-06 05:10:26 +03:00
CTextBox : : CTextBox ( std : : string Text , const Rect & rect , int SliderStyle , EFonts Font /*= FONT_SMALL*/ , EAlignment Align /*= TOPLEFT*/ , const SDL_Color & Color /*= zwykly*/ )
2010-08-27 19:20:35 +03:00
: CLabel ( rect . x , rect . y , Font , Align , Color , Text ) , sliderStyle ( SliderStyle ) , slider ( NULL )
2010-07-06 05:10:26 +03:00
{
redrawParentOnScrolling = false ;
autoRedraw = false ;
pos . h = rect . h ;
pos . w = rect . w ;
assert ( Align = = TOPLEFT | | Align = = CENTER ) ; //TODO: support for other alignments
assert ( pos . w > = 80 ) ; //we need some space
setTxt ( Text ) ;
}
void CTextBox : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
const Font & f = * graphics - > fonts [ font ] ;
int dy = f . height ; //line height
int base_y = pos . y ;
if ( alignment = = CENTER )
2010-07-06 05:40:42 +03:00
base_y + = std : : max ( ( pos . h - maxH ) / 2 , 0 ) ;
2010-07-06 05:10:26 +03:00
int howManyLinesToPrint = slider ? slider - > capacity : lines . size ( ) ;
int firstLineToPrint = slider ? slider - > value : 0 ;
for ( int i = 0 ; i < howManyLinesToPrint ; i + + )
{
const std : : string & line = lines [ i + firstLineToPrint ] ;
2010-07-13 08:25:40 +03:00
if ( ! line . size ( ) ) continue ;
2010-07-06 05:10:26 +03:00
int x = pos . x ;
if ( alignment = = CENTER )
2010-07-06 05:40:42 +03:00
{
2010-07-06 05:10:26 +03:00
x + = ( pos . w - f . getWidth ( line . c_str ( ) ) ) / 2 ;
2010-07-06 05:40:42 +03:00
if ( slider )
x - = slider - > pos . w / 2 + 5 ;
}
2010-07-06 05:10:26 +03:00
2010-07-18 01:53:04 +03:00
if ( line [ 0 ] = = ' { ' & & line [ line . size ( ) - 1 ] = = ' } ' )
2010-07-13 08:25:40 +03:00
printAt ( line , x , base_y + i * dy , font , tytulowy , to ) ;
else
printAt ( line , x , base_y + i * dy , font , color , to ) ;
2010-07-06 05:10:26 +03:00
}
}
void CTextBox : : setTxt ( const std : : string & Txt )
{
recalculateLines ( Txt ) ;
CLabel : : setTxt ( Txt ) ;
}
void CTextBox : : sliderMoved ( int to )
{
2010-07-06 05:40:42 +03:00
if ( ! slider )
return ;
2010-07-06 05:10:26 +03:00
if ( redrawParentOnScrolling )
parent - > redraw ( ) ;
redraw ( ) ;
}
void CTextBox : : setBounds ( int limitW , int limitH )
{
pos . h = limitH ;
pos . w = limitW ;
recalculateLines ( text ) ;
}
void CTextBox : : recalculateLines ( const std : : string & Txt )
{
delChildNUll ( slider , true ) ;
lines . clear ( ) ;
const Font & f = * graphics - > fonts [ font ] ;
int lineHeight = f . height ;
int lineCapacity = pos . h / lineHeight ;
lines = CMessage : : breakText ( Txt , pos . w , font ) ;
if ( lines . size ( ) > lineCapacity ) //we need to add a slider
{
lines = CMessage : : breakText ( Txt , pos . w - 32 - 10 , font ) ;
OBJ_CONSTRUCTION_CAPTURING_ALL ;
slider = new CSlider ( pos . w - 32 , 0 , pos . h , boost : : bind ( & CTextBox : : sliderMoved , this , _1 ) , lineCapacity , lines . size ( ) , 0 , false , sliderStyle ) ;
if ( active )
slider - > activate ( ) ;
}
maxH = lineHeight * lines . size ( ) ;
maxW = 0 ;
BOOST_FOREACH ( const std : : string & line , lines )
amax ( maxW , f . getWidth ( line . c_str ( ) ) ) ;
}
2010-02-15 08:54:57 +02:00
void CGStatusBar : : print ( const std : : string & Text )
{
setTxt ( Text ) ;
}
void CGStatusBar : : clear ( )
{
setTxt ( " " ) ;
}
std : : string CGStatusBar : : getCurrent ( )
{
return text ;
}
CGStatusBar : : CGStatusBar ( int x , int y , EFonts Font /*= FONT_SMALL*/ , EAlignment Align , const SDL_Color & Color /*= zwykly*/ , const std : : string & Text /*= ""*/ )
: CLabel ( x , y , Font , Align , Color , Text )
{
init ( ) ;
}
2010-02-15 13:37:47 +02:00
CGStatusBar : : CGStatusBar ( CPicture * BG , EFonts Font /*= FONT_SMALL*/ , EAlignment Align /*= CENTER*/ , const SDL_Color & Color /*= zwykly*/ )
2010-02-15 08:54:57 +02:00
: CLabel ( BG - > pos . x , BG - > pos . y , Font , Align , Color , " " )
{
init ( ) ;
bg = BG ;
2010-07-06 05:10:26 +03:00
moveChild ( bg , bg - > parent , this ) ;
2010-02-15 08:54:57 +02:00
pos = bg - > pos ;
2010-07-09 02:03:27 +03:00
calcOffset ( ) ;
}
2010-02-15 08:54:57 +02:00
2010-07-09 02:03:27 +03:00
CGStatusBar : : CGStatusBar ( int x , int y , std : : string name /*="ADROLLVR.bmp"*/ , int maxw /*=-1*/ )
: CLabel ( x , y , FONT_SMALL , CENTER )
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
init ( ) ;
bg = new CPicture ( name ) ;
pos = bg - > pos ;
if ( maxw < pos . w )
2010-02-15 08:54:57 +02:00
{
2010-07-09 02:03:27 +03:00
amin ( pos . w , maxw ) ;
bg - > srcRect = new Rect ( 0 , 0 , maxw , pos . h ) ;
2010-02-15 08:54:57 +02:00
}
2010-07-09 02:03:27 +03:00
calcOffset ( ) ;
2010-02-15 08:54:57 +02:00
}
CGStatusBar : : ~ CGStatusBar ( )
{
GH . statusbar = oldStatusBar ;
}
void CGStatusBar : : show ( SDL_Surface * to )
{
}
void CGStatusBar : : init ( )
{
oldStatusBar = GH . statusbar ;
GH . statusbar = this ;
}
2010-07-09 02:03:27 +03:00
void CGStatusBar : : calcOffset ( )
{
switch ( alignment )
{
case CENTER :
textOffset = Point ( pos . w / 2 , pos . h / 2 ) ;
break ;
case BOTTOMRIGHT :
textOffset = Point ( pos . w , pos . h ) ;
break ;
}
}
2010-02-15 08:54:57 +02:00
CTextInput : : CTextInput ( const Rect & Pos , const Point & bgOffset , const std : : string & bgName , const CFunctionList < void ( const std : : string & ) > & CB )
2010-02-16 18:35:24 +02:00
: cb ( CB )
2010-02-15 08:54:57 +02:00
{
2010-02-16 18:35:24 +02:00
focus = false ;
2010-02-15 08:54:57 +02:00
pos + = Pos ;
2010-10-24 14:35:14 +03:00
captureAllKeys = true ;
2010-02-15 08:54:57 +02:00
OBJ_CONSTRUCTION ;
bg = new CPicture ( bgName , bgOffset . x , bgOffset . y ) ;
used = LCLICK | KEYBOARD ;
2010-02-15 13:37:47 +02:00
giveFocus ( ) ;
2010-02-15 08:54:57 +02:00
}
CTextInput : : CTextInput ( const Rect & Pos , SDL_Surface * srf )
{
2010-02-16 18:35:24 +02:00
focus = false ;
2010-02-15 08:54:57 +02:00
pos + = Pos ;
2010-10-24 14:35:14 +03:00
captureAllKeys = true ;
2010-02-15 08:54:57 +02:00
OBJ_CONSTRUCTION ;
bg = new CPicture ( Pos , 0 , true ) ;
Rect hlp = Pos ;
2010-10-24 14:35:14 +03:00
if ( srf )
CSDL_Ext : : blitSurface ( srf , & hlp , * bg , NULL ) ;
else
SDL_FillRect ( * bg , NULL , 0 ) ;
2010-02-15 08:54:57 +02:00
pos . w = bg - > pos . w ;
pos . h = bg - > pos . h ;
bg - > pos = pos ;
used = LCLICK | KEYBOARD ;
2010-02-15 13:37:47 +02:00
giveFocus ( ) ;
2010-02-15 08:54:57 +02:00
}
void CTextInput : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
2010-02-15 13:37:47 +02:00
const std : : string toPrint = focus ? text + " _ " : text ;
CSDL_Ext : : printAt ( toPrint , pos . x , pos . y , FONT_SMALL , zwykly , to ) ;
2010-02-15 08:54:57 +02:00
}
void CTextInput : : clickLeft ( tribool down , bool previousState )
{
2010-02-15 13:37:47 +02:00
if ( down & & ! focus )
giveFocus ( ) ;
2010-02-15 08:54:57 +02:00
}
void CTextInput : : keyPressed ( const SDL_KeyboardEvent & key )
{
2010-02-16 18:35:24 +02:00
if ( ! focus | | key . state ! = SDL_PRESSED )
return ;
if ( key . keysym . sym = = SDLK_TAB )
{
moveFocus ( ) ;
2010-07-21 13:09:29 +03:00
GH . breakEventHandling ( ) ;
2010-02-16 18:35:24 +02:00
return ;
}
2010-02-15 08:54:57 +02:00
switch ( key . keysym . sym )
{
case SDLK_BACKSPACE :
if ( text . size ( ) )
text . resize ( text . size ( ) - 1 ) ;
break ;
default :
char c = key . keysym . unicode ; //TODO 16-/>8
static const std : : string forbiddenChars = " <>: \" / \\ |?* " ; //if we are entering a filename, some special characters won't be allowed
if ( ! vstd : : contains ( forbiddenChars , c ) & & std : : isprint ( c ) )
text + = c ;
break ;
}
redraw ( ) ;
cb ( text ) ;
}
void CTextInput : : setText ( const std : : string & nText , bool callCb )
{
text = nText ;
redraw ( ) ;
if ( callCb )
cb ( text ) ;
}
2010-02-15 13:37:47 +02:00
CTextInput : : ~ CTextInput ( )
2010-02-16 18:35:24 +02:00
{
}
CFocusable : : CFocusable ( )
{
focusables . push_back ( this ) ;
}
CFocusable : : ~ CFocusable ( )
2010-02-15 13:37:47 +02:00
{
if ( inputWithFocus = = this )
inputWithFocus = NULL ;
2010-02-16 18:35:24 +02:00
focusables - = this ;
}
void CFocusable : : giveFocus ( )
2010-02-15 13:37:47 +02:00
{
if ( inputWithFocus )
{
inputWithFocus - > focus = false ;
inputWithFocus - > redraw ( ) ;
}
focus = true ;
inputWithFocus = this ;
redraw ( ) ;
}
2010-02-16 18:35:24 +02:00
void CFocusable : : moveFocus ( )
{
std : : list < CFocusable * > : : iterator i = vstd : : find ( focusables , this ) ,
ourIt = i ;
for ( i + + ; i ! = ourIt ; i + + )
{
if ( i = = focusables . end ( ) )
i = focusables . begin ( ) ;
if ( ( * i ) - > active )
{
( * i ) - > giveFocus ( ) ;
break ; ;
}
}
2010-07-06 05:10:26 +03:00
}
2011-01-06 22:00:19 +02:00
CWindowWithArtifacts : : CWindowWithArtifacts ( )
{
type | = WITH_ARTIFACTS ;
}
CWindowWithArtifacts : : ~ CWindowWithArtifacts ( )
{
}
void CArtifactsOfHero : : SCommonPart : : Artpos : : clear ( )
{
slotID = - 1 ;
AOH = NULL ;
art = NULL ;
}
CArtifactsOfHero : : SCommonPart : : Artpos : : Artpos ( )
{
clear ( ) ;
}
void CArtifactsOfHero : : SCommonPart : : Artpos : : setTo ( const CArtPlace * place , bool dontTakeBackpack )
{
slotID = place - > slotID ;
AOH = place - > ourOwner ;
if ( slotID > = 19 & & dontTakeBackpack )
art = NULL ;
else
art = place - > ourArt ;
}
bool CArtifactsOfHero : : SCommonPart : : Artpos : : operator = = ( const ArtifactLocation & al ) const
{
if ( ! AOH )
return false ;
bool ret = al . hero = = AOH - > curHero & & al . slot = = slotID ;
//assert(al.getArt() == art);
return ret ;
2011-01-18 20:56:14 +02:00
}
bool CArtifactsOfHero : : SCommonPart : : Artpos : : valid ( )
{
assert ( AOH & & art ) ;
return art = = AOH - > curHero - > getArt ( slotID ) ;
2011-02-27 21:58:14 +02:00
}