2009-05-20 13:08:56 +03:00
# include "../stdafx.h"
2008-08-02 18:08:03 +03:00
# include "CPreGame.h"
2009-01-12 22:05:56 +02:00
# include <ctime>
2008-12-21 21:17:35 +02:00
# include <boost/filesystem.hpp> // includes all needed Boost.Filesystem declarations
# include <boost/algorithm/string.hpp>
# include <zlib.h>
2009-05-20 13:08:56 +03:00
# include "../timeHandler.h"
2008-08-02 18:08:03 +03:00
# include <sstream>
# include "SDL_Extensions.h"
# include "CGameInfo.h"
# include "CCursorHandler.h"
2010-02-13 18:26:47 +02:00
# include "../hch/CDefHandler.h"
# include "../hch/CGeneralTextHandler.h"
2009-05-20 13:08:56 +03:00
# include "../hch/CLodHandler.h"
# include "../hch/CTownHandler.h"
# include "../hch/CHeroHandler.h"
2010-01-29 22:52:45 +02:00
# include "../hch/CObjectHandler.h"
2010-02-13 18:26:47 +02:00
# include "../hch/CCampaignHandler.h"
# include "../hch/CCreatureHandler.h"
# include "../hch/CMusicHandler.h"
# include "../hch/CVideoHandler.h"
2008-08-02 18:08:03 +03:00
# include <cmath>
2009-05-20 13:08:56 +03:00
# include "Graphics.h"
2009-08-17 11:50:31 +03:00
//#include <boost/thread.hpp>
2008-08-02 18:08:03 +03:00
# include <boost/bind.hpp>
2008-12-21 21:17:35 +02:00
# include <cstdlib>
2009-05-20 13:08:56 +03:00
# include "../lib/Connection.h"
2009-10-10 08:47:59 +03:00
# include "../lib/VCMIDirs.h"
2010-02-13 18:26:47 +02:00
# include "../lib/map.h"
2009-08-17 11:50:31 +03:00
# include "AdventureMapButton.h"
2009-08-22 16:59:15 +03:00
# include "GUIClasses.h"
2009-08-27 11:04:32 +03:00
# include "CPlayerInterface.h"
# include "../CCallback.h"
2009-08-28 22:34:08 +03:00
# include <boost/lexical_cast.hpp>
2010-02-08 16:38:06 +02:00
# include <cstdlib>
# include "CMessage.h"
2009-04-15 17:03:31 +03:00
/*
* CPreGame . 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
*
*/
2009-08-17 13:47:08 +03:00
namespace fs = boost : : filesystem ;
2009-08-27 11:04:32 +03:00
using boost : : bind ;
using boost : : ref ;
2010-02-20 15:24:38 +02:00
# if _MSC_VER >= 1600
# define bind boost::bind
# define ref boost::ref
# endif
2009-08-17 11:50:31 +03:00
void startGame ( StartInfo * options ) ;
2009-04-15 17:03:31 +03:00
2009-08-17 11:50:31 +03:00
CGPreGame * CGP ;
2010-02-13 18:26:47 +02:00
static const CMapInfo * curMap ;
2009-11-01 03:15:16 +02:00
static StartInfo * curOpts ;
2010-02-16 18:35:24 +02:00
static int playerColor , playerSerial ; //if more than one player - applies to the first
static std : : vector < std : : string > playerNames ; // serial id of name <-> player name
2008-12-21 21:17:35 +02:00
2009-08-27 11:04:32 +03:00
static std : : string selectedName ; //set when game is started/loaded
2009-11-01 03:15:16 +02:00
static void do_quit ( )
{
SDL_Event event ;
event . quit . type = SDL_QUIT ;
SDL_PushEvent ( & event ) ;
}
2009-10-26 07:39:30 +02:00
2010-03-08 00:56:51 +02:00
static CMapInfo * mapInfoFromGame ( )
{
CMapInfo * ret = new CMapInfo ( ) ;
CMapHeader * headerCopy = new CMapHeader ( * LOCPLINT - > cb - > getMapHeader ( ) ) ; //will be deleted by CMapInfo d-tor
ret - > setHeader ( headerCopy ) ;
return ret ;
}
static void setPlayersFromGame ( )
{
playerColor = LOCPLINT - > playerID ;
playerSerial = LOCPLINT - > serialID ;
}
static void clearInfo ( )
{
delNull ( curMap ) ;
delNull ( curOpts ) ;
playerColor = playerSerial = - 1 ;
playerNames . clear ( ) ;
}
2010-02-13 18:26:47 +02:00
void CMapInfo : : countPlayers ( )
{
2010-02-24 15:03:36 +02:00
actualHumanPlayers = playerAmnt = humenPlayers = 0 ;
2010-02-13 18:26:47 +02:00
for ( int i = 0 ; i < PLAYER_LIMIT ; i + + )
{
if ( mapHeader - > players [ i ] . canHumanPlay )
{
playerAmnt + + ;
humenPlayers + + ;
}
else if ( mapHeader - > players [ i ] . canComputerPlay )
{
playerAmnt + + ;
}
}
2010-02-24 15:03:36 +02:00
if ( scenarioOpts )
for ( std : : vector < PlayerSettings > : : const_iterator i = scenarioOpts - > playerInfos . begin ( ) ; i ! = scenarioOpts - > playerInfos . end ( ) ; i + + )
if ( i - > human )
actualHumanPlayers + + ;
2010-02-13 18:26:47 +02:00
}
//CMapInfo::CMapInfo(const std::string &fname, const unsigned char *map )
//: mapHeader(NULL), campaignHeader(NULL)
//{
// init(fname, map);
//}
CMapInfo : : CMapInfo ( bool map )
2010-02-24 15:03:36 +02:00
: mapHeader ( NULL ) , campaignHeader ( NULL ) , scenarioOpts ( NULL )
2010-02-13 18:26:47 +02:00
{
}
void CMapInfo : : mapInit ( const std : : string & fname , const unsigned char * map )
{
filename = fname ;
int i = 0 ;
mapHeader = new CMapHeader ( ) ;
mapHeader - > version = CMapHeader : : invalid ;
2010-03-01 20:22:22 +02:00
try
{
mapHeader - > initFromMemory ( map , i ) ;
countPlayers ( ) ;
}
catch ( const std : : string & e )
{
tlog1 < < " \t \t Warning: evil map file: " < < fname < < " : " < < e < < std : : endl ;
delete mapHeader ;
mapHeader = NULL ;
}
2010-02-13 18:26:47 +02:00
}
CMapInfo : : ~ CMapInfo ( )
{
delete mapHeader ;
delete campaignHeader ;
}
void CMapInfo : : campaignInit ( )
{
2010-02-18 14:34:44 +02:00
campaignHeader = new CCampaignHeader ( CCampaignHandler : : getHeader ( filename , lodCmpgn ) ) ;
2010-02-13 18:26:47 +02:00
}
2010-03-08 00:56:51 +02:00
void CMapInfo : : setHeader ( CMapHeader * header )
{
mapHeader = header ;
}
2009-08-17 11:50:31 +03:00
CMenuScreen : : CMenuScreen ( EState which )
2009-02-06 13:15:39 +02:00
{
2009-08-17 11:50:31 +03:00
OBJ_CONSTRUCTION ;
bgAd = NULL ;
switch ( which )
2009-02-06 13:15:39 +02:00
{
2009-08-17 11:50:31 +03:00
case mainMenu :
2009-02-06 13:15:39 +02:00
{
2009-08-17 11:50:31 +03:00
buttons [ 0 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 3 ] . second , bind ( & CMenuScreen : : moveTo , this , ref ( CGP - > scrs [ newGame ] ) ) , 540 , 10 , " ZMENUNG.DEF " , SDLK_n ) ;
buttons [ 1 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 4 ] . second , bind ( & CMenuScreen : : moveTo , this , ref ( CGP - > scrs [ loadGame ] ) ) , 532 , 132 , " ZMENULG.DEF " , SDLK_l ) ;
2010-02-15 08:54:57 +02:00
buttons [ 2 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 5 ] . second , 0 , 524 , 251 , " ZMENUHS.DEF " , SDLK_h ) ;
2009-08-17 11:50:31 +03:00
buttons [ 3 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 6 ] . second , 0 /*cb*/ , 557 , 359 , " ZMENUCR.DEF " , SDLK_c ) ;
2009-11-24 22:29:50 +02:00
boost : : function < void ( ) > confWindow = bind ( CInfoWindow : : showYesNoDialog , ref ( CGI - > generaltexth - > allTexts [ 69 ] ) , ( const std : : vector < SComponent * > * ) 0 , do_quit , 0 , false , 1 ) ;
buttons [ 4 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 7 ] . second , confWindow , 586 , 468 , " ZMENUQT.DEF " , SDLK_ESCAPE ) ;
2009-02-06 13:15:39 +02:00
}
2009-08-17 11:50:31 +03:00
break ;
case newGame :
2009-02-06 13:15:39 +02:00
{
2009-11-24 21:50:20 +02:00
bgAd = new CPicture ( BitmapHandler : : loadBitmap ( " ZNEWGAM.bmp " ) , 114 , 312 , true ) ;
2010-02-24 15:03:36 +02:00
buttons [ 0 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 10 ] . second , bind ( & CGPreGame : : openSel , CGP , newGame , false ) , 545 , 4 , " ZTSINGL.DEF " , SDLK_s ) ;
2010-02-15 08:54:57 +02:00
buttons [ 1 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 11 ] . second , & pushIntT < CMultiMode > , 568 , 120 , " ZTMULTI.DEF " , SDLK_m ) ;
2010-02-08 16:38:06 +02:00
buttons [ 2 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 12 ] . second , bind ( & CMenuScreen : : moveTo , this , ref ( CGP - > scrs [ campaignMain ] ) ) , 541 , 233 , " ZTCAMPN.DEF " , SDLK_c ) ;
2009-08-17 11:50:31 +03:00
buttons [ 3 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 13 ] . second , 0 /*cb*/ , 545 , 358 , " ZTTUTOR.DEF " , SDLK_t ) ;
buttons [ 4 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 14 ] . second , bind ( & CMenuScreen : : moveTo , this , CGP - > scrs [ mainMenu ] ) , 582 , 464 , " ZTBACK.DEF " , SDLK_ESCAPE ) ;
}
break ;
case loadGame :
{
2009-11-24 21:50:20 +02:00
bgAd = new CPicture ( BitmapHandler : : loadBitmap ( " ZLOADGAM.bmp " ) , 114 , 312 , true ) ;
2010-02-24 15:03:36 +02:00
buttons [ 0 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 10 ] . second , bind ( & CGPreGame : : openSel , CGP , loadGame , false ) , 545 , 4 , " ZTSINGL.DEF " , SDLK_s ) ;
buttons [ 1 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 11 ] . second , bind ( & CGPreGame : : openSel , CGP , loadGame , true ) , 568 , 120 , " ZTMULTI.DEF " , SDLK_m ) ;
2009-08-17 11:50:31 +03:00
buttons [ 2 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 12 ] . second , 0 /*cb*/ , 541 , 233 , " ZTCAMPN.DEF " , SDLK_c ) ;
buttons [ 3 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 13 ] . second , 0 /*cb*/ , 545 , 358 , " ZTTUTOR.DEF " , SDLK_t ) ;
buttons [ 4 ] = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 14 ] . second , bind ( & CMenuScreen : : moveTo , this , CGP - > scrs [ mainMenu ] ) , 582 , 464 , " ZTBACK.DEF " , SDLK_ESCAPE ) ;
2009-02-06 13:15:39 +02:00
}
2009-08-17 11:50:31 +03:00
break ;
2010-02-08 16:38:06 +02:00
case campaignMain :
{
buttons [ 0 ] = new AdventureMapButton ( " " , " " , 0 /*cb*/ , 535 , 8 , " ZSSSOD.DEF " , SDLK_s ) ;
buttons [ 1 ] = new AdventureMapButton ( " " , " " , 0 /*cb*/ , 494 , 117 , " ZSSROE.DEF " , SDLK_m ) ;
buttons [ 2 ] = new AdventureMapButton ( " " , " " , 0 /*cb*/ , 486 , 241 , " ZSSARM.DEF " , SDLK_c ) ;
2010-02-24 15:03:36 +02:00
buttons [ 3 ] = new AdventureMapButton ( " " , " " , bind ( & CGPreGame : : openSel , CGP , campaignList , false ) , 550 , 358 , " ZSSCUS.DEF " , SDLK_t ) ;
2010-02-08 16:38:06 +02:00
buttons [ 4 ] = new AdventureMapButton ( " " , " " , bind ( & CMenuScreen : : moveTo , this , CGP - > scrs [ newGame ] ) , 582 , 464 , " ZSSEXIT.DEF " , SDLK_ESCAPE ) ;
2010-02-11 16:12:22 +02:00
2010-02-08 16:38:06 +02:00
}
break ;
2009-02-06 13:15:39 +02:00
}
2009-08-17 11:50:31 +03:00
for ( int i = 0 ; i < ARRAY_COUNT ( buttons ) ; i + + )
buttons [ i ] - > hoverable = true ;
2009-02-06 13:15:39 +02:00
}
2009-08-17 11:50:31 +03:00
CMenuScreen : : ~ CMenuScreen ( )
2008-08-06 01:11:32 +03:00
{
2009-08-17 11:50:31 +03:00
}
void CMenuScreen : : showAll ( SDL_Surface * to )
2008-08-06 01:11:32 +03:00
{
2009-08-17 11:50:31 +03:00
blitAt ( CGP - > mainbg , 0 , 0 , to ) ;
CIntObject : : showAll ( to ) ;
2008-08-06 01:11:32 +03:00
}
2009-08-17 11:50:31 +03:00
void CMenuScreen : : show ( SDL_Surface * to )
2009-01-25 18:19:34 +02:00
{
2009-08-17 11:50:31 +03:00
CIntObject : : show ( to ) ;
CGI - > videoh - > update ( pos . x + 8 , pos . y + 105 , screen , true , false ) ;
2009-01-25 18:19:34 +02:00
}
2009-08-17 11:50:31 +03:00
void CMenuScreen : : moveTo ( CMenuScreen * next )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
GH . popInt ( this ) ;
GH . pushInt ( next ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
CGPreGame : : CGPreGame ( )
2008-08-02 18:08:03 +03:00
{
2009-08-27 11:04:32 +03:00
GH . defActionsDef = 63 ;
2009-08-17 11:50:31 +03:00
CGP = this ;
mainbg = BitmapHandler : : loadBitmap ( " ZPIC1005.bmp " ) ;
for ( int i = 0 ; i < ARRAY_COUNT ( scrs ) ; i + + )
2010-02-13 18:26:47 +02:00
scrs [ i ] = new CMenuScreen ( ( CMenuScreen : : EState ) i ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
CGPreGame : : ~ CGPreGame ( )
2008-08-06 01:11:32 +03:00
{
2009-08-17 11:50:31 +03:00
SDL_FreeSurface ( mainbg ) ;
for ( int i = 0 ; i < ARRAY_COUNT ( scrs ) ; i + + )
delete scrs [ i ] ;
2008-08-06 01:11:32 +03:00
}
2009-08-17 11:50:31 +03:00
2010-02-24 15:03:36 +02:00
void CGPreGame : : openSel ( CMenuScreen : : EState type , bool multi )
2008-08-02 18:08:03 +03:00
{
2010-02-26 13:18:09 +02:00
playerNames . clear ( ) ;
2010-02-16 18:35:24 +02:00
playerNames . push_back ( CGI - > generaltexth - > allTexts [ 434 ] ) ; //we have only one player and his name is "Player"
2010-02-24 15:03:36 +02:00
GH . pushInt ( new CSelectionScreen ( type , multi ) ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void CGPreGame : : loadGraphics ( )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
victory = CDefHandler : : giveDef ( " SCNRVICT.DEF " ) ;
loss = CDefHandler : : giveDef ( " SCNRLOSS.DEF " ) ;
bonuses = CDefHandler : : giveDef ( " SCNRSTAR.DEF " ) ;
rHero = BitmapHandler : : loadBitmap ( " HPSRAND1.bmp " ) ;
rTown = BitmapHandler : : loadBitmap ( " HPSRAND0.bmp " ) ;
nHero = BitmapHandler : : loadBitmap ( " HPSRAND6.bmp " ) ;
nTown = BitmapHandler : : loadBitmap ( " HPSRAND5.bmp " ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void CGPreGame : : disposeGraphics ( )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
delete victory ;
delete loss ;
SDL_FreeSurface ( rHero ) ;
SDL_FreeSurface ( nHero ) ;
SDL_FreeSurface ( rTown ) ;
SDL_FreeSurface ( nTown ) ;
2008-08-02 18:08:03 +03:00
}
2009-12-28 06:08:24 +02:00
void CGPreGame : : update ( )
{
if ( GH . listInt . size ( ) = = 0 )
{
# ifdef _WIN32
CGI - > videoh - > open ( " ACREDIT.SMK " ) ;
# else
CGI - > videoh - > open ( " ACREDIT.SMK " , true , false ) ;
# endif
2010-02-13 18:26:47 +02:00
GH . pushInt ( scrs [ CMenuScreen : : mainMenu ] ) ;
2009-12-28 06:08:24 +02:00
}
CGI - > curh - > draw1 ( ) ;
SDL_Flip ( screen ) ;
CGI - > curh - > draw2 ( ) ;
GH . topInt ( ) - > show ( screen ) ;
GH . updateTime ( ) ;
GH . handleEvents ( ) ;
}
2010-02-24 15:03:36 +02:00
CSelectionScreen : : CSelectionScreen ( CMenuScreen : : EState Type , bool MultiPlayer )
: multiPlayer ( MultiPlayer )
2008-08-02 18:08:03 +03:00
{
2009-08-27 11:04:32 +03:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
IShowActivable : : type = BLOCK_ADV_HOTKEYS ;
pos . w = 762 ;
pos . h = 584 ;
2010-02-13 18:26:47 +02:00
if ( Type = = CMenuScreen : : saveGame )
2009-08-27 11:04:32 +03:00
{
center ( pos ) ;
}
2010-02-15 14:12:21 +02:00
else if ( Type = = CMenuScreen : : campaignList )
{
bg = new CPicture ( BitmapHandler : : loadBitmap ( " CamCust.bmp " ) , 0 , 0 , true ) ;
pos . x = 3 ;
pos . y = 6 ;
}
2009-08-27 11:04:32 +03:00
else
{
pos . x = 3 ;
pos . y = 6 ;
bg = new CPicture ( BitmapHandler : : loadBitmap ( rand ( ) % 2 ? " ZPIC1000.bmp " : " ZPIC1001.bmp " ) , - 3 , - 6 , true ) ;
}
2009-08-17 11:50:31 +03:00
CGP - > loadGraphics ( ) ;
type = Type ;
curOpts = & sInfo ;
2009-08-27 11:04:32 +03:00
sInfo . difficulty = 1 ;
2009-08-17 11:50:31 +03:00
current = NULL ;
2010-02-13 18:26:47 +02:00
sInfo . mode = ( Type = = CMenuScreen : : newGame ? 0 : 1 ) ;
2009-08-17 11:50:31 +03:00
sInfo . turnTime = 0 ;
curTab = NULL ;
2010-02-13 18:26:47 +02:00
card = new InfoCard ( type ) ; //right info card
if ( type = = CMenuScreen : : campaignList )
{
opt = NULL ;
}
else
{
opt = new OptionsTab ( type /*, sInfo*/ ) ; //scenario options tab
opt - > recActions = DISPOSE ;
}
2010-02-24 15:03:36 +02:00
sel = new SelectionTab ( type , bind ( & CSelectionScreen : : changeSelection , this , _1 ) , multiPlayer ) ; //scenario selection tab
2009-08-17 11:50:31 +03:00
sel - > recActions = DISPOSE ;
switch ( type )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
case CMenuScreen : : newGame :
2009-08-17 11:50:31 +03:00
{
card - > difficulty - > onChange = bind ( & CSelectionScreen : : difficultyChange , this , _1 ) ;
card - > difficulty - > select ( 1 , 0 ) ;
2009-08-27 11:04:32 +03:00
AdventureMapButton * select = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 45 ] , bind ( & CSelectionScreen : : toggleTab , this , sel ) , 411 , 75 , " GSPBUTT.DEF " , SDLK_s ) ;
2009-08-17 11:50:31 +03:00
select - > addTextOverlay ( CGI - > generaltexth - > allTexts [ 500 ] , FONT_SMALL ) ;
2009-08-27 11:04:32 +03:00
AdventureMapButton * opts = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 46 ] , bind ( & CSelectionScreen : : toggleTab , this , opt ) , 411 , 503 , " GSPBUTT.DEF " , SDLK_a ) ;
2009-08-17 11:50:31 +03:00
opts - > addTextOverlay ( CGI - > generaltexth - > allTexts [ 501 ] , FONT_SMALL ) ;
2009-08-27 11:04:32 +03:00
AdventureMapButton * random = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 47 ] , bind ( & CSelectionScreen : : toggleTab , this , sel ) , 411 , 99 , " GSPBUTT.DEF " , SDLK_r ) ;
2009-08-17 11:50:31 +03:00
random - > addTextOverlay ( CGI - > generaltexth - > allTexts [ 740 ] , FONT_SMALL ) ;
2009-08-27 11:04:32 +03:00
start = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 103 ] , bind ( & CSelectionScreen : : startGame , this ) , 411 , 529 , " SCNRBEG.DEF " , SDLK_b ) ;
2009-08-17 11:50:31 +03:00
}
break ;
2010-02-13 18:26:47 +02:00
case CMenuScreen : : loadGame :
2009-08-17 11:50:31 +03:00
sel - > recActions = 255 ;
2009-08-27 11:04:32 +03:00
start = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 103 ] , bind ( & CSelectionScreen : : startGame , this ) , 411 , 529 , " SCNRLOD.DEF " , SDLK_l ) ;
break ;
2010-02-13 18:26:47 +02:00
case CMenuScreen : : saveGame :
2009-08-27 11:04:32 +03:00
sel - > recActions = 255 ;
start = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 103 ] . second , bind ( & CSelectionScreen : : startGame , this ) , 411 , 529 , " SCNRSAV.DEF " ) ;
2009-08-17 11:50:31 +03:00
break ;
2010-02-13 18:26:47 +02:00
case CMenuScreen : : campaignList :
sel - > recActions = 255 ;
2010-02-15 14:12:21 +02:00
start = new AdventureMapButton ( std : : pair < std : : string , std : : string > ( ) , bind ( & CSelectionScreen : : startCampaign , this ) , 411 , 529 , " SCNRLOD.DEF " , SDLK_b ) ;
2010-02-13 18:26:47 +02:00
break ;
2008-08-02 18:08:03 +03:00
}
2010-02-15 14:12:21 +02:00
2008-08-02 18:08:03 +03:00
2009-08-27 11:04:32 +03:00
start - > assignedKeys . insert ( SDLK_RETURN ) ;
2010-02-15 14:12:21 +02:00
std : : string backName ;
if ( Type = = CMenuScreen : : campaignList )
{
backName = " SCNRBACK.DEF " ;
}
else
{
backName = " SCNRBACK.DEF " ;
}
back = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 105 ] . second , bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 581 , 529 , backName , SDLK_ESCAPE ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
CSelectionScreen : : ~ CSelectionScreen ( )
2008-08-02 18:08:03 +03:00
{
2009-08-27 11:04:32 +03:00
curMap = NULL ;
curOpts = NULL ;
2009-10-06 04:14:00 +03:00
playerSerial = playerColor = - 1 ;
2010-02-16 18:35:24 +02:00
playerNames . clear ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void CSelectionScreen : : toggleTab ( CIntObject * tab )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( curTab & & curTab - > active )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
curTab - > deactivate ( ) ;
curTab - > recActions = DISPOSE ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
if ( curTab ! = tab )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
tab - > recActions = 255 ;
tab - > activate ( ) ;
curTab = tab ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
else
{
curTab = NULL ;
} ;
GH . totalRedraw ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void CSelectionScreen : : changeSelection ( const CMapInfo * to )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
curMap = current = to ; ;
2010-03-06 00:51:09 +02:00
2010-02-13 18:26:47 +02:00
if ( to & & type = = CMenuScreen : : loadGame )
2010-02-24 15:03:36 +02:00
curOpts - > difficulty = to - > scenarioOpts - > difficulty ;
2010-03-08 00:56:51 +02:00
if ( type ! = CMenuScreen : : campaignList & & type ! = CMenuScreen : : saveGame )
2010-02-13 18:26:47 +02:00
{
2010-03-06 00:51:09 +02:00
updateStartInfo ( to , sInfo , to ? to - > mapHeader : NULL ) ;
2010-02-13 18:26:47 +02:00
}
2009-08-17 11:50:31 +03:00
card - > changeSelection ( to ) ;
2010-02-13 18:26:47 +02:00
if ( type ! = CMenuScreen : : campaignList )
{
2010-03-06 00:51:09 +02:00
opt - > changeSelection ( to ? to - > mapHeader : NULL ) ;
2010-02-13 18:26:47 +02:00
}
2008-08-02 18:08:03 +03:00
}
2010-02-16 18:35:24 +02:00
void setPlayer ( PlayerSettings & pset , unsigned player )
{
if ( player < playerNames . size ( ) )
{
pset . name = playerNames [ player ] ;
pset . human = true ;
if ( playerColor < 0 )
{
playerColor = pset . color ;
playerSerial = pset . serial ;
}
}
else
{
pset . name = CGI - > generaltexth - > allTexts [ 468 ] ; //Computer
pset . human = false ;
}
}
2010-02-18 14:34:44 +02:00
void CSelectionScreen : : updateStartInfo ( const CMapInfo * to , StartInfo & sInfo , const CMapHeader * mapHeader )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
sInfo . playerInfos . clear ( ) ;
2009-09-21 11:29:41 +03:00
if ( ! to )
return ;
2009-08-17 11:50:31 +03:00
sInfo . playerInfos . resize ( to - > playerAmnt ) ;
2009-09-21 11:29:41 +03:00
sInfo . mapname = to - > filename ;
2009-10-06 04:14:00 +03:00
playerSerial = playerColor = - 1 ;
2010-02-16 18:35:24 +02:00
ui8 placedPlayers = 0 ;
2008-08-02 18:08:03 +03:00
2009-08-17 11:50:31 +03:00
int serialC = 0 ;
for ( int i = 0 ; i < PLAYER_LIMIT ; i + + )
2008-08-02 18:08:03 +03:00
{
2010-02-18 14:34:44 +02:00
const PlayerInfo & pinfo = mapHeader - > players [ i ] ;
2009-08-17 11:50:31 +03:00
//neither computer nor human can play - no player
if ( ! ( pinfo . canComputerPlay | | pinfo . canComputerPlay ) )
continue ;
PlayerSettings & pset = sInfo . playerInfos [ serialC ] ;
pset . color = i ;
pset . serial = serialC + + ;
2010-03-08 00:56:51 +02:00
if ( pinfo . canHumanPlay )
setPlayer ( pset , placedPlayers + + ) ;
else
setPlayer ( pset , - 1 ) ;
2008-08-02 18:08:03 +03:00
2009-08-17 11:50:31 +03:00
for ( int j = 0 ; j < F_NUMBER & & pset . castle ! = - 1 ; j + + ) //we start with none and find matching faction. if more than one, then set to random
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( ( 1 < < j ) & pinfo . allowedFactions )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( pset . castle > = 0 ) //we've already assigned a castle and another one is possible -> set random and let player choose
pset . castle = - 1 ; //breaks
if ( pset . castle = = - 2 ) //first available castle - pick
pset . castle = j ;
2008-08-02 18:08:03 +03:00
}
}
2010-02-18 14:34:44 +02:00
if ( ( pinfo . generateHeroAtMainTown | | mapHeader - > version = = CMapHeader : : RoE ) & & pinfo . hasMainTown //we will generate hero in front of main town
2009-08-17 11:50:31 +03:00
| | pinfo . p8 ) //random hero
pset . hero = - 1 ;
else
pset . hero = - 2 ;
2008-08-02 18:08:03 +03:00
2009-08-17 11:50:31 +03:00
if ( pinfo . mainHeroName . length ( ) )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
pset . heroName = pinfo . mainHeroName ;
if ( ( pset . heroPortrait = pinfo . mainHeroPortrait ) = = 255 )
pset . heroPortrait = pinfo . p9 ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
pset . handicap = 0 ;
}
2008-08-02 18:08:03 +03:00
}
2008-11-16 03:06:15 +02:00
2010-02-15 14:12:21 +02:00
void CSelectionScreen : : startCampaign ( )
{
2010-02-18 14:34:44 +02:00
CCampaign * ourCampaign = CCampaignHandler : : getCampaign ( curMap - > filename , curMap - > lodCmpgn ) ;
2010-02-15 14:12:21 +02:00
GH . pushInt ( new CBonusSelection ( ourCampaign , 0 ) ) ;
}
2009-08-17 11:50:31 +03:00
void CSelectionScreen : : startGame ( )
2008-08-06 01:11:32 +03:00
{
2010-03-08 00:56:51 +02:00
if ( type = = CMenuScreen : : newGame )
{
//there must be at least one human player before game can be started
std : : vector < PlayerSettings > : : const_iterator i ;
for ( i = curOpts - > playerInfos . begin ( ) ; i ! = curOpts - > playerInfos . end ( ) ; i + + )
if ( i - > human )
break ;
if ( i = = curOpts - > playerInfos . end ( ) )
{
GH . pushInt ( CInfoWindow : : create ( CGI - > generaltexth - > allTexts [ 530 ] ) ) ; //You must position yourself prior to starting the game.
return ;
}
}
2010-02-13 18:26:47 +02:00
if ( type ! = CMenuScreen : : saveGame )
2009-08-27 11:04:32 +03:00
{
if ( ! current )
return ;
selectedName = sInfo . mapname ;
StartInfo * si = new StartInfo ( sInfo ) ;
2010-03-08 00:56:51 +02:00
GH . popIntTotally ( this ) ; //delete me
GH . popInt ( GH . topInt ( ) ) ; //only deactivate main menu screen
2010-02-25 15:51:30 +02:00
//curMap = NULL;
2009-08-27 11:04:32 +03:00
curOpts = NULL ;
: : startGame ( si ) ;
}
else
{
if ( ! ( sel & & sel - > txt & & sel - > txt - > text . size ( ) ) )
return ;
2009-08-17 11:50:31 +03:00
2009-10-10 08:47:59 +03:00
selectedName = GVCMIDirs . UserPath + " /Games/ " + sel - > txt - > text + " .vlgm1 " ;
2010-03-08 00:56:51 +02:00
CFunctionList < void ( ) > overWrite ;
overWrite + = bind ( & CCallback : : save , LOCPLINT - > cb , sel - > txt - > text ) ;
overWrite + = bind ( & CGuiHandler : : popIntTotally , & GH , this ) ;
if ( fs : : exists ( selectedName ) )
{
std : : string hlp = CGI - > generaltexth - > allTexts [ 493 ] ; //%s exists. Overwrite?
boost : : algorithm : : replace_first ( hlp , " %s " , sel - > txt - > text ) ;
LOCPLINT - > showYesNoDialog ( hlp , std : : vector < SComponent * > ( ) , overWrite , 0 , false ) ;
}
else
overWrite ( ) ;
// LOCPLINT->cb->save(sel->txt->text);
// GH.popIntTotally(this);
2009-08-27 11:04:32 +03:00
}
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void CSelectionScreen : : difficultyChange ( int to )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
assert ( type = = CMenuScreen : : newGame ) ;
2009-08-17 11:50:31 +03:00
sInfo . difficulty = to ;
GH . totalRedraw ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
// A new size filter (Small, Medium, ...) has been selected. Populate
// selMaps with the relevant data.
2009-08-27 11:04:32 +03:00
void SelectionTab : : filter ( int size , bool selectFirst )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
curItems . clear ( ) ;
2010-02-13 18:26:47 +02:00
if ( tabType = = CMenuScreen : : campaignList )
{
for ( size_t i = 0 ; i < allItems . size ( ) ; i + + )
2009-08-17 11:50:31 +03:00
curItems . push_back ( & allItems [ i ] ) ;
2010-02-13 18:26:47 +02:00
}
else
{
for ( size_t i = 0 ; i < allItems . size ( ) ; i + + )
if ( allItems [ i ] . mapHeader & & allItems [ i ] . mapHeader - > version & & ( ! size | | allItems [ i ] . mapHeader - > width = = size ) )
curItems . push_back ( & allItems [ i ] ) ;
}
2009-08-17 11:50:31 +03:00
if ( curItems . size ( ) )
{
slider - > block ( false ) ;
slider - > setAmount ( curItems . size ( ) ) ;
sort ( ) ;
2009-08-27 11:04:32 +03:00
if ( selectFirst )
{
slider - > moveTo ( 0 ) ;
onSelect ( curItems [ 0 ] ) ;
}
2009-09-11 14:11:01 +03:00
selectAbs ( 0 ) ;
2009-08-17 11:50:31 +03:00
}
else
{
slider - > block ( true ) ;
onSelect ( NULL ) ;
}
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void SelectionTab : : getFiles ( std : : vector < FileInfo > & out , const std : : string & dirname , const std : : string & ext )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( ! boost : : filesystem : : exists ( dirname ) )
{
tlog1 < < " Cannot find " < < dirname < < " directory! \n " ;
}
2009-10-04 05:02:45 +03:00
fs : : path tie ( dirname ) ;
2009-08-17 11:50:31 +03:00
fs : : directory_iterator end_iter ;
for ( fs : : directory_iterator file ( tie ) ; file ! = end_iter ; + + file )
{
if ( fs : : is_regular_file ( file - > status ( ) )
& & boost : : ends_with ( file - > path ( ) . filename ( ) , ext ) )
{
2010-03-01 20:22:22 +02:00
std : : time_t date = 0 ;
try
{
date = fs : : last_write_time ( file - > path ( ) ) ;
out . resize ( out . size ( ) + 1 ) ;
out . back ( ) . date = date ;
out . back ( ) . name = file - > path ( ) . string ( ) ;
}
catch ( . . . )
{
tlog2 < < " \t \t Warning: very corrupted map file: " < < file - > path ( ) . string ( ) < < std : : endl ;
}
2009-08-17 11:50:31 +03:00
}
}
allItems . resize ( out . size ( ) ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void SelectionTab : : parseMaps ( std : : vector < FileInfo > & files , int start , int threads )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
int read = 0 ;
unsigned char mapBuffer [ 1500 ] ;
while ( start < allItems . size ( ) )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
gzFile tempf = gzopen ( files [ start ] . name . c_str ( ) , " rb " ) ;
read = gzread ( tempf , mapBuffer , 1500 ) ;
gzclose ( tempf ) ;
if ( read < 50 | | ! mapBuffer [ 4 ] )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
tlog3 < < " \t \t Warning: corrupted map file: " < < files [ start ] . name < < std : : endl ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
else //valid map
{
2010-02-13 18:26:47 +02:00
allItems [ start ] . mapInit ( files [ start ] . name , mapBuffer ) ;
2009-08-17 11:50:31 +03:00
//allItems[start].date = "DATEDATE";// files[start].date;
}
start + = threads ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
}
2010-02-24 15:03:36 +02:00
void SelectionTab : : parseGames ( std : : vector < FileInfo > & files , bool multi )
2009-08-17 11:50:31 +03:00
{
for ( int i = 0 ; i < files . size ( ) ; i + + )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
CLoadFile lf ( files [ i ] . name ) ;
if ( ! lf . sfile )
continue ;
ui8 sign [ 8 ] ;
lf > > sign ;
if ( std : : memcmp ( sign , " VCMISVG " , 7 ) )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
tlog1 < < files [ i ] . name < < " is not a correct savefile! " < < std : : endl ;
continue ;
2008-08-02 18:08:03 +03:00
}
2010-02-13 23:45:46 +02:00
allItems [ i ] . mapHeader = new CMapHeader ( ) ;
2010-02-24 15:03:36 +02:00
lf > > * ( allItems [ i ] . mapHeader ) > > allItems [ i ] . scenarioOpts ;
2009-08-17 11:50:31 +03:00
allItems [ i ] . filename = files [ i ] . name ;
allItems [ i ] . countPlayers ( ) ;
allItems [ i ] . date = std : : asctime ( std : : localtime ( & files [ i ] . date ) ) ;
2010-02-24 15:03:36 +02:00
if ( ( allItems [ i ] . actualHumanPlayers > 1 ) ! = multi ) //if multi mode then only multi games, otherwise single
{
delete allItems [ i ] . mapHeader ;
allItems [ i ] . mapHeader = NULL ;
}
2008-08-02 18:08:03 +03:00
}
}
2009-02-06 13:15:39 +02:00
2010-02-13 18:26:47 +02:00
void SelectionTab : : parseCampaigns ( std : : vector < FileInfo > & files )
{
for ( int i = 0 ; i < files . size ( ) ; i + + )
{
2010-02-18 16:09:16 +02:00
//allItems[i].date = std::asctime(std::localtime(&files[i].date));
2010-02-13 18:26:47 +02:00
allItems [ i ] . filename = files [ i ] . name ;
2010-02-18 14:34:44 +02:00
allItems [ i ] . lodCmpgn = files [ i ] . inLod ;
2010-02-13 18:26:47 +02:00
allItems [ i ] . campaignInit ( ) ;
}
}
2010-02-24 15:03:36 +02:00
SelectionTab : : SelectionTab ( CMenuScreen : : EState Type , const boost : : function < void ( CMapInfo * ) > & OnSelect , bool MultiPlayer )
2010-02-15 14:12:21 +02:00
: onSelect ( OnSelect ) , bg ( NULL )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
OBJ_CONSTRUCTION ;
selectionPos = 0 ;
2009-08-23 21:01:08 +03:00
used = LCLICK | WHEEL | KEYBOARD | DOUBLECLICK ;
2009-08-17 11:50:31 +03:00
slider = NULL ;
2009-08-27 11:04:32 +03:00
txt = NULL ;
2010-02-13 18:26:47 +02:00
tabType = Type ;
2009-08-27 11:04:32 +03:00
2010-02-15 15:28:33 +02:00
if ( Type ! = CMenuScreen : : campaignList )
{
2010-02-13 18:26:47 +02:00
bg = new CPicture ( BitmapHandler : : loadBitmap ( " SCSELBCK.bmp " ) , 0 , 0 , true ) ;
2010-02-15 14:12:21 +02:00
pos . w = bg - > pos . w ;
pos . h = bg - > pos . h ;
2010-02-15 15:28:33 +02:00
}
else
{
SDL_Surface * tmp1 = BitmapHandler : : loadBitmap ( " CAMCUST.bmp " ) ;
SDL_Surface * tmp = CSDL_Ext : : newSurface ( 400 , tmp1 - > h ) ;
blitAt ( tmp1 , 0 , 0 , tmp ) ;
SDL_FreeSurface ( tmp1 ) ;
bg = new CPicture ( tmp , 0 , 0 , true ) ;
pos . w = bg - > pos . w ;
pos . h = bg - > pos . h ;
bg - > pos . x = bg - > pos . y = 0 ;
}
2009-08-27 11:04:32 +03:00
2009-08-17 11:50:31 +03:00
std : : vector < FileInfo > toParse ;
2010-02-18 14:34:44 +02:00
std : : vector < CCampaignHeader > cpm ;
2010-02-13 18:26:47 +02:00
switch ( tabType )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
case CMenuScreen : : newGame :
getFiles ( toParse , DATA_DIR " /Maps " , " h3m " ) ; //get all maps
2009-08-17 11:50:31 +03:00
parseMaps ( toParse ) ;
positions = 18 ;
break ;
2009-02-06 13:15:39 +02:00
2010-02-13 18:26:47 +02:00
case CMenuScreen : : loadGame :
case CMenuScreen : : saveGame :
getFiles ( toParse , GVCMIDirs . UserPath + " /Games " , " vlgm1 " ) ; //get all saves
2010-02-24 15:03:36 +02:00
parseGames ( toParse , MultiPlayer ) ;
2010-02-13 18:26:47 +02:00
if ( tabType = = CMenuScreen : : loadGame )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
positions = 18 ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
else
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
positions = 16 ;
2009-08-27 11:04:32 +03:00
}
2010-02-13 18:26:47 +02:00
if ( tabType = = CMenuScreen : : saveGame )
2009-08-27 11:04:32 +03:00
txt = new CTextInput ( Rect ( 32 , 539 , 350 , 20 ) , Point ( - 32 , - 25 ) , " GSSTRIP.bmp " , 0 ) ;
2009-08-17 11:50:31 +03:00
break ;
2010-02-13 18:26:47 +02:00
case CMenuScreen : : campaignList :
getFiles ( toParse , DATA_DIR " /Maps " , " h3c " ) ; //get all campaigns
2010-02-18 14:34:44 +02:00
for ( int g = 0 ; g < toParse . size ( ) ; + + g )
{
toParse [ g ] . inLod = false ;
}
//add lod cmpgns
cpm = CCampaignHandler : : getCampaignHeaders ( CCampaignHandler : : ALL ) ;
for ( int g = 0 ; g < cpm . size ( ) ; g + + )
{
2010-02-18 16:09:16 +02:00
FileInfo fi ;
fi . inLod = cpm [ g ] . loadFromLod ;
fi . name = cpm [ g ] . filename ;
toParse . push_back ( fi ) ;
2010-02-18 14:34:44 +02:00
if ( cpm [ g ] . loadFromLod )
{
2010-02-18 16:09:16 +02:00
allItems . push_back ( CMapInfo ( false ) ) ;
2010-02-18 14:34:44 +02:00
}
}
2010-02-13 18:26:47 +02:00
parseCampaigns ( toParse ) ;
2010-02-15 14:12:21 +02:00
positions = 18 ;
2010-02-13 18:26:47 +02:00
break ;
2009-02-08 19:19:42 +02:00
2009-08-17 11:50:31 +03:00
default :
assert ( 0 ) ;
2010-02-13 18:26:47 +02:00
break ;
2009-08-17 11:50:31 +03:00
}
2009-02-08 19:19:42 +02:00
2010-02-15 15:28:33 +02:00
2010-02-13 18:26:47 +02:00
if ( tabType ! = CMenuScreen : : campaignList )
2009-08-17 11:50:31 +03:00
{
2010-02-15 15:28:33 +02:00
//size filter buttons
2010-02-13 18:26:47 +02:00
{
int sizes [ ] = { 36 , 72 , 108 , 144 , 0 } ;
const char * names [ ] = { " SCSMBUT.DEF " , " SCMDBUT.DEF " , " SCLGBUT.DEF " , " SCXLBUT.DEF " , " SCALBUT.DEF " } ;
for ( int i = 0 ; i < 5 ; i + + )
new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 54 + i ] . second , bind ( & SelectionTab : : filter , this , sizes [ i ] , true ) , 158 + 47 * i , 46 , names [ i ] ) ;
}
2009-08-17 11:50:31 +03:00
2010-02-15 15:28:33 +02:00
//sort buttons buttons
2010-02-13 18:26:47 +02:00
{
int xpos [ ] = { 23 , 55 , 88 , 121 , 306 , 339 } ;
const char * names [ ] = { " SCBUTT1.DEF " , " SCBUTT2.DEF " , " SCBUTCP.DEF " , " SCBUTT3.DEF " , " SCBUTT4.DEF " , " SCBUTT5.DEF " } ;
for ( int i = 0 ; i < 6 ; i + + )
new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 107 + i ] . second , bind ( & SelectionTab : : sortBy , this , i ) , xpos [ i ] , 86 , names [ i ] ) ;
}
2009-02-11 19:03:30 +02:00
}
2010-02-15 15:28:33 +02:00
else
{
//sort by buttons
new AdventureMapButton ( " " , " " , bind ( & SelectionTab : : sortBy , this , _numOfMaps ) , 23 , 86 , " CamCusM.DEF " ) ; //by num of maps
new AdventureMapButton ( " " , " " , bind ( & SelectionTab : : sortBy , this , _name ) , 55 , 86 , " CamCusL.DEF " ) ; //by name
}
2009-08-17 11:50:31 +03:00
2010-02-13 18:26:47 +02:00
slider = new CSlider ( 372 , 86 , tabType ! = CMenuScreen : : saveGame ? 480 : 430 , bind ( & SelectionTab : : sliderMove , this , _1 ) , positions , curItems . size ( ) , 0 , false , 1 ) ;
2009-08-17 11:50:31 +03:00
format = CDefHandler : : giveDef ( " SCSELC.DEF " ) ;
sortingBy = _format ;
ascending = true ;
filter ( 0 ) ;
2009-08-27 11:04:32 +03:00
//select(0);
2010-02-13 18:26:47 +02:00
switch ( tabType )
2009-08-27 11:04:32 +03:00
{
2010-02-13 18:26:47 +02:00
case CMenuScreen : : newGame :
2009-10-10 04:42:33 +03:00
selectFName ( DATA_DIR " /Maps/Arrogance.h3m " ) ;
2009-08-27 11:04:32 +03:00
break ;
2010-02-13 18:26:47 +02:00
case CMenuScreen : : loadGame :
case CMenuScreen : : campaignList :
2009-08-27 11:04:32 +03:00
select ( 0 ) ;
break ;
2010-02-13 18:26:47 +02:00
case CMenuScreen : : saveGame : ;
2009-08-27 11:04:32 +03:00
if ( selectedName . size ( ) )
{
2010-03-08 00:56:51 +02:00
if ( selectedName [ 2 ] = = ' M ' ) //name starts with ./Maps instead of ./Games => there was nothing to select
2009-08-27 11:04:32 +03:00
txt - > setText ( " NEWGAME " ) ;
else
2009-08-28 22:34:08 +03:00
selectFName ( selectedName ) ;
2009-08-27 11:04:32 +03:00
}
}
2009-08-17 11:50:31 +03:00
}
SelectionTab : : ~ SelectionTab ( )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
delete format ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void SelectionTab : : sortBy ( int criteria )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( criteria = = sortingBy )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
ascending = ! ascending ;
2008-08-02 18:08:03 +03:00
}
else
{
2009-08-17 11:50:31 +03:00
sortingBy = ( ESortBy ) criteria ;
ascending = true ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
sort ( ) ;
2009-09-11 14:11:01 +03:00
selectAbs ( 0 ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void SelectionTab : : sort ( )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( sortingBy ! = _name )
2010-02-13 18:26:47 +02:00
std : : stable_sort ( curItems . begin ( ) , curItems . end ( ) , mapSorter ( _name ) ) ;
std : : stable_sort ( curItems . begin ( ) , curItems . end ( ) , mapSorter ( sortingBy ) ) ;
2009-06-10 23:48:55 +03:00
2009-08-17 11:50:31 +03:00
if ( ! ascending )
std : : reverse ( curItems . begin ( ) , curItems . end ( ) ) ;
2009-06-10 23:48:55 +03:00
2009-08-17 11:50:31 +03:00
redraw ( ) ;
}
2009-06-10 23:48:55 +03:00
2009-08-17 11:50:31 +03:00
void SelectionTab : : select ( int position )
{
2009-08-27 11:04:32 +03:00
if ( ! curItems . size ( ) ) return ;
2009-08-17 11:50:31 +03:00
// New selection. py is the index in curItems.
int py = position + slider - > value ;
2009-08-23 21:01:08 +03:00
amax ( py , 0 ) ;
amin ( py , curItems . size ( ) - 1 ) ;
2009-02-06 13:15:39 +02:00
2009-08-23 21:01:08 +03:00
selectionPos = py ;
if ( position < 0 )
slider - > moveTo ( slider - > value + position ) ;
else if ( position > = positions )
slider - > moveTo ( slider - > value + position - positions + 1 ) ;
2010-03-08 00:56:51 +02:00
if ( txt )
txt - > setText ( fs : : basename ( curItems [ py ] - > filename ) ) ;
2009-08-23 21:01:08 +03:00
onSelect ( curItems [ py ] ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
2009-08-27 11:04:32 +03:00
void SelectionTab : : selectAbs ( int position )
{
select ( position - slider - > value ) ;
}
2009-08-17 11:50:31 +03:00
int SelectionTab : : getPosition ( int x , int y )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
return - 1 ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void SelectionTab : : sliderMove ( int slidPos )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( ! slider ) return ; //ignore spurious call when slider is being created
redraw ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
2009-05-04 02:38:08 +03:00
// Display the tab with the scenario names
//
// elemIdx is the index of the maps or saved game to display on line 0
2009-08-17 11:50:31 +03:00
// slider->capacity contains the number of available screen lines
// slider->positionsAmnt is the number of elements after filtering
void SelectionTab : : printMaps ( SDL_Surface * to )
2008-08-02 18:08:03 +03:00
{
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
int elemIdx = slider - > value ;
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
// Display all elements if there's enough space
//if(slider->amount < slider->capacity)
// elemIdx = 0;
2009-05-04 02:38:08 +03:00
2010-02-13 18:26:47 +02:00
SDL_Color itemColor ;
2009-08-17 11:50:31 +03:00
# define POS(xx, yy) pos.x + xx, pos.y + yy + line*25
for ( int line = 0 ; line < positions & & elemIdx < curItems . size ( ) ; elemIdx + + , line + + )
{
CMapInfo * curMap = curItems [ elemIdx ] ;
2009-05-04 02:38:08 +03:00
2010-02-15 14:12:21 +02:00
if ( elemIdx = = selectionPos )
itemColor = tytulowy ;
else
itemColor = zwykly ;
2010-02-13 18:26:47 +02:00
if ( tabType ! = CMenuScreen : : campaignList )
{
//amount of players
std : : ostringstream ostr ( std : : ostringstream : : out ) ;
ostr < < curMap - > playerAmnt < < " / " < < curMap - > humenPlayers ;
CSDL_Ext : : printAt ( ostr . str ( ) , POS ( 29 , 120 ) , FONT_SMALL , itemColor , to ) ;
//map size
std : : string temp2 = " C " ;
switch ( curMap - > mapHeader - > width )
{
case 36 :
temp2 = " S " ;
break ;
case 72 :
temp2 = " M " ;
break ;
case 108 :
temp2 = " L " ;
break ;
case 144 :
temp2 = " XL " ;
break ;
}
CSDL_Ext : : printAtMiddle ( temp2 , POS ( 70 , 128 ) , FONT_SMALL , itemColor , to ) ;
2009-05-04 02:38:08 +03:00
2010-02-13 18:26:47 +02:00
int temp = - 1 ;
switch ( curMap - > mapHeader - > version )
{
case CMapHeader : : RoE :
temp = 0 ;
break ;
case CMapHeader : : AB :
temp = 1 ;
break ;
case CMapHeader : : SoD :
temp = 2 ;
break ;
case CMapHeader : : WoG :
temp = 3 ;
break ;
default :
// Unknown version. Be safe and ignore that map
tlog2 < < " Warning: " < < curMap - > filename < < " has wrong version! \n " ;
continue ;
}
blitAt ( format - > ourImages [ temp ] . bitmap , POS ( 88 , 117 ) , to ) ;
//victory conditions
if ( curMap - > mapHeader - > victoryCondition . condition = = winStandard )
temp = 11 ;
else
temp = curMap - > mapHeader - > victoryCondition . condition ;
blitAt ( CGP - > victory - > ourImages [ temp ] . bitmap , POS ( 306 , 117 ) , to ) ;
//loss conditions
if ( curMap - > mapHeader - > lossCondition . typeOfLossCon = = lossStandard )
temp = 3 ;
else
temp = curMap - > mapHeader - > lossCondition . typeOfLossCon ;
blitAt ( CGP - > loss - > ourImages [ temp ] . bitmap , POS ( 339 , 117 ) , to ) ;
}
2010-02-15 14:12:21 +02:00
else //if campaign
{
//number of maps in campaign
std : : ostringstream ostr ( std : : ostringstream : : out ) ;
ostr < < CGI - > generaltexth - > campaignRegionNames [ curMap - > campaignHeader - > mapVersion ] . size ( ) ;
CSDL_Ext : : printAt ( ostr . str ( ) , POS ( 29 , 120 ) , FONT_SMALL , itemColor , to ) ;
}
2009-05-04 02:38:08 +03:00
2010-02-13 18:26:47 +02:00
std : : string name ;
if ( tabType ! = CMenuScreen : : campaignList )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
if ( ! curMap - > mapHeader - > name . length ( ) )
curMap - > mapHeader - > name = " Unnamed " ;
name = curMap - > mapHeader - > name ;
2008-08-02 18:08:03 +03:00
}
2010-02-13 18:26:47 +02:00
else
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
name = curMap - > campaignHeader - > name ;
2008-08-02 18:08:03 +03:00
}
2009-01-11 00:08:18 +02:00
2010-02-13 18:26:47 +02:00
//print name
2010-02-15 14:12:21 +02:00
if ( tabType = = CMenuScreen : : newGame | | tabType = = CMenuScreen : : campaignList ) {
2010-02-13 18:26:47 +02:00
CSDL_Ext : : printAtMiddle ( name , POS ( 213 , 128 ) , FONT_SMALL , itemColor , to ) ;
2009-10-10 04:42:33 +03:00
} else
2010-02-13 18:26:47 +02:00
CSDL_Ext : : printAtMiddle ( fs : : basename ( curMap - > filename ) , POS ( 213 , 128 ) , FONT_SMALL , itemColor , to ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
# undef POS
2008-08-02 18:08:03 +03:00
}
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
void SelectionTab : : showAll ( SDL_Surface * to )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
CIntObject : : showAll ( to ) ;
printMaps ( to ) ;
2009-10-23 04:48:03 +03:00
2010-02-13 18:26:47 +02:00
std : : string title ;
switch ( tabType ) {
case CMenuScreen : : newGame :
title = CGI - > generaltexth - > arraytxt [ 229 ] ;
break ;
case CMenuScreen : : loadGame :
title = CGI - > generaltexth - > arraytxt [ 230 ] ;
break ;
case CMenuScreen : : saveGame :
title = CGI - > generaltexth - > arraytxt [ 231 ] ;
break ;
case CMenuScreen : : campaignList :
title = " Select a Campaign " ; //TODO: find where is the title
break ;
2009-10-23 04:48:03 +03:00
}
2010-02-13 18:26:47 +02:00
CSDL_Ext : : printAtMiddle ( title , pos . x + 205 , pos . y + 28 , FONT_MEDIUM , tytulowy , to ) ; //Select a Scenario to Play
2010-02-15 14:12:21 +02:00
if ( tabType ! = CMenuScreen : : campaignList )
{
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 510 ] , pos . x + 87 , pos . y + 62 , FONT_SMALL , tytulowy , to ) ; //Map sizes
}
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void SelectionTab : : clickLeft ( tribool down , bool previousState )
2009-01-11 00:08:18 +02:00
{
2009-10-06 03:32:33 +03:00
if ( down )
{
int line = getLine ( ) ;
if ( line ! = - 1 )
select ( line ) ;
}
2009-01-11 00:08:18 +02:00
}
2009-02-08 08:42:15 +02:00
2009-08-23 21:01:08 +03:00
void SelectionTab : : wheelScrolled ( bool down , bool in )
{
slider - > moveTo ( slider - > value + 3 * ( down ? + 1 : - 1 ) ) ;
//select(selectionPos - slider->value + (down ? +1 : -1));
}
void SelectionTab : : keyPressed ( const SDL_KeyboardEvent & key )
{
if ( key . state ! = SDL_PRESSED ) return ;
int moveBy = 0 ;
switch ( key . keysym . sym )
{
case SDLK_UP :
moveBy = - 1 ;
break ;
case SDLK_DOWN :
moveBy = + 1 ;
break ;
case SDLK_PAGEUP :
moveBy = - positions + 1 ;
break ;
case SDLK_PAGEDOWN :
moveBy = + positions - 1 ;
break ;
case SDLK_HOME :
select ( - slider - > value ) ;
return ;
case SDLK_END :
select ( curItems . size ( ) - slider - > value ) ;
return ;
2009-08-27 11:04:32 +03:00
default :
return ;
2009-08-23 21:01:08 +03:00
}
select ( selectionPos - slider - > value + moveBy ) ;
}
void SelectionTab : : onDoubleClick ( )
{
2009-08-27 11:04:32 +03:00
if ( getLine ( ) ! = - 1 ) //double clicked scenarios list
{
2009-10-13 07:58:15 +03:00
//act as if start button was pressed
2009-08-27 11:04:32 +03:00
( static_cast < CSelectionScreen * > ( parent ) ) - > start - > callback ( ) ;
}
}
int SelectionTab : : getLine ( )
{
int line = - 1 ;
Point clickPos ( GH . current - > button . x , GH . current - > button . y ) ;
2009-09-26 00:11:13 +03:00
clickPos = clickPos - pos . topLeft ( ) ;
2009-08-27 11:04:32 +03:00
2009-10-06 03:32:33 +03:00
if ( clickPos . y > 115 & & clickPos . y < 564 & & clickPos . x > 22 & & clickPos . x < 371 )
2009-08-27 11:04:32 +03:00
{
line = ( clickPos . y - 115 ) / 25 ; //which line
}
return line ;
}
void SelectionTab : : selectFName ( const std : : string & fname )
{
for ( int i = curItems . size ( ) - 1 ; i > = 0 ; i - - )
{
if ( curItems [ i ] - > filename = = fname )
{
slider - > moveTo ( i ) ;
selectAbs ( i ) ;
return ;
}
}
selectAbs ( 0 ) ;
2009-08-23 21:01:08 +03:00
}
2010-02-13 18:26:47 +02:00
InfoCard : : InfoCard ( CMenuScreen : : EState Type )
2010-02-15 14:12:21 +02:00
: difficulty ( NULL ) , sizes ( NULL ) , sFlags ( NULL ) , bg ( NULL )
2009-02-08 08:42:15 +02:00
{
2009-08-17 11:50:31 +03:00
OBJ_CONSTRUCTION ;
2009-08-27 11:04:32 +03:00
pos . x + = 393 ;
2009-08-22 16:59:15 +03:00
used = RCLICK ;
2010-02-13 18:26:47 +02:00
2009-08-17 11:50:31 +03:00
type = Type ;
2009-08-27 11:04:32 +03:00
2010-02-15 14:12:21 +02:00
if ( type = = CMenuScreen : : campaignList )
2009-01-12 22:05:56 +02:00
{
2010-02-15 14:12:21 +02:00
/*bg = new CPicture(BitmapHandler::loadBitmap("CamCust.bmp"), 0, 0, true);
bg - > pos . x = 0 ;
bg - > pos . y = 0 ; */
}
else
{
bg = new CPicture ( BitmapHandler : : loadBitmap ( " GSELPOP1.bmp " ) , 0 , 0 , true ) ;
pos . w = bg - > pos . w ;
pos . h = bg - > pos . h ;
2010-02-13 18:26:47 +02:00
sizes = CDefHandler : : giveDef ( " SCNRMPSZ.DEF " ) ;
sFlags = CDefHandler : : giveDef ( " ITGFLAGS.DEF " ) ;
2009-08-27 11:04:32 +03:00
2010-02-13 18:26:47 +02:00
difficulty = new CHighlightableButtonsGroup ( 0 ) ;
2009-08-27 11:04:32 +03:00
{
2010-02-13 18:26:47 +02:00
static const char * difButns [ ] = { " GSPBUT3.DEF " , " GSPBUT4.DEF " , " GSPBUT5.DEF " , " GSPBUT6.DEF " , " GSPBUT7.DEF " } ;
BLOCK_CAPTURING ;
for ( int i = 0 ; i < 5 ; i + + )
{
difficulty - > addButton ( new CHighlightableButton ( " " , CGI - > generaltexth - > zelp [ 24 + i ] . second , 0 , 110 + i * 32 , 450 , difButns [ i ] , i ) ) ;
difficulty - > buttons . back ( ) - > pos + = pos . topLeft ( ) ;
}
2009-08-27 11:04:32 +03:00
}
2010-02-13 18:26:47 +02:00
if ( type ! = CMenuScreen : : newGame )
difficulty - > block ( true ) ;
}
2008-08-02 18:08:03 +03:00
}
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
InfoCard : : ~ InfoCard ( )
2009-05-29 04:50:33 +03:00
{
2009-08-17 11:50:31 +03:00
delete sizes ;
delete sFlags ;
2008-08-02 18:08:03 +03:00
}
2009-05-29 04:50:33 +03:00
2009-08-17 11:50:31 +03:00
void InfoCard : : showAll ( SDL_Surface * to )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
CIntObject : : showAll ( to ) ;
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
//blit texts
2010-02-13 18:26:47 +02:00
if ( type ! = CMenuScreen : : campaignList )
{
printAtLoc ( CGI - > generaltexth - > allTexts [ 390 ] + " : " , 24 , 400 , FONT_SMALL , zwykly , to ) ; //Allies
printAtLoc ( CGI - > generaltexth - > allTexts [ 391 ] + " : " , 190 , 400 , FONT_SMALL , zwykly , to ) ; //Enemies
printAtLoc ( CGI - > generaltexth - > allTexts [ 494 ] , 33 , 430 , FONT_SMALL , tytulowy , to ) ; //"Map Diff:"
printAtLoc ( CGI - > generaltexth - > allTexts [ 492 ] + " : " , 133 , 430 , FONT_SMALL , tytulowy , to ) ; //player difficulty
printAtLoc ( CGI - > generaltexth - > allTexts [ 218 ] + " : " , 290 , 430 , FONT_SMALL , tytulowy , to ) ; //"Rating:"
printAtLoc ( CGI - > generaltexth - > allTexts [ 495 ] , 26 , 22 , FONT_SMALL , tytulowy , to ) ; //Scenario Name:
printAtLoc ( CGI - > generaltexth - > allTexts [ 496 ] , 26 , 132 , FONT_SMALL , tytulowy , to ) ; //Scenario Description:
printAtLoc ( CGI - > generaltexth - > allTexts [ 497 ] , 26 , 283 , FONT_SMALL , tytulowy , to ) ; //Victory Condition:
printAtLoc ( CGI - > generaltexth - > allTexts [ 498 ] , 26 , 339 , FONT_SMALL , tytulowy , to ) ; //Loss Condition:
}
2009-08-17 11:50:31 +03:00
if ( curMap )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
if ( type ! = CMenuScreen : : campaignList )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
if ( type ! = CMenuScreen : : newGame )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
for ( int i = 0 ; i < difficulty - > buttons . size ( ) ; i + + )
{
//if(i == curMap->difficulty)
// difficulty->buttons[i]->state = 3;
//else
// difficulty->buttons[i]->state = 2;
2008-08-02 18:08:03 +03:00
2010-02-13 18:26:47 +02:00
difficulty - > buttons [ i ] - > showAll ( to ) ;
}
2008-08-02 18:08:03 +03:00
}
2010-02-13 18:26:47 +02:00
//victory conditions
int temp = curMap - > mapHeader - > victoryCondition . condition + 1 ;
if ( temp > 20 ) temp = 0 ;
std : : string sss = CGI - > generaltexth - > victoryConditions [ temp ] ;
if ( temp & & curMap - > mapHeader - > victoryCondition . allowNormalVictory ) sss + = " / " + CGI - > generaltexth - > victoryConditions [ 0 ] ;
printAtLoc ( sss , 60 , 307 , FONT_SMALL , zwykly , to ) ;
2008-08-02 18:08:03 +03:00
2010-02-13 18:26:47 +02:00
//loss conditoins
temp = curMap - > mapHeader - > lossCondition . typeOfLossCon + 1 ;
if ( temp > 20 ) temp = 0 ;
sss = CGI - > generaltexth - > lossCondtions [ temp ] ;
printAtLoc ( sss , 60 , 366 , FONT_SMALL , zwykly , to ) ;
2008-08-02 18:08:03 +03:00
2010-02-13 18:26:47 +02:00
//difficulty
assert ( curMap - > mapHeader - > difficulty < = 4 ) ;
std : : string & diff = CGI - > generaltexth - > arraytxt [ 142 + curMap - > mapHeader - > difficulty ] ;
printAtMiddleLoc ( diff , 62 , 472 , FONT_SMALL , zwykly , to ) ;
//selecting size icon
switch ( curMap - > mapHeader - > width )
{
case 36 :
temp = 0 ;
break ;
case 72 :
temp = 1 ;
break ;
case 108 :
temp = 2 ;
break ;
case 144 :
temp = 3 ;
break ;
default :
temp = 4 ;
break ;
}
blitAtLoc ( sizes - > ourImages [ temp ] . bitmap , 318 , 22 , to ) ;
2010-02-15 14:12:21 +02:00
//conditions
2010-02-13 18:26:47 +02:00
temp = curMap - > mapHeader - > victoryCondition . condition ;
if ( temp > 12 ) temp = 11 ;
blitAtLoc ( CGP - > victory - > ourImages [ temp ] . bitmap , 24 , 302 , to ) ; //victory cond descr
temp = curMap - > mapHeader - > lossCondition . typeOfLossCon ;
if ( temp > 12 ) temp = 3 ;
blitAtLoc ( CGP - > loss - > ourImages [ temp ] . bitmap , 24 , 359 , to ) ; //loss cond
if ( type = = CMenuScreen : : loadGame )
printToLoc ( ( static_cast < const CMapInfo * > ( curMap ) ) - > date , 308 , 34 , FONT_SMALL , zwykly , to ) ;
//print flags
int fx = 64 , ex = 244 , myT ;
//if (curMap->howManyTeams)
myT = curMap - > mapHeader - > players [ playerColor ] . team ;
//else
// myT = -1;
for ( std : : vector < PlayerSettings > : : const_iterator i = curOpts - > playerInfos . begin ( ) ; i ! = curOpts - > playerInfos . end ( ) ; i + + )
{
int * myx = ( ( i - > color = = playerColor | | curMap - > mapHeader - > players [ i - > color ] . team = = myT ) ? & fx : & ex ) ;
blitAtLoc ( sFlags - > ourImages [ i - > color ] . bitmap , * myx , 399 , to ) ;
* myx + = sFlags - > ourImages [ i - > color ] . bitmap - > w ;
}
std : : string tob ;
switch ( curOpts - > difficulty )
{
case 0 :
tob = " 80% " ;
break ;
case 1 :
tob = " 100% " ;
break ;
case 2 :
tob = " 130% " ;
break ;
case 3 :
tob = " 160% " ;
break ;
case 4 :
tob = " 200% " ;
break ;
}
printAtMiddleLoc ( tob , 311 , 472 , FONT_SMALL , zwykly , to ) ;
}
2008-08-02 18:08:03 +03:00
2009-05-29 04:50:33 +03:00
//blit description
2010-02-13 18:26:47 +02:00
std : : string itemDesc , name ;
if ( type = = CMenuScreen : : campaignList )
{
itemDesc = curMap - > campaignHeader - > description ;
name = curMap - > campaignHeader - > name ;
}
else
{
itemDesc = curMap - > mapHeader - > description ;
name = curMap - > mapHeader - > name ;
}
std : : vector < std : : string > * desc = CMessage : : breakText ( itemDesc , 52 ) ;
2009-08-17 11:50:31 +03:00
for ( int i = 0 ; i < desc - > size ( ) ; i + + )
printAtLoc ( ( * desc ) [ i ] , 26 , 149 + i * 16 , FONT_SMALL , zwykly , to ) ;
delete desc ;
2009-01-12 22:05:56 +02:00
2010-02-13 18:26:47 +02:00
//name
if ( name . length ( ) )
printAtLoc ( name , 26 , 39 , FONT_BIG , tytulowy , to ) ;
2009-08-17 11:50:31 +03:00
else
printAtLoc ( " Unnamed " , 26 , 39 , FONT_BIG , tytulowy , to ) ;
2009-06-10 22:44:09 +03:00
2010-02-13 18:26:47 +02:00
2008-08-02 18:08:03 +03:00
}
}
2009-05-04 02:38:08 +03:00
2009-08-17 11:50:31 +03:00
void InfoCard : : changeSelection ( const CMapInfo * to )
2008-08-02 18:08:03 +03:00
{
2010-02-13 18:26:47 +02:00
if ( to & & type ! = CMenuScreen : : newGame & & type ! = CMenuScreen : : campaignList )
2009-08-27 11:04:32 +03:00
difficulty - > select ( curOpts - > difficulty , 0 ) ;
2009-08-17 11:50:31 +03:00
GH . totalRedraw ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-22 16:59:15 +03:00
void InfoCard : : clickRight ( tribool down , bool previousState )
{
static const Rect flagArea ( 19 , 397 , 335 , 23 ) ;
2009-08-27 11:04:32 +03:00
if ( down & & curMap & & isItInLoc ( flagArea , GH . current - > motion . x , GH . current - > motion . y ) )
2009-08-22 16:59:15 +03:00
showTeamsPopup ( ) ;
}
void InfoCard : : showTeamsPopup ( )
{
2010-02-13 18:26:47 +02:00
SDL_Surface * bmp = CMessage : : drawBox1 ( 256 , 90 + 50 * curMap - > mapHeader - > howManyTeams ) ;
2009-08-22 16:59:15 +03:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 657 ] , 128 , 30 , FONT_MEDIUM , tytulowy , bmp ) ; //{Team Alignments}
2010-02-13 18:26:47 +02:00
for ( int i = 0 ; i < curMap - > mapHeader - > howManyTeams ; i + + )
2009-08-22 16:59:15 +03:00
{
std : : vector < ui8 > flags ;
std : : string hlp = CGI - > generaltexth - > allTexts [ 656 ] ; //Team %d
hlp . replace ( hlp . find ( " %d " ) , 2 , boost : : lexical_cast < std : : string > ( i + 1 ) ) ;
CSDL_Ext : : printAtMiddle ( hlp , 128 , 65 + 50 * i , FONT_SMALL , zwykly , bmp ) ;
for ( int j = 0 ; j < PLAYER_LIMIT ; j + + )
2010-02-13 18:26:47 +02:00
if ( ( curMap - > mapHeader - > players [ j ] . canHumanPlay | | curMap - > mapHeader - > players [ j ] . canComputerPlay )
& & curMap - > mapHeader - > players [ j ] . team = = i )
2009-08-22 16:59:15 +03:00
flags . push_back ( j ) ;
int curx = 128 - 9 * flags . size ( ) ;
for ( int j = 0 ; j < flags . size ( ) ; j + + )
{
blitAt ( sFlags - > ourImages [ flags [ j ] ] . bitmap , curx , 75 + 50 * i , bmp ) ;
curx + = 18 ;
}
}
GH . pushInt ( new CInfoPopup ( bmp , true ) ) ;
}
2010-02-13 18:26:47 +02:00
OptionsTab : : OptionsTab ( CMenuScreen : : EState Type )
2009-08-27 11:04:32 +03:00
: type ( Type )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
OBJ_CONSTRUCTION ;
2009-08-27 11:04:32 +03:00
bg = new CPicture ( BitmapHandler : : loadBitmap ( " ADVOPTBK.bmp " ) , 0 , 0 , true ) ;
2009-08-17 11:50:31 +03:00
pos = bg - > pos ;
2008-08-02 18:08:03 +03:00
2010-02-13 18:26:47 +02:00
if ( type = = CMenuScreen : : newGame )
2009-08-27 11:04:32 +03:00
turnDuration = new CSlider ( 55 , 551 , 194 , bind ( & OptionsTab : : setTurnLength , this , _1 ) , 1 , 11 , 11 , true , 1 ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
OptionsTab : : ~ OptionsTab ( )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
void OptionsTab : : showAll ( SDL_Surface * to )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
CIntObject : : showAll ( to ) ;
printAtMiddleLoc ( CGI - > generaltexth - > allTexts [ 515 ] , 222 , 30 , FONT_BIG , tytulowy , to ) ;
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 516 ] , 222 , 58 , FONT_SMALL , 55 , zwykly , to ) ; //Select starting options, handicap, and name for each player in the game.
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 517 ] , 107 , 102 , FONT_SMALL , 14 , tytulowy , to ) ; //Player Name Handicap Type
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 518 ] , 197 , 102 , FONT_SMALL , 10 , tytulowy , to ) ; //Starting Town
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 519 ] , 273 , 102 , FONT_SMALL , 10 , tytulowy , to ) ; //Starting Hero
printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 520 ] , 349 , 102 , FONT_SMALL , 10 , tytulowy , to ) ; //Starting Bonus
printAtMiddleLoc ( CGI - > generaltexth - > allTexts [ 521 ] , 222 , 538 , FONT_SMALL , tytulowy , to ) ; // Player Turn Duration
if ( curOpts - > turnTime )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
std : : ostringstream os ;
os < < ( int ) curOpts - > turnTime < < " Minutes " ;
printAtMiddleLoc ( os . str ( ) , 319 , 559 , FONT_SMALL , zwykly , to ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
else
printAtMiddleLoc ( " Unlimited " , 319 , 559 , FONT_SMALL , zwykly , to ) ;
}
void OptionsTab : : nextCastle ( int player , int dir )
{
2009-08-18 11:22:56 +03:00
PlayerSettings & s = curOpts - > playerInfos [ player ] ;
si32 & cur = s . castle ;
2010-02-13 18:26:47 +02:00
ui32 allowed = curMap - > mapHeader - > players [ s . color ] . allowedFactions ;
2009-08-17 11:50:31 +03:00
if ( cur = = - 2 ) //no castle - no change
return ;
if ( cur = = - 1 ) //random => first/last available
{
int pom = ( dir > 0 ) ? ( 0 ) : ( F_NUMBER - 1 ) ; // last or first
for ( ; pom > = 0 & & pom < F_NUMBER ; pom + = dir )
{
if ( ( 1 < < pom ) & allowed )
{
cur = pom ;
break ;
}
}
}
else // next/previous available
{
for ( ; ; )
{
cur + = dir ;
if ( ( 1 < < cur ) & allowed )
break ;
if ( cur > = F_NUMBER | | cur < 0 )
{
double p1 = log ( ( double ) allowed ) / log ( 2.0f ) + 0.000001f ;
double check = p1 - ( ( int ) p1 ) ;
if ( check < 0.001 )
cur = ( int ) p1 ;
else
cur = - 1 ;
break ;
}
}
}
2009-08-18 11:22:56 +03:00
if ( s . hero > = 0 )
s . hero = - 1 ;
2009-10-06 04:14:00 +03:00
if ( cur < 0 & & s . bonus = = bresource )
s . bonus = brandom ;
2009-08-18 11:22:56 +03:00
entries [ player ] - > selectButtons ( ) ;
2009-08-17 11:50:31 +03:00
redraw ( ) ;
}
void OptionsTab : : nextHero ( int player , int dir )
{
PlayerSettings & s = curOpts - > playerInfos [ player ] ;
int old = s . hero ;
if ( s . castle < 0 | | ! s . human | | s . hero = = - 2 )
return ;
2008-08-02 18:08:03 +03:00
2009-08-17 11:50:31 +03:00
if ( s . hero = = - 1 ) //random => first/last available
2009-02-11 19:48:40 +02:00
{
2009-08-17 11:50:31 +03:00
int max = ( s . castle * HEROES_PER_TYPE * 2 + 15 ) ,
min = ( s . castle * HEROES_PER_TYPE * 2 ) ;
s . hero = nextAllowedHero ( min , max , 0 , dir ) ;
2009-02-11 19:48:40 +02:00
}
2009-08-17 11:50:31 +03:00
else
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( dir > 0 )
s . hero = nextAllowedHero ( s . hero , ( s . castle * HEROES_PER_TYPE * 2 + 16 ) , 1 , dir ) ;
else
s . hero = nextAllowedHero ( s . castle * HEROES_PER_TYPE * 2 - 1 , s . hero , 1 , dir ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
if ( old ! = s . hero )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
usedHeroes . erase ( old ) ;
usedHeroes . insert ( s . hero ) ;
redraw ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
}
int OptionsTab : : nextAllowedHero ( int min , int max , int incl , int dir )
{
if ( dir > 0 )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
for ( int i = min + incl ; i < = max - incl ; i + + )
if ( canUseThisHero ( i ) )
return i ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
else
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
for ( int i = max - incl ; i > = min + incl ; i - - )
if ( canUseThisHero ( i ) )
return i ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
return - 1 ;
2008-08-02 18:08:03 +03:00
}
2009-05-01 19:14:29 +03:00
2009-08-17 11:50:31 +03:00
bool OptionsTab : : canUseThisHero ( int ID )
{
//for(int i=0;i<CPG->ret.playerInfos.size();i++)
// if(CPG->ret.playerInfos[i].hero==ID) //hero is already taken
// return false;
2009-06-24 09:56:36 +03:00
2010-02-13 18:26:47 +02:00
return ! vstd : : contains ( usedHeroes , ID ) & & curMap - > mapHeader - > allowedHeroes [ ID ] ;
2009-08-17 11:50:31 +03:00
}
2009-02-11 19:03:30 +02:00
2009-08-17 11:50:31 +03:00
void OptionsTab : : nextBonus ( int player , int dir )
{
PlayerSettings & s = curOpts - > playerInfos [ player ] ;
si8 & ret = s . bonus + = dir ;
2009-06-24 09:56:36 +03:00
2010-02-13 18:26:47 +02:00
if ( s . hero = = - 2 & & ! curMap - > mapHeader - > players [ s . color ] . heroesNames . size ( ) & & ret = = bartifact ) //no hero - can't be artifact
2009-08-17 11:50:31 +03:00
{
if ( dir < 0 )
ret = brandom ;
else ret = bgold ;
2008-08-02 18:08:03 +03:00
}
2009-06-28 02:33:59 +03:00
2009-08-17 11:50:31 +03:00
if ( ret > bresource )
ret = brandom ;
if ( ret < brandom )
ret = bresource ;
2009-06-24 09:56:36 +03:00
2009-08-17 11:50:31 +03:00
if ( s . castle = = - 1 & & ret = = bresource ) //random castle - can't be resource
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
if ( dir < 0 )
ret = bgold ;
else ret = brandom ;
2008-08-02 18:08:03 +03:00
}
2009-05-29 04:54:45 +03:00
2009-08-17 11:50:31 +03:00
redraw ( ) ;
2008-08-02 18:08:03 +03:00
}
2009-05-29 04:54:45 +03:00
2009-08-27 11:04:32 +03:00
void OptionsTab : : changeSelection ( const CMapHeader * to )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
for ( int i = 0 ; i < entries . size ( ) ; i + + )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
children - = entries [ i ] ;
delete entries [ i ] ;
2008-08-02 18:08:03 +03:00
}
2009-08-17 11:50:31 +03:00
entries . clear ( ) ;
usedHeroes . clear ( ) ;
2010-03-06 00:51:09 +02:00
OBJ_CONSTRUCTION_CAPTURING_ALL ;
2009-08-17 11:50:31 +03:00
for ( int i = 0 ; i < curOpts - > playerInfos . size ( ) ; i + + )
2008-08-02 18:08:03 +03:00
{
2009-08-17 11:50:31 +03:00
entries . push_back ( new PlayerOptionsEntry ( this , curOpts - > playerInfos [ i ] ) ) ;
2010-02-13 18:26:47 +02:00
const std : : vector < SheroName > & heroes = curMap - > mapHeader - > players [ curOpts - > playerInfos [ i ] . color ] . heroesNames ;
2009-08-17 11:50:31 +03:00
for ( size_t hi = 0 ; hi < heroes . size ( ) ; hi + + )
usedHeroes . insert ( heroes [ hi ] . heroID ) ;
2008-08-02 18:08:03 +03:00
}
}
2008-11-16 03:06:15 +02:00
2009-08-17 11:50:31 +03:00
void OptionsTab : : setTurnLength ( int npos )
2008-11-16 03:06:15 +02:00
{
2009-08-17 11:50:31 +03:00
static const int times [ ] = { 1 , 2 , 4 , 6 , 8 , 10 , 15 , 20 , 25 , 30 , 0 } ;
amin ( npos , ARRAY_COUNT ( times ) - 1 ) ;
curOpts - > turnTime = times [ npos ] ;
redraw ( ) ;
2008-11-16 03:06:15 +02:00
}
2009-08-17 11:50:31 +03:00
void OptionsTab : : flagPressed ( int player )
2008-11-16 03:06:15 +02:00
{
2010-02-16 18:35:24 +02:00
static std : : pair < int , int > playerToRestore ( - 1 , - 1 ) ; //<color serial, player name serial>
PlayerSettings & clicked = curOpts - > playerInfos [ player ] ;
PlayerSettings * old = NULL ;
if ( playerNames . size ( ) = = 1 ) //single player -> swap
{
if ( player = = playerSerial ) //that color is already selected, no action needed
return ;
2009-10-06 04:14:00 +03:00
2010-02-16 18:35:24 +02:00
old = & curOpts - > playerInfos [ playerSerial ] ;
std : : swap ( old - > human , clicked . human ) ;
std : : swap ( old - > name , clicked . name ) ;
playerColor = clicked . color ;
playerSerial = player ;
}
else
{
//identify clicked player
int curNameID = clicked . human
? vstd : : findPos ( playerNames , clicked . name )
: - 1 ;
if ( curNameID > = 0 & & playerToRestore . second = = curNameID ) //player to restore is about to being replaced -> put him back to the old place
{
PlayerSettings & restPos = curOpts - > playerInfos [ playerToRestore . first ] ;
setPlayer ( restPos , playerToRestore . second ) ;
playerToRestore . first = playerToRestore . second = 0 ;
}
//who will be put here?
if ( curNameID < 0 ) //if possible replace computer with unallocated player
{
for ( int i = 0 ; i < playerNames . size ( ) ; i + + )
{
if ( ! curOpts - > getPlayersSettings ( playerNames [ i ] ) )
{
curNameID = i - 1 ; //-1 because it'll incremented soon
break ;
}
}
}
2009-08-18 11:22:56 +03:00
2010-02-16 18:35:24 +02:00
setPlayer ( clicked , + + curNameID ) ; //simply next player
2009-08-18 11:22:56 +03:00
2010-02-16 18:35:24 +02:00
//if that player was somewhere else, we need to replace him with computer
if ( curNameID < playerNames . size ( ) )
{
for ( std : : vector < PlayerSettings > : : iterator i = curOpts - > playerInfos . begin ( ) ; i ! = curOpts - > playerInfos . end ( ) ; i + + )
{
if ( i - > serial ! = player & & i - > name = = playerNames [ curNameID ] )
{
assert ( i - > human ) ;
playerToRestore . first = i - > serial ;
playerToRestore . second = vstd : : findPos ( playerNames , i - > name ) ;
setPlayer ( * i , - 1 ) ; //set computer
old = & * i ;
break ;
}
}
}
}
2009-08-18 11:22:56 +03:00
2010-02-16 18:35:24 +02:00
entries [ clicked . serial ] - > selectButtons ( ) ;
if ( old )
{
entries [ old - > serial ] - > selectButtons ( ) ;
if ( ! entries [ playerSerial ] - > fixedHero )
old - > hero = - 1 ;
}
2009-08-17 11:50:31 +03:00
GH . totalRedraw ( ) ;
2008-11-16 03:06:15 +02:00
}
2009-08-17 11:50:31 +03:00
OptionsTab : : PlayerOptionsEntry : : PlayerOptionsEntry ( OptionsTab * owner , PlayerSettings & S )
: s ( S )
2008-11-16 03:06:15 +02:00
{
2009-08-17 11:50:31 +03:00
OBJ_CONSTRUCTION ;
defActions | = SHARE_POS ;
pos = parent - > pos + Point ( 54 , 122 + s . serial * 50 ) ;
2008-11-16 03:06:15 +02:00
2009-08-17 11:50:31 +03:00
static const char * flags [ ] = { " AOFLGBR.DEF " , " AOFLGBB.DEF " , " AOFLGBY.DEF " , " AOFLGBG.DEF " ,
" AOFLGBO.DEF " , " AOFLGBP.DEF " , " AOFLGBT.DEF " , " AOFLGBS.DEF " } ;
static const char * bgs [ ] = { " ADOPRPNL.bmp " , " ADOPBPNL.bmp " , " ADOPYPNL.bmp " , " ADOPGPNL.bmp " ,
" ADOPOPNL.bmp " , " ADOPPPNL.bmp " , " ADOPTPNL.bmp " , " ADOPSPNL.bmp " } ;
2008-11-16 03:06:15 +02:00
2009-08-17 11:50:31 +03:00
bg = new CPicture ( BitmapHandler : : loadBitmap ( bgs [ s . color ] ) , 0 , 0 , true ) ;
2010-02-13 18:26:47 +02:00
if ( owner - > type = = CMenuScreen : : newGame )
2009-08-27 11:04:32 +03:00
{
btns [ 0 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 132 ] , bind ( & OptionsTab : : nextCastle , owner , s . serial , - 1 ) , 107 , 5 , " ADOPLFA.DEF " ) ;
btns [ 1 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 133 ] , bind ( & OptionsTab : : nextCastle , owner , s . serial , + 1 ) , 168 , 5 , " ADOPRTA.DEF " ) ;
btns [ 2 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 148 ] , bind ( & OptionsTab : : nextHero , owner , s . serial , - 1 ) , 183 , 5 , " ADOPLFA.DEF " ) ;
btns [ 3 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 149 ] , bind ( & OptionsTab : : nextHero , owner , s . serial , + 1 ) , 244 , 5 , " ADOPRTA.DEF " ) ;
btns [ 4 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 164 ] , bind ( & OptionsTab : : nextBonus , owner , s . serial , - 1 ) , 259 , 5 , " ADOPLFA.DEF " ) ;
btns [ 5 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 165 ] , bind ( & OptionsTab : : nextBonus , owner , s . serial , + 1 ) , 320 , 5 , " ADOPRTA.DEF " ) ;
}
2009-09-07 05:29:44 +03:00
else
for ( int i = 0 ; i < 6 ; i + + )
btns [ i ] = NULL ;
2009-05-10 01:19:41 +03:00
2009-08-18 11:22:56 +03:00
fixedHero = s . hero ! = - 1 ; //if we doesn't start with "random hero" it must be fixed or none
selectButtons ( false ) ;
2010-03-08 00:56:51 +02:00
assert ( curMap & & curMap - > mapHeader ) ;
const PlayerInfo & p = curMap - > mapHeader - > players [ s . color ] ;
assert ( p . canComputerPlay | | p . canHumanPlay ) ; //someone must be able to control this player
if ( p . canHumanPlay & & p . canComputerPlay )
whoCanPlay = HUMAN_OR_CPU ;
else if ( p . canComputerPlay )
whoCanPlay = CPU ;
else
whoCanPlay = HUMAN ;
2009-08-18 11:22:56 +03:00
2010-02-13 18:26:47 +02:00
if ( owner - > type ! = CMenuScreen : : scenarioInfo & & curMap - > mapHeader - > players [ s . color ] . canHumanPlay )
2009-08-17 11:50:31 +03:00
{
flag = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 180 ] , bind ( & OptionsTab : : flagPressed , owner , s . serial ) , - 43 , 2 , flags [ s . color ] ) ;
flag - > hoverable = true ;
}
else
flag = NULL ;
2009-08-22 16:59:15 +03:00
defActions & = ~ SHARE_POS ;
2009-08-17 11:50:31 +03:00
town = new SelectedBox ( TOWN , s . serial ) ;
2009-08-22 16:59:15 +03:00
town - > pos + = pos + Point ( 119 , 2 ) ;
2009-08-17 11:50:31 +03:00
hero = new SelectedBox ( HERO , s . serial ) ;
2009-08-22 16:59:15 +03:00
hero - > pos + = pos + Point ( 195 , 2 ) ;
2009-08-17 11:50:31 +03:00
bonus = new SelectedBox ( BONUS , s . serial ) ;
2009-08-22 16:59:15 +03:00
bonus - > pos + = pos + Point ( 271 , 2 ) ;
2008-11-16 03:06:15 +02:00
}
2009-08-17 11:50:31 +03:00
void OptionsTab : : PlayerOptionsEntry : : showAll ( SDL_Surface * to )
2008-11-16 03:06:15 +02:00
{
2009-08-17 11:50:31 +03:00
CIntObject : : showAll ( to ) ;
printAtMiddleLoc ( s . name , 55 , 10 , FONT_SMALL , zwykly , to ) ;
2010-03-08 00:56:51 +02:00
printAtMiddleWBLoc ( CGI - > generaltexth - > arraytxt [ 206 + whoCanPlay ] , 28 , 34 , FONT_TINY , 6 , zwykly , to ) ;
2008-11-16 03:06:15 +02:00
}
2009-08-18 11:22:56 +03:00
void OptionsTab : : PlayerOptionsEntry : : selectButtons ( bool onlyHero )
{
2009-09-07 05:29:44 +03:00
if ( ! btns [ 0 ] )
2009-08-27 11:04:32 +03:00
return ;
2009-08-18 11:22:56 +03:00
if ( ! onlyHero & & s . castle ! = - 1 )
{
btns [ 0 ] - > disable ( ) ;
btns [ 1 ] - > disable ( ) ;
}
if ( fixedHero | | ! s . human | | s . castle < 0 )
{
btns [ 2 ] - > disable ( ) ;
btns [ 3 ] - > disable ( ) ;
}
else
{
btns [ 2 ] - > enable ( active ) ;
btns [ 3 ] - > enable ( active ) ;
}
}
2009-08-17 11:50:31 +03:00
void OptionsTab : : SelectedBox : : showAll ( SDL_Surface * to )
2008-11-16 03:06:15 +02:00
{
2010-02-13 18:26:47 +02:00
//PlayerSettings &s = curOpts->playerInfos[player];
2009-08-22 16:59:15 +03:00
SDL_Surface * toBlit = getImg ( ) ;
const std : : string * toPrint = getText ( ) ;
blitAt ( toBlit , pos , to ) ;
printAtMiddleLoc ( * toPrint , 23 , 39 , FONT_TINY , zwykly , to ) ;
}
2009-08-17 11:50:31 +03:00
2009-08-22 16:59:15 +03:00
OptionsTab : : SelectedBox : : SelectedBox ( SelType Which , ui8 Player )
: which ( Which ) , player ( Player )
{
SDL_Surface * img = getImg ( ) ;
pos . w = img - > w ;
pos . h = img - > h ;
used = RCLICK ;
}
SDL_Surface * OptionsTab : : SelectedBox : : getImg ( ) const
{
2010-02-13 18:26:47 +02:00
const PlayerSettings & s = curOpts - > playerInfos [ player ] ;
2009-08-17 11:50:31 +03:00
switch ( which )
{
case TOWN :
2009-08-22 16:59:15 +03:00
if ( s . castle < F_NUMBER & & s . castle > = 0 )
return graphics - > getPic ( s . castle , true , false ) ;
else if ( s . castle = = - 1 )
return CGP - > rTown ;
else if ( s . castle = = - 2 )
return CGP - > nTown ;
case HERO :
if ( s . hero = = - 1 )
2009-08-17 11:50:31 +03:00
{
2009-08-22 16:59:15 +03:00
return CGP - > rHero ;
2009-08-17 11:50:31 +03:00
}
2009-08-22 16:59:15 +03:00
else if ( s . hero = = - 2 )
2009-08-17 11:50:31 +03:00
{
2009-08-22 16:59:15 +03:00
if ( s . heroPortrait > = 0 )
return graphics - > portraitSmall [ s . heroPortrait ] ;
2009-08-17 11:50:31 +03:00
else
2009-08-22 16:59:15 +03:00
return CGP - > nHero ;
}
else
{
return graphics - > portraitSmall [ s . hero ] ;
2009-08-17 11:50:31 +03:00
}
break ;
case BONUS :
{
int pom ;
switch ( s . bonus )
{
case - 1 :
pom = 10 ;
break ;
case 0 :
pom = 9 ;
break ;
case 1 :
pom = 8 ;
break ;
case 2 :
pom = CGI - > townh - > towns [ s . castle ] . bonus ;
break ;
2009-08-22 16:59:15 +03:00
default :
assert ( 0 ) ;
2009-08-17 11:50:31 +03:00
}
2009-08-22 16:59:15 +03:00
return CGP - > bonuses - > ourImages [ pom ] . bitmap ;
2009-08-17 11:50:31 +03:00
}
2009-08-22 16:59:15 +03:00
default :
return NULL ;
2009-08-17 11:50:31 +03:00
}
2009-08-22 16:59:15 +03:00
}
2009-08-18 11:22:56 +03:00
2009-08-22 16:59:15 +03:00
const std : : string * OptionsTab : : SelectedBox : : getText ( ) const
{
2010-02-13 18:26:47 +02:00
const PlayerSettings & s = curOpts - > playerInfos [ player ] ;
2009-08-22 16:59:15 +03:00
switch ( which )
{
case TOWN :
if ( s . castle < F_NUMBER & & s . castle > = 0 )
return & CGI - > townh - > towns [ s . castle ] . Name ( ) ;
else if ( s . castle = = - 1 )
return & CGI - > generaltexth - > allTexts [ 522 ] ;
else if ( s . castle = = - 2 )
return & CGI - > generaltexth - > allTexts [ 523 ] ;
case HERO :
if ( s . hero = = - 1 )
return & CGI - > generaltexth - > allTexts [ 522 ] ;
else if ( s . hero = = - 2 )
{
if ( s . heroPortrait > = 0 )
{
if ( s . heroName . length ( ) )
return & s . heroName ;
else
return & CGI - > heroh - > heroes [ s . heroPortrait ] - > name ;
}
else
return & CGI - > generaltexth - > allTexts [ 523 ] ;
}
else
{
//if(s.heroName.length())
// return &s.heroName;
//else
return & CGI - > heroh - > heroes [ s . hero ] - > name ;
}
case BONUS :
switch ( s . bonus )
{
case - 1 :
return & CGI - > generaltexth - > allTexts [ 522 ] ;
default :
return & CGI - > generaltexth - > arraytxt [ 214 + s . bonus ] ;
}
default :
return NULL ;
}
2008-11-16 03:06:15 +02:00
}
2009-08-22 16:59:15 +03:00
void OptionsTab : : SelectedBox : : clickRight ( tribool down , bool previousState )
2008-11-16 03:06:15 +02:00
{
2009-08-22 16:59:15 +03:00
if ( indeterminate ( down ) | | ! down ) return ;
2010-02-13 18:26:47 +02:00
const PlayerSettings & s = curOpts - > playerInfos [ player ] ;
2009-08-22 16:59:15 +03:00
SDL_Surface * bmp = NULL ;
const std : : string * title = NULL , * subTitle = NULL ;
subTitle = getText ( ) ;
int val ;
switch ( which )
{
2009-10-06 04:14:00 +03:00
case TOWN :
val = s . castle ;
break ;
2009-08-22 16:59:15 +03:00
case HERO :
val = s . hero ;
2010-02-11 06:24:37 +02:00
if ( val = = - 2 ) //none => we may have some preset info
2009-08-22 16:59:15 +03:00
{
2010-02-13 18:26:47 +02:00
int p9 = curMap - > mapHeader - > players [ s . color ] . p9 ;
2009-10-06 04:14:00 +03:00
if ( p9 ! = 255 & & curOpts - > playerInfos [ player ] . heroPortrait > = 0 )
2009-08-22 16:59:15 +03:00
val = p9 ;
}
break ;
2009-10-06 04:14:00 +03:00
case BONUS :
val = s . bonus ;
break ;
2009-08-22 16:59:15 +03:00
}
if ( val = = - 1 | | which = = BONUS ) //random or bonus box
{
bmp = CMessage : : drawBox1 ( 256 , 190 ) ;
std : : string * description = NULL ;
switch ( which )
{
case TOWN :
title = & CGI - > generaltexth - > allTexts [ 103 ] ;
description = & CGI - > generaltexth - > allTexts [ 104 ] ;
break ;
case HERO :
title = & CGI - > generaltexth - > allTexts [ 101 ] ;
description = & CGI - > generaltexth - > allTexts [ 102 ] ;
break ;
case BONUS :
{
switch ( val )
{
case brandom :
title = & CGI - > generaltexth - > allTexts [ 86 ] ; //{Random Bonus}
description = & CGI - > generaltexth - > allTexts [ 94 ] ; //Gold, wood and ore, or an artifact is randomly chosen as your starting bonus
break ;
case bartifact :
title = & CGI - > generaltexth - > allTexts [ 83 ] ; //{Artifact Bonus}
description = & CGI - > generaltexth - > allTexts [ 90 ] ; //An artifact is randomly chosen and equipped to your starting hero
break ;
case bgold :
title = & CGI - > generaltexth - > allTexts [ 84 ] ; //{Gold Bonus}
subTitle = & CGI - > generaltexth - > allTexts [ 87 ] ; //500-1000
description = & CGI - > generaltexth - > allTexts [ 92 ] ; //At the start of the game, 500-1000 gold is added to your Kingdom's resource pool
break ;
case bresource :
{
title = & CGI - > generaltexth - > allTexts [ 85 ] ; //{Resource Bonus}
switch ( CGI - > townh - > towns [ s . castle ] . primaryRes )
{
case 1 :
subTitle = & CGI - > generaltexth - > allTexts [ 694 ] ;
description = & CGI - > generaltexth - > allTexts [ 690 ] ;
break ;
case 3 :
subTitle = & CGI - > generaltexth - > allTexts [ 695 ] ;
description = & CGI - > generaltexth - > allTexts [ 691 ] ;
break ;
case 4 :
subTitle = & CGI - > generaltexth - > allTexts [ 692 ] ;
description = & CGI - > generaltexth - > allTexts [ 688 ] ;
break ;
case 5 :
subTitle = & CGI - > generaltexth - > allTexts [ 693 ] ;
description = & CGI - > generaltexth - > allTexts [ 689 ] ;
break ;
case 127 :
subTitle = & CGI - > generaltexth - > allTexts [ 89 ] ; //5-10 wood / 5-10 ore
description = & CGI - > generaltexth - > allTexts [ 93 ] ; //At the start of the game, 5-10 wood and 5-10 ore are added to your Kingdom's resource pool
break ;
}
}
break ;
}
}
break ;
}
if ( description )
CSDL_Ext : : printAtMiddleWB ( * description , 125 , 145 , FONT_SMALL , 37 , zwykly , bmp ) ;
}
else if ( val = = - 2 )
{
return ;
}
else if ( which = = TOWN )
{
bmp = CMessage : : drawBox1 ( 256 , 319 ) ;
title = & CGI - > generaltexth - > allTexts [ 80 ] ;
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 79 ] , 135 , 137 , FONT_MEDIUM , tytulowy , bmp ) ;
const CTown & t = CGI - > townh - > towns [ val ] ;
//print creatures
int x = 60 , y = 159 ;
for ( int i = 0 ; i < 7 ; i + + )
{
int c = t . basicCreatures [ i ] ;
blitAt ( graphics - > smallImgs [ c ] , x , y , bmp ) ;
2010-05-02 21:20:26 +03:00
CSDL_Ext : : printAtMiddleWB ( CGI - > creh - > creatures [ c ] - > nameSing , x + 16 , y + 45 , FONT_TINY , 10 , zwykly , bmp ) ;
2009-08-22 16:59:15 +03:00
if ( i = = 2 )
{
x = 40 ;
y + = 76 ;
}
else
{
x + = 52 ;
}
}
}
else if ( val > = 0 )
{
const CHero * h = CGI - > heroh - > heroes [ val ] ;
bmp = CMessage : : drawBox1 ( 320 , 255 ) ;
title = & CGI - > generaltexth - > allTexts [ 77 ] ;
CSDL_Ext : : printAtMiddle ( * title , 167 , 36 , FONT_MEDIUM , tytulowy , bmp ) ;
CSDL_Ext : : printAtMiddle ( * subTitle + " - " + h - > heroClass - > name , 160 , 99 , FONT_SMALL , zwykly , bmp ) ;
blitAt ( getImg ( ) , 136 , 56 , bmp ) ;
//print specialty
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > allTexts [ 78 ] , 166 , 132 , FONT_MEDIUM , tytulowy , bmp ) ;
blitAt ( graphics - > un44 - > ourImages [ val ] . bitmap , 140 , 150 , bmp ) ;
2010-02-11 06:24:37 +02:00
CSDL_Ext : : printAtMiddle ( CGI - > generaltexth - > hTxts [ val ] . bonusName , 166 , 203 , FONT_SMALL , zwykly , bmp ) ;
2009-08-22 16:59:15 +03:00
GH . pushInt ( new CInfoPopup ( bmp , true ) ) ;
return ;
}
if ( title )
CSDL_Ext : : printAtMiddle ( * title , 135 , 36 , FONT_MEDIUM , tytulowy , bmp ) ;
if ( subTitle )
CSDL_Ext : : printAtMiddle ( * subTitle , 127 , 103 , FONT_SMALL , zwykly , bmp ) ;
blitAt ( getImg ( ) , 104 , 60 , bmp ) ;
GH . pushInt ( new CInfoPopup ( bmp , true ) ) ;
2009-08-27 11:04:32 +03:00
}
2010-03-08 00:56:51 +02:00
CScenarioInfo : : CScenarioInfo ( const CMapHeader * mapHeader , const StartInfo * startInfo )
2009-08-27 11:04:32 +03:00
{
OBJ_CONSTRUCTION_CAPTURING_ALL ;
for ( size_t i = 0 ; i < startInfo - > playerInfos . size ( ) ; i + + )
2009-10-06 04:14:00 +03:00
{
2009-08-27 11:04:32 +03:00
if ( startInfo - > playerInfos [ i ] . human )
2009-10-06 04:14:00 +03:00
{
2009-08-27 11:04:32 +03:00
playerColor = startInfo - > playerInfos [ i ] . color ;
2009-10-06 04:14:00 +03:00
playerSerial = i ;
}
}
2009-08-27 11:04:32 +03:00
pos . w = 762 ;
pos . h = 584 ;
center ( pos ) ;
2010-03-08 00:56:51 +02:00
assert ( LOCPLINT ) ;
assert ( ! curOpts ) ;
curOpts = new StartInfo ( * LOCPLINT - > cb - > getStartInfo ( ) ) ; //deleted by clearInfo
assert ( ! curMap ) ;
curMap = mapInfoFromGame ( ) ; //deleted by clearInfo
setPlayersFromGame ( ) ;
2009-08-27 11:04:32 +03:00
2010-02-13 18:26:47 +02:00
card = new InfoCard ( CMenuScreen : : scenarioInfo ) ;
opt = new OptionsTab ( CMenuScreen : : scenarioInfo ) ;
2009-08-27 11:04:32 +03:00
opt - > changeSelection ( 0 ) ;
card - > difficulty - > select ( startInfo - > difficulty , 0 ) ;
back = new AdventureMapButton ( " " , CGI - > generaltexth - > zelp [ 105 ] . second , bind ( & CGuiHandler : : popIntTotally , & GH , this ) , 584 , 535 , " SCNRBACK.DEF " , SDLK_ESCAPE ) ;
}
CScenarioInfo : : ~ CScenarioInfo ( )
{
2010-03-08 00:56:51 +02:00
clearInfo ( ) ;
2009-08-27 11:04:32 +03:00
}
2010-02-13 18:26:47 +02:00
bool mapSorter : : operator ( ) ( const CMapInfo * aaa , const CMapInfo * bbb )
2010-02-08 16:38:06 +02:00
{
2010-02-13 18:26:47 +02:00
const CMapHeader * a = aaa - > mapHeader ,
* b = bbb - > mapHeader ;
if ( a & & b ) //if we are sorting scenarios
2010-02-08 16:38:06 +02:00
{
2010-02-13 18:26:47 +02:00
switch ( sortBy )
2010-02-08 16:38:06 +02:00
{
2010-02-13 18:26:47 +02:00
case _format : //by map format (RoE, WoG, etc)
return ( a - > version < b - > version ) ;
break ;
case _loscon : //by loss conditions
return ( a - > lossCondition . typeOfLossCon < b - > lossCondition . typeOfLossCon ) ;
break ;
case _playerAm : //by player amount
int playerAmntB , humenPlayersB , playerAmntA , humenPlayersA ;
playerAmntB = humenPlayersB = playerAmntA = humenPlayersA = 0 ;
for ( int i = 0 ; i < 8 ; i + + )
{
if ( a - > players [ i ] . canHumanPlay ) { playerAmntA + + ; humenPlayersA + + ; }
else if ( a - > players [ i ] . canComputerPlay ) { playerAmntA + + ; }
if ( b - > players [ i ] . canHumanPlay ) { playerAmntB + + ; humenPlayersB + + ; }
else if ( b - > players [ i ] . canComputerPlay ) { playerAmntB + + ; }
}
if ( playerAmntB ! = playerAmntA )
return ( playerAmntA < playerAmntB ) ;
else
return ( humenPlayersA < humenPlayersB ) ;
break ;
case _size : //by size of map
return ( a - > width < b - > width ) ;
break ;
case _viccon : //by victory conditions
return ( a - > victoryCondition . condition < b - > victoryCondition . condition ) ;
break ;
case _name : //by name
return ( a - > name < b - > name ) ;
break ;
default :
return ( a - > name < b - > name ) ;
break ;
2010-02-08 16:38:06 +02:00
}
2010-02-13 18:26:47 +02:00
}
else //if we are sorting campaigns
{
2010-02-15 15:28:33 +02:00
switch ( sortBy )
{
case _numOfMaps : //by number of maps in campaign
return CGI - > generaltexth - > campaignRegionNames [ aaa - > campaignHeader - > mapVersion ] . size ( ) <
CGI - > generaltexth - > campaignRegionNames [ bbb - > campaignHeader - > mapVersion ] . size ( ) ;
break ;
case _name : //by name
return aaa - > campaignHeader - > name < bbb - > campaignHeader - > name ;
break ;
default :
return aaa - > campaignHeader - > name < bbb - > campaignHeader - > name ;
break ;
}
2010-02-08 16:38:06 +02:00
}
2010-02-15 08:54:57 +02:00
}
CMultiMode : : CMultiMode ( )
{
OBJ_CONSTRUCTION ;
bg = new CPicture ( " MUPOPUP.bmp " ) ;
bg - > convertToScreenBPP ( ) ; //so we could draw without problems
blitAt ( CPicture ( " MUMAP.bmp " ) , 16 , 77 , * bg ) ; //blit img
pos = bg - > center ( ) ; //center, window has size of bg graphic
2010-02-15 13:37:47 +02:00
bar = new CGStatusBar ( new CPicture ( Rect ( 7 , 465 , 440 , 18 ) , 0 ) ) ; //226, 472
2010-02-15 08:54:57 +02:00
txt = new CTextInput ( Rect ( 19 , 436 , 334 , 16 ) , * bg ) ;
txt - > setText ( CGI - > generaltexth - > allTexts [ 434 ] ) ; //Player
btns [ 0 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 266 ] , bind ( & CMultiMode : : openHotseat , this ) , 373 , 78 , " MUBHOT.DEF " ) ;
2010-02-26 13:18:09 +02:00
btns [ 6 ] = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 288 ] , bind ( & CGuiHandler : : popIntTotally , ref ( GH ) , this ) , 373 , 424 , " MUBCANC.DEF " , SDLK_ESCAPE ) ;
2010-02-15 08:54:57 +02:00
}
void CMultiMode : : openHotseat ( )
{
GH . pushInt ( new CHotSeatPlayers ( txt - > text ) ) ;
}
CHotSeatPlayers : : CHotSeatPlayers ( const std : : string & firstPlayer )
{
OBJ_CONSTRUCTION ;
bg = new CPicture ( " MUHOTSEA.bmp " ) ;
bg - > convertToScreenBPP ( ) ; //so we could draw without problems
bg - > printAtMiddleWBLoc ( CGI - > generaltexth - > allTexts [ 446 ] , 185 , 55 , FONT_BIG , 50 , zwykly , * bg ) ; //HOTSEAT Please enter names
pos = bg - > center ( ) ; //center, window has size of bg graphic
for ( int i = 0 ; i < ARRAY_COUNT ( txt ) ; i + + )
txt [ i ] = new CTextInput ( Rect ( 60 , 85 + i * 30 , 280 , 16 ) , * bg ) ;
2010-02-15 13:37:47 +02:00
txt [ 0 ] - > setText ( firstPlayer ) ;
txt [ 0 ] - > giveFocus ( ) ;
2010-02-21 17:03:30 +02:00
ok = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 560 ] , bind ( & CHotSeatPlayers : : enterSelectionScreen , this ) , 95 , 338 , " MUBCHCK.DEF " , SDLK_RETURN ) ;
cancel = new AdventureMapButton ( CGI - > generaltexth - > zelp [ 561 ] , bind ( & CGuiHandler : : popIntTotally , ref ( GH ) , this ) , 205 , 338 , " MUBCANC.DEF " , SDLK_ESCAPE ) ;
2010-02-15 13:37:47 +02:00
bar = new CGStatusBar ( new CPicture ( Rect ( 7 , 381 , 348 , 18 ) , 0 ) ) ; //226, 472
}
void CHotSeatPlayers : : enterSelectionScreen ( )
{
2010-02-26 13:18:09 +02:00
playerNames . clear ( ) ;
2010-02-15 13:37:47 +02:00
for ( int i = 0 ; i < ARRAY_COUNT ( txt ) ; i + + )
if ( txt [ i ] - > text . length ( ) )
playerNames . push_back ( txt [ i ] - > text ) ;
GH . popInts ( 2 ) ;
2010-02-16 18:35:24 +02:00
GH . pushInt ( new CSelectionScreen ( CMenuScreen : : newGame ) ) ;
2010-02-15 14:12:21 +02:00
}
2010-02-16 19:28:56 +02:00
CBonusSelection : : CBonusSelection ( const CCampaign * _ourCampaign , int _whichMap )
2010-02-18 14:34:44 +02:00
: ourCampaign ( _ourCampaign ) , whichMap ( _whichMap ) , highlightedRegion ( NULL ) , ourHeader ( NULL )
2010-02-15 14:12:21 +02:00
{
OBJ_CONSTRUCTION ;
static const std : : string bgNames [ ] = { " E1_BG.BMP " , " G2_BG.BMP " , " E2_BG.BMP " , " G1_BG.BMP " , " G3_BG.BMP " , " N1_BG.BMP " ,
" S1_BG.BMP " , " BR_BG.BMP " , " IS_BG.BMP " , " KR_BG.BMP " , " NI_BG.BMP " , " TA_BG.BMP " , " AR_BG.BMP " , " HS_BG.BMP " ,
" BB_BG.BMP " , " NB_BG.BMP " , " EL_BG.BMP " , " RN_BG.BMP " , " UA_BG.BMP " , " SP_BG.BMP " } ;
2010-02-16 19:28:56 +02:00
loadPositionsOfGraphics ( ) ;
2010-02-15 14:12:21 +02:00
background = BitmapHandler : : loadBitmap ( bgNames [ ourCampaign - > header . mapVersion ] ) ;
SDL_Surface * panel = BitmapHandler : : loadBitmap ( " CAMPBRF.BMP " ) ;
blitAt ( panel , 456 , 6 , background ) ;
2010-05-08 21:56:38 +03:00
startB = new AdventureMapButton ( " " , " " , bind ( & CBonusSelection : : startMap , this ) , 475 , 536 , " SCNRBEG.DEF " , SDLK_RETURN ) ;
2010-02-20 15:24:38 +02:00
backB = new AdventureMapButton ( " " , " " , bind ( & CBonusSelection : : goBack , this ) , 624 , 536 , " SCNRBACK.DEF " , SDLK_ESCAPE ) ;
2010-02-15 14:12:21 +02:00
//campaign name
if ( ourCampaign - > header . name . length ( ) )
printAtLoc ( ourCampaign - > header . name , 481 , 28 , FONT_BIG , tytulowy , background ) ;
else
printAtLoc ( " Unnamed " , 481 , 28 , FONT_BIG , tytulowy , background ) ;
//map size icon
2010-02-18 14:34:44 +02:00
sizes = CDefHandler : : giveDef ( " SCNRMPSZ.DEF " ) ;
2010-02-15 14:12:21 +02:00
//campaign description
printAtLoc ( CGI - > generaltexth - > allTexts [ 38 ] , 481 , 63 , FONT_SMALL , tytulowy , background ) ;
std : : vector < std : : string > * desc = CMessage : : breakText ( ourCampaign - > header . description , 45 ) ;
for ( int i = 0 ; i < desc - > size ( ) ; i + + )
printAtLoc ( ( * desc ) [ i ] , 481 , 86 + i * 16 , FONT_SMALL , zwykly , background ) ;
delete desc ;
2010-02-18 14:34:44 +02:00
//set left part of window
for ( int g = 0 ; g < ourCampaign - > scenarios . size ( ) ; + + g )
{
if ( ourCampaign - > conquerable ( g ) )
{
regions . push_back ( new CRegion ( this , true , true , g ) ) ;
regions [ regions . size ( ) - 1 ] - > rclickText = ourCampaign - > scenarios [ g ] . regionText ;
if ( highlightedRegion = = NULL )
{
highlightedRegion = regions . back ( ) ;
selectMap ( g ) ;
}
}
else if ( ourCampaign - > scenarios [ g ] . conquered ) //display as striped
{
regions . push_back ( new CRegion ( this , false , false , g ) ) ;
regions [ regions . size ( ) - 1 ] - > rclickText = ourCampaign - > scenarios [ g ] . regionText ;
}
}
2010-02-15 14:12:21 +02:00
//allies / enemies
printAtLoc ( CGI - > generaltexth - > allTexts [ 390 ] + " : " , 486 , 407 , FONT_SMALL , zwykly , background ) ; //Allies
printAtLoc ( CGI - > generaltexth - > allTexts [ 391 ] + " : " , 619 , 407 , FONT_SMALL , zwykly , background ) ; //Enemies
int fx = 64 , ex = 244 , myT ;
2010-02-18 14:34:44 +02:00
myT = ourHeader - > players [ playerColor ] . team ;
2010-02-15 14:12:21 +02:00
/*for (std::vector<PlayerSettings>::const_iterator i = curOpts->playerInfos.begin(); i != curOpts->playerInfos.end(); i++)
{
int * myx = ( ( i - > color = = playerColor | | ourHeader . players [ i - > color ] . team = = myT ) ? & fx : & ex ) ;
blitAtLoc ( sFlags - > ourImages [ i - > color ] . bitmap , * myx , 399 , to ) ;
* myx + = sFlags - > ourImages [ i - > color ] . bitmap - > w ;
} */
SDL_FreeSurface ( panel ) ;
2010-02-16 19:28:56 +02:00
//bonus choosing
printAtLoc ( CGI - > generaltexth - > allTexts [ 71 ] , 510 , 431 , FONT_MEDIUM , zwykly , background ) ; //Choose a bonus:
//difficulty
printAtLoc ( " Difficulty " , 691 , 431 , FONT_MEDIUM , zwykly , background ) ; //Difficulty
2010-02-15 14:12:21 +02:00
}
CBonusSelection : : ~ CBonusSelection ( )
{
SDL_FreeSurface ( background ) ;
2010-02-18 14:34:44 +02:00
delete sizes ;
delete ourHeader ;
2010-02-15 14:12:21 +02:00
}
void CBonusSelection : : goBack ( )
{
GH . popIntTotally ( this ) ;
}
void CBonusSelection : : showAll ( SDL_Surface * to )
{
CIntObject : : showAll ( to ) ;
blitAt ( background , pos . x , pos . y , to ) ;
2010-02-15 15:28:33 +02:00
}
2010-02-16 19:28:56 +02:00
void CBonusSelection : : loadPositionsOfGraphics ( )
{
std : : ifstream is ( ( GVCMIDirs . UserPath + " /config/campaign_regions.txt " ) . c_str ( ) , std : : ios_base : : binary | std : : ios_base : : in ) ;
assert ( is . is_open ( ) ) ;
for ( int g = 0 ; g < CGI - > generaltexth - > campaignMapNames . size ( ) ; + + g )
{
SCampPositions sc ;
is > > sc . campPrefix ;
is > > sc . colorSuffixLength ;
bool contReading = true ;
while ( contReading )
{
SCampPositions : : SRegionDesc rd ;
is > > rd . infix ;
if ( rd . infix = = " END " )
{
contReading = false ;
}
else
{
is > > rd . xpos > > rd . ypos ;
sc . regions . push_back ( rd ) ;
}
}
campDescriptions . push_back ( sc ) ;
}
}
2010-02-18 14:34:44 +02:00
void CBonusSelection : : selectMap ( int whichOne )
{
sInfo . difficulty = ourCampaign - > scenarios [ whichOne ] . difficulty ;
2010-05-08 21:56:38 +03:00
sInfo . mapname = ourCampaign - > header . filename ;
2010-02-18 14:34:44 +02:00
sInfo . mode = 2 ;
//get header
int i = 0 ;
delete ourHeader ;
ourHeader = new CMapHeader ( ) ;
ourHeader - > initFromMemory ( ( const unsigned char * ) ourCampaign - > mapPieces [ whichOne ] . c_str ( ) , i ) ;
2010-05-08 21:56:38 +03:00
CMapInfo * mapInfo = const_cast < CMapInfo * > ( curMap ) ;
mapInfo - > mapHeader = ourHeader ;
mapInfo - > countPlayers ( ) ;
mapInfo - > mapHeader = NULL ;
2010-02-18 14:34:44 +02:00
2010-05-08 21:56:38 +03:00
CSelectionScreen : : updateStartInfo ( curMap , sInfo , ourHeader ) ;
2010-02-18 14:34:44 +02:00
sInfo . turnTime = 0 ;
sInfo . whichMapInCampaign = whichOne ;
}
void CBonusSelection : : show ( SDL_Surface * to )
{
blitAt ( background , pos . x , pos . y , to ) ;
//map name
std : : string mapDesc = ourHeader - > description ,
mapName = ourHeader - > name ;
if ( mapName . length ( ) )
printAtLoc ( mapName , 481 , 219 , FONT_BIG , tytulowy , to ) ;
else
printAtLoc ( " Unnamed " , 481 , 219 , FONT_BIG , tytulowy , to ) ;
//map description
printAtLoc ( CGI - > generaltexth - > allTexts [ 496 ] , 481 , 253 , FONT_SMALL , tytulowy , to ) ;
std : : vector < std : : string > * desc = CMessage : : breakText ( mapDesc , 45 ) ;
for ( int i = 0 ; i < desc - > size ( ) ; i + + )
printAtLoc ( ( * desc ) [ i ] , 481 , 281 + i * 16 , FONT_SMALL , zwykly , to ) ;
delete desc ;
//map size icon
int temp ;
switch ( ourHeader - > width )
{
case 36 :
temp = 0 ;
break ;
case 72 :
temp = 1 ;
break ;
case 108 :
temp = 2 ;
break ;
case 144 :
temp = 3 ;
break ;
default :
temp = 4 ;
break ;
}
blitAtLoc ( sizes - > ourImages [ temp ] . bitmap , 735 , 26 , to ) ;
CIntObject : : show ( to ) ;
}
2010-02-23 17:39:31 +02:00
void CBonusSelection : : updateBonusSelection ( )
{
//graphics:
//spell - SPELLBON.DEF
//monster - TWCRPORT.DEF
//building - ?
//artifact - ARTIFBON.DEF
//spell scroll - SPELLBON.DEF
//prim skill - PSKILBON.DEF
//sec skill - SSKILBON.DEF
//resource - BORES.DEF
//player - ?
//hero -?
bonuses = new CHighlightableButtonsGroup ( 0 ) ;
{
static const char * bonDefs [ ] = { " SPELLBON.DEF " , " TWCRPORT.DEF " , " GSPBUT5.DEF " , " ARTIFBON.DEF " , " SPELLBON.DEF " ,
" PSKILBON.DEF " , " SSKILBON.DEF " , " BORES.DEF " , " GSPBUT5.DEF " , " GSPBUT5.DEF " } ;
for ( int i = 0 ; i < 5 ; i + + )
{
bonuses - > addButton ( new CHighlightableButton ( " " , " " , 0 , 110 + i * 32 , 450 , bonDefs [ i ] , i ) ) ;
bonuses - > buttons . back ( ) - > pos + = Point ( 68 , 0 ) ;
}
}
}
2010-05-08 21:56:38 +03:00
void CBonusSelection : : startMap ( )
{
StartInfo * si = new StartInfo ( sInfo ) ;
GH . popInts ( 3 ) ;
curOpts = NULL ;
: : startGame ( si ) ;
}
2010-02-16 19:28:56 +02:00
CBonusSelection : : CRegion : : CRegion ( CBonusSelection * _owner , bool _accessible , bool _selectable , int _myNumber )
: owner ( _owner ) , accessible ( _accessible ) , selectable ( _selectable ) , myNumber ( _myNumber )
{
OBJ_CONSTRUCTION ;
2010-02-18 14:34:44 +02:00
used = LCLICK | RCLICK ;
2010-02-16 19:28:56 +02:00
static const std : : string colors [ 2 ] [ 8 ] = {
{ " R " , " B " , " N " , " G " , " O " , " V " , " T " , " P " } ,
{ " Re " , " Bl " , " Br " , " Gr " , " Or " , " Vi " , " Te " , " Pi " } } ;
const SCampPositions & campDsc = owner - > campDescriptions [ owner - > ourCampaign - > header . mapVersion ] ;
const SCampPositions : : SRegionDesc & desc = campDsc . regions [ myNumber ] ;
pos . x = desc . xpos ;
pos . y = desc . ypos ;
//loading of graphics
std : : string prefix = campDsc . campPrefix + desc . infix + " _ " ;
std : : string suffix = colors [ campDsc . colorSuffixLength - 1 ] [ owner - > ourCampaign - > scenarios [ myNumber ] . regionColor ] ;
static const std : : string infix [ ] = { " En " , " Se " , " Co " } ;
for ( int g = 0 ; g < ARRAY_COUNT ( infix ) ; g + + )
{
graphics [ g ] = BitmapHandler : : loadBitmap ( prefix + infix [ g ] + suffix + " .BMP " ) ;
}
2010-02-18 14:34:44 +02:00
pos . w = graphics [ 0 ] - > w ;
pos . h = graphics [ 0 ] - > h ;
2010-02-16 19:28:56 +02:00
}
CBonusSelection : : CRegion : : ~ CRegion ( )
{
for ( int g = 0 ; g < ARRAY_COUNT ( graphics ) ; + + g )
{
SDL_FreeSurface ( graphics [ g ] ) ;
}
}
void CBonusSelection : : CRegion : : clickLeft ( tribool down , bool previousState )
{
//select if selectable & clicked inside our graphic
2010-02-21 17:03:30 +02:00
if ( indeterminate ( down ) )
{
return ;
}
2010-02-18 14:34:44 +02:00
if ( ! down & & selectable & & ! CSDL_Ext : : isTransparent ( graphics [ 0 ] , GH . current - > motion . x - pos . x , GH . current - > motion . y - pos . y ) )
2010-02-16 19:28:56 +02:00
{
2010-02-18 14:34:44 +02:00
owner - > selectMap ( myNumber ) ;
owner - > highlightedRegion = this ;
2010-02-16 19:28:56 +02:00
}
}
void CBonusSelection : : CRegion : : clickRight ( tribool down , bool previousState )
{
//show r-click text
2010-02-18 14:34:44 +02:00
if ( down & & ! CSDL_Ext : : isTransparent ( graphics [ 0 ] , GH . current - > motion . x - pos . x , GH . current - > motion . y - pos . y ) & &
rclickText . size ( ) )
{
2010-03-21 00:17:19 +02:00
CRClickPopup : : createAndPush ( rclickText ) ;
2010-02-18 14:34:44 +02:00
}
2010-02-16 19:28:56 +02:00
}
void CBonusSelection : : CRegion : : show ( SDL_Surface * to )
{
const SCampPositions : : SRegionDesc & desc = owner - > campDescriptions [ owner - > ourCampaign - > header . mapVersion ] . regions [ myNumber ] ;
if ( ! accessible )
{
//show as striped
blitAt ( graphics [ 2 ] , pos . x , pos . y , to ) ;
}
else if ( this = = owner - > highlightedRegion )
{
//show as selected
blitAt ( graphics [ 1 ] , pos . x , pos . y , to ) ;
}
else
{
//show as not selected selected
blitAt ( graphics [ 0 ] , pos . x , pos . y , to ) ;
}
}
2010-03-08 00:56:51 +02:00
2010-05-27 00:59:58 +03:00
CSavingScreen : : CSavingScreen ( bool hotseat )
: CSelectionScreen ( CMenuScreen : : saveGame , hotseat )
2010-03-08 00:56:51 +02:00
{
ourGame = mapInfoFromGame ( ) ;
sInfo = * LOCPLINT - > cb - > getStartInfo ( ) ;
setPlayersFromGame ( ) ;
}
CSavingScreen : : ~ CSavingScreen ( )
{
}