2008-12-27 01:01:59 +00:00
# ifndef __CGAMEHANDLER_H__
# define __CGAMEHANDLER_H__
# include "../global.h"
# include <set>
# include "../client/FunctionList.h"
2009-05-20 10:08:56 +00:00
# include "../lib/CGameState.h"
2008-12-27 01:01:59 +00:00
# include "../lib/Connection.h"
# include "../lib/IGameCallback.h"
2009-03-09 10:37:49 +00:00
# include "../lib/BattleAction.h"
2008-12-27 01:01:59 +00:00
# include <boost/function.hpp>
# include <boost/thread.hpp>
2009-04-15 14:03:31 +00:00
/*
* CGameHandler . 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 01:01:59 +00:00
class CVCMIServer ;
class CGameState ;
struct StartInfo ;
class CCPPObjectScript ;
class CScriptCallback ;
struct BattleResult ;
struct BattleAttack ;
struct BattleStackAttacked ;
2009-03-06 22:11:17 +00:00
struct CPack ;
struct Query ;
2008-12-27 01:01:59 +00: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 10:37:49 +00:00
public :
2008-12-27 01:01:59 +00:00
CVCMIServer * s ;
2009-04-12 00:58:41 +00:00
std : : map < int , CConnection * > connections ; //player color -> connection to client with interface of that player
2008-12-27 01:01:59 +00:00
PlayerStatuses states ; //player color -> player state
std : : set < CConnection * > conns ;
2009-04-12 00:58:41 +00:00
//queries stuff
2009-04-12 01:48:50 +00:00
boost : : recursive_mutex gsm ;
2009-04-12 00:58:41 +00:00
ui32 QID ;
std : : map < ui32 , CFunctionList < void ( ui32 ) > > callbacks ; //query id => callback function - for selection and yes/no dialogs
std : : map < ui32 , boost : : function < void ( ) > > garrisonCallbacks ; //query id => callback - for garrison dialogs
std : : map < ui32 , std : : pair < si32 , si32 > > allowedExchanges ;
bool isAllowedExchange ( int id1 , int id2 ) ;
2008-12-27 01:01:59 +00:00
void giveSpells ( const CGTownInstance * t , const CGHeroInstance * h ) ;
2009-08-22 15:29:30 +00:00
int moveStack ( int stack , int dest ) ; //returned value - travelled distance
2009-08-22 13:59:15 +00:00
void startBattle ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool creatureBank , boost : : function < void ( BattleResult * ) > cb , const CGTownInstance * town = NULL ) ; //use hero=NULL for no hero
2009-08-22 15:29:30 +00:00
void prepareAttack ( BattleAttack & bat , CStack * att , CStack * def , int distance ) ; //distance - number of hexes travelled before attacking
2008-12-27 01:01:59 +00:00
void prepareAttacked ( BattleStackAttacked & bsa , CStack * def ) ;
void checkForBattleEnd ( std : : vector < CStack * > & stacks ) ;
2009-08-22 13:59:15 +00:00
void setupBattle ( BattleInfo * curB , int3 tile , const CCreatureSet & army1 , const CCreatureSet & army2 , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool creatureBank , const CGTownInstance * town ) ;
2008-12-27 01:01:59 +00:00
2009-03-09 10:37:49 +00:00
2008-12-27 01:01:59 +00: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 ) ;
2009-04-16 00:28:54 +00:00
bool removeObject ( int objid ) ;
2008-12-27 01:01:59 +00:00
void setBlockVis ( int objid , bool bv ) ;
void setOwner ( int objid , ui8 owner ) ;
void setHoverName ( int objid , MetaString * name ) ;
2009-08-17 10:02:29 +00:00
void setObjProperty ( int objid , int prop , si64 val ) ;
2009-08-16 15:39:18 +00:00
void changePrimSkill ( int ID , int which , si64 val , bool abs = false ) ;
2009-01-10 22:08:18 +00:00
void changeSecSkill ( int ID , int which , int val , bool abs = false ) ;
2008-12-27 01:01:59 +00:00
void showInfoDialog ( InfoWindow * iw ) ;
2009-04-11 01:32:50 +00:00
void showBlockingDialog ( BlockingDialog * iw , const CFunctionList < void ( ui32 ) > & callback ) ;
ui32 showBlockingDialog ( BlockingDialog * iw ) ; //synchronous version of above
2009-09-09 17:49:03 +00:00
void showGarrisonDialog ( int upobj , int hid , bool removableUnits , const boost : : function < void ( ) > & cb ) ;
2008-12-27 01:01:59 +00:00
void giveResource ( int player , int which , int val ) ;
2009-08-11 07:50:29 +00:00
void giveCreatures ( int objid , const CGHeroInstance * h , CCreatureSet * creatures ) ;
2008-12-27 01:01:59 +00: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; pos==-2 - default if available or backpack
2009-04-03 22:34:31 +00:00
void moveArtifact ( int hid , int oldPosition , int destPos ) ;
void removeArtifact ( int hid , int pos ) ;
2009-08-22 13:59:15 +00:00
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool creatureBank , boost : : function < void ( BattleResult * ) > cb , const CGTownInstance * town = NULL ) ; //use hero=NULL for no hero
2009-08-17 10:47:08 +00:00
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , bool creatureBank , boost : : function < void ( BattleResult * ) > cb ) ;
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , bool creatureBank , boost : : function < void ( BattleResult * ) > cb = 0 ) ; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
2009-07-20 23:34:06 +00:00
//void startBattleI(int heroID, CCreatureSet army, int3 tile, boost::function<void(BattleResult*)> cb); //for hero<=>neutral army
2008-12-27 01:01:59 +00:00
void setAmount ( int objid , ui32 val ) ;
2009-04-16 00:28:54 +00:00
bool moveHero ( si32 hid , int3 dst , ui8 instant , ui8 asker = 255 ) ;
2009-02-04 13:40:54 +00:00
void giveHeroBonus ( GiveBonus * bonus ) ;
void setMovePoints ( SetMovePoints * smp ) ;
2009-02-06 11:15:39 +00:00
void setManaPoints ( int hid , int val ) ;
2009-02-14 19:12:40 +00:00
void giveHero ( int id , int player ) ;
2009-02-20 10:36:15 +00:00
void changeObjPos ( int objid , int3 newPos , ui8 flags ) ;
2009-06-16 11:18:14 +00:00
void heroExchange ( si32 hero1 , si32 hero2 ) ;
2008-12-27 01:01:59 +00:00
//////////////////////////////////////////////////////////////////////////
void init ( StartInfo * si , int Seed ) ;
void handleConnection ( std : : set < int > players , CConnection & c ) ;
2009-03-09 10:37:49 +00:00
int getPlayerAt ( CConnection * c ) const ;
void playerMessage ( ui8 player , const std : : string & message ) ;
2009-04-16 00:28:54 +00:00
bool makeBattleAction ( BattleAction & ba ) ;
bool makeCustomAction ( BattleAction & ba ) ;
bool queryReply ( ui32 qid , ui32 answer ) ;
bool hireHero ( ui32 tid , ui8 hid ) ;
2009-07-26 03:33:13 +00:00
bool buildBoat ( ui32 objid ) ;
2009-04-16 00:28:54 +00:00
bool setFormation ( si32 hid , ui8 formation ) ;
bool tradeResources ( ui32 val , ui8 player , ui32 id1 , ui32 id2 ) ;
bool buyArtifact ( ui32 hid , si32 aid ) ;
bool swapArtifacts ( si32 hid1 , si32 hid2 , ui16 slot1 , ui16 slot2 ) ;
bool garrisonSwap ( si32 tid ) ;
bool upgradeCreature ( ui32 objid , ui8 pos , ui32 upgID ) ;
bool recruitCreatures ( si32 objid , ui32 crid , ui32 cram ) ;
bool buildStructure ( si32 tid , si32 bid ) ;
bool disbandCreature ( si32 id , ui8 pos ) ;
bool arrangeStacks ( si32 id1 , si32 id2 , ui8 what , ui8 p1 , ui8 p2 , si32 val ) ;
2009-03-09 10:37:49 +00:00
void save ( const std : : string & fname ) ;
void close ( ) ;
2009-03-09 19:40:43 +00:00
void handleTimeEvents ( ) ;
2009-03-26 23:05:40 +00:00
bool complain ( const std : : string & problem ) ; //sends message to all clients, prints on the logs and return true
2009-07-06 19:41:27 +00:00
void objectVisited ( const CGObjectInstance * obj , const CGHeroInstance * h ) ;
2009-08-03 23:53:18 +00:00
void engageIntoBattle ( ui8 player ) ;
2009-03-09 10:37:49 +00:00
2008-12-27 01:01:59 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-01-10 22:08:18 +00:00
h & QID & states ;
2008-12-27 01:01:59 +00:00
}
2009-03-09 10:37:49 +00:00
2009-04-11 01:32:50 +00:00
ui32 getQueryResult ( ui8 player , int queryID ) ;
2009-03-09 10:37:49 +00:00
void sendMessageToAll ( const std : : string & message ) ;
void sendMessageTo ( CConnection & c , const std : : string & message ) ;
2009-03-06 22:11:17 +00: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 10:37:49 +00:00
void sendToAllClients ( CPackForClient * info ) ;
void sendAndApply ( CPackForClient * info ) ;
2009-01-10 22:08:18 +00:00
void run ( bool resume ) ;
2008-12-27 01:01:59 +00:00
void newTurn ( ) ;
friend class CVCMIServer ;
friend class CScriptCallback ;
} ;
# endif // __CGAMEHANDLER_H__