2008-12-27 03:01:59 +02:00
# ifndef __CLIENT_H__
# define __CLIENT_H__
# include "../global.h"
# include <boost/thread.hpp>
# include "../lib/IGameCallback.h"
2009-08-04 02:53:18 +03:00
# include "../lib/CondSh.h"
2009-03-28 20:46:20 +02:00
2009-04-15 17:03:31 +03:00
/*
* Client . h , 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-12-27 03:01:59 +02:00
struct StartInfo ;
class CGameState ;
class CGameInterface ;
class CConnection ;
class CCallback ;
2009-03-07 00:11:17 +02:00
struct BattleAction ;
2009-01-30 23:28:02 +02:00
struct SharedMem ;
2008-12-27 03:01:59 +02:00
class CClient ;
2009-08-30 15:47:40 +03:00
struct CPathsInfo ;
2008-12-27 03:01:59 +02:00
void processCommand ( const std : : string & message , CClient * & client ) ;
namespace boost
{
class mutex ;
class condition_variable ;
}
template < typename T >
struct CSharedCond
{
boost : : mutex * mx ;
boost : : condition_variable * cv ;
T * res ;
CSharedCond ( T * R )
{
res = R ;
mx = new boost : : mutex ;
cv = new boost : : condition_variable ;
}
~ CSharedCond ( )
{
delete res ;
delete mx ;
delete cv ;
}
} ;
class CClient : public IGameCallback
{
2009-03-07 00:11:17 +02:00
public :
2008-12-27 03:01:59 +02:00
CCallback * cb ;
2009-03-28 20:46:20 +02:00
std : : set < CCallback * > callbacks ; //callbacks given to player interfaces
2008-12-27 03:01:59 +02:00
std : : map < ui8 , CGameInterface * > playerint ;
CConnection * serv ;
2009-01-30 23:28:02 +02:00
SharedMem * shared ;
2009-03-07 00:11:17 +02:00
BattleAction * curbaction ;
2009-08-30 15:47:40 +03:00
CPathsInfo * pathInfo ;
2008-12-27 03:01:59 +02:00
2009-08-04 02:53:18 +03:00
CondSh < bool > waitingRequest ;
2008-12-27 03:01:59 +02:00
void waitForMoveAndSend ( int color ) ;
2009-08-04 02:53:18 +03:00
//void sendRequest(const CPackForServer *request, bool waitForRealization);
2008-12-27 03:01:59 +02:00
CClient ( void ) ;
CClient ( CConnection * con , StartInfo * si ) ;
~ CClient ( void ) ;
2009-01-30 23:28:02 +02:00
void init ( ) ;
2009-01-11 00:08:18 +02:00
void newGame ( CConnection * con , StartInfo * si ) ; //con - connection to server
2009-11-01 03:15:16 +02:00
void endGame ( ) ;
2008-12-27 03:01:59 +02:00
void save ( const std : : string & fname ) ;
2009-11-01 03:15:16 +02:00
void loadGame ( const std : : string & fname ) ;
2008-12-27 03:01:59 +02:00
void run ( ) ;
2009-11-01 03:15:16 +02:00
void stop ( ) ;
bool terminate ; // tell to terminate
2008-12-27 03:01:59 +02:00
//////////////////////////////////////////////////////////////////////////
//from IGameCallback
int getCurrentPlayer ( ) ;
int getSelectedHero ( ) ;
//not working yet, will be implement somewhen later with support for local-sim-based gameplay
void changeSpells ( int hid , bool give , const std : : set < ui32 > & spells ) { } ;
2009-04-16 03:28:54 +03:00
bool removeObject ( int objid ) { return false ; } ;
2008-12-27 03:01:59 +02:00
void setBlockVis ( int objid , bool bv ) { } ;
void setOwner ( int objid , ui8 owner ) { } ;
void setHoverName ( int objid , MetaString * name ) { } ;
2009-08-17 13:02:29 +03:00
void setObjProperty ( int objid , int prop , si64 val ) { } ;
2009-08-16 18:39:18 +03:00
void changePrimSkill ( int ID , int which , si64 val , bool abs = false ) { } ;
2009-01-11 00:08:18 +02:00
void changeSecSkill ( int ID , int which , int val , bool abs = false ) { } ;
2008-12-27 03:01:59 +02:00
void showInfoDialog ( InfoWindow * iw ) { } ;
2009-04-11 04:32:50 +03:00
void showBlockingDialog ( BlockingDialog * iw , const CFunctionList < void ( ui32 ) > & callback ) { } ;
ui32 showBlockingDialog ( BlockingDialog * iw ) { return 0 ; } ; //synchronous version of above
2009-09-09 20:49:03 +03:00
void showGarrisonDialog ( int upobj , int hid , bool removableUnits , const boost : : function < void ( ) > & cb ) { } ;
2008-12-27 03:01:59 +02:00
void giveResource ( int player , int which , int val ) { } ;
2009-09-23 15:05:33 +03:00
void giveCreatures ( int objid , const CGHeroInstance * h , CCreatureSet creatures ) { } ;
2008-12-27 03:01:59 +02:00
void showCompInfo ( ShowInInfobox * comp ) { } ;
void heroVisitCastle ( int obj , int heroID ) { } ;
void stopHeroVisitCastle ( int obj , int heroID ) { } ;
void giveHeroArtifact ( int artid , int hid , int position ) { } ; //pos==-1 - first free slot in backpack=0; pos==-2 - default if available or backpack
2009-09-13 01:17:23 +03:00
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool creatureBank = false , boost : : function < void ( BattleResult * ) > cb = 0 , const CGTownInstance * town = NULL ) { } ; //use hero=NULL for no hero
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , boost : : function < void ( BattleResult * ) > cb = 0 , bool creatureBank = false ) { } ; //if any of armies is hero, hero will be used
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , boost : : function < void ( BattleResult * ) > cb = 0 , bool creatureBank = false ) { } ; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
2008-12-27 03:01:59 +02:00
void setAmount ( int objid , ui32 val ) { } ;
2009-04-16 03:28:54 +03:00
bool moveHero ( si32 hid , int3 dst , ui8 instant , ui8 asker = 255 ) { return false ; } ;
2009-02-04 15:40:54 +02:00
void giveHeroBonus ( GiveBonus * bonus ) { } ;
void setMovePoints ( SetMovePoints * smp ) { } ;
2009-02-06 13:15:39 +02:00
void setManaPoints ( int hid , int val ) { } ;
2009-02-14 21:12:40 +02:00
void giveHero ( int id , int player ) { } ;
2009-02-20 12:36:15 +02:00
void changeObjPos ( int objid , int3 newPos , ui8 flags ) { } ;
2009-03-14 13:25:25 +02:00
void sendAndApply ( CPackForClient * info ) { } ;
2009-06-16 14:18:14 +03:00
void heroExchange ( si32 hero1 , si32 hero2 ) { } ;
2009-03-14 13:25:25 +02:00
2008-12-27 03:01:59 +02:00
//////////////////////////////////////////////////////////////////////////
friend class CCallback ; //handling players actions
friend void processCommand ( const std : : string & message , CClient * & client ) ; //handling console
2009-01-11 00:08:18 +02:00
static void runServer ( const char * portc ) ;
2009-01-30 23:28:02 +02:00
void waitForServer ( ) ;
2009-03-28 20:46:20 +02:00
//////////////////////////////////////////////////////////////////////////
template < typename Handler > void serialize ( Handler & h , const int version ) ;
2008-12-27 03:01:59 +02:00
} ;
# endif // __CLIENT_H__