2009-05-20 13:08:56 +03:00
# include "../stdafx.h"
2009-05-20 12:02:50 +03:00
# include "CCastleInterface.h"
2008-08-20 09:57:53 +03:00
# include "AdventureMapButton.h"
# include "CAdvmapInterface.h"
2009-05-20 13:08:56 +03:00
# include "../CCallback.h"
2008-01-09 19:21:31 +02:00
# include "CGameInfo.h"
2008-08-20 09:57:53 +03:00
# include "CHeroWindow.h"
# include "CMessage.h"
2008-01-09 19:21:31 +02:00
# include "SDL_Extensions.h"
2009-05-20 13:08:56 +03:00
# include "CCreatureAnimation.h"
# include "Graphics.h"
# include "../hch/CArtHandler.h"
# include "../hch/CBuildingHandler.h"
# include "../hch/CDefHandler.h"
# include "../hch/CGeneralTextHandler.h"
# include "../hch/CLodHandler.h"
# include "../hch/CObjectHandler.h"
# include "../hch/CSpellHandler.h"
# include "../hch/CTownHandler.h"
2008-08-16 11:47:41 +03:00
# include <boost/algorithm/string.hpp>
# include <boost/algorithm/string/replace.hpp>
2008-08-17 12:11:16 +03:00
# include <boost/assign/std/vector.hpp>
2009-04-09 18:05:20 +03:00
# include <boost/lexical_cast.hpp>
2008-08-17 17:09:30 +03:00
# include <cmath>
2008-08-20 09:57:53 +03:00
# include <sstream>
2008-08-17 12:11:16 +03:00
using namespace boost : : assign ;
using namespace CSDL_Ext ;
2009-04-15 17:03:31 +03:00
/*
* CCastleInterface . cpp , part of VCMI engine
*
* Authors : listed in file AUTHORS in main folder
*
* License : GNU General Public License v2 .0 or later
* Full text of license available in license . txt file , in main folder
*
*/
2008-03-21 02:03:31 +02:00
extern TTF_Font * GEOR16 ;
2008-01-19 13:55:04 +02:00
CBuildingRect : : CBuildingRect ( Structure * Str )
2008-12-23 15:59:03 +02:00
: moi ( false ) , offset ( 0 ) , str ( Str )
2008-08-02 18:08:03 +03:00
{
2008-06-12 09:45:51 +03:00
def = CDefHandler : : giveDef ( Str - > defName ) ;
2008-06-01 16:42:29 +03:00
max = def - > ourImages . size ( ) ;
if ( str - > ID = = 33 & & str - > townID = = 4 ) //little 'hack' for estate in necropolis - background color is not always the first color in the palette
{
for ( std : : vector < Cimage > : : iterator i = def - > ourImages . begin ( ) ; i ! = def - > ourImages . end ( ) ; i + + )
{
SDL_SetColorKey ( i - > bitmap , SDL_SRCCOLORKEY , * ( ( char * ) i - > bitmap - > pixels ) ) ;
}
}
2008-11-28 03:36:34 +02:00
pos . x = str - > pos . x + LOCPLINT - > castleInt - > pos . x ;
pos . y = str - > pos . y + LOCPLINT - > castleInt - > pos . y ;
2008-02-02 02:41:00 +02:00
pos . w = def - > ourImages [ 0 ] . bitmap - > w ;
pos . h = def - > ourImages [ 0 ] . bitmap - > h ;
if ( Str - > ID < 0 | | ( Str - > ID > = 27 & & Str - > ID < = 29 ) )
{
area = border = NULL ;
return ;
}
2009-10-13 07:07:26 +03:00
border = BitmapHandler : : loadBitmap ( str - > borderName ) ;
if ( border )
2008-12-23 15:59:03 +02:00
{
2008-01-20 18:24:03 +02:00
SDL_SetColorKey ( border , SDL_SRCCOLORKEY , SDL_MapRGB ( border - > format , 0 , 255 , 255 ) ) ;
2008-12-23 15:59:03 +02:00
}
else
{
2008-09-19 15:09:15 +03:00
tlog2 < < " Warning: no border for " < < Str - > ID < < std : : endl ;
2008-12-23 15:59:03 +02:00
}
2009-10-13 07:07:26 +03:00
area = BitmapHandler : : loadBitmap ( str - > areaName ) ; //FIXME look up
if ( area )
2008-12-23 15:59:03 +02:00
{
2008-01-20 18:24:03 +02:00
; //SDL_SetColorKey(area,SDL_SRCCOLORKEY,SDL_MapRGB(area->format,0,255,255));
2008-12-23 15:59:03 +02:00
}
else
{
2008-09-19 15:09:15 +03:00
tlog2 < < " Warning: no area for " < < Str - > ID < < std : : endl ;
2008-12-23 15:59:03 +02:00
}
2008-01-19 13:55:04 +02:00
}
CBuildingRect : : ~ CBuildingRect ( )
{
delete def ;
if ( border )
SDL_FreeSurface ( border ) ;
if ( area )
SDL_FreeSurface ( area ) ;
}
void CBuildingRect : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateHover ( ) ;
activateLClick ( ) ;
activateRClick ( ) ;
2008-03-23 03:01:17 +02:00
2008-01-19 13:55:04 +02:00
}
void CBuildingRect : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateHover ( ) ;
deactivateLClick ( ) ;
deactivateRClick ( ) ;
2008-03-23 03:01:17 +02:00
if ( moi )
2009-08-11 19:05:33 +03:00
deactivateMouseMove ( ) ;
2008-03-23 03:01:17 +02:00
moi = false ;
2008-01-19 13:55:04 +02:00
}
bool CBuildingRect : : operator < ( const CBuildingRect & p2 ) const
{
if ( str - > pos . z ! = p2 . str - > pos . z )
return ( str - > pos . z ) < ( p2 . str - > pos . z ) ;
else
return ( str - > ID ) < ( p2 . str - > ID ) ;
}
2008-01-20 18:24:03 +02:00
void CBuildingRect : : hover ( bool on )
2008-01-19 13:55:04 +02:00
{
2009-08-11 19:05:33 +03:00
//Hoverable::hover(on);
2008-01-24 00:15:33 +02:00
if ( on )
2008-01-20 18:24:03 +02:00
{
2008-03-23 03:01:17 +02:00
if ( ! moi )
2009-08-11 19:05:33 +03:00
activateMouseMove ( ) ;
2008-03-23 03:01:17 +02:00
moi = true ;
2008-01-24 00:15:33 +02:00
}
2008-08-02 18:08:03 +03:00
else
2008-01-24 00:15:33 +02:00
{
2008-03-23 03:01:17 +02:00
if ( moi )
2009-08-11 19:05:33 +03:00
deactivateMouseMove ( ) ;
2008-03-23 03:01:17 +02:00
moi = false ;
2008-01-24 00:15:33 +02:00
if ( LOCPLINT - > castleInt - > hBuild = = this )
2008-01-27 22:37:10 +02:00
{
2008-01-24 00:15:33 +02:00
LOCPLINT - > castleInt - > hBuild = NULL ;
2008-01-27 22:37:10 +02:00
LOCPLINT - > statusbar - > clear ( ) ;
2009-05-30 19:00:26 +03:00
//call mouseMoved in other buildings, cursor might have been moved while they were inactive (eg. because of r-click popup)
for ( size_t i = 0 ; i < LOCPLINT - > castleInt - > buildings . size ( ) ; i + + )
2009-08-07 01:36:51 +03:00
LOCPLINT - > castleInt - > buildings [ i ] - > mouseMoved ( GH . current - > motion ) ;
2008-01-27 22:37:10 +02:00
}
2008-01-20 18:24:03 +02:00
}
2008-01-19 13:55:04 +02:00
}
2009-08-11 19:05:33 +03:00
void CBuildingRect : : clickLeft ( tribool down , bool previousState )
2008-01-19 13:55:04 +02:00
{
2009-08-07 01:36:51 +03:00
if ( area & & ( LOCPLINT - > castleInt - > hBuild = = this ) & & ! ( indeterminate ( down ) ) & & ( CSDL_Ext : : SDL_GetPixel ( area , GH . current - > motion . x - pos . x , GH . current - > motion . y - pos . y ) ! = 0 ) ) //na polu
2008-03-06 20:54:35 +02:00
{
2009-08-11 19:05:33 +03:00
if ( previousState & & ! down )
2008-03-10 01:06:35 +02:00
LOCPLINT - > castleInt - > buildingClicked ( str - > ID ) ;
2009-08-11 19:05:33 +03:00
//ClickableL::clickLeft(down);
2008-03-06 20:54:35 +02:00
}
2008-01-19 13:55:04 +02:00
}
2009-08-11 19:05:33 +03:00
void CBuildingRect : : clickRight ( tribool down , bool previousState )
2008-01-19 13:55:04 +02:00
{
2008-03-10 01:06:35 +02:00
if ( ( ! area ) | | ( ! ( ( bool ) down ) ) | | ( this ! = LOCPLINT - > castleInt - > hBuild ) )
2008-03-06 20:54:35 +02:00
return ;
2009-08-07 01:36:51 +03:00
if ( ( CSDL_Ext : : SDL_GetPixel ( area , GH . current - > motion . x - pos . x , GH . current - > motion . y - pos . y ) ! = 0 ) ) //na polu
2008-03-06 20:54:35 +02:00
{
2009-05-22 02:50:45 +03:00
CBuilding * bld = CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] ;
assert ( bld ) ;
2008-03-06 20:54:35 +02:00
CInfoPopup * vinya = new CInfoPopup ( ) ;
vinya - > free = true ;
vinya - > bitmap = CMessage : : drawBoxTextBitmapSub
( LOCPLINT - > playerID ,
2009-05-22 02:50:45 +03:00
bld - > Description ( ) ,
2008-08-02 18:08:03 +03:00
LOCPLINT - > castleInt - > bicons - > ourImages [ str - > ID ] . bitmap ,
2009-05-22 02:50:45 +03:00
bld - > Name ( ) ) ;
2008-04-25 12:25:59 +03:00
vinya - > pos . x = screen - > w / 2 - vinya - > bitmap - > w / 2 ;
vinya - > pos . y = screen - > h / 2 - vinya - > bitmap - > h / 2 ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( vinya ) ;
2008-03-06 20:54:35 +02:00
}
2008-01-19 13:55:04 +02:00
}
2008-09-25 17:09:31 +03:00
void CBuildingRect : : mouseMoved ( const SDL_MouseMotionEvent & sEvent )
2008-01-24 00:15:33 +02:00
{
2009-05-30 19:00:26 +03:00
if ( area & & isItIn ( & pos , sEvent . x , sEvent . y ) )
2008-01-24 00:15:33 +02:00
{
2008-03-15 19:48:05 +02:00
if ( CSDL_Ext : : SDL_GetPixel ( area , sEvent . x - pos . x , sEvent . y - pos . y ) = = 0 ) //hovered pixel is inside this building
2008-01-24 00:15:33 +02:00
{
if ( LOCPLINT - > castleInt - > hBuild = = this )
2008-01-27 22:37:10 +02:00
{
2008-01-24 00:15:33 +02:00
LOCPLINT - > castleInt - > hBuild = NULL ;
2008-01-27 22:37:10 +02:00
LOCPLINT - > statusbar - > clear ( ) ;
}
2008-01-24 00:15:33 +02:00
}
2008-03-15 19:48:05 +02:00
else //inside the area of this building
2008-01-24 00:15:33 +02:00
{
2008-03-15 19:48:05 +02:00
if ( LOCPLINT - > castleInt - > hBuild ) //a building is hovered
2008-01-24 00:15:33 +02:00
{
2008-03-15 19:48:05 +02:00
if ( ( * LOCPLINT - > castleInt - > hBuild ) < ( * this ) ) //set if we are on top
2008-01-24 00:15:33 +02:00
{
LOCPLINT - > castleInt - > hBuild = this ;
2008-12-22 19:48:41 +02:00
if ( CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] & & CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] - > Name ( ) . length ( ) )
LOCPLINT - > statusbar - > print ( CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] - > Name ( ) ) ;
2008-03-06 20:54:35 +02:00
else
LOCPLINT - > statusbar - > print ( str - > name ) ;
2008-01-24 00:15:33 +02:00
}
}
2008-03-15 19:48:05 +02:00
else //no building hovered
2008-01-24 00:15:33 +02:00
{
LOCPLINT - > castleInt - > hBuild = this ;
2008-12-22 19:48:41 +02:00
if ( CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] & & CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] - > Name ( ) . length ( ) )
LOCPLINT - > statusbar - > print ( CGI - > buildh - > buildings [ str - > townID ] [ str - > ID ] - > Name ( ) ) ;
2008-03-06 20:54:35 +02:00
else
LOCPLINT - > statusbar - > print ( str - > name ) ;
2008-01-24 00:15:33 +02:00
}
}
}
//if(border)
// blitAt(border,pos.x,pos.y);
}
2008-08-16 11:47:41 +03:00
void CHeroGSlot : : hover ( bool on )
{
if ( ! on ) return ;
CHeroGSlot * other = upg ? & owner - > hslotup : & owner - > hslotdown ;
std : : string temp ;
if ( hero )
{
if ( highlight ) //view NNN
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 4 ] ;
2008-08-16 11:47:41 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , hero - > name ) ;
}
else if ( other - > hero & & other - > highlight ) //exchange
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 7 ] ;
2008-08-16 11:47:41 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , hero - > name ) ;
boost : : algorithm : : replace_first ( temp , " %s " , other - > hero - > name ) ;
}
else // select NNN (in ZZZ)
{
if ( upg ) //down - visiting
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 32 ] ;
2008-08-16 11:47:41 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , hero - > name ) ;
}
else //up - garrison
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 12 ] ;
2008-08-16 11:47:41 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , hero - > name ) ;
}
}
}
else //we are empty slot
{
if ( other - > highlight & & other - > hero ) //move NNNN
{
2008-12-22 19:48:41 +02:00
temp = CGI - > generaltexth - > tcommands [ 6 ] ;
2008-08-16 11:47:41 +03:00
boost : : algorithm : : replace_first ( temp , " %s " , other - > hero - > name ) ;
}
else //empty
{
temp = CGI - > generaltexth - > allTexts [ 507 ] ;
}
}
if ( temp . size ( ) )
LOCPLINT - > statusbar - > print ( temp ) ;
}
2009-04-14 15:47:09 +03:00
2009-08-11 19:05:33 +03:00
void CHeroGSlot : : clickRight ( tribool down , bool previousState )
2008-08-16 11:47:41 +03:00
{
}
2009-04-14 15:47:09 +03:00
2009-08-11 19:05:33 +03:00
void CHeroGSlot : : clickLeft ( tribool down , bool previousState )
2008-08-16 11:47:41 +03:00
{
2008-08-25 13:25:16 +03:00
CHeroGSlot * other = upg ? & owner - > hslotup : & owner - > hslotdown ;
2008-08-16 11:47:41 +03:00
if ( ! down )
{
2009-05-25 02:21:55 +03:00
owner - > garr - > splitting = false ;
owner - > garr - > highlighted = NULL ;
2009-09-09 09:04:42 +03:00
2008-08-16 11:47:41 +03:00
if ( hero & & highlight )
{
2009-09-09 09:04:42 +03:00
setHighlight ( false ) ;
2008-08-16 11:47:41 +03:00
LOCPLINT - > openHeroWindow ( hero ) ;
}
2008-08-25 13:25:16 +03:00
else if ( other - > hero & & other - > highlight )
{
2009-04-09 18:05:20 +03:00
bool allow = true ;
2009-10-23 06:07:03 +03:00
if ( upg ) //moving hero out of town - check if it is allowed
2009-04-09 18:05:20 +03:00
{
if ( ! hero & & LOCPLINT - > cb - > howManyHeroes ( false ) > = 8 )
{
std : : string tmp = CGI - > generaltexth - > allTexts [ 18 ] ; //You already have %d adventuring heroes under your command.
boost : : algorithm : : replace_first ( tmp , " %d " , boost : : lexical_cast < std : : string > ( LOCPLINT - > cb - > howManyHeroes ( false ) ) ) ;
2009-04-22 21:48:56 +03:00
LOCPLINT - > showInfoDialog ( tmp , std : : vector < SComponent * > ( ) , soundBase : : sound_todo ) ;
2009-04-09 18:05:20 +03:00
allow = false ;
}
else if ( ! other - > hero - > army . slots . size ( ) ) //hero has no creatures - strange, but if we have appropriate error message...
{
2009-04-22 21:48:56 +03:00
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 19 ] , std : : vector < SComponent * > ( ) , soundBase : : sound_todo ) ; //This hero has no creatures. A hero must have creatures before he can brave the dangers of the countryside.
2009-04-09 18:05:20 +03:00
allow = false ;
}
}
2009-09-09 09:04:42 +03:00
setHighlight ( false ) ;
other - > setHighlight ( false ) ;
2009-04-09 18:05:20 +03:00
if ( allow )
LOCPLINT - > cb - > swapGarrisonHero ( owner - > town ) ;
2008-08-25 13:25:16 +03:00
}
2008-08-16 11:47:41 +03:00
else if ( hero )
{
2009-09-09 09:04:42 +03:00
setHighlight ( true ) ;
2008-08-25 13:25:16 +03:00
owner - > garr - > highlighted = NULL ;
2009-04-14 17:19:46 +03:00
show ( screen2 ) ;
2008-08-16 11:47:41 +03:00
}
hover ( false ) ; hover ( true ) ; //refresh statusbar
}
2009-08-07 01:36:51 +03:00
//if(indeterminate(down) && !isItIn(&other->pos,GH.current->motion.x,GH.current->motion.y))
2009-06-13 02:34:02 +03:00
//{
// other->highlight = highlight = false;
// show(screen2);
//}
2008-08-16 11:47:41 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-16 11:47:41 +03:00
void CHeroGSlot : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
activateHover ( ) ;
2008-08-16 11:47:41 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-16 11:47:41 +03:00
void CHeroGSlot : : deactivate ( )
{
2008-08-27 13:19:18 +03:00
highlight = false ;
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
deactivateHover ( ) ;
2008-08-16 11:47:41 +03:00
}
2009-04-14 15:47:09 +03:00
void CHeroGSlot : : show ( SDL_Surface * to )
2008-08-16 11:47:41 +03:00
{
if ( hero ) //there is hero
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > portraitLarge [ hero - > portrait ] , pos , to ) ;
2008-08-16 11:47:41 +03:00
else if ( ! upg ) //up garrison
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > flags - > ourImages [ LOCPLINT - > castleInt - > town - > getOwner ( ) ] . bitmap , pos , to ) ;
2008-08-16 11:47:41 +03:00
if ( highlight )
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > bigImgs [ - 1 ] , pos , to ) ;
2008-08-16 11:47:41 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-16 11:47:41 +03:00
CHeroGSlot : : CHeroGSlot ( int x , int y , int updown , const CGHeroInstance * h , CCastleInterface * Owner )
{
owner = Owner ;
pos . x = x ;
pos . y = y ;
pos . w = 58 ;
pos . h = 64 ;
hero = h ;
upg = updown ;
highlight = false ;
}
2009-04-14 15:47:09 +03:00
2008-08-16 11:47:41 +03:00
CHeroGSlot : : ~ CHeroGSlot ( )
{
}
2009-04-14 15:47:09 +03:00
2009-09-09 09:04:42 +03:00
void CHeroGSlot : : setHighlight ( bool on )
{
highlight = on ;
if ( owner - > hslotup . hero & & owner - > hslotdown . hero ) //two heroes in town
{
for ( size_t i = 0 ; i < owner - > garr - > splitButtons . size ( ) ; i + + ) //splitting enabled when slot higlighted
owner - > garr - > splitButtons [ i ] - > block ( ! on ) ;
}
}
2009-05-24 01:57:39 +03:00
static std : : string getBgName ( int type ) //TODO - co z tym zrobi�?
2008-01-09 19:21:31 +02:00
{
switch ( type )
{
case 0 :
return " TBCSBACK.bmp " ;
case 1 :
return " TBRMBACK.bmp " ;
case 2 :
return " TBTWBACK.bmp " ;
case 3 :
return " TBINBACK.bmp " ;
case 4 :
return " TBNCBACK.bmp " ;
case 5 :
return " TBDNBACK.bmp " ;
case 6 :
return " TBSTBACK.bmp " ;
case 7 :
return " TBFRBACK.bmp " ;
case 8 :
return " TBELBACK.bmp " ;
default :
2008-08-02 18:08:03 +03:00
# ifndef __GNUC__
2008-01-09 19:21:31 +02:00
throw new std : : exception ( " std::string getBgName(int type): invalid type " ) ;
2008-08-02 18:08:03 +03:00
# else
throw new std : : exception ( ) ;
# endif
2008-01-09 19:21:31 +02:00
}
}
2008-01-15 23:38:01 +02:00
class SORTHELP
{
public :
bool operator ( )
2008-01-19 13:55:04 +02:00
( const CBuildingRect * a ,
const CBuildingRect * b )
2008-01-15 23:38:01 +02:00
{
2008-01-19 13:55:04 +02:00
return ( * a ) < ( * b ) ;
2008-01-15 23:38:01 +02:00
}
} srthlp ;
2008-01-09 19:21:31 +02:00
2009-07-20 11:18:33 +03:00
CCastleInterface : : CCastleInterface ( const CGTownInstance * Town , int listPos )
2008-08-16 11:47:41 +03:00
: hslotup ( 241 , 387 , 0 , Town - > garrisonHero , this ) , hslotdown ( 241 , 483 , 1 , Town - > visitingHero , this )
2008-08-02 18:08:03 +03:00
{
2009-07-26 06:33:13 +03:00
showing = false ;
2009-04-14 15:47:09 +03:00
bars = CDefHandler : : giveDefEss ( " TPTHBAR.DEF " ) ;
status = CDefHandler : : giveDefEss ( " TPTHCHK.DEF " ) ;
2008-11-28 03:36:34 +02:00
LOCPLINT - > castleInt = this ;
2008-03-11 23:36:59 +02:00
hall = NULL ;
2008-06-12 09:45:51 +03:00
townInt = BitmapHandler : : loadBitmap ( " TOWNSCRN.bmp " ) ;
cityBg = BitmapHandler : : loadBitmap ( getBgName ( Town - > subID ) ) ;
2008-11-28 03:36:34 +02:00
pos . x = screen - > w / 2 - 400 ;
pos . y = screen - > h / 2 - 300 ;
hslotup . pos . x + = pos . x ;
hslotup . pos . y + = pos . y ;
hslotdown . pos . x + = pos . x ;
hslotdown . pos . y + = pos . y ;
2008-06-12 09:45:51 +03:00
hall = CDefHandler : : giveDef ( " ITMTL.DEF " ) ;
fort = CDefHandler : : giveDef ( " ITMCL.DEF " ) ;
2008-04-19 19:15:04 +03:00
hBuild = NULL ;
count = 0 ;
town = Town ;
2009-05-29 16:43:33 +03:00
animval = 0 ;
2008-04-19 19:15:04 +03:00
//garrison
2009-06-28 11:21:50 +03:00
garr = new CGarrisonInt ( pos . x + 305 , pos . y + 387 , 4 , Point ( 0 , 96 ) , townInt , Point ( 62 , 374 ) , town , town - > visitingHero ) ;
2008-04-19 19:15:04 +03:00
2008-11-28 03:36:34 +02:00
townlist = new CTownList ( 3 , pos . x + 744 , pos . y + 414 , " IAM014.DEF " , " IAM015.DEF " ) ; //744,526);
2008-05-18 20:33:39 +03:00
exit = new AdventureMapButton
2008-12-22 19:48:41 +02:00
( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CCastleInterface : : close , this ) , pos . x + 744 , pos . y + 544 , " TSBTNS.DEF " , SDLK_RETURN ) ;
2009-07-20 11:18:33 +03:00
exit - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2009-09-09 09:04:42 +03:00
split = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 3 ] , " " , boost : : bind ( & CGarrisonInt : : splitClick , garr ) , pos . x + 744 , pos . y + 382 , " TSBTNS.DEF " ) ;
split - > callback + = boost : : bind ( & CCastleInterface : : splitClicked , this ) ;
garr - > splitButtons . push_back ( split ) ;
2008-11-28 03:36:34 +02:00
statusbar = new CStatusBar ( pos . x + 7 , pos . y + 555 , " TSTATBAR.bmp " , 732 ) ;
2008-12-08 00:38:04 +02:00
resdatabar = new CResDataBar ( " ZRESBAR.bmp " , pos . x + 3 , pos . y + 575 , 32 , 2 , 85 , 85 ) ;
resdatabar - > pos . x = pos . x + 3 ; resdatabar - > pos . y = pos . y + 575 ;
2008-01-31 23:35:30 +02:00
2008-05-18 20:33:39 +03:00
townlist - > fun = boost : : bind ( & CCastleInterface : : townChange , this ) ;
2008-01-31 23:35:30 +02:00
townlist - > genList ( ) ;
2009-04-17 17:01:22 +03:00
townlist - > selected = vstd : : findPos ( townlist - > items , Town ) ;
2009-07-20 11:18:33 +03:00
townlist - > from = townlist - > selected - listPos ;
amax ( townlist - > from , 0 ) ;
amin ( townlist - > from , townlist - > items . size ( ) - townlist - > SIZE ) ;
2008-01-31 23:35:30 +02:00
2008-06-30 03:06:41 +03:00
graphics - > blueToPlayersAdv ( townInt , LOCPLINT - > playerID ) ;
2008-01-31 23:35:30 +02:00
exit - > bitmapOffset = 4 ;
2008-01-15 23:38:01 +02:00
2008-01-28 16:01:09 +02:00
//buildings
2008-03-23 03:01:17 +02:00
recreateBuildings ( ) ;
2008-01-15 23:38:01 +02:00
2008-01-28 16:01:09 +02:00
2008-03-06 20:54:35 +02:00
std : : string defname ;
switch ( town - > subID )
{
case 0 :
defname = " HALLCSTL.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : castleTown ;
2008-03-06 20:54:35 +02:00
break ;
case 1 :
defname = " HALLRAMP.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : rampartTown ;
2008-03-06 20:54:35 +02:00
break ;
case 2 :
defname = " HALLTOWR.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : towerTown ;
2008-03-06 20:54:35 +02:00
break ;
case 3 :
defname = " HALLINFR.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : infernoTown ;
2008-03-06 20:54:35 +02:00
break ;
case 4 :
defname = " HALLNECR.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : necroTown ;
2008-03-06 20:54:35 +02:00
break ;
case 5 :
defname = " HALLDUNG.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : dungeonTown ;
2008-03-06 20:54:35 +02:00
break ;
case 6 :
defname = " HALLSTRN.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : strongHoldTown ;
2008-03-06 20:54:35 +02:00
break ;
case 7 :
defname = " HALLFORT.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : fortressTown ;
2008-03-06 20:54:35 +02:00
break ;
case 8 :
defname = " HALLELEM.DEF " ;
2009-05-01 02:25:17 +03:00
musicID = musicBase : : elemTown ;
2008-03-06 20:54:35 +02:00
break ;
default :
2008-11-28 03:36:34 +02:00
throw new std : : string ( " Wrong town subID " ) ;
2008-03-06 20:54:35 +02:00
}
2008-06-12 09:45:51 +03:00
bicons = CDefHandler : : giveDefEss ( defname ) ;
2009-07-26 14:42:00 +03:00
CGI - > musich - > playMusic ( musicID , - 1 ) ;
2008-01-09 19:21:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-09 19:21:31 +02:00
CCastleInterface : : ~ CCastleInterface ( )
{
2009-04-14 15:47:09 +03:00
delete bars ;
delete status ;
2008-01-09 19:21:31 +02:00
SDL_FreeSurface ( townInt ) ;
SDL_FreeSurface ( cityBg ) ;
delete exit ;
2009-09-11 08:45:40 +03:00
//delete split;
2008-01-09 19:21:31 +02:00
delete hall ;
delete fort ;
2008-01-26 23:50:51 +02:00
delete garr ;
2008-01-31 23:35:30 +02:00
delete townlist ;
delete statusbar ;
2008-12-08 00:38:04 +02:00
delete resdatabar ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + )
2008-01-15 23:38:01 +02:00
{
delete buildings [ i ] ;
}
2008-03-06 20:54:35 +02:00
delete bicons ;
2008-01-15 23:38:01 +02:00
2008-01-09 19:21:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-09 19:21:31 +02:00
void CCastleInterface : : close ( )
{
2008-08-28 20:36:34 +03:00
if ( town - > visitingHero )
LOCPLINT - > adventureInt - > select ( town - > visitingHero ) ;
2009-09-20 15:47:40 +03:00
else
LOCPLINT - > adventureInt - > select ( town ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > castleInt = NULL ;
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-22 07:14:59 +03:00
CGI - > musich - > stopMusic ( 5000 ) ;
2008-01-09 19:21:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-30 00:47:43 +02:00
void CCastleInterface : : splitF ( )
{
}
2009-04-14 15:47:09 +03:00
2008-03-10 01:06:35 +02:00
void CCastleInterface : : buildingClicked ( int building )
{
2008-09-19 15:09:15 +03:00
tlog5 < < " You've clicked on " < < building < < std : : endl ;
2008-05-03 18:30:11 +03:00
if ( building = = 19 | | building = = 18 )
{
building = town - > town - > hordeLvl [ 0 ] + 30 ;
}
else if ( building = = 24 | | building = = 25 )
{
building = town - > town - > hordeLvl [ 1 ] + 30 ;
}
2008-04-04 20:30:53 +03:00
if ( building > = 30 )
{
2008-08-17 12:11:16 +03:00
showRecruitmentWindow ( building ) ;
2008-04-04 20:30:53 +03:00
}
2008-04-20 15:39:33 +03:00
else
2008-03-10 01:06:35 +02:00
{
2008-04-20 15:39:33 +03:00
switch ( building )
{
2008-10-26 22:58:34 +02:00
case 0 : case 1 : case 2 : case 3 : case 4 : //mage guild
2008-08-20 09:57:53 +03:00
{
2009-06-13 02:34:02 +03:00
const CGHeroInstance * h = NULL ; //hero that "enters" mage guild
if ( ! town - > garrisonHero & & ! town - > visitingHero ) //no heroes in town
h = NULL ;
else if ( ! town - > garrisonHero ) //only visiting hero
h = town - > visitingHero ;
else if ( ! town - > visitingHero | | hslotup . highlight ) //only garrisoned hero OR both heroes present, garrisoned hero selected
h = town - > garrisonHero ;
else //both heroes present, use the visiting one
h = town - > visitingHero ;
if ( h & & ! vstd : : contains ( h - > artifWorn , ui16 ( 17 ) ) ) //hero doesn't have spellbok
2008-08-25 13:25:16 +03:00
{
if ( LOCPLINT - > cb - > getResourceAmount ( 6 ) < 500 ) //not enough gold to buy spellbook
{
2009-11-13 18:02:25 +02:00
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 213 ] ) ;
2008-08-25 13:25:16 +03:00
}
else
{
2009-06-13 02:34:02 +03:00
CFunctionList < void ( ) > fl = boost : : bind ( & CCallback : : buyArtifact , LOCPLINT - > cb , h , 0 ) ;
2008-08-25 13:25:16 +03:00
fl + = boost : : bind ( & CCastleInterface : : enterMageGuild , this ) ;
std : : vector < SComponent * > vvv ( 1 , new SComponent ( SComponent : : artifact , 0 , 0 ) ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > showYesNoDialog ( CGI - > generaltexth - > allTexts [ 214 ] , vvv , fl , 0 , true ) ;
2008-08-25 13:25:16 +03:00
}
}
else
{
enterMageGuild ( ) ;
}
2008-08-20 09:57:53 +03:00
break ;
}
2008-10-26 22:58:34 +02:00
case 5 : //tavern
{
2009-05-22 02:50:45 +03:00
enterTavern ( ) ;
2008-10-26 22:58:34 +02:00
break ;
}
2009-07-26 06:33:13 +03:00
case 6 : //shipyard
{
LOCPLINT - > showShipyardDialog ( town ) ;
break ;
}
2008-10-26 22:58:34 +02:00
case 7 : case 8 : case 9 : //fort/citadel/castle
2008-08-17 12:11:16 +03:00
{
2008-08-30 00:41:32 +03:00
CFortScreen * fs = new CFortScreen ( this ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( fs ) ;
2008-08-17 12:11:16 +03:00
break ;
}
2008-10-26 22:58:34 +02:00
case 10 : case 11 : case 12 : case 13 : //hall
2008-04-20 15:39:33 +03:00
enterHall ( ) ;
break ;
2008-10-26 22:58:34 +02:00
case 14 : //marketplace
2008-09-07 06:38:37 +03:00
{
CMarketplaceWindow * cmw = new CMarketplaceWindow ( 0 ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( cmw ) ;
2008-09-07 06:38:37 +03:00
break ;
}
2008-10-26 22:58:34 +02:00
case 15 : //resource silo
2008-09-12 11:51:46 +03:00
{
2009-05-22 02:50:45 +03:00
LOCPLINT - > showInfoDialog ( CGI - > buildh - > buildings [ town - > subID ] [ 15 ] - > Description ( ) , std : : vector < SComponent * > ( ) , soundBase : : sound_todo ) ;
2008-09-12 11:51:46 +03:00
break ;
}
2008-10-26 22:58:34 +02:00
case 16 : //blacksmith
2008-08-27 13:19:18 +03:00
{
const CGHeroInstance * hero = town - > visitingHero ;
if ( ! hero )
{
std : : string pom = CGI - > generaltexth - > allTexts [ 273 ] ;
2008-12-22 19:48:41 +02:00
boost : : algorithm : : replace_first ( pom , " %s " , CGI - > buildh - > buildings [ town - > subID ] [ 16 ] - > Name ( ) ) ;
2009-04-22 21:48:56 +03:00
LOCPLINT - > showInfoDialog ( pom , std : : vector < SComponent * > ( ) , soundBase : : sound_todo ) ;
2008-08-27 13:19:18 +03:00
return ;
}
int aid = town - > town - > warMachine ;
int price = CGI - > arth - > artifacts [ aid ] . price ;
bool possible = ( LOCPLINT - > cb - > getResourceAmount ( 6 ) > = price ) ;
if ( vstd : : contains ( hero - > artifWorn , ui16 ( aid + 9 ) ) ) //hero already has machine
possible = false ;
2009-04-21 01:57:07 +03:00
2009-08-07 01:36:51 +03:00
GH . pushInt ( new CBlacksmithDialog ( possible , CArtHandler : : convertMachineID ( aid , false ) , aid , hero - > id ) ) ;
2008-08-27 13:19:18 +03:00
break ;
}
2009-05-22 02:50:45 +03:00
//TODO: case 17: //special 1
//TODO: case 18: //basic horde 1
//TODO: case 19: //upg horde 1
2009-07-26 06:33:13 +03:00
case 20 : //ship at shipyard
2009-11-13 18:02:25 +02:00
LOCPLINT - > showInfoDialog ( CGI - > generaltexth - > allTexts [ 51 ] ) ; //Cannot build another boat
2009-07-26 06:33:13 +03:00
break ;
2009-05-22 02:50:45 +03:00
//TODO: case 21: //special 2
case 22 : //special 3
{
switch ( town - > subID )
{
case 0 : //brotherhood of sword
enterTavern ( ) ;
break ;
default :
tlog4 < < " This building isn't handled... \n " ;
break ;
}
break ;
}
//TODO: case 23: //special 4
//TODO: case 24: //basic horde 2
//TODO: case 25: //upg horde 2
//TODO: case 26: //grail
2008-04-20 15:39:33 +03:00
default :
2008-09-19 15:09:15 +03:00
tlog4 < < " This building isn't handled... \n " ;
2008-04-20 15:39:33 +03:00
}
2008-03-10 01:06:35 +02:00
}
}
2009-04-14 15:47:09 +03:00
2008-03-10 01:06:35 +02:00
void CCastleInterface : : enterHall ( )
{
2008-08-17 12:11:16 +03:00
CHallInterface * h = new CHallInterface ( this ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( h ) ;
2008-03-10 01:06:35 +02:00
}
2008-12-08 00:38:04 +02:00
2009-04-14 15:47:09 +03:00
void CCastleInterface : : showAll ( SDL_Surface * to /*=NULL*/ )
{
2008-11-28 03:36:34 +02:00
blitAt ( cityBg , pos , to ) ;
blitAt ( townInt , pos . x , pos . y + 374 , to ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > adventureInt - > resdatabar . draw ( to ) ;
townlist - > draw ( to ) ;
statusbar - > show ( to ) ;
resdatabar - > draw ( to ) ;
2008-01-09 19:21:31 +02:00
2009-04-14 15:47:09 +03:00
garr - > show ( to ) ;
2008-01-09 19:21:31 +02:00
int pom ;
2008-01-09 21:59:23 +02:00
//draw fort icon
2008-01-09 19:21:31 +02:00
if ( town - > builtBuildings . find ( 9 ) ! = town - > builtBuildings . end ( ) )
pom = 2 ;
else if ( town - > builtBuildings . find ( 8 ) ! = town - > builtBuildings . end ( ) )
pom = 1 ;
else if ( town - > builtBuildings . find ( 7 ) ! = town - > builtBuildings . end ( ) )
pom = 0 ;
else pom = 3 ;
2008-11-28 03:36:34 +02:00
blitAt ( fort - > ourImages [ pom ] . bitmap , pos . x + 122 , pos . y + 413 , to ) ;
2008-01-09 19:21:31 +02:00
2008-01-09 21:59:23 +02:00
//draw ((village/town/city) hall)/capitol icon
2008-01-09 19:21:31 +02:00
if ( town - > builtBuildings . find ( 13 ) ! = town - > builtBuildings . end ( ) )
pom = 3 ;
else if ( town - > builtBuildings . find ( 12 ) ! = town - > builtBuildings . end ( ) )
pom = 2 ;
else if ( town - > builtBuildings . find ( 11 ) ! = town - > builtBuildings . end ( ) )
pom = 1 ;
else pom = 0 ;
2008-11-28 03:36:34 +02:00
blitAt ( hall - > ourImages [ pom ] . bitmap , pos . x + 80 , pos . y + 413 , to ) ;
2008-01-09 19:21:31 +02:00
2008-01-09 21:59:23 +02:00
//draw creatures icons and their growths
for ( int i = 0 ; i < CREATURES_PER_TOWN ; i + + )
{
int cid = - 1 ;
if ( town - > builtBuildings . find ( 30 + i ) ! = town - > builtBuildings . end ( ) )
{
if ( town - > builtBuildings . find ( 30 + CREATURES_PER_TOWN + i ) ! = town - > builtBuildings . end ( ) )
2008-04-04 20:30:53 +03:00
cid = town - > town - > upgradedCreatures [ i ] ;
else
cid = town - > town - > basicCreatures [ i ] ;
2008-01-09 21:59:23 +02:00
}
if ( cid > = 0 )
{
2008-01-12 13:32:40 +02:00
int pomx , pomy ;
pomx = 22 + ( 55 * ( ( i > 3 ) ? ( i - 4 ) : i ) ) ;
pomy = ( i > 3 ) ? ( 507 ) : ( 459 ) ;
2008-11-28 03:36:34 +02:00
blitAt ( graphics - > smallImgs [ cid ] , pos . x + pomx , pos . y + pomy , to ) ;
2008-01-12 13:32:40 +02:00
std : : ostringstream oss ;
2008-04-11 20:41:02 +03:00
oss < < ' + ' < < town - > creatureGrowth ( i ) ;
2008-11-28 03:36:34 +02:00
CSDL_Ext : : printAtMiddle ( oss . str ( ) , pos . x + pomx + 16 , pos . y + pomy + 37 , GEOR13 , zwykly , to ) ;
2008-01-09 21:59:23 +02:00
}
}
//print name and income
2008-11-28 03:36:34 +02:00
CSDL_Ext : : printAt ( town - > name , pos . x + 85 , pos . y + 389 , GEOR13 , zwykly , to ) ;
2008-01-09 19:21:31 +02:00
char temp [ 10 ] ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( town - > dailyIncome ( ) , temp , 10 ) ;
2008-11-28 03:36:34 +02:00
CSDL_Ext : : printAtMiddle ( temp , pos . x + 195 , pos . y + 442 , GEOR13 , zwykly , to ) ;
2008-01-12 13:32:40 +02:00
//blit town icon
pom = town - > subID * 2 ;
if ( ! town - > hasFort ( ) )
pom + = F_NUMBER * 2 ;
if ( town - > builded > = MAX_BUILDING_PER_TURN )
pom + + ;
2008-11-28 03:36:34 +02:00
blitAt ( graphics - > bigTownPic - > ourImages [ pom ] . bitmap , pos . x + 15 , pos . y + 387 , to ) ;
2008-01-12 13:32:40 +02:00
2009-04-14 15:47:09 +03:00
hslotup . show ( to ) ;
hslotdown . show ( to ) ;
2008-01-26 21:36:31 +02:00
2009-04-14 15:47:09 +03:00
show ( to ) ;
2008-12-08 00:38:04 +02:00
2008-12-22 19:48:41 +02:00
if ( screen - > w ! = 800 | | screen - > h ! = 600 )
CMessage : : drawBorder ( LOCPLINT - > playerID , to , 828 , 628 , pos . x - 14 , pos . y - 15 ) ;
2009-04-14 15:47:09 +03:00
exit - > show ( to ) ;
2009-09-11 08:45:40 +03:00
//split->show(to);
2008-01-19 14:26:55 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-31 23:35:30 +02:00
void CCastleInterface : : townChange ( )
{
const CGTownInstance * nt = townlist - > items [ townlist - > selected ] ;
2009-07-20 11:18:33 +03:00
int tpos = townlist - > selected - townlist - > from ;
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
GH . pushInt ( new CCastleInterface ( nt , tpos ) ) ;
2008-01-31 23:35:30 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-19 14:26:55 +02:00
void CCastleInterface : : show ( SDL_Surface * to )
{
count + + ;
2008-08-16 11:47:41 +03:00
if ( count = = 8 )
2008-01-19 14:26:55 +02:00
{
count = 0 ;
animval + + ;
2008-01-12 13:32:40 +02:00
}
2008-01-15 23:38:01 +02:00
2008-11-28 03:36:34 +02:00
blitAt ( cityBg , pos , to ) ;
2008-01-20 18:24:03 +02:00
2008-01-19 14:26:55 +02:00
2008-01-15 23:38:01 +02:00
//blit buildings
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + )
2008-01-15 23:38:01 +02:00
{
2008-06-04 16:00:56 +03:00
int frame = ( ( animval ) % ( buildings [ i ] - > max - buildings [ i ] - > offset ) ) + buildings [ i ] - > offset ;
2008-06-01 16:42:29 +03:00
if ( frame )
2008-01-19 14:26:55 +02:00
{
blitAt ( buildings [ i ] - > def - > ourImages [ 0 ] . bitmap , buildings [ i ] - > pos . x , buildings [ i ] - > pos . y , to ) ;
2008-06-01 16:42:29 +03:00
blitAt ( buildings [ i ] - > def - > ourImages [ frame ] . bitmap , buildings [ i ] - > pos . x , buildings [ i ] - > pos . y , to ) ;
2008-01-19 14:26:55 +02:00
}
2008-08-02 18:08:03 +03:00
else
2008-06-01 16:42:29 +03:00
blitAt ( buildings [ i ] - > def - > ourImages [ frame ] . bitmap , buildings [ i ] - > pos . x , buildings [ i ] - > pos . y , to ) ;
if ( hBuild = = buildings [ i ] & & hBuild - > border ) //if this this higlighted structure and has border we'll blit it
2008-01-24 00:15:33 +02:00
blitAt ( hBuild - > border , hBuild - > pos , to ) ;
2008-01-15 23:38:01 +02:00
}
2008-01-09 19:21:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-09 19:21:31 +02:00
void CCastleInterface : : activate ( )
{
2008-03-11 23:36:59 +02:00
showing = true ;
2008-01-31 23:35:30 +02:00
townlist - > activate ( ) ;
2008-01-26 21:36:31 +02:00
garr - > activate ( ) ;
2008-01-27 22:37:10 +02:00
LOCPLINT - > statusbar = statusbar ;
2008-01-26 21:36:31 +02:00
exit - > activate ( ) ;
2009-09-11 08:45:40 +03:00
//split->activate();
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + ) //XXX pls use iterators or at() but not []
{
2008-01-20 18:24:03 +02:00
buildings [ i ] - > activate ( ) ;
2008-12-23 15:59:03 +02:00
}
2008-08-16 11:47:41 +03:00
hslotdown . activate ( ) ;
hslotup . activate ( ) ;
2009-08-11 19:05:33 +03:00
activateKeys ( ) ;
2008-01-09 19:21:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-01-09 19:21:31 +02:00
void CCastleInterface : : deactivate ( )
{
2008-03-11 23:36:59 +02:00
showing = false ;
2008-01-31 23:35:30 +02:00
townlist - > deactivate ( ) ;
2008-01-26 21:36:31 +02:00
garr - > deactivate ( ) ;
2008-01-09 19:21:31 +02:00
exit - > deactivate ( ) ;
2009-09-11 08:45:40 +03:00
//split->deactivate();
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + ) //XXX iterators
{
2008-01-20 18:24:03 +02:00
buildings [ i ] - > deactivate ( ) ;
2008-12-23 15:59:03 +02:00
}
2008-08-16 11:47:41 +03:00
hslotdown . deactivate ( ) ;
hslotup . deactivate ( ) ;
2009-08-11 19:05:33 +03:00
deactivateKeys ( ) ;
2008-03-10 01:06:35 +02:00
}
2008-03-23 03:01:17 +02:00
void CCastleInterface : : addBuilding ( int bid )
{
2008-05-03 18:30:11 +03:00
//TODO: lepiej by bylo tylko dodawac co trzeba pamietajac o grupach
2008-08-01 21:13:33 +03:00
deactivate ( ) ;
2008-03-23 03:01:17 +02:00
recreateBuildings ( ) ;
2008-08-01 21:13:33 +03:00
activate ( ) ;
2008-03-23 03:01:17 +02:00
}
void CCastleInterface : : removeBuilding ( int bid )
{
2008-05-03 18:30:11 +03:00
//TODO: lepiej by bylo tylko usuwac co trzeba pamietajac o grupach
2008-03-23 03:01:17 +02:00
recreateBuildings ( ) ;
}
void CCastleInterface : : recreateBuildings ( )
{
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + )
2008-03-23 03:01:17 +02:00
{
if ( showing )
buildings [ i ] - > deactivate ( ) ;
delete buildings [ i ] ;
}
buildings . clear ( ) ;
hBuild = NULL ;
std : : set < std : : pair < int , int > > s ; //group - id
2008-08-01 14:21:15 +03:00
for ( std : : set < si32 > : : const_iterator i = town - > builtBuildings . begin ( ) ; i ! = town - > builtBuildings . end ( ) ; i + + )
2008-03-23 03:01:17 +02:00
{
if ( CGI - > townh - > structures . find ( town - > subID ) ! = CGI - > townh - > structures . end ( ) ) //we have info about structures in this town
{
if ( CGI - > townh - > structures [ town - > subID ] . find ( * i ) ! = CGI - > townh - > structures [ town - > subID ] . end ( ) ) //we have info about that structure
{
Structure * st = CGI - > townh - > structures [ town - > subID ] [ * i ] ;
if ( st - > group < 0 ) //no group - just add it
{
buildings . push_back ( new CBuildingRect ( st ) ) ;
}
else
{
std : : set < std : : pair < int , int > > : : iterator obecny = s . end ( ) ;
for ( std : : set < std : : pair < int , int > > : : iterator seti = s . begin ( ) ; seti ! = s . end ( ) ; seti + + ) //check if we have already building from same group
{
if ( seti - > first = = st - > group )
{
2008-08-02 18:08:03 +03:00
obecny = seti ;
2008-03-23 03:01:17 +02:00
break ;
}
}
if ( obecny ! = s . end ( ) )
{
if ( ( * ( CGI - > townh - > structures [ town - > subID ] [ obecny - > second ] ) ) < ( * ( CGI - > townh - > structures [ town - > subID ] [ st - > ID ] ) ) ) //we have to replace old building with current one
{
2008-12-21 21:17:35 +02:00
for ( size_t itpb = 0 ; itpb < buildings . size ( ) ; itpb + + )
2008-03-23 03:01:17 +02:00
{
if ( buildings [ itpb ] - > str - > ID = = obecny - > second )
{
delete buildings [ itpb ] ;
buildings . erase ( buildings . begin ( ) + itpb ) ;
2008-08-02 18:08:03 +03:00
# ifndef __GNUC__
2008-12-21 21:17:35 +02:00
obecny - > second = st - > ID ; //XXX look closer!
2008-08-02 18:08:03 +03:00
# else
* ( const_cast < int * > ( & ( obecny - > second ) ) ) = st - > ID ;
# endif
2008-03-23 03:01:17 +02:00
buildings . push_back ( new CBuildingRect ( st ) ) ;
}
}
}
}
else
{
buildings . push_back ( new CBuildingRect ( st ) ) ;
s . insert ( std : : pair < int , int > ( st - > group , st - > ID ) ) ;
}
}
}
else continue ;
}
else
break ;
}
2009-07-26 06:33:13 +03:00
//ship in shipyard
2009-09-20 15:47:40 +03:00
bool isThereShip = false ;
2009-07-26 06:33:13 +03:00
if ( vstd : : contains ( town - > builtBuildings , 6 ) )
{
std : : vector < const CGObjectInstance * > vobjs = LOCPLINT - > cb - > getVisitableObjs ( town - > bestLocation ( ) ) ;
2009-11-13 18:02:25 +02:00
if ( vobjs . size ( ) & & ( vobjs . front ( ) - > ID = = 8 | | vobjs . front ( ) - > ID = = HEROI_TYPE ) ) //there is visitable obj at shipyard output tile and it's a boat or hero (on boat)
2009-07-26 06:33:13 +03:00
{
Structure * st = CGI - > townh - > structures [ town - > subID ] [ 20 ] ;
buildings . push_back ( new CBuildingRect ( st ) ) ;
s . insert ( std : : pair < int , int > ( st - > group , st - > ID ) ) ;
2009-09-20 15:47:40 +03:00
isThereShip = true ;
2009-07-26 06:33:13 +03:00
}
}
2008-04-04 20:30:53 +03:00
std : : sort ( buildings . begin ( ) , buildings . end ( ) , srthlp ) ;
2008-06-01 16:42:29 +03:00
//code for Mana Vortex (there are two sets of animation frames - one without mage guild and one with
2008-08-02 18:08:03 +03:00
if ( ( town - > subID = = 5 ) & & ( town - > builtBuildings . find ( 21 ) ! = town - > builtBuildings . end ( ) ) )
2008-06-01 16:42:29 +03:00
{
CBuildingRect * vortex = NULL ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + )
2008-06-01 16:42:29 +03:00
{
if ( buildings [ i ] - > str - > ID = = 21 )
{
vortex = buildings [ i ] ;
break ;
}
}
if ( town - > builtBuildings . find ( 4 ) ! = town - > builtBuildings . end ( ) ) //there is mage Guild level 5
{
vortex - > offset = 10 ;
vortex - > max = vortex - > def - > ourImages . size ( ) ;
}
else
{
vortex - > offset = 0 ;
vortex - > max = 10 ;
}
}
2008-06-04 16:00:56 +03:00
//code for the shipyard in the Castle
2009-09-20 15:47:40 +03:00
else if ( town - > subID = = 0 )
2008-06-04 16:00:56 +03:00
{
2009-09-20 15:47:40 +03:00
int shipID = 0 ;
if ( isThereShip )
shipID = 20 ;
else if ( vstd : : contains ( town - > builtBuildings , 6 ) )
shipID = 6 ;
if ( shipID )
2008-06-04 16:00:56 +03:00
{
2009-09-20 15:47:40 +03:00
CBuildingRect * shipyard = NULL ;
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + )
2008-06-04 16:00:56 +03:00
{
2009-09-20 15:47:40 +03:00
if ( buildings [ i ] - > str - > ID = = shipID )
{
shipyard = buildings [ i ] ;
break ;
}
}
if ( town - > builtBuildings . find ( 8 ) ! = town - > builtBuildings . end ( ) ) //there is citadel
{
shipyard - > offset = 1 ;
shipyard - > max = shipyard - > def - > ourImages . size ( ) ;
}
else
{
shipyard - > offset = 0 ;
shipyard - > max = 1 ;
2008-06-04 16:00:56 +03:00
}
}
}
2009-07-26 06:33:13 +03:00
if ( showing )
for ( size_t i = 0 ; i < buildings . size ( ) ; i + + )
buildings [ i ] - > activate ( ) ;
2008-04-11 20:41:02 +03:00
}
2008-08-17 12:11:16 +03:00
2009-05-12 06:43:40 +03:00
CRecruitmentWindow * CCastleInterface : : showRecruitmentWindow ( int building )
2008-03-10 01:06:35 +02:00
{
2009-07-06 22:41:27 +03:00
if ( building > 36 ) //upg dwelling
2008-08-17 12:11:16 +03:00
building - = 7 ;
2009-07-06 22:41:27 +03:00
int level = building - 30 ;
assert ( level > = 0 & & level < = 6 ) ;
2009-07-26 13:43:22 +03:00
//std::vector<std::pair<int,int > > crs;
//int amount = town->creatures[level].first;
2008-08-17 12:11:16 +03:00
2009-07-26 13:43:22 +03:00
//const std::vector<ui32> &cres = town->creatures[level].second;
2008-03-10 01:06:35 +02:00
2009-07-26 13:43:22 +03:00
//for(size_t i = 0; i < cres.size(); i++)
// crs.push_back(std::make_pair((int)cres[i],amount));
//CRecruitmentWindow *rw = new CRecruitmentWindow(crs,boost::bind(&CCallback::recruitCreatures,LOCPLINT->cb,town,_1,_2));
2008-08-17 12:11:16 +03:00
2009-07-26 13:43:22 +03:00
CRecruitmentWindow * rw = new CRecruitmentWindow ( town , level , town , boost : : bind ( & CCallback : : recruitCreatures , LOCPLINT - > cb , town , _1 , _2 ) ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( rw ) ;
2008-08-17 12:11:16 +03:00
return rw ;
}
2008-08-25 13:25:16 +03:00
void CCastleInterface : : enterMageGuild ( )
{
2009-08-07 01:36:51 +03:00
GH . pushInt ( new CMageGuildScreen ( this ) ) ;
2008-08-25 13:25:16 +03:00
}
2009-05-22 02:50:45 +03:00
void CCastleInterface : : enterTavern ( )
{
std : : vector < const CGHeroInstance * > h = LOCPLINT - > cb - > getAvailableHeroes ( town ) ;
CTavernWindow * tv = new CTavernWindow ( h [ 0 ] , h [ 1 ] , " GOSSIP TEST " ) ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( tv ) ;
2009-05-22 02:50:45 +03:00
}
2009-07-20 11:18:33 +03:00
void CCastleInterface : : keyPressed ( const SDL_KeyboardEvent & key )
{
2009-09-07 05:29:44 +03:00
if ( key . state ! = SDL_PRESSED ) return ;
2009-07-20 11:18:33 +03:00
switch ( key . keysym . sym )
{
case SDLK_UP :
if ( townlist - > selected )
{
townlist - > selected - - ;
townlist - > from - - ;
townChange ( ) ;
}
break ;
case SDLK_DOWN :
if ( townlist - > selected < townlist - > items . size ( ) - 1 )
{
townlist - > selected + + ;
townlist - > from + + ;
townChange ( ) ;
}
break ;
case SDLK_SPACE :
if ( town - > visitingHero & & town - > garrisonHero )
{
LOCPLINT - > cb - > swapGarrisonHero ( town ) ;
}
break ;
2009-10-13 07:07:26 +03:00
default :
break ;
2009-07-20 11:18:33 +03:00
}
}
2009-09-09 09:04:42 +03:00
void CCastleInterface : : splitClicked ( )
{
if ( town - > visitingHero & & town - > garrisonHero & & ( hslotdown . highlight | | hslotup . highlight ) )
{
LOCPLINT - > heroExchangeStarted ( town - > visitingHero - > id , town - > garrisonHero - > id ) ;
}
}
2008-03-10 01:06:35 +02:00
void CHallInterface : : CBuildingBox : : hover ( bool on )
{
2009-08-11 19:05:33 +03:00
//Hoverable::hover(on);
2008-03-16 02:09:43 +02:00
if ( on )
{
2008-06-03 21:16:54 +03:00
std : : string toPrint ;
if ( state = = 8 )
2008-12-22 19:48:41 +02:00
toPrint = CGI - > generaltexth - > hcommands [ 5 ] ;
2008-06-03 21:16:54 +03:00
else
2008-12-22 19:48:41 +02:00
toPrint = CGI - > generaltexth - > hcommands [ state ] ;
2008-03-16 02:09:43 +02:00
std : : vector < std : : string > name ;
2008-12-22 19:48:41 +02:00
name . push_back ( CGI - > buildh - > buildings [ LOCPLINT - > castleInt - > town - > subID ] [ BID ] - > Name ( ) ) ;
2008-03-16 02:09:43 +02:00
LOCPLINT - > statusbar - > print ( CSDL_Ext : : processStr ( toPrint , name ) ) ;
}
else
LOCPLINT - > statusbar - > clear ( ) ;
2008-03-10 01:06:35 +02:00
}
2009-08-11 19:05:33 +03:00
void CHallInterface : : CBuildingBox : : clickLeft ( tribool down , bool previousState )
2008-03-10 01:06:35 +02:00
{
2009-08-11 19:05:33 +03:00
if ( previousState & & ( ! down ) )
2008-03-21 02:03:31 +02:00
{
2009-08-07 01:36:51 +03:00
GH . pushInt ( new CHallInterface : : CBuildWindow ( LOCPLINT - > castleInt - > town - > subID , BID , state , 0 ) ) ;
2008-03-21 02:03:31 +02:00
}
2009-08-11 19:05:33 +03:00
//ClickableL::clickLeft(down);
2008-03-10 01:06:35 +02:00
}
2009-08-11 19:05:33 +03:00
void CHallInterface : : CBuildingBox : : clickRight ( tribool down , bool previousState )
2008-03-10 01:06:35 +02:00
{
2008-03-21 02:03:31 +02:00
if ( down )
{
2009-08-07 01:36:51 +03:00
GH . pushInt ( new CHallInterface : : CBuildWindow ( LOCPLINT - > castleInt - > town - > subID , BID , state , 1 ) ) ;
2008-03-21 02:03:31 +02:00
}
2009-08-11 19:05:33 +03:00
//ClickableR::clickRight(down);
2008-03-10 01:06:35 +02:00
}
2008-03-11 23:36:59 +02:00
void CHallInterface : : CBuildingBox : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
CCastleInterface * ci = LOCPLINT - > castleInt ;
blitAt ( ci - > bicons - > ourImages [ BID ] . bitmap , pos . x , pos . y , to ) ;
2008-03-16 02:09:43 +02:00
int pom , pom2 = - 1 ;
2008-03-11 23:36:59 +02:00
switch ( state )
{
2008-08-02 18:08:03 +03:00
case 4 :
2008-03-11 23:36:59 +02:00
pom = 0 ;
2008-03-16 02:09:43 +02:00
pom2 = 0 ;
2008-03-11 23:36:59 +02:00
break ;
2008-03-16 02:09:43 +02:00
case 7 :
2008-03-11 23:36:59 +02:00
pom = 1 ;
break ;
2008-03-16 02:09:43 +02:00
case 6 :
pom2 = 2 ;
2008-03-11 23:36:59 +02:00
pom = 2 ;
break ;
2009-07-11 02:40:10 +03:00
case 5 : case 8 :
2008-03-16 02:09:43 +02:00
pom2 = 1 ;
pom = 2 ;
break ;
2009-07-11 02:40:10 +03:00
case 0 : case 2 : case 1 : default :
2008-03-11 23:36:59 +02:00
pom = 3 ;
2008-03-16 02:09:43 +02:00
break ;
2008-03-11 23:36:59 +02:00
}
2009-04-14 15:47:09 +03:00
blitAt ( ci - > bars - > ourImages [ pom ] . bitmap , pos . x - 1 , pos . y + 71 , to ) ;
2008-03-16 02:09:43 +02:00
if ( pom2 > = 0 )
2009-04-14 15:47:09 +03:00
blitAt ( ci - > status - > ourImages [ pom2 ] . bitmap , pos . x + 135 , pos . y + 54 , to ) ;
CSDL_Ext : : printAtMiddle ( CGI - > buildh - > buildings [ ci - > town - > subID ] [ BID ] - > Name ( ) , pos . x - 1 + ci - > bars - > ourImages [ 0 ] . bitmap - > w / 2 , pos . y + 71 + ci - > bars - > ourImages [ 0 ] . bitmap - > h / 2 , GEOR13 , zwykly , to ) ;
2008-03-11 23:36:59 +02:00
}
2008-03-10 01:06:35 +02:00
void CHallInterface : : CBuildingBox : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateHover ( ) ;
activateLClick ( ) ;
activateRClick ( ) ;
2008-03-10 01:06:35 +02:00
}
void CHallInterface : : CBuildingBox : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateHover ( ) ;
deactivateLClick ( ) ;
deactivateRClick ( ) ;
2008-03-10 01:06:35 +02:00
}
CHallInterface : : CBuildingBox : : ~ CBuildingBox ( )
{
}
2008-03-11 23:36:59 +02:00
CHallInterface : : CBuildingBox : : CBuildingBox ( int id )
2008-03-21 02:03:31 +02:00
: BID ( id )
2008-03-11 23:36:59 +02:00
{
pos . w = 150 ;
pos . h = 70 ;
}
CHallInterface : : CBuildingBox : : CBuildingBox ( int id , int x , int y )
2008-03-21 02:03:31 +02:00
: BID ( id )
2008-03-11 23:36:59 +02:00
{
pos . x = x ;
pos . y = y ;
2008-03-16 02:09:43 +02:00
pos . w = 150 ;
pos . h = 70 ;
2008-03-11 23:36:59 +02:00
}
2008-03-10 01:06:35 +02:00
CHallInterface : : CHallInterface ( CCastleInterface * owner )
{
2009-05-20 12:02:50 +03:00
resdatabar = new CMinorResDataBar ;
2008-11-28 03:36:34 +02:00
pos = owner - > pos ;
2009-05-20 12:02:50 +03:00
resdatabar - > pos . x + = pos . x ;
resdatabar - > pos . y + = pos . y ;
2008-06-12 09:45:51 +03:00
bg = BitmapHandler : : loadBitmap ( CGI - > buildh - > hall [ owner - > town - > subID ] . first ) ;
2008-06-30 03:06:41 +03:00
graphics - > blueToPlayersAdv ( bg , LOCPLINT - > playerID ) ;
2008-05-18 20:33:39 +03:00
exit = new AdventureMapButton
2008-12-22 19:48:41 +02:00
( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CHallInterface : : close , this ) , pos . x + 748 , pos . y + 556 , " TPMAGE1.DEF " , SDLK_RETURN ) ;
2008-11-28 03:36:34 +02:00
exit - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2008-03-21 02:03:31 +02:00
//preparing boxes with buildings//
2008-03-16 02:09:43 +02:00
boxes . resize ( 5 ) ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < 5 ; i + + ) //for each row
2008-03-11 23:36:59 +02:00
{
2009-03-12 20:50:36 +02:00
std : : vector < std : : vector < std : : vector < int > > > & boxList = CGI - > buildh - > hall [ owner - > town - > subID ] . second ;
for ( size_t j = 0 ; j < boxList [ i ] . size ( ) ; j + + ) //for each box
2008-03-11 23:36:59 +02:00
{
2008-12-21 21:17:35 +02:00
size_t k = 0 ;
2009-03-12 20:50:36 +02:00
for ( ; k < boxList [ i ] [ j ] . size ( ) ; k + + ) //we are looking for the first not build structure
2008-03-11 23:36:59 +02:00
{
2009-03-12 20:50:36 +02:00
int bid = boxList [ i ] [ j ] [ k ] ;
if ( ! vstd : : contains ( owner - > town - > builtBuildings , bid ) )
2008-03-11 23:36:59 +02:00
{
int x = 34 + 194 * j ,
2008-03-16 02:09:43 +02:00
y = 37 + 104 * i ,
2009-03-12 20:50:36 +02:00
ID = bid ;
if ( boxList [ i ] . size ( ) = = 2 ) //only two boxes in this row
2008-03-11 23:36:59 +02:00
x + = 194 ;
2009-03-12 20:50:36 +02:00
else if ( boxList [ i ] . size ( ) = = 3 ) //only three boxes in this row
2008-03-11 23:36:59 +02:00
x + = 97 ;
2009-03-12 20:50:36 +02:00
boxes [ i ] . push_back ( new CBuildingBox ( bid , pos . x + x , pos . y + y ) ) ;
//if this is horde dwelling for upgraded creatures and we already have one for basic creatures
if ( ( bid = = 25 & & vstd : : contains ( owner - > town - > builtBuildings , 24 ) )
| | ( bid = = 19 & & vstd : : contains ( owner - > town - > builtBuildings , 18 ) )
)
{
boxes [ i ] . back ( ) - > state = 4 ; //already built
}
else
{
boxes [ i ] . back ( ) - > state = LOCPLINT - > cb - > canBuildStructure ( owner - > town , ID ) ;
}
2008-03-16 02:09:43 +02:00
2008-03-11 23:36:59 +02:00
break ;
}
}
2009-03-12 20:50:36 +02:00
if ( k = = boxList [ i ] [ j ] . size ( ) ) //all buildings built - let's take the last one
2008-03-11 23:36:59 +02:00
{
int x = 34 + 194 * j ,
y = 37 + 104 * i ;
2009-03-12 20:50:36 +02:00
if ( boxList [ i ] . size ( ) = = 2 )
2008-03-11 23:36:59 +02:00
x + = 194 ;
2009-03-12 20:50:36 +02:00
else if ( boxList [ i ] . size ( ) = = 3 )
2008-03-11 23:36:59 +02:00
x + = 97 ;
2009-03-12 20:50:36 +02:00
boxes [ i ] . push_back ( new CBuildingBox ( boxList [ i ] [ j ] [ k - 1 ] , pos . x + x , pos . y + y ) ) ;
2008-03-16 02:09:43 +02:00
boxes [ i ] [ boxes [ i ] . size ( ) - 1 ] - > state = 4 ; //already exists
2008-03-11 23:36:59 +02:00
}
}
}
2008-03-10 01:06:35 +02:00
}
CHallInterface : : ~ CHallInterface ( )
{
2008-03-16 02:09:43 +02:00
SDL_FreeSurface ( bg ) ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < boxes . size ( ) ; i + + )
for ( size_t j = 0 ; j < boxes [ i ] . size ( ) ; j + + )
delete boxes [ i ] [ j ] ; //TODO whats wrong with smartpointers?
2008-03-16 02:09:43 +02:00
delete exit ;
2009-05-20 12:02:50 +03:00
delete resdatabar ;
2008-03-10 01:06:35 +02:00
}
void CHallInterface : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2008-03-10 01:06:35 +02:00
}
2009-01-11 00:08:18 +02:00
void CHallInterface : : show ( SDL_Surface * to )
2008-03-10 01:06:35 +02:00
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos , to ) ;
2009-05-22 02:50:45 +03:00
LOCPLINT - > castleInt - > statusbar - > show ( to ) ;
2009-05-20 12:02:50 +03:00
resdatabar - > show ( to ) ;
2009-04-14 15:47:09 +03:00
exit - > show ( to ) ;
2008-03-11 23:36:59 +02:00
for ( int i = 0 ; i < 5 ; i + + )
{
2008-12-21 21:17:35 +02:00
for ( size_t j = 0 ; j < boxes [ i ] . size ( ) ; + + j )
2009-04-14 15:47:09 +03:00
boxes [ i ] [ j ] - > show ( to ) ;
2008-03-11 23:36:59 +02:00
}
2008-03-10 01:06:35 +02:00
}
void CHallInterface : : activate ( )
{
2008-03-11 23:36:59 +02:00
for ( int i = 0 ; i < 5 ; i + + )
2008-12-23 15:59:03 +02:00
{
for ( size_t j = 0 ; j < boxes [ i ] . size ( ) ; + + j )
{
2008-03-11 23:36:59 +02:00
boxes [ i ] [ j ] - > activate ( ) ;
2008-12-23 15:59:03 +02:00
}
}
2008-03-11 23:36:59 +02:00
exit - > activate ( ) ;
2008-03-10 01:06:35 +02:00
}
void CHallInterface : : deactivate ( )
{
2008-03-11 23:36:59 +02:00
for ( int i = 0 ; i < 5 ; i + + )
{
2008-12-21 21:17:35 +02:00
for ( size_t j = 0 ; j < boxes [ i ] . size ( ) ; + + j )
2008-03-11 23:36:59 +02:00
{
boxes [ i ] [ j ] - > deactivate ( ) ;
}
}
exit - > deactivate ( ) ;
2008-03-16 02:09:43 +02:00
}
void CHallInterface : : CBuildWindow : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateRClick ( ) ;
2008-03-23 03:01:17 +02:00
if ( mode )
return ;
2008-04-04 20:30:53 +03:00
if ( state = = 7 )
buy - > activate ( ) ;
2008-03-21 02:03:31 +02:00
cancel - > activate ( ) ;
2008-03-16 02:09:43 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-16 02:09:43 +02:00
void CHallInterface : : CBuildWindow : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateRClick ( ) ;
2008-03-23 03:01:17 +02:00
if ( mode )
return ;
2008-04-04 20:30:53 +03:00
if ( state = = 7 )
buy - > deactivate ( ) ;
2008-03-21 02:03:31 +02:00
cancel - > deactivate ( ) ;
}
2009-04-14 15:47:09 +03:00
2008-03-21 02:03:31 +02:00
void CHallInterface : : CBuildWindow : : Buy ( )
{
2009-04-14 15:47:09 +03:00
int building = bid ;
2009-08-07 01:36:51 +03:00
GH . popInts ( 2 ) ; //we - build window and hall screen
2009-04-14 15:47:09 +03:00
LOCPLINT - > cb - > buildBuilding ( LOCPLINT - > castleInt - > town , building ) ;
2008-03-21 02:03:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-21 02:03:31 +02:00
void CHallInterface : : CBuildWindow : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2008-03-21 02:03:31 +02:00
}
2009-04-14 15:47:09 +03:00
2009-08-11 19:05:33 +03:00
void CHallInterface : : CBuildWindow : : clickRight ( tribool down , bool previousState )
2008-03-21 02:03:31 +02:00
{
if ( ( ! down | | indeterminate ( down ) ) & & mode )
close ( ) ;
2008-03-16 02:09:43 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-16 02:09:43 +02:00
void CHallInterface : : CBuildWindow : : show ( SDL_Surface * to )
{
2008-03-21 02:03:31 +02:00
SDL_Rect pom = genRect ( bitmap - > h - 1 , bitmap - > w - 1 , pos . x , pos . y ) ;
SDL_Rect poms = pom ; poms . x = 0 ; poms . y = 0 ;
2009-04-14 15:47:09 +03:00
SDL_BlitSurface ( bitmap , & poms , to , & pom ) ;
2008-03-23 03:01:17 +02:00
if ( ! mode )
{
2009-04-14 15:47:09 +03:00
buy - > show ( to ) ;
cancel - > show ( to ) ;
2008-03-23 03:01:17 +02:00
}
2008-03-21 02:03:31 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-23 03:01:17 +02:00
std : : string CHallInterface : : CBuildWindow : : getTextForState ( int state )
2008-03-21 02:03:31 +02:00
{
2008-03-23 03:01:17 +02:00
std : : string ret ;
2008-03-21 02:03:31 +02:00
if ( state < 7 )
2008-12-22 19:48:41 +02:00
ret = CGI - > generaltexth - > hcommands [ state ] ;
2008-03-21 02:03:31 +02:00
switch ( state )
{
2008-06-03 21:16:54 +03:00
case 4 : case 5 : case 6 :
2008-12-22 19:48:41 +02:00
ret . replace ( ret . find_first_of ( " %s " ) , 2 , CGI - > buildh - > buildings [ tid ] [ bid ] - > Name ( ) ) ;
2008-03-23 03:01:17 +02:00
break ;
2008-03-21 02:03:31 +02:00
case 7 :
return CGI - > generaltexth - > allTexts [ 219 ] ; //all prereq. are met
2008-03-23 03:01:17 +02:00
case 8 :
{
ret = CGI - > generaltexth - > allTexts [ 52 ] ;
std : : set < int > used ;
used . insert ( bid ) ;
std : : set < int > reqs ;
2008-08-02 18:08:03 +03:00
2008-11-28 03:36:34 +02:00
for ( std : : set < int > : : iterator i = CGI - > townh - > requirements [ tid ] [ bid ] . begin ( ) ;
i ! = CGI - > townh - > requirements [ tid ] [ bid ] . end ( ) ;
i + +
)
{
2008-08-02 18:08:03 +03:00
if ( LOCPLINT - > castleInt - > town - > builtBuildings . find ( * i ) = = LOCPLINT - > castleInt - > town - > builtBuildings . end ( ) )
2008-03-23 03:01:17 +02:00
reqs . insert ( * i ) ;
2008-11-28 03:36:34 +02:00
}
2008-03-23 03:01:17 +02:00
while ( true )
{
2008-12-21 21:17:35 +02:00
size_t czystych = 0 ;
2008-03-23 03:01:17 +02:00
for ( std : : set < int > : : iterator i = reqs . begin ( ) ; i ! = reqs . end ( ) ; i + + )
{
if ( used . find ( * i ) = = used . end ( ) ) //we haven't added requirements for this building
{
used . insert ( * i ) ;
for (
std : : set < int > : : iterator j = CGI - > townh - > requirements [ tid ] [ * i ] . begin ( ) ;
j ! = CGI - > townh - > requirements [ tid ] [ * i ] . end ( ) ;
j + +
)
{
if ( LOCPLINT - > castleInt - > town - > builtBuildings . find ( * j ) = = //this building is not built
2008-08-02 18:08:03 +03:00
LOCPLINT - > castleInt - > town - > builtBuildings . end ( ) )
2008-03-23 03:01:17 +02:00
reqs . insert ( * j ) ;
}
}
else
{
czystych + + ;
}
}
if ( czystych = = reqs . size ( ) )
break ;
}
bool first = true ;
for ( std : : set < int > : : iterator i = reqs . begin ( ) ; i ! = reqs . end ( ) ; i + + )
{
2008-12-22 19:48:41 +02:00
ret + = ( ( ( first ) ? ( " " ) : ( " , " ) ) + CGI - > buildh - > buildings [ tid ] [ * i ] - > Name ( ) ) ;
2008-03-23 03:01:17 +02:00
first = false ;
}
}
2008-03-21 02:03:31 +02:00
}
2008-03-23 03:01:17 +02:00
return ret ;
2008-03-16 02:09:43 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-16 02:09:43 +02:00
CHallInterface : : CBuildWindow : : CBuildWindow ( int Tid , int Bid , int State , bool Mode )
2008-12-21 21:17:35 +02:00
: tid ( Tid ) , bid ( Bid ) , state ( State ) , mode ( Mode )
2008-03-16 02:09:43 +02:00
{
2008-06-12 09:45:51 +03:00
SDL_Surface * hhlp = BitmapHandler : : loadBitmap ( " TPUBUILD.bmp " ) ;
2008-08-02 18:08:03 +03:00
graphics - > blueToPlayersAdv ( hhlp , LOCPLINT - > playerID ) ;
2008-04-25 12:25:59 +03:00
bitmap = SDL_ConvertSurface ( hhlp , screen - > format , 0 ) ; //na 8bitowej mapie by sie psulo
2008-03-21 02:03:31 +02:00
SDL_SetColorKey ( hhlp , SDL_SRCCOLORKEY , SDL_MapRGB ( hhlp - > format , 0 , 255 , 255 ) ) ;
SDL_FreeSurface ( hhlp ) ;
2008-04-25 12:25:59 +03:00
pos . x = screen - > w / 2 - bitmap - > w / 2 ;
pos . y = screen - > h / 2 - bitmap - > h / 2 ;
2008-03-21 02:03:31 +02:00
blitAt ( LOCPLINT - > castleInt - > bicons - > ourImages [ bid ] . bitmap , 125 , 50 , bitmap ) ;
2008-12-22 19:48:41 +02:00
std : : vector < std : : string > pom ; pom . push_back ( CGI - > buildh - > buildings [ tid ] [ bid ] - > Name ( ) ) ;
CSDL_Ext : : printAtMiddleWB ( CGI - > buildh - > buildings [ tid ] [ bid ] - > Description ( ) , 197 , 168 , GEOR16 , 40 , zwykly , bitmap ) ;
2008-03-21 02:03:31 +02:00
CSDL_Ext : : printAtMiddleWB ( getTextForState ( state ) , 197 , 248 , GEOR13 , 50 , zwykly , bitmap ) ;
2008-12-22 19:48:41 +02:00
CSDL_Ext : : printAtMiddle ( CSDL_Ext : : processStr ( CGI - > generaltexth - > hcommands [ 7 ] , pom ) , 197 , 30 , GEOR16 , tytulowy , bitmap ) ;
2008-12-23 15:59:03 +02:00
2008-12-21 21:17:35 +02:00
int resamount = 0 ;
2008-12-23 15:59:03 +02:00
for ( int i = 0 ; i < 7 ; i + + )
{
if ( CGI - > buildh - > buildings [ tid ] [ bid ] - > resources [ i ] )
{
resamount + + ;
}
}
2008-03-21 02:03:31 +02:00
int ah = ( resamount > 4 ) ? 304 : 341 ;
int cn = - 1 , it = 0 ;
int row1w = std : : min ( resamount , 4 ) * 32 + ( std : : min ( resamount , 4 ) - 1 ) * 45 ,
row2w = ( resamount - 4 ) * 32 + ( resamount - 5 ) * 45 ;
char buf [ 15 ] ;
while ( + + cn < 7 )
{
if ( ! CGI - > buildh - > buildings [ tid ] [ bid ] - > resources [ cn ] )
continue ;
2008-08-02 18:08:03 +03:00
SDL_itoa ( CGI - > buildh - > buildings [ tid ] [ bid ] - > resources [ cn ] , buf , 10 ) ;
2008-03-21 02:03:31 +02:00
if ( it < 4 )
{
CSDL_Ext : : printAtMiddle ( buf , ( bitmap - > w / 2 - row1w / 2 ) + 77 * it + 16 , ah + 42 , GEOR16 , zwykly , bitmap ) ;
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > resources32 - > ourImages [ cn ] . bitmap , ( bitmap - > w / 2 - row1w / 2 ) + 77 * it + + , ah , bitmap ) ;
2008-03-21 02:03:31 +02:00
}
else
{
CSDL_Ext : : printAtMiddle ( buf , ( bitmap - > w / 2 - row2w / 2 ) + 77 * it + 16 - 308 , ah + 42 , GEOR16 , zwykly , bitmap ) ;
2008-06-13 11:16:51 +03:00
blitAt ( graphics - > resources32 - > ourImages [ cn ] . bitmap , ( bitmap - > w / 2 - row2w / 2 ) + 77 * it + + - 308 , ah , bitmap ) ;
2008-03-21 02:03:31 +02:00
}
if ( it = = 4 )
ah + = 75 ;
}
2008-03-23 03:01:17 +02:00
if ( ! mode )
{
2008-05-18 20:33:39 +03:00
buy = new AdventureMapButton
2008-10-19 16:17:32 +03:00
( " " , " " , boost : : bind ( & CBuildWindow : : Buy , this ) , pos . x + 45 , pos . y + 446 , " IBUY30.DEF " , SDLK_RETURN ) ;
2008-05-18 20:33:39 +03:00
cancel = new AdventureMapButton
2008-10-19 16:17:32 +03:00
( " " , " " , boost : : bind ( & CBuildWindow : : close , this ) , pos . x + 290 , pos . y + 445 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
2008-04-04 20:30:53 +03:00
if ( state ! = 7 )
buy - > state = 2 ;
2008-03-23 03:01:17 +02:00
}
2008-03-16 02:09:43 +02:00
}
2009-04-14 15:47:09 +03:00
2008-03-16 02:09:43 +02:00
CHallInterface : : CBuildWindow : : ~ CBuildWindow ( )
{
2008-03-21 02:03:31 +02:00
SDL_FreeSurface ( bitmap ) ;
2008-03-23 03:01:17 +02:00
if ( ! mode )
{
delete buy ;
delete cancel ;
}
2008-08-02 18:08:03 +03:00
}
2008-08-17 12:11:16 +03:00
CFortScreen : : ~ CFortScreen ( )
{
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < crePics . size ( ) ; i + + )
2008-08-17 12:11:16 +03:00
delete crePics [ i ] ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < recAreas . size ( ) ; i + + )
2008-08-17 12:11:16 +03:00
delete recAreas [ i ] ;
SDL_FreeSurface ( bg ) ;
delete exit ;
2009-05-20 12:02:50 +03:00
delete resdatabar ;
2008-08-17 12:11:16 +03:00
}
void CFortScreen : : show ( SDL_Surface * to )
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos , to ) ;
2008-08-17 12:11:16 +03:00
static unsigned char anim = 1 ;
for ( int i = 0 ; i < CREATURES_PER_TOWN ; i + + )
{
2009-04-14 15:47:09 +03:00
crePics [ i ] - > blitPic ( to , pos . x + positions [ i ] . x + 159 , pos . y + positions [ i ] . y + 4 , ! ( anim % 4 ) ) ;
2008-08-17 12:11:16 +03:00
}
anim + + ;
2009-04-14 15:47:09 +03:00
exit - > show ( to ) ;
2009-05-20 12:02:50 +03:00
resdatabar - > show ( to ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > statusbar - > show ( to ) ;
2008-08-17 12:11:16 +03:00
}
void CFortScreen : : activate ( )
{
2009-02-11 19:03:30 +02:00
LOCPLINT - > statusbar = LOCPLINT - > castleInt - > statusbar ;
2008-08-17 12:11:16 +03:00
exit - > activate ( ) ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < recAreas . size ( ) ; + + i )
2008-08-17 12:11:16 +03:00
{
recAreas [ i ] - > activate ( ) ;
}
}
void CFortScreen : : deactivate ( )
{
exit - > deactivate ( ) ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < recAreas . size ( ) ; i + + )
2008-08-17 12:11:16 +03:00
{
recAreas [ i ] - > deactivate ( ) ;
}
}
void CFortScreen : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2008-08-17 12:11:16 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-17 12:11:16 +03:00
CFortScreen : : CFortScreen ( CCastleInterface * owner )
{
2009-05-20 12:02:50 +03:00
resdatabar = new CMinorResDataBar ;
2008-11-28 03:36:34 +02:00
pos = owner - > pos ;
2008-08-17 12:11:16 +03:00
bg = NULL ;
2008-12-22 19:48:41 +02:00
exit = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CFortScreen : : close , this ) , pos . x + 748 , pos . y + 556 , " TPMAGE1.DEF " , SDLK_RETURN ) ;
2008-08-17 12:11:16 +03:00
positions + = genRect ( 126 , 386 , 10 , 22 ) , genRect ( 126 , 386 , 404 , 22 ) ,
genRect ( 126 , 386 , 10 , 155 ) , genRect ( 126 , 386 , 404 , 155 ) ,
genRect ( 126 , 386 , 10 , 288 ) , genRect ( 126 , 386 , 404 , 288 ) ,
2008-11-28 03:36:34 +02:00
genRect ( 126 , 386 , 206 , 421 ) ;
2008-08-17 12:11:16 +03:00
draw ( owner , true ) ;
2009-05-20 12:02:50 +03:00
resdatabar - > pos + = pos ;
2008-08-17 12:11:16 +03:00
}
void CFortScreen : : draw ( CCastleInterface * owner , bool first )
{
if ( bg )
SDL_FreeSurface ( bg ) ;
char buf [ 20 ] ;
memset ( buf , 0 , 20 ) ;
SDL_Surface * bg2 = BitmapHandler : : loadBitmap ( " TPCASTL7.bmp " ) ,
* icons = BitmapHandler : : loadBitmap ( " ZPCAINFO.bmp " ) ;
SDL_SetColorKey ( icons , SDL_SRCCOLORKEY , SDL_MapRGB ( icons - > format , 0 , 255 , 255 ) ) ;
graphics - > blueToPlayersAdv ( bg2 , LOCPLINT - > playerID ) ;
bg = SDL_ConvertSurface ( bg2 , screen - > format , 0 ) ;
SDL_FreeSurface ( bg2 ) ;
2008-12-22 19:48:41 +02:00
printAtMiddle ( CGI - > buildh - > buildings [ owner - > town - > subID ] [ owner - > town - > fortLevel ( ) + 6 ] - > Name ( ) , 400 , 13 , GEORXX , zwykly , bg ) ;
2008-08-17 12:11:16 +03:00
for ( int i = 0 ; i < CREATURES_PER_TOWN ; i + + )
{
bool upgraded = owner - > town - > creatureDwelling ( i , true ) ;
bool present = owner - > town - > creatureDwelling ( i , false ) ;
CCreature * c = & CGI - > creh - > creatures [ upgraded ? owner - > town - > town - > upgradedCreatures [ i ] : owner - > town - > town - > basicCreatures [ i ] ] ;
printAtMiddle ( c - > namePl , positions [ i ] . x + 79 , positions [ i ] . y + 10 , GEOR13 , zwykly , bg ) ; //cr. name
blitAt ( owner - > bicons - > ourImages [ 30 + i + upgraded * 7 ] . bitmap , positions [ i ] . x + 4 , positions [ i ] . y + 21 , bg ) ; //dwelling pic
2008-12-22 19:48:41 +02:00
printAtMiddle ( CGI - > buildh - > buildings [ owner - > town - > subID ] [ 30 + i + upgraded * 7 ] - > Name ( ) , positions [ i ] . x + 79 , positions [ i ] . y + 100 , GEOR13 , zwykly , bg ) ; //dwelling name
2008-08-17 12:11:16 +03:00
if ( present ) //if creature is present print avail able quantity
{
2009-07-06 22:41:27 +03:00
SDL_itoa ( owner - > town - > creatures [ i ] . first , buf , 10 ) ;
2008-08-17 12:11:16 +03:00
printAtMiddle ( CGI - > generaltexth - > allTexts [ 217 ] + buf , positions [ i ] . x + 79 , positions [ i ] . y + 118 , GEOR13 , zwykly , bg ) ;
}
blitAt ( icons , positions [ i ] . x + 261 , positions [ i ] . y + 3 , bg ) ;
2009-07-16 02:58:47 +03:00
//attack
2008-08-17 12:11:16 +03:00
printAt ( CGI - > generaltexth - > allTexts [ 190 ] , positions [ i ] . x + 288 , positions [ i ] . y + 5 , GEOR13 , zwykly , bg ) ;
SDL_itoa ( c - > attack , buf , 10 ) ;
printToWR ( buf , positions [ i ] . x + 381 , positions [ i ] . y + 18 , GEOR13 , zwykly , bg ) ;
//defense
printAt ( CGI - > generaltexth - > allTexts [ 191 ] , positions [ i ] . x + 288 , positions [ i ] . y + 25 , GEOR13 , zwykly , bg ) ;
SDL_itoa ( c - > defence , buf , 10 ) ;
printToWR ( buf , positions [ i ] . x + 381 , positions [ i ] . y + 38 , GEOR13 , zwykly , bg ) ;
//damage
printAt ( CGI - > generaltexth - > allTexts [ 199 ] , positions [ i ] . x + 288 , positions [ i ] . y + 46 , GEOR13 , zwykly , bg ) ;
SDL_itoa ( c - > damageMin , buf , 10 ) ;
2008-11-06 19:17:48 +02:00
int hlp ;
if ( c - > damageMin > 0 )
hlp = log10f ( c - > damageMin ) + 2 ;
else
hlp = 2 ;
2008-08-17 12:11:16 +03:00
buf [ hlp - 1 ] = ' ' ; buf [ hlp ] = ' - ' ; buf [ hlp + 1 ] = ' ' ;
SDL_itoa ( c - > damageMax , buf + hlp + 2 , 10 ) ;
printToWR ( buf , positions [ i ] . x + 381 , positions [ i ] . y + 59 , GEOR13 , zwykly , bg ) ;
//health
2008-11-28 03:36:34 +02:00
printAt ( CGI - > generaltexth - > zelp [ 439 ] . first , positions [ i ] . x + 288 , positions [ i ] . y + 66 , GEOR13 , zwykly , bg ) ;
2008-08-17 12:11:16 +03:00
SDL_itoa ( c - > hitPoints , buf , 10 ) ;
printToWR ( buf , positions [ i ] . x + 381 , positions [ i ] . y + 79 , GEOR13 , zwykly , bg ) ;
//speed
2008-11-28 03:36:34 +02:00
printAt ( CGI - > generaltexth - > zelp [ 441 ] . first , positions [ i ] . x + 288 , positions [ i ] . y + 87 , GEOR13 , zwykly , bg ) ;
2008-08-17 12:11:16 +03:00
SDL_itoa ( c - > speed , buf , 10 ) ;
printToWR ( buf , positions [ i ] . x + 381 , positions [ i ] . y + 100 , GEOR13 , zwykly , bg ) ;
if ( present ) //growth
{
printAt ( CGI - > generaltexth - > allTexts [ 194 ] , positions [ i ] . x + 288 , positions [ i ] . y + 107 , GEOR13 , zwykly , bg ) ;
SDL_itoa ( owner - > town - > creatureGrowth ( i ) , buf , 10 ) ;
printToWR ( buf , positions [ i ] . x + 381 , positions [ i ] . y + 120 , GEOR13 , zwykly , bg ) ;
}
if ( first )
{
crePics . push_back ( new CCreaturePic ( c , false ) ) ;
if ( present )
{
recAreas . push_back ( new RecArea ( 30 + i + upgraded * 7 ) ) ;
2009-02-11 19:03:30 +02:00
recAreas . back ( ) - > pos = positions [ i ] + pos ;
2008-08-17 12:11:16 +03:00
}
}
}
SDL_FreeSurface ( icons ) ;
}
2009-08-11 19:05:33 +03:00
void CFortScreen : : RecArea : : clickLeft ( tribool down , bool previousState )
2008-08-17 12:11:16 +03:00
{
2009-08-11 19:05:33 +03:00
if ( ! down & & previousState )
2008-08-17 12:11:16 +03:00
{
2009-04-14 15:47:09 +03:00
LOCPLINT - > castleInt - > showRecruitmentWindow ( bid ) ;
2008-08-17 12:11:16 +03:00
}
2009-08-11 19:05:33 +03:00
//ClickableL::clickLeft(down);
2008-08-17 12:11:16 +03:00
}
void CFortScreen : : RecArea : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
2008-08-17 12:11:16 +03:00
}
void CFortScreen : : RecArea : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
2008-08-17 17:09:30 +03:00
}
2008-08-20 09:57:53 +03:00
2009-08-11 19:05:33 +03:00
void CFortScreen : : RecArea : : clickRight ( tribool down , bool previousState )
2009-01-22 19:30:15 +02:00
{
2009-08-11 19:05:33 +03:00
clickLeft ( down , false ) ; //r-click does same as l-click - opens recr. window
2009-01-22 19:30:15 +02:00
}
2008-08-20 09:57:53 +03:00
CMageGuildScreen : : CMageGuildScreen ( CCastleInterface * owner )
{
2009-05-20 12:02:50 +03:00
resdatabar = new CMinorResDataBar ;
2008-11-28 03:36:34 +02:00
pos = owner - > pos ;
2009-05-20 12:02:50 +03:00
resdatabar - > pos . x + = pos . x ;
resdatabar - > pos . y + = pos . y ;
2008-08-20 09:57:53 +03:00
bg = BitmapHandler : : loadBitmap ( " TPMAGE.bmp " ) ;
2008-12-22 19:48:41 +02:00
exit = new AdventureMapButton ( CGI - > generaltexth - > tcommands [ 8 ] , " " , boost : : bind ( & CMageGuildScreen : : close , this ) , pos . x + 748 , pos . y + 556 , " TPMAGE1.DEF " , SDLK_RETURN ) ;
2008-11-28 03:36:34 +02:00
exit - > assignedKeys . insert ( SDLK_ESCAPE ) ;
2008-08-20 09:57:53 +03:00
scrolls2 = CDefHandler : : giveDefEss ( " TPMAGES.DEF " ) ;
SDL_Surface * view = BitmapHandler : : loadBitmap ( graphics - > guildBgs [ owner - > town - > subID ] ) ;
SDL_SetColorKey ( view , SDL_SRCCOLORKEY , SDL_MapRGB ( view - > format , 0 , 255 , 255 ) ) ;
positions . resize ( 5 ) ;
positions [ 0 ] + = genRect ( 61 , 83 , 222 , 445 ) , genRect ( 61 , 83 , 312 , 445 ) , genRect ( 61 , 83 , 402 , 445 ) , genRect ( 61 , 83 , 520 , 445 ) , genRect ( 61 , 83 , 610 , 445 ) , genRect ( 61 , 83 , 700 , 445 ) ;
positions [ 1 ] + = genRect ( 61 , 83 , 48 , 53 ) , genRect ( 61 , 83 , 48 , 147 ) , genRect ( 61 , 83 , 48 , 241 ) , genRect ( 61 , 83 , 48 , 335 ) , genRect ( 61 , 83 , 48 , 429 ) ;
positions [ 2 ] + = genRect ( 61 , 83 , 570 , 82 ) , genRect ( 61 , 83 , 672 , 82 ) , genRect ( 61 , 83 , 570 , 157 ) , genRect ( 61 , 83 , 672 , 157 ) ;
positions [ 3 ] + = genRect ( 61 , 83 , 183 , 42 ) , genRect ( 61 , 83 , 183 , 148 ) , genRect ( 61 , 83 , 183 , 253 ) ;
positions [ 4 ] + = genRect ( 61 , 83 , 491 , 325 ) , genRect ( 61 , 83 , 591 , 325 ) ;
blitAt ( view , 332 , 76 , bg ) ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < owner - > town - > town - > mageLevel ; i + + )
2008-08-20 09:57:53 +03:00
{
2008-12-21 21:17:35 +02:00
size_t sp = owner - > town - > spellsAtLevel ( i + 1 , false ) ; //spell at level with -1 hmmm?
for ( size_t j = 0 ; j < sp ; j + + )
2008-08-20 09:57:53 +03:00
{
2008-09-23 13:58:54 +03:00
if ( i < owner - > town - > mageGuildLevel ( ) & & owner - > town - > spells [ i ] . size ( ) > j )
2008-08-20 09:57:53 +03:00
{
spells . push_back ( Scroll ( & CGI - > spellh - > spells [ owner - > town - > spells [ i ] [ j ] ] ) ) ;
spells [ spells . size ( ) - 1 ] . pos = positions [ i ] [ j ] ;
2009-04-14 15:47:09 +03:00
blitAt ( graphics - > spellscr - > ourImages [ owner - > town - > spells [ i ] [ j ] ] . bitmap , positions [ i ] [ j ] , bg ) ;
2008-08-20 09:57:53 +03:00
}
else
{
blitAt ( scrolls2 - > ourImages [ 1 ] . bitmap , positions [ i ] [ j ] , bg ) ;
}
}
}
SDL_FreeSurface ( view ) ;
2008-12-21 21:17:35 +02:00
for ( size_t i = 0 ; i < spells . size ( ) ; i + + )
2008-11-28 03:36:34 +02:00
{
spells [ i ] . pos . x + = pos . x ;
spells [ i ] . pos . y + = pos . y ;
}
2008-08-20 09:57:53 +03:00
delete scrolls2 ;
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
CMageGuildScreen : : ~ CMageGuildScreen ( )
{
delete exit ;
SDL_FreeSurface ( bg ) ;
2009-05-20 12:02:50 +03:00
delete resdatabar ;
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
void CMageGuildScreen : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2009-01-11 00:08:18 +02:00
void CMageGuildScreen : : show ( SDL_Surface * to )
2008-08-20 09:57:53 +03:00
{
2009-04-14 15:47:09 +03:00
blitAt ( bg , pos , to ) ;
2009-05-20 12:02:50 +03:00
resdatabar - > show ( to ) ;
2009-04-14 15:47:09 +03:00
LOCPLINT - > statusbar - > show ( to ) ;
exit - > show ( to ) ;
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
void CMageGuildScreen : : activate ( )
{
exit - > activate ( ) ;
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < spells . size ( ) ; i + + )
{
2008-08-20 09:57:53 +03:00
spells [ i ] . activate ( ) ;
2008-12-23 15:59:03 +02:00
}
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
void CMageGuildScreen : : deactivate ( )
{
exit - > deactivate ( ) ;
2008-12-23 15:59:03 +02:00
for ( size_t i = 0 ; i < spells . size ( ) ; i + + )
{
2008-08-20 09:57:53 +03:00
spells [ i ] . deactivate ( ) ;
2008-12-23 15:59:03 +02:00
}
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2009-08-11 19:05:33 +03:00
void CMageGuildScreen : : Scroll : : clickLeft ( tribool down , bool previousState )
2008-08-20 09:57:53 +03:00
{
2008-08-27 13:19:18 +03:00
if ( down )
{
std : : vector < SComponent * > comps ( 1 ,
2009-04-14 15:47:09 +03:00
new CCustomImgComponent ( SComponent : : spell , spell - > id , 0 , graphics - > spellscr - > ourImages [ spell - > id ] . bitmap , false )
2008-08-27 13:19:18 +03:00
) ;
2009-04-22 21:48:56 +03:00
LOCPLINT - > showInfoDialog ( spell - > descriptions [ 0 ] , comps , soundBase : : sound_todo ) ;
2008-08-27 13:19:18 +03:00
}
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2009-08-11 19:05:33 +03:00
void CMageGuildScreen : : Scroll : : clickRight ( tribool down , bool previousState )
2008-08-20 09:57:53 +03:00
{
if ( down )
{
CInfoPopup * vinya = new CInfoPopup ( ) ;
vinya - > free = true ;
vinya - > bitmap = CMessage : : drawBoxTextBitmapSub
( LOCPLINT - > playerID ,
2009-04-14 15:47:09 +03:00
spell - > descriptions [ 0 ] , graphics - > spellscr - > ourImages [ spell - > id ] . bitmap ,
2008-08-20 22:02:48 +03:00
spell - > name , 30 , 30 ) ;
2008-08-20 09:57:53 +03:00
vinya - > pos . x = screen - > w / 2 - vinya - > bitmap - > w / 2 ;
vinya - > pos . y = screen - > h / 2 - vinya - > bitmap - > h / 2 ;
2009-08-07 01:36:51 +03:00
GH . pushInt ( vinya ) ;
2008-08-20 09:57:53 +03:00
}
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
void CMageGuildScreen : : Scroll : : hover ( bool on )
{
2009-08-11 19:05:33 +03:00
//Hoverable::hover(on);
2008-08-27 13:19:18 +03:00
if ( on )
LOCPLINT - > statusbar - > print ( spell - > name ) ;
else
LOCPLINT - > statusbar - > clear ( ) ;
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
void CMageGuildScreen : : Scroll : : activate ( )
{
2009-08-11 19:05:33 +03:00
activateLClick ( ) ;
activateRClick ( ) ;
activateHover ( ) ;
2008-08-20 09:57:53 +03:00
}
2009-04-14 15:47:09 +03:00
2008-08-20 09:57:53 +03:00
void CMageGuildScreen : : Scroll : : deactivate ( )
{
2009-08-11 19:05:33 +03:00
deactivateLClick ( ) ;
deactivateRClick ( ) ;
deactivateHover ( ) ;
2008-08-27 13:19:18 +03:00
}
CBlacksmithDialog : : CBlacksmithDialog ( bool possible , int creMachineID , int aid , int hid )
{
SDL_Surface * bg2 = BitmapHandler : : loadBitmap ( " TPSMITH.bmp " ) ;
SDL_SetColorKey ( bg2 , SDL_SRCCOLORKEY , SDL_MapRGB ( bg2 - > format , 0 , 255 , 255 ) ) ;
graphics - > blueToPlayersAdv ( bg2 , LOCPLINT - > playerID ) ;
bmp = SDL_ConvertSurface ( bg2 , screen - > format , 0 ) ;
SDL_FreeSurface ( bg2 ) ;
bg2 = BitmapHandler : : loadBitmap ( " TPSMITBK.bmp " ) ;
blitAt ( bg2 , 64 , 50 , bmp ) ;
SDL_FreeSurface ( bg2 ) ;
2009-05-07 20:20:41 +03:00
2008-08-27 13:19:18 +03:00
CCreatureAnimation cra ( CGI - > creh - > creatures [ creMachineID ] . animDefName ) ;
2009-02-21 17:43:28 +02:00
cra . nextFrameMiddle ( bmp , 170 , 120 , true , 0 , false ) ;
2008-08-27 13:19:18 +03:00
char pom [ 75 ] ;
sprintf ( pom , CGI - > generaltexth - > allTexts [ 274 ] . c_str ( ) , CGI - > creh - > creatures [ creMachineID ] . nameSing . c_str ( ) ) ; //build a new ...
printAtMiddle ( pom , 165 , 28 , GEORXX , tytulowy , bmp ) ;
printAtMiddle ( CGI - > generaltexth - > jktexts [ 43 ] , 165 , 218 , GEOR16 , zwykly , bmp ) ; //resource cost
SDL_itoa ( CGI - > arth - > artifacts [ aid ] . price , pom , 10 ) ;
printAtMiddle ( pom , 165 , 290 , GEOR13 , zwykly , bmp ) ;
2009-05-07 20:20:41 +03:00
2008-08-27 13:19:18 +03:00
pos . w = bmp - > w ;
pos . h = bmp - > h ;
pos . x = screen - > w / 2 - pos . w / 2 ;
pos . y = screen - > h / 2 - pos . h / 2 ;
2009-05-07 20:20:41 +03:00
2008-10-19 16:17:32 +03:00
buy = new AdventureMapButton ( " " , " " , boost : : bind ( & CBlacksmithDialog : : close , this ) , pos . x + 42 , pos . y + 312 , " IBUY30.DEF " , SDLK_RETURN ) ;
cancel = new AdventureMapButton ( " " , " " , boost : : bind ( & CBlacksmithDialog : : close , this ) , pos . x + 224 , pos . y + 312 , " ICANCEL.DEF " , SDLK_ESCAPE ) ;
2009-05-07 20:20:41 +03:00
2008-08-27 13:19:18 +03:00
if ( possible )
buy - > callback + = boost : : bind ( & CCallback : : buyArtifact , LOCPLINT - > cb , LOCPLINT - > cb - > getHeroInfo ( hid , 2 ) , aid ) ;
else
buy - > bitmapOffset = 2 ;
2009-05-07 20:20:41 +03:00
2008-08-27 13:19:18 +03:00
blitAt ( graphics - > resources32 - > ourImages [ 6 ] . bitmap , 148 , 244 , bmp ) ;
}
2009-04-14 15:47:09 +03:00
void CBlacksmithDialog : : show ( SDL_Surface * to )
2008-08-27 13:19:18 +03:00
{
2009-04-14 15:47:09 +03:00
blitAt ( bmp , pos , to ) ;
buy - > show ( to ) ;
cancel - > show ( to ) ;
2008-08-27 13:19:18 +03:00
}
void CBlacksmithDialog : : activate ( )
{
if ( ! buy - > bitmapOffset )
buy - > activate ( ) ;
cancel - > activate ( ) ;
}
void CBlacksmithDialog : : deactivate ( )
{
if ( ! buy - > bitmapOffset )
buy - > deactivate ( ) ;
cancel - > deactivate ( ) ;
}
CBlacksmithDialog : : ~ CBlacksmithDialog ( )
{
SDL_FreeSurface ( bmp ) ;
delete cancel ;
delete buy ;
}
void CBlacksmithDialog : : close ( )
{
2009-08-07 01:36:51 +03:00
GH . popIntTotally ( this ) ;
2009-05-06 05:32:36 +03:00
}