2008-12-27 03:01:59 +02:00
# ifndef __CGAMEHANDLER_H__
# define __CGAMEHANDLER_H__
# include "../global.h"
# include <set>
# include "../client/FunctionList.h"
# include "../CGameState.h"
# include "../lib/Connection.h"
# include "../lib/IGameCallback.h"
2009-03-09 12:37:49 +02:00
# include "../lib/BattleAction.h"
2008-12-27 03:01:59 +02:00
# include <boost/function.hpp>
# include <boost/thread.hpp>
class CVCMIServer ;
class CGameState ;
struct StartInfo ;
class CCPPObjectScript ;
class CScriptCallback ;
struct BattleResult ;
struct BattleAttack ;
struct BattleStackAttacked ;
2009-03-07 00:11:17 +02:00
struct CPack ;
struct Query ;
2008-12-27 03:01:59 +02:00
class CGHeroInstance ;
extern std : : map < ui32 , CFunctionList < void ( ui32 ) > > callbacks ; //question id => callback functions - for selection dialogs
extern boost : : mutex gsm ;
struct PlayerStatus
{
bool makingTurn , engagedIntoBattle ;
std : : set < ui32 > queries ;
PlayerStatus ( ) : makingTurn ( false ) , engagedIntoBattle ( false ) { } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & makingTurn & engagedIntoBattle & queries ;
}
} ;
class PlayerStatuses
{
public :
std : : map < ui8 , PlayerStatus > players ;
boost : : mutex mx ;
boost : : condition_variable cv ; //notifies when any changes are made
void addPlayer ( ui8 player ) ;
PlayerStatus operator [ ] ( ui8 player ) ;
bool hasQueries ( ui8 player ) ;
bool checkFlag ( ui8 player , bool PlayerStatus : : * flag ) ;
void setFlag ( ui8 player , bool PlayerStatus : : * flag , bool val ) ;
void addQuery ( ui8 player , ui32 id ) ;
void removeQuery ( ui8 player , ui32 id ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & players ;
}
} ;
class CGameHandler : public IGameCallback
{
2009-03-09 12:37:49 +02:00
public :
2008-12-27 03:01:59 +02:00
static ui32 QID ;
CVCMIServer * s ;
std : : map < int , CConnection * > connections ; //player color -> connection to clinet with interface of that player
PlayerStatuses states ; //player color -> player state
std : : set < CConnection * > conns ;
void giveSpells ( const CGTownInstance * t , const CGHeroInstance * h ) ;
void moveStack ( int stack , int dest ) ;
void startBattle ( CCreatureSet army1 , CCreatureSet army2 , int3 tile , CGHeroInstance * hero1 , CGHeroInstance * hero2 , boost : : function < void ( BattleResult * ) > cb ) ; //use hero=NULL for no hero
void prepareAttack ( BattleAttack & bat , CStack * att , CStack * def ) ; //if last parameter is true, attack is by shooting, if false it's a melee attack
void prepareAttacked ( BattleStackAttacked & bsa , CStack * def ) ;
void checkForBattleEnd ( std : : vector < CStack * > & stacks ) ;
void setupBattle ( BattleInfo * curB , int3 tile , CCreatureSet & army1 , CCreatureSet & army2 , CGHeroInstance * hero1 , CGHeroInstance * hero2 ) ;
2009-03-09 12:37:49 +02:00
2008-12-27 03:01:59 +02:00
CGameHandler ( void ) ;
~ CGameHandler ( void ) ;
//////////////////////////////////////////////////////////////////////////
//from IGameCallback
//get info
int getCurrentPlayer ( ) ;
int getSelectedHero ( ) ;
//do sth
void changeSpells ( int hid , bool give , const std : : set < ui32 > & spells ) ;
void removeObject ( int objid ) ;
void setBlockVis ( int objid , bool bv ) ;
void setOwner ( int objid , ui8 owner ) ;
void setHoverName ( int objid , MetaString * name ) ;
void setObjProperty ( int objid , int prop , int val ) ;
void changePrimSkill ( int ID , int which , int 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 ) ; //synchronous version of above
2008-12-27 03:01:59 +02:00
void giveResource ( int player , int which , int val ) ;
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; pos==-2 - default if available or backpack
2009-04-04 01:34:31 +03:00
void moveArtifact ( int hid , int oldPosition , int destPos ) ;
void removeArtifact ( int hid , int pos ) ;
2008-12-27 03:01:59 +02:00
void startBattleI ( const CCreatureSet * army1 , const CCreatureSet * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , boost : : function < void ( BattleResult * ) > cb ) ; //use hero=NULL for no hero
void startBattleI ( int heroID , CCreatureSet army , int3 tile , boost : : function < void ( BattleResult * ) > cb ) ; //for hero<=>neutral army
void setAmount ( int objid , ui32 val ) ;
2009-03-09 12:37:49 +02:00
void moveHero ( si32 hid , int3 dst , ui8 instant , ui8 asker = 255 ) ;
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 ) ;
2008-12-27 03:01:59 +02:00
//////////////////////////////////////////////////////////////////////////
void init ( StartInfo * si , int Seed ) ;
void handleConnection ( std : : set < int > players , CConnection & c ) ;
2009-03-09 12:37:49 +02:00
int getPlayerAt ( CConnection * c ) const ;
void playerMessage ( ui8 player , const std : : string & message ) ;
void makeBattleAction ( BattleAction & ba ) ;
void makeCustomAction ( BattleAction & ba ) ;
void queryReply ( ui32 qid , ui32 answer ) ;
void hireHero ( ui32 tid , ui8 hid ) ;
void setFormation ( si32 hid , ui8 formation ) ;
void tradeResources ( ui32 val , ui8 player , ui32 id1 , ui32 id2 ) ;
void buyArtifact ( ui32 hid , si32 aid ) ;
void swapArtifacts ( si32 hid1 , si32 hid2 , ui16 slot1 , ui16 slot2 ) ;
void garrisonSwap ( si32 tid ) ;
void upgradeCreature ( ui32 objid , ui8 pos , ui32 upgID ) ;
void recruitCreatures ( si32 objid , ui32 crid , ui32 cram ) ;
void buildStructure ( si32 tid , si32 bid ) ;
void disbandCreature ( si32 id , ui8 pos ) ;
void arrangeStacks ( si32 id1 , si32 id2 , ui8 what , ui8 p1 , ui8 p2 , si32 val ) ;
void save ( const std : : string & fname ) ;
void close ( ) ;
2009-03-09 21:40:43 +02:00
void handleTimeEvents ( ) ;
2009-03-27 01:05:40 +02:00
bool complain ( const std : : string & problem ) ; //sends message to all clients, prints on the logs and return true
2009-03-09 12:37:49 +02:00
2008-12-27 03:01:59 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-01-11 00:08:18 +02:00
h & QID & states ;
2008-12-27 03:01:59 +02:00
}
2009-03-09 12:37:49 +02:00
2009-04-11 04:32:50 +03:00
ui32 getQueryResult ( ui8 player , int queryID ) ;
2009-03-09 12:37:49 +02:00
void sendMessageToAll ( const std : : string & message ) ;
void sendMessageTo ( CConnection & c , const std : : string & message ) ;
2009-03-07 00:11:17 +02:00
void applyAndAsk ( Query * sel , ui8 player , boost : : function < void ( ui32 ) > & callback ) ;
void ask ( Query * sel , ui8 player , const CFunctionList < void ( ui32 ) > & callback ) ;
2009-03-09 12:37:49 +02:00
void sendToAllClients ( CPackForClient * info ) ;
void sendAndApply ( CPackForClient * info ) ;
2009-01-11 00:08:18 +02:00
void run ( bool resume ) ;
2008-12-27 03:01:59 +02:00
void newTurn ( ) ;
friend class CVCMIServer ;
friend class CScriptCallback ;
} ;
# endif // __CGAMEHANDLER_H__