2011-12-14 00:23:17 +03:00
# pragma once
2011-05-03 06:14:18 +03:00
2014-04-20 11:58:58 +03:00
# include "lib/CGameInfoCallback.h"
2014-04-24 22:09:27 +03:00
# include "lib/int3.h" // for int3
2009-04-16 14:14:13 +03:00
2009-04-15 17:03:31 +03:00
/*
* CCallback . 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
*
2009-04-16 14:14:13 +03:00
*/
2009-08-05 03:21:06 +03:00
2009-04-16 14:14:13 +03:00
class CGHeroInstance ;
class CGameState ;
struct CPath ;
class CGObjectInstance ;
class CArmedInstance ;
struct BattleAction ;
class CGTownInstance ;
struct lua_State ;
class CClient ;
2009-07-26 06:33:13 +03:00
class IShipyard ;
2009-08-30 15:47:40 +03:00
struct CGPathNode ;
struct CGPath ;
2011-05-03 06:14:18 +03:00
struct CPathsInfo ;
2011-08-26 03:27:58 +03:00
struct CPack ;
2013-06-23 19:09:15 +03:00
class IBattleEventsReceiver ;
class IGameEventsReceiver ;
2014-04-20 10:13:37 +03:00
struct ArtifactLocation ;
2010-12-22 22:14:40 +02:00
class IBattleCallback
2009-04-16 14:14:13 +03:00
{
public :
2009-08-04 02:53:18 +03:00
bool waitTillRealize ; //if true, request functions will return after they are realized by server
2011-07-05 22:05:41 +03:00
bool unlockGsWhenWaiting ; //if true after sending each request, gs mutex will be unlocked so the changes can be applied; NOTICE caller must have gs mx locked prior to any call to actiob callback!
2010-12-22 22:14:40 +02:00
//battle
virtual int battleMakeAction ( BattleAction * action ) = 0 ; //for casting spells by hero - DO NOT use it for moving active stack
2011-02-12 18:12:48 +02:00
virtual bool battleMakeTacticAction ( BattleAction * action ) = 0 ; // performs tactic phase actions
2010-12-22 22:14:40 +02:00
} ;
2011-05-03 06:14:18 +03:00
class IGameActionCallback
2010-12-22 22:14:40 +02:00
{
public :
2009-08-03 22:22:05 +03:00
//hero
2015-03-08 16:04:09 +02:00
virtual bool moveHero ( const CGHeroInstance * h , int3 dst , bool transit ) = 0 ; //dst must be free, neighbouring tile (this function can move hero only by one tile)
2009-08-03 22:22:05 +03:00
virtual bool dismissHero ( const CGHeroInstance * hero ) = 0 ; //dismisses given hero; true - successfuly, false - not successfuly
2013-02-12 18:46:43 +03:00
virtual void dig ( const CGObjectInstance * hero ) = 0 ;
2013-02-11 02:24:57 +03:00
virtual void castSpell ( const CGHeroInstance * hero , SpellID spellID , const int3 & pos = int3 ( - 1 , - 1 , - 1 ) ) = 0 ; //cast adventure map spell
2011-05-03 06:14:18 +03:00
2009-08-03 22:22:05 +03:00
//town
2010-07-09 02:03:27 +03:00
virtual void recruitHero ( const CGObjectInstance * townOrTavern , const CGHeroInstance * hero ) = 0 ;
2013-02-11 22:11:34 +03:00
virtual bool buildBuilding ( const CGTownInstance * town , BuildingID buildingID ) = 0 ;
2014-09-19 00:18:49 +03:00
virtual void recruitCreatures ( const CGDwelling * obj , const CArmedInstance * dst , CreatureID ID , ui32 amount , si32 level = - 1 ) = 0 ;
2013-02-16 17:03:47 +03:00
virtual bool upgradeCreature ( const CArmedInstance * obj , SlotID stackPos , CreatureID newID = CreatureID : : NONE ) = 0 ; //if newID==-1 then best possible upgrade will be made
2009-08-03 22:22:05 +03:00
virtual void swapGarrisonHero ( const CGTownInstance * town ) = 0 ;
2011-05-03 06:14:18 +03:00
2013-06-26 14:18:27 +03:00
virtual void trade ( const CGObjectInstance * market , EMarketMode : : EMarketMode mode , int id1 , int id2 , int val1 , const CGHeroInstance * hero = nullptr ) = 0 ; //mode==0: sell val1 units of id1 resource for id2 resiurce
2011-05-03 06:14:18 +03:00
2013-05-27 13:53:28 +03:00
virtual int selectionMade ( int selection , QueryID queryID ) = 0 ;
2013-02-16 17:03:47 +03:00
virtual int swapCreatures ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 ) = 0 ; //swaps creatures between two possibly different garrisons // TODO: AI-unsafe code - fix it!
virtual int mergeStacks ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 ) = 0 ; //joins first stack to the second (creatures must be same type)
virtual int mergeOrSwapStacks ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 ) = 0 ; //first goes to the second
virtual int splitStack ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 , int val ) = 0 ; //split creatures from the first stack
2012-01-30 19:07:52 +03:00
//virtual bool swapArtifacts(const CGHeroInstance * hero1, ui16 pos1, const CGHeroInstance * hero2, ui16 pos2)=0; //swaps artifacts between two given heroes
2012-04-14 05:20:22 +03:00
virtual bool swapArtifacts ( const ArtifactLocation & l1 , const ArtifactLocation & l2 ) = 0 ;
2013-02-16 17:03:47 +03:00
virtual bool assembleArtifacts ( const CGHeroInstance * hero , ArtifactPosition artifactSlot , bool assemble , ArtifactID assembleTo ) = 0 ;
virtual bool dismissCreature ( const CArmedInstance * obj , SlotID stackPos ) = 0 ;
2009-04-16 14:14:13 +03:00
virtual void endTurn ( ) = 0 ;
2013-02-11 02:24:57 +03:00
virtual void buyArtifact ( const CGHeroInstance * hero , ArtifactID aid ) = 0 ; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith)
2009-04-16 14:14:13 +03:00
virtual void setFormation ( const CGHeroInstance * hero , bool tight ) = 0 ;
2011-05-03 06:14:18 +03:00
2009-04-16 14:14:13 +03:00
virtual void save ( const std : : string & fname ) = 0 ;
2014-09-21 20:35:53 +03:00
virtual void sendMessage ( const std : : string & mess , const CGObjectInstance * currentObject = nullptr ) = 0 ;
2009-07-26 06:33:13 +03:00
virtual void buildBoat ( const IShipyard * obj ) = 0 ;
2009-04-16 14:14:13 +03:00
} ;
2011-08-30 09:36:57 +03:00
struct CPack ;
2012-08-26 12:07:48 +03:00
class CBattleCallback : public IBattleCallback , public CPlayerBattleCallback
2009-04-16 14:14:13 +03:00
{
2010-12-22 22:14:40 +02:00
protected :
2012-07-15 18:34:00 +03:00
int sendRequest ( const CPack * request ) ; //returns requestID (that'll be matched to requestID in PackageApplied)
2009-04-16 14:14:13 +03:00
CClient * cl ;
2011-05-03 06:14:18 +03:00
//virtual bool hasAccess(int playerId) const;
2010-12-22 22:14:40 +02:00
public :
2013-03-03 20:06:03 +03:00
CBattleCallback ( CGameState * GS , boost : : optional < PlayerColor > Player , CClient * C ) ;
2013-06-26 14:18:27 +03:00
int battleMakeAction ( BattleAction * action ) override ; //for casting spells by hero - DO NOT use it for moving active stack
bool battleMakeTacticAction ( BattleAction * action ) override ; // performs tactic phase actions
2013-02-12 18:46:43 +03:00
2011-02-06 19:26:27 +02:00
friend class CCallback ;
friend class CClient ;
2010-12-22 22:14:40 +02:00
} ;
2011-05-03 06:14:18 +03:00
class CCallback : public CPlayerSpecificInfoCallback , public IGameActionCallback , public CBattleCallback
2010-12-22 22:14:40 +02:00
{
2009-04-16 14:14:13 +03:00
public :
2013-03-03 20:06:03 +03:00
CCallback ( CGameState * GS , boost : : optional < PlayerColor > Player , CClient * C ) ;
2013-02-12 18:46:43 +03:00
virtual ~ CCallback ( ) ;
2012-03-06 19:59:55 +03:00
2011-05-30 02:49:25 +03:00
//client-specific functionalities (pathfinding)
2014-02-15 22:39:03 +03:00
virtual bool canMoveBetween ( const int3 & a , const int3 & b ) ;
2014-02-07 11:23:31 +03:00
virtual int getMovementCost ( const CGHeroInstance * hero , int3 dest ) ;
2014-09-21 16:42:08 +03:00
virtual int3 getGuardingCreaturePosition ( int3 tile ) ;
virtual const CPathsInfo * getPathsInfo ( const CGHeroInstance * h ) ;
2012-02-26 21:31:59 +03:00
2014-09-21 16:42:08 +03:00
virtual void calculatePaths ( const CGHeroInstance * hero , CPathsInfo & out ) ;
2011-05-03 06:14:18 +03:00
2013-06-22 21:22:44 +03:00
//Set of metrhods that allows adding more interfaces for this player that'll receive game event call-ins.
2013-06-23 19:09:15 +03:00
void registerGameInterface ( shared_ptr < IGameEventsReceiver > gameEvents ) ;
void registerBattleInterface ( shared_ptr < IBattleEventsReceiver > battleEvents ) ;
void unregisterGameInterface ( shared_ptr < IGameEventsReceiver > gameEvents ) ;
void unregisterBattleInterface ( shared_ptr < IBattleEventsReceiver > battleEvents ) ;
2012-07-15 18:34:00 +03:00
2013-12-06 22:44:11 +03:00
void unregisterAllInterfaces ( ) ; //stops delivering information about game events to player interfaces -> can be called ONLY after victory/loss
2011-05-30 02:49:25 +03:00
2009-04-16 14:14:13 +03:00
//commands
2015-03-08 16:04:09 +02:00
bool moveHero ( const CGHeroInstance * h , int3 dst , bool transit = false ) ; //dst must be free, neighbouring tile (this function can move hero only by one tile)
2010-06-30 22:27:35 +03:00
bool teleportHero ( const CGHeroInstance * who , const CGTownInstance * where ) ;
2013-05-27 13:53:28 +03:00
int selectionMade ( int selection , QueryID queryID ) ;
2013-02-16 17:03:47 +03:00
int swapCreatures ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 ) ;
int mergeOrSwapStacks ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 ) ; //first goes to the second
int mergeStacks ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 ) ; //first goes to the second
int splitStack ( const CArmedInstance * s1 , const CArmedInstance * s2 , SlotID p1 , SlotID p2 , int val ) ;
2009-04-16 14:14:13 +03:00
bool dismissHero ( const CGHeroInstance * hero ) ;
2012-01-30 19:07:52 +03:00
//bool swapArtifacts(const CGHeroInstance * hero1, ui16 pos1, const CGHeroInstance * hero2, ui16 pos2);
2012-04-14 05:20:22 +03:00
bool swapArtifacts ( const ArtifactLocation & l1 , const ArtifactLocation & l2 ) ;
2012-01-30 19:07:52 +03:00
//bool moveArtifact(const CGHeroInstance * hero, ui16 src, const CStackInstance * stack, ui16 dest); // TODO: unify classes
//bool moveArtifact(const CStackInstance * stack, ui16 src , const CGHeroInstance * hero, ui16 dest); // TODO: unify classes
2013-02-16 17:03:47 +03:00
bool assembleArtifacts ( const CGHeroInstance * hero , ArtifactPosition artifactSlot , bool assemble , ArtifactID assembleTo ) ;
2013-06-26 14:18:27 +03:00
bool buildBuilding ( const CGTownInstance * town , BuildingID buildingID ) override ;
2014-09-19 00:18:49 +03:00
void recruitCreatures ( const CGDwelling * obj , const CArmedInstance * dst , CreatureID ID , ui32 amount , si32 level = - 1 ) ;
2013-02-16 17:03:47 +03:00
bool dismissCreature ( const CArmedInstance * obj , SlotID stackPos ) ;
2013-06-26 14:18:27 +03:00
bool upgradeCreature ( const CArmedInstance * obj , SlotID stackPos , CreatureID newID = CreatureID : : NONE ) override ;
2009-04-16 14:14:13 +03:00
void endTurn ( ) ;
void swapGarrisonHero ( const CGTownInstance * town ) ;
2013-06-26 14:18:27 +03:00
void buyArtifact ( const CGHeroInstance * hero , ArtifactID aid ) override ;
void trade ( const CGObjectInstance * market , EMarketMode : : EMarketMode mode , int id1 , int id2 , int val1 , const CGHeroInstance * hero = nullptr ) ;
2009-04-16 14:14:13 +03:00
void setFormation ( const CGHeroInstance * hero , bool tight ) ;
2010-07-09 02:03:27 +03:00
void recruitHero ( const CGObjectInstance * townOrTavern , const CGHeroInstance * hero ) ;
2009-04-16 14:14:13 +03:00
void save ( const std : : string & fname ) ;
2014-09-21 20:35:53 +03:00
void sendMessage ( const std : : string & mess , const CGObjectInstance * currentObject = nullptr ) ;
2009-07-26 06:33:13 +03:00
void buildBoat ( const IShipyard * obj ) ;
2013-02-12 18:46:43 +03:00
void dig ( const CGObjectInstance * hero ) ;
2013-02-11 02:24:57 +03:00
void castSpell ( const CGHeroInstance * hero , SpellID spellID , const int3 & pos = int3 ( - 1 , - 1 , - 1 ) ) ;
2009-04-16 14:14:13 +03:00
//friends
friend class CClient ;
} ;