2009-05-20 10:08:56 +00:00
#include "../stdafx.h"
2008-08-25 21:14:00 +00:00
#include "AdventureMapButton.h"
#include "CAdvmapInterface.h"
2009-05-20 10:08:56 +00:00
#include "../CCallback.h"
2008-01-13 16:24:24 +00:00
#include "CGameInfo.h"
2008-08-25 21:14:00 +00:00
#include "CHeroWindow.h"
#include "CMessage.h"
2008-01-10 19:01:25 +00:00
#include "SDL.h"
#include "SDL_Extensions.h"
2009-05-20 10:08:56 +00:00
#include "CBitmapHandler.h"
#include "Graphics.h"
#include "CSpellWindow.h"
#include "CConfigHandler.h"
#include "../global.h"
#include "../hch/CArtHandler.h"
#include "../hch/CDefHandler.h"
#include "../hch/CGeneralTextHandler.h"
#include "../hch/CHeroHandler.h"
#include "../hch/CLodHandler.h"
#include "../hch/CObjectHandler.h"
2008-08-28 17:36:34 +00:00
#include <boost/algorithm/string/replace.hpp>
#include <boost/assign/list_of.hpp>
2008-08-25 21:14:00 +00:00
#include <boost/assign/std/vector.hpp>
#include <cstdlib>
#include <sstream>
2009-11-13 16:02:25 +00:00
#include <boost/lexical_cast.hpp>
2009-01-07 19:40:19 +00:00
2009-11-29 02:46:30 +00:00
#undef min
2009-11-20 22:35:18 +00:00
2009-04-15 14:03:31 +00:00
/*
* CHeroWindow.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
2008-01-19 13:19:58 +00:00
extern SDL_Surface * screen ;
2008-01-15 18:50:52 +00:00
extern TTF_Font * GEOR16 ;
2008-08-25 21:14:00 +00:00
using namespace boost :: assign ;
2008-01-30 10:55:43 +00:00
CHeroWindow :: CHeroWindow ( int playerColor ) :
2009-06-18 15:05:00 +00:00
player ( playerColor )
2008-01-10 19:01:25 +00:00
{
2008-06-12 06:45:51 +00:00
background = BitmapHandler :: loadBitmap ( "HEROSCR4.bmp" );
2008-06-30 00:06:41 +00:00
graphics -> blueToPlayersAdv ( background , playerColor );
2008-11-28 01:36:34 +00:00
pos . x = screen -> w / 2 - background -> w / 2 - 65 ;
pos . y = screen -> h / 2 - background -> h / 2 - 8 ;
2008-01-10 19:01:25 +00:00
pos . h = background -> h ;
pos . w = background -> w ;
2008-01-15 18:50:52 +00:00
curBack = NULL ;
curHero = NULL ;
2009-06-18 15:05:00 +00:00
artifs = new CArtifactsOfHero ( pos );
2009-07-26 15:37:27 +00:00
artifs -> commonInfo = new CArtifactsOfHero :: SCommonPart ;
2009-11-28 19:55:40 +00:00
artifs -> commonInfo -> participants . insert ( artifs );
2009-07-26 15:37:27 +00:00
artifs -> commonInfo -> activeArtPlace = NULL ;
2008-01-11 18:56:39 +00:00
2009-04-14 12:47:09 +00:00
garr = NULL ;
2008-11-28 01:36:34 +00:00
ourBar = new CStatusBar ( pos . x + 72 , pos . y + 567 , "ADROLLVR.bmp" , 660 );
2008-01-30 13:18:08 +00:00
2008-11-28 01:36:34 +00:00
quitButton = new AdventureMapButton ( CGI -> generaltexth -> heroscrn [ 17 ], std :: string (), boost :: function < void () > (), pos . x + 674 , pos . y + 524 , "hsbtns.def" , SDLK_RETURN );
dismissButton = new AdventureMapButton ( std :: string (), CGI -> generaltexth -> heroscrn [ 28 ], boost :: bind ( & CHeroWindow :: dismissCurrent , this ), pos . x + 519 , pos . y + 437 , "hsbtns2.def" , SDLK_d );
questlogButton = new AdventureMapButton ( CGI -> generaltexth -> heroscrn [ 0 ], std :: string (), boost :: bind ( & CHeroWindow :: questlog , this ), pos . x + 379 , pos . y + 437 , "hsbtns4.def" , SDLK_q );
2008-01-12 12:55:45 +00:00
2008-09-24 08:15:49 +00:00
formations = new CHighlightableButtonsGroup ( 0 );
2008-11-28 01:36:34 +00:00
formations -> addButton ( map_list_of ( 0 , CGI -> generaltexth -> heroscrn [ 23 ]), CGI -> generaltexth -> heroscrn [ 29 ], "hsbtns6.def" , pos . x + 546 , pos . y + 491 , 0 , 0 , SDLK_t );
formations -> addButton ( map_list_of ( 0 , CGI -> generaltexth -> heroscrn [ 24 ]), CGI -> generaltexth -> heroscrn [ 30 ], "hsbtns7.def" , pos . x + 546 , pos . y + 527 , 1 , 0 , SDLK_l );
2008-09-24 08:15:49 +00:00
2008-09-19 08:16:19 +00:00
2008-11-28 01:36:34 +00:00
gar2button = new CHighlightableButton ( 0 , 0 , map_list_of ( 0 , CGI -> generaltexth -> heroscrn [ 26 ])( 3 , CGI -> generaltexth -> heroscrn [ 25 ]), CGI -> generaltexth -> heroscrn [ 31 ], false , "hsbtns8.def" , NULL , pos . x + 604 , pos . y + 491 , SDLK_b );
2008-01-13 19:42:21 +00:00
2009-06-19 12:10:36 +00:00
//right list of heroes
2008-01-13 19:42:21 +00:00
for ( int g = 0 ; g < 8 ; ++ g )
{
2008-01-25 19:09:41 +00:00
//heroList.push_back(new AdventureMapButton<CHeroWindow>(std::string(), std::string(), &CHeroWindow::switchHero, 677, 95+g*54, "hsbtns5.def", this));
heroListMi . push_back ( new LClickableAreaHero ());
2009-06-19 12:10:36 +00:00
heroListMi [ g ] -> pos = genRect ( 32 , 48 , pos . x + 677 , pos . y + 95 + g * 54 );
2008-01-25 19:09:41 +00:00
heroListMi [ g ] -> owner = this ;
heroListMi [ g ] -> id = g ;
2008-01-13 19:42:21 +00:00
}
2008-11-28 01:36:34 +00:00
2009-06-17 16:46:16 +00:00
flags = CDefHandler :: giveDefEss ( "CREST58.DEF" );
2008-01-19 18:58:24 +00:00
//areas
2008-01-27 16:07:27 +00:00
portraitArea = new LRClickableAreaWText ();
2009-06-19 12:10:36 +00:00
portraitArea -> pos = genRect ( 64 , 58 , pos . x + 83 , pos . y + 26 );
2008-01-27 16:07:27 +00:00
for ( int v = 0 ; v < 4 ; ++ v )
{
primSkillAreas . push_back ( new LRClickableAreaWTextComp ());
2009-06-19 12:10:36 +00:00
primSkillAreas [ v ] -> pos = genRect ( 42 , 42 , pos . x + 95 + 70 * v , pos . y + 111 );
2009-03-26 23:05:40 +00:00
primSkillAreas [ v ] -> text = CGI -> generaltexth -> arraytxt [ 2 + v ];
2008-01-27 16:07:27 +00:00
primSkillAreas [ v ] -> type = v ;
primSkillAreas [ v ] -> bonus = - 1 ; // to be initilized when hero is being set
2008-01-28 12:28:18 +00:00
primSkillAreas [ v ] -> baseType = 0 ;
2008-01-27 16:07:27 +00:00
}
expArea = new LRClickableAreaWText ();
2009-06-19 12:10:36 +00:00
expArea -> pos = genRect ( 42 , 136 , pos . x + 83 , pos . y + 236 );
2008-01-31 12:10:59 +00:00
expArea -> hoverText = CGI -> generaltexth -> heroscrn [ 9 ];
2008-01-29 13:55:14 +00:00
2009-02-03 05:28:05 +00:00
morale = new LRClickableAreaWTextComp ();
morale -> pos = genRect ( 45 , 53 , pos . x + 240 , pos . y + 187 );
luck = new LRClickableAreaWTextComp ();
luck -> pos = genRect ( 45 , 53 , pos . x + 298 , pos . y + 187 );
2008-01-29 13:55:14 +00:00
spellPointsArea = new LRClickableAreaWText ();
2009-06-19 12:10:36 +00:00
spellPointsArea -> pos = genRect ( 42 , 136 , pos . x + 227 , pos . y + 236 );
2008-01-31 12:10:59 +00:00
spellPointsArea -> hoverText = CGI -> generaltexth -> heroscrn [ 22 ];
2008-01-29 13:55:14 +00:00
2008-01-28 12:28:18 +00:00
for ( int i = 0 ; i < 8 ; ++ i )
{
secSkillAreas . push_back ( new LRClickableAreaWTextComp ());
2009-06-19 12:10:36 +00:00
secSkillAreas [ i ] -> pos = genRect ( 42 , 136 , pos . x + (( i % 2 == 0 ) ? ( 83 ) : ( 227 )), pos . y + ( 284 + 48 * ( i / 2 )));
2008-01-28 12:28:18 +00:00
secSkillAreas [ i ] -> baseType = 1 ;
}
2008-11-28 01:36:34 +00:00
pos . x += 65 ;
pos . y += 8 ;
2008-01-10 19:01:25 +00:00
}
CHeroWindow ::~ CHeroWindow ()
{
SDL_FreeSurface ( background );
2008-01-11 18:56:39 +00:00
delete quitButton ;
2008-01-12 12:55:45 +00:00
delete dismissButton ;
delete questlogButton ;
2008-09-24 08:15:49 +00:00
delete formations ;
2008-01-13 16:24:24 +00:00
delete gar2button ;
2009-09-09 06:04:42 +00:00
//delete gar4button;
2008-01-13 19:42:21 +00:00
2008-12-23 13:59:03 +00:00
for ( size_t g = 0 ; g < heroListMi . size (); ++ g )
{
2008-01-25 19:09:41 +00:00
delete heroListMi [ g ];
2008-12-23 13:59:03 +00:00
}
2008-01-12 12:55:45 +00:00
2008-12-23 13:59:03 +00:00
if ( curBack )
{
2008-01-12 12:55:45 +00:00
SDL_FreeSurface ( curBack );
2008-12-23 13:59:03 +00:00
}
2008-01-12 12:55:45 +00:00
2008-01-13 16:24:24 +00:00
delete flags ;
2008-01-19 13:19:58 +00:00
2009-04-14 12:47:09 +00:00
delete garr ;
2008-01-31 12:10:59 +00:00
delete ourBar ;
2008-01-30 13:18:08 +00:00
2009-07-26 15:37:27 +00:00
delete artifs -> commonInfo ;
artifs -> commonInfo = NULL ; //to prevent heap corruption
2009-06-18 15:05:00 +00:00
delete artifs ;
2008-01-19 18:58:24 +00:00
delete portraitArea ;
2008-01-27 16:07:27 +00:00
delete expArea ;
2009-02-03 05:28:05 +00:00
delete luck ;
delete morale ;
2008-01-29 13:55:14 +00:00
delete spellPointsArea ;
2008-12-21 19:17:35 +00:00
for ( size_t v = 0 ; v < primSkillAreas . size (); ++ v )
2008-01-27 16:07:27 +00:00
{
delete primSkillAreas [ v ];
}
2008-12-21 19:17:35 +00:00
for ( size_t v = 0 ; v < secSkillAreas . size (); ++ v )
2008-01-28 12:28:18 +00:00
{
delete secSkillAreas [ v ];
}
2008-01-10 19:01:25 +00:00
}
void CHeroWindow :: show ( SDL_Surface * to )
{
2008-01-26 19:36:31 +00:00
if ( curBack )
blitAt ( curBack , pos . x , pos . y , to );
2009-04-14 12:47:09 +00:00
quitButton -> show ( to );
dismissButton -> show ( to );
questlogButton -> show ( to );
formations -> show ( to );
gar2button -> show ( to );
2009-09-09 06:04:42 +00:00
//gar4button->show(to);
2008-01-19 13:19:58 +00:00
2009-04-14 12:47:09 +00:00
garr -> show ( to );
ourBar -> show ( to );
2008-01-30 13:18:08 +00:00
2009-06-18 15:05:00 +00:00
artifs -> show ( to );
2008-01-10 19:01:25 +00:00
}
2009-06-19 12:10:36 +00:00
void CHeroWindow :: setHero ( const CGHeroInstance * hero )
2008-01-10 19:01:25 +00:00
{
2008-09-28 21:01:49 +00:00
char bufor [ 400 ];
2009-06-19 12:10:36 +00:00
//CGHeroInstance *hero = const_cast<CGHeroInstance*>(Hero); //but don't modify hero! - it's only for easy map reading
2008-01-28 12:28:18 +00:00
if ( ! hero ) //something strange... no hero? it shouldn't happen
2008-01-25 19:09:41 +00:00
{
2008-08-02 15:08:03 +00:00
return ;
2008-01-25 19:09:41 +00:00
}
2008-01-10 19:01:25 +00:00
curHero = hero ;
2008-01-31 12:10:59 +00:00
2009-06-17 09:38:03 +00:00
//pos temporarily switched, restored later
2008-11-28 01:36:34 +00:00
pos . x -= 65 ;
pos . y -= 8 ;
2008-08-28 17:36:34 +00:00
gar2button -> callback . clear ();
gar2button -> callback2 . clear ();
2008-09-28 21:01:49 +00:00
sprintf ( bufor , CGI -> generaltexth -> heroscrn [ 16 ]. c_str (), curHero -> name . c_str (), curHero -> type -> heroClass -> name . c_str ());
dismissButton -> hoverTexts [ 0 ] = std :: string ( bufor );
2008-01-31 12:10:59 +00:00
2008-09-28 21:01:49 +00:00
sprintf ( bufor , CGI -> generaltexth -> allTexts [ 15 ]. c_str (), curHero -> name . c_str (), curHero -> type -> heroClass -> name . c_str ());
portraitArea -> hoverText = std :: string ( bufor );
2008-01-31 12:10:59 +00:00
2008-11-28 01:36:34 +00:00
portraitArea -> text = hero -> getBiography ();
2008-01-19 13:19:58 +00:00
2009-04-14 12:47:09 +00:00
delete garr ;
2009-07-17 21:53:28 +00:00
garr = new CGarrisonInt ( pos . x + 80 , pos . y + 493 , 8 , Point (), curBack , Point ( 16 , 486 ), curHero );
2009-04-14 12:47:09 +00:00
garr -> update = false ;
2009-09-09 06:04:42 +00:00
AdventureMapButton * split = new AdventureMapButton ( CGI -> generaltexth -> allTexts [ 256 ], CGI -> generaltexth -> heroscrn [ 32 ], boost :: bind ( & CGarrisonInt :: splitClick , garr ), pos . x + 604 , pos . y + 527 , "hsbtns9.def" , false , NULL , false ); //deleted by garrison destructor
boost :: algorithm :: replace_first ( split -> hoverTexts [ 0 ], "%s" , CGI -> generaltexth -> allTexts [ 43 ]);
garr -> splitButtons . push_back ( split );
2008-06-21 13:27:52 +00:00
2009-06-19 12:10:36 +00:00
//primary skills support
2008-12-21 19:17:35 +00:00
for ( size_t g = 0 ; g < primSkillAreas . size (); ++ g )
2008-01-27 16:07:27 +00:00
{
2008-09-29 11:03:30 +00:00
primSkillAreas [ g ] -> bonus = hero -> getPrimSkillLevel ( g );
2008-01-27 16:07:27 +00:00
}
2009-07-03 19:57:14 +00:00
2009-06-19 12:10:36 +00:00
//secondary skills support
2009-11-20 22:35:18 +00:00
for ( size_t g = 0 ; g < std :: min ( secSkillAreas . size (), hero -> secSkills . size ()); ++ g )
2008-01-28 12:28:18 +00:00
{
2009-07-03 19:57:14 +00:00
int skill = hero -> secSkills [ g ]. first ,
level = hero -> secSkills [ g ]. second ;
2008-08-02 15:08:03 +00:00
2009-07-03 19:57:14 +00:00
secSkillAreas [ g ] -> type = skill ;
secSkillAreas [ g ] -> bonus = level ;
secSkillAreas [ g ] -> text = CGI -> generaltexth -> skillInfoTexts [ skill ][ level - 1 ];
sprintf ( bufor , CGI -> generaltexth -> heroscrn [ 21 ]. c_str (), CGI -> generaltexth -> levels [ level - 1 ]. c_str (), CGI -> generaltexth -> skillName [ skill ]. c_str ());
2008-09-28 21:01:49 +00:00
secSkillAreas [ g ] -> hoverText = std :: string ( bufor );
2008-01-28 12:28:18 +00:00
}
2008-01-27 16:07:27 +00:00
2009-10-28 10:45:45 +00:00
//printing experience - original format does not support ui64
2009-10-27 20:40:11 +00:00
expArea -> text = CGI -> generaltexth -> allTexts [ 2 ]. c_str ();
boost :: replace_first ( expArea -> text , "%d" , boost :: lexical_cast < std :: string > ( hero -> level ));
boost :: replace_first ( expArea -> text , "%d" , boost :: lexical_cast < std :: string > ( CGI -> heroh -> reqExp ( hero -> level + 1 )));
boost :: replace_first ( expArea -> text , "%d" , boost :: lexical_cast < std :: string > ( hero -> exp ));
2008-09-28 21:01:49 +00:00
2009-06-19 12:10:36 +00:00
//printing spell points
2009-04-14 12:47:09 +00:00
sprintf ( bufor , CGI -> generaltexth -> allTexts [ 205 ]. c_str (), hero -> name . c_str (), hero -> mana , hero -> manaLimit ());
2008-09-28 21:01:49 +00:00
spellPointsArea -> text = std :: string ( bufor );
2008-01-27 16:07:27 +00:00
2009-06-19 12:10:36 +00:00
artifs -> setHero ( hero );
2008-01-19 13:19:58 +00:00
2009-02-09 16:18:48 +00:00
dismissButton -> block ( !! hero -> visitedTown );
2008-09-28 13:29:37 +00:00
if ( hero -> getSecSkillLevel ( 19 ) == 0 )
2008-08-28 17:36:34 +00:00
gar2button -> block ( true );
else
{
gar2button -> block ( false );
2008-09-18 13:54:54 +00:00
gar2button -> callback = vstd :: assigno ( hero -> tacticFormationEnabled , true );
gar2button -> callback2 = vstd :: assigno ( hero -> tacticFormationEnabled , false );
2008-08-28 17:36:34 +00:00
}
2008-09-24 08:15:49 +00:00
2009-06-19 12:10:36 +00:00
//setting formations
2008-10-26 20:58:34 +00:00
formations -> onChange = 0 ;
2008-09-24 08:15:49 +00:00
formations -> select ( hero -> army . formation , true );
2009-06-19 12:10:36 +00:00
formations -> onChange = boost :: bind ( & CCallback :: setFormation , LOCPLINT -> cb , hero , _1 );
2008-09-24 08:15:49 +00:00
2009-06-19 12:10:36 +00:00
//setting morale
2009-02-03 05:28:05 +00:00
std :: vector < std :: pair < int , std :: string > > mrl = hero -> getCurrentMoraleModifiers ();
int mrlv = hero -> getCurrentMorale ();
int mrlt = ( mrlv > 0 ) - ( mrlv < 0 ); //signum: -1 - bad morale, 0 - neutral, 1 - good
morale -> hoverText = CGI -> generaltexth -> heroscrn [ 4 - mrlt ];
morale -> baseType = SComponent :: morale ;
morale -> bonus = mrlv ;
morale -> text = CGI -> generaltexth -> arraytxt [ 88 ];
boost :: algorithm :: replace_first ( morale -> text , "%s" , CGI -> generaltexth -> arraytxt [ 86 - mrlt ]);
for ( int it = 0 ; it < mrl . size (); it ++ )
morale -> text += mrl [ it ]. second ;
2009-06-19 12:10:36 +00:00
//setting luck
2009-02-04 13:40:54 +00:00
mrl = hero -> getCurrentLuckModifiers ();
mrlv = hero -> getCurrentLuck ();
mrlt = ( mrlv > 0 ) - ( mrlv < 0 ); //signum: -1 - bad luck, 0 - neutral, 1 - good
luck -> hoverText = CGI -> generaltexth -> heroscrn [ 7 - mrlt ];
luck -> baseType = SComponent :: luck ;
luck -> bonus = mrlv ;
luck -> text = CGI -> generaltexth -> arraytxt [ 62 ];
boost :: algorithm :: replace_first ( luck -> text , "%s" , CGI -> generaltexth -> arraytxt [ 60 - mrlt ]);
for ( int it = 0 ; it < mrl . size (); it ++ )
luck -> text += mrl [ it ]. second ;
2009-02-03 05:28:05 +00:00
2009-06-19 12:10:36 +00:00
//restoring pos
2008-11-28 01:36:34 +00:00
pos . x += 65 ;
pos . y += 8 ;
2008-01-26 19:36:31 +00:00
redrawCurBack ();
2008-01-11 18:56:39 +00:00
}
void CHeroWindow :: quit ()
{
2009-08-06 22:36:51 +00:00
GH . popInt ( this );
2009-06-10 20:48:55 +00:00
dispose ();
2008-01-11 18:56:39 +00:00
}
void CHeroWindow :: activate ()
{
quitButton -> activate ();
2008-01-12 12:55:45 +00:00
dismissButton -> activate ();
questlogButton -> activate ();
2008-01-13 16:24:24 +00:00
gar2button -> activate ();
2008-09-24 08:15:49 +00:00
formations -> activate ();
2009-09-09 06:04:42 +00:00
//gar4button->activate();
2008-01-19 18:58:24 +00:00
portraitArea -> activate ();
2008-01-27 16:07:27 +00:00
expArea -> activate ();
2008-01-29 13:55:14 +00:00
spellPointsArea -> activate ();
2009-02-03 05:28:05 +00:00
morale -> activate ();
luck -> activate ();
2008-01-30 13:18:08 +00:00
2009-04-14 12:47:09 +00:00
garr -> activate ();
2008-01-31 12:10:59 +00:00
LOCPLINT -> statusbar = ourBar ;
2008-01-30 13:18:08 +00:00
2008-12-21 19:17:35 +00:00
for ( size_t v = 0 ; v < primSkillAreas . size (); ++ v )
2008-01-27 16:07:27 +00:00
{
primSkillAreas [ v ] -> activate ();
}
2009-11-20 22:35:18 +00:00
for ( size_t v = 0 ; v < std :: min ( secSkillAreas . size (), curHero -> secSkills . size ()); ++ v )
2008-01-13 19:42:21 +00:00
{
2008-01-28 12:28:18 +00:00
secSkillAreas [ v ] -> activate ();
2008-01-13 19:42:21 +00:00
}
2008-01-15 18:50:52 +00:00
redrawCurBack ();
2008-01-20 13:53:11 +00:00
2009-06-18 15:05:00 +00:00
artifs -> activate ();
2008-12-21 19:17:35 +00:00
for ( size_t e = 0 ; e < heroListMi . size (); ++ e )
2008-01-26 19:36:31 +00:00
{
heroListMi [ e ] -> activate ();
}
2008-01-12 12:55:45 +00:00
}
2008-01-20 12:34:39 +00:00
void CHeroWindow :: deactivate ()
{
quitButton -> deactivate ();
dismissButton -> deactivate ();
questlogButton -> deactivate ();
gar2button -> deactivate ();
2008-09-24 08:15:49 +00:00
formations -> deactivate ();
2009-09-09 06:04:42 +00:00
//gar4button->deactivate();
2008-01-20 12:34:39 +00:00
portraitArea -> deactivate ();
2008-01-27 16:07:27 +00:00
expArea -> deactivate ();
2008-01-29 13:55:14 +00:00
spellPointsArea -> deactivate ();
2009-02-05 09:49:45 +00:00
morale -> deactivate ();
luck -> deactivate ();
2008-01-30 13:18:08 +00:00
2009-04-14 12:47:09 +00:00
garr -> deactivate ();
2008-01-30 13:18:08 +00:00
2008-12-21 19:17:35 +00:00
for ( size_t v = 0 ; v < primSkillAreas . size (); ++ v )
2008-01-27 16:07:27 +00:00
{
primSkillAreas [ v ] -> deactivate ();
}
2009-11-20 22:35:18 +00:00
for ( size_t v = 0 ; v < std :: min ( secSkillAreas . size (), curHero -> secSkills . size ()); ++ v )
2008-01-20 12:34:39 +00:00
{
2008-01-28 12:28:18 +00:00
secSkillAreas [ v ] -> deactivate ();
2008-01-20 12:34:39 +00:00
}
2008-01-20 13:53:11 +00:00
2009-06-18 15:05:00 +00:00
artifs -> deactivate ();
2008-12-21 19:17:35 +00:00
for ( size_t e = 0 ; e < heroListMi . size (); ++ e )
2008-01-26 19:36:31 +00:00
{
heroListMi [ e ] -> deactivate ();
}
2008-01-20 12:34:39 +00:00
}
2008-01-12 12:55:45 +00:00
void CHeroWindow :: dismissCurrent ()
{
2008-08-27 10:19:18 +00:00
CFunctionList < void () > ony = boost :: bind ( & CHeroWindow :: quit , this );
ony += boost :: bind ( & CCallback :: dismissHero , LOCPLINT -> cb , curHero );
2009-04-14 12:47:09 +00:00
LOCPLINT -> showYesNoDialog ( CGI -> generaltexth -> allTexts [ 22 ], std :: vector < SComponent *> (), ony , 0 , false );
2008-01-12 12:55:45 +00:00
}
void CHeroWindow :: questlog ()
{
2008-01-11 18:56:39 +00:00
}
2009-04-03 22:34:31 +00:00
2008-01-15 18:50:52 +00:00
void CHeroWindow :: redrawCurBack ()
{
if ( curBack )
SDL_FreeSurface ( curBack );
2008-02-10 13:09:56 +00:00
curBack = SDL_DisplayFormat ( background );
2008-01-15 18:50:52 +00:00
2009-06-26 15:41:19 +00:00
//primary skills & exp and mana
2008-08-13 00:44:31 +00:00
blitAt ( graphics -> pskillsm -> ourImages [ 0 ]. bitmap , 32 , 111 , curBack );
blitAt ( graphics -> pskillsm -> ourImages [ 1 ]. bitmap , 102 , 111 , curBack );
blitAt ( graphics -> pskillsm -> ourImages [ 2 ]. bitmap , 172 , 111 , curBack );
blitAt ( graphics -> pskillsm -> ourImages [ 5 ]. bitmap , 242 , 111 , curBack );
blitAt ( graphics -> pskillsm -> ourImages [ 4 ]. bitmap , 20 , 230 , curBack );
blitAt ( graphics -> pskillsm -> ourImages [ 3 ]. bitmap , 162 , 230 , curBack );
2008-01-15 18:50:52 +00:00
2009-06-17 09:38:03 +00:00
//blitting portrait
2008-08-02 15:08:03 +00:00
blitAt ( graphics -> portraitLarge [ curHero -> portrait ], 19 , 19 , curBack );
2008-01-15 18:50:52 +00:00
2009-06-17 09:38:03 +00:00
//printing hero's name
2008-01-15 18:50:52 +00:00
CSDL_Ext :: printAtMiddle ( curHero -> name , 190 , 40 , GEORXX , tytulowy , curBack );
2009-06-17 09:38:03 +00:00
//printing hero's level
2009-06-17 16:46:16 +00:00
std :: ostringstream secondLine ;
2008-01-15 18:50:52 +00:00
secondLine << "Level " << curHero -> level << " " << curHero -> type -> heroClass -> name ;
CSDL_Ext :: printAtMiddle ( secondLine . str (), 190 , 66 , TNRB16 , zwykly , curBack );
2009-06-01 03:04:50 +00:00
//primary skills names
2008-01-15 18:50:52 +00:00
CSDL_Ext :: printAtMiddle ( CGI -> generaltexth -> jktexts [ 1 ], 53 , 98 , GEOR13 , tytulowy , curBack );
CSDL_Ext :: printAtMiddle ( CGI -> generaltexth -> jktexts [ 2 ], 123 , 98 , GEOR13 , tytulowy , curBack );
CSDL_Ext :: printAtMiddle ( CGI -> generaltexth -> jktexts [ 3 ], 193 , 98 , GEOR13 , tytulowy , curBack );
CSDL_Ext :: printAtMiddle ( CGI -> generaltexth -> jktexts [ 4 ], 263 , 98 , GEOR13 , tytulowy , curBack );
//dismiss / quest log
std :: vector < std :: string > * toPrin = CMessage :: breakText ( CGI -> generaltexth -> jktexts [ 8 ]. substr ( 1 , CGI -> generaltexth -> jktexts [ 8 ]. size () - 2 ));
if ( toPrin -> size () == 1 )
{
CSDL_Ext :: printAt (( * toPrin )[ 0 ], 372 , 440 , GEOR13 , zwykly , curBack );
}
else
{
CSDL_Ext :: printAt (( * toPrin )[ 0 ], 372 , 431 , GEOR13 , zwykly , curBack );
CSDL_Ext :: printAt (( * toPrin )[ 1 ], 372 , 447 , GEOR13 , zwykly , curBack );
}
delete toPrin ;
toPrin = CMessage :: breakText ( CGI -> generaltexth -> jktexts [ 9 ]. substr ( 1 , CGI -> generaltexth -> jktexts [ 9 ]. size () - 2 ));
if ( toPrin -> size () == 1 )
{
CSDL_Ext :: printAt (( * toPrin )[ 0 ], 512 , 440 , GEOR13 , zwykly , curBack );
}
else
{
CSDL_Ext :: printAt (( * toPrin )[ 0 ], 512 , 431 , GEOR13 , zwykly , curBack );
CSDL_Ext :: printAt (( * toPrin )[ 1 ], 512 , 447 , GEOR13 , zwykly , curBack );
}
delete toPrin ;
//printing primary skills' amounts
2009-06-17 16:46:16 +00:00
for ( int m = 0 ; m < 4 ; ++ m )
{
std :: ostringstream primarySkill ;
primarySkill << curHero -> getPrimSkillLevel ( m );
CSDL_Ext :: printAtMiddle ( primarySkill . str (), 53 + 70 * m , 165 , TNRB16 , zwykly , curBack );
}
2008-01-15 18:50:52 +00:00
2009-06-26 15:41:19 +00:00
//morale and luck printing
2008-06-13 08:16:51 +00:00
blitAt ( graphics -> luck42 -> ourImages [ curHero -> getCurrentLuck () + 3 ]. bitmap , 239 , 182 , curBack );
blitAt ( graphics -> morale42 -> ourImages [ curHero -> getCurrentMorale () + 3 ]. bitmap , 181 , 182 , curBack );
2008-01-15 18:50:52 +00:00
blitAt ( flags -> ourImages [ player ]. bitmap , 606 , 8 , curBack );
//hero list blitting
2009-06-10 01:23:17 +00:00
2009-06-11 17:21:06 +00:00
for ( int pos = 0 , g = 0 ; g < LOCPLINT -> wanderingHeroes . size (); ++ g )
2008-01-15 18:50:52 +00:00
{
2009-06-11 17:21:06 +00:00
const CGHeroInstance * cur = LOCPLINT -> wanderingHeroes [ g ];
2009-06-10 01:23:17 +00:00
if ( cur -> inTownGarrison )
// Only display heroes that are not in garrison
continue ;
blitAt ( graphics -> portraitSmall [ cur -> portrait ], 611 , 87 + pos * 54 , curBack );
2008-01-15 18:50:52 +00:00
//printing yellow border
if ( cur -> name == curHero -> name )
{
2008-08-02 15:08:03 +00:00
for ( int f = 0 ; f < graphics -> portraitSmall [ cur -> portrait ] -> w ; ++ f )
2008-01-15 18:50:52 +00:00
{
2008-08-02 15:08:03 +00:00
for ( int h = 0 ; h < graphics -> portraitSmall [ cur -> portrait ] -> h ; ++ h )
if ( f == 0 || h == 0 || f == graphics -> portraitSmall [ cur -> portrait ] -> w - 1 || h == graphics -> portraitSmall [ cur -> portrait ] -> h - 1 )
2008-01-15 18:50:52 +00:00
{
2009-06-10 01:23:17 +00:00
CSDL_Ext :: SDL_PutPixelWithoutRefresh ( curBack , 611 + f , 87 + pos * 54 + h , 240 , 220 , 120 );
2008-01-15 18:50:52 +00:00
}
}
}
2009-06-10 01:23:17 +00:00
pos ++ ;
2008-01-15 18:50:52 +00:00
}
//secondary skills
2009-06-17 16:46:16 +00:00
for ( int g = 1 ; g <= 8 ; ++ g )
2008-01-15 18:50:52 +00:00
{
2009-06-17 16:46:16 +00:00
if ( curHero -> secSkills . size () >= g )
{
blitAt ( graphics -> abils44 -> ourImages [ curHero -> secSkills [ g - 1 ]. first * 3 + 3 + curHero -> secSkills [ g - 1 ]. second - 1 ]. bitmap , g % 2 ? 18 : 161 , 276 + 48 * (( g - 1 ) / 2 ), curBack );
CSDL_Ext :: printAt ( CGI -> generaltexth -> levels [ curHero -> secSkills [ g - 1 ]. second - 1 ], g % 2 ? 69 : 213 , 279 + 48 * (( g - 1 ) / 2 ), GEOR13 , zwykly , curBack );
CSDL_Ext :: printAt ( CGI -> generaltexth -> skillName [ curHero -> secSkills [ g - 1 ]. first ], g % 2 ? 69 : 213 , 299 + 48 * (( g - 1 ) / 2 ), GEOR13 , zwykly , curBack );
}
2008-01-15 18:50:52 +00:00
}
//printing special ability
2008-06-13 08:16:51 +00:00
blitAt ( graphics -> un44 -> ourImages [ curHero -> subID ]. bitmap , 18 , 180 , curBack );
2008-01-15 18:50:52 +00:00
//printing necessery texts
CSDL_Ext :: printAt ( CGI -> generaltexth -> jktexts [ 6 ]. substr ( 1 , CGI -> generaltexth -> jktexts [ 6 ]. size () - 2 ), 69 , 231 , GEOR13 , tytulowy , curBack );
2009-06-17 16:46:16 +00:00
std :: ostringstream expstr ;
2008-01-15 18:50:52 +00:00
expstr << curHero -> exp ;
CSDL_Ext :: printAt ( expstr . str (), 69 , 247 , GEOR16 , zwykly , curBack );
CSDL_Ext :: printAt ( CGI -> generaltexth -> jktexts [ 7 ]. substr ( 1 , CGI -> generaltexth -> jktexts [ 7 ]. size () - 2 ), 212 , 231 , GEOR13 , tytulowy , curBack );
2009-06-17 16:46:16 +00:00
std :: ostringstream manastr ;
2009-05-22 19:20:30 +00:00
manastr << curHero -> mana << '/' << curHero -> manaLimit ();
2008-01-15 18:50:52 +00:00
CSDL_Ext :: printAt ( manastr . str (), 212 , 247 , GEOR16 , zwykly , curBack );
2008-01-19 13:19:58 +00:00
}
2009-06-10 20:48:55 +00:00
void CHeroWindow :: dispose ()
{
SDL_FreeSurface ( curBack );
curBack = NULL ;
curHero = NULL ;
2009-06-18 15:05:00 +00:00
artifs -> dispose ();
2009-06-10 20:48:55 +00:00
}