2011-12-14 00:23:17 +03:00
# pragma once
2008-12-27 03:01:59 +02:00
2011-12-14 00:23:17 +03:00
2011-12-22 16:05:19 +03:00
# include "BattleHex.h"
2008-12-27 03:01:59 +02:00
# include "../client/FunctionList.h"
2011-07-05 09:14:07 +03:00
# include "ResourceSet.h"
2011-12-14 00:23:17 +03:00
# include "int3.h"
# include "GameConstants.h"
2012-08-26 12:07:48 +03:00
# include "CBattleCallback.h"
2008-12-27 03:01:59 +02:00
2009-04-15 17:03:31 +03:00
/*
* IGameCallback . 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-02-04 15:40:54 +02:00
struct SetMovePoints ;
struct GiveBonus ;
2008-12-27 03:01:59 +02:00
class CGObjectInstance ;
class CGTownInstance ;
class CGHeroInstance ;
2009-04-11 04:32:50 +03:00
struct BlockingDialog ;
2008-12-27 03:01:59 +02:00
struct InfoWindow ;
struct MetaString ;
struct ShowInInfobox ;
struct BattleResult ;
2009-09-21 12:00:33 +03:00
struct Component ;
2008-12-27 03:01:59 +02:00
class CGameState ;
2009-02-08 08:42:15 +02:00
struct PlayerSettings ;
2009-03-14 13:25:25 +02:00
struct CPackForClient ;
2009-04-16 03:28:54 +03:00
class CArtHandler ;
class CArtifact ;
2009-07-21 02:34:06 +03:00
class CArmedInstance ;
2009-07-26 06:33:13 +03:00
struct TerrainTile ;
2010-02-10 04:56:00 +02:00
struct PlayerState ;
2010-07-09 02:03:27 +03:00
class CTown ;
2010-11-27 03:46:19 +02:00
struct StackLocation ;
2010-12-26 16:34:11 +02:00
struct ArtifactLocation ;
class CArtifactInstance ;
2011-05-03 06:14:18 +03:00
struct StartInfo ;
struct InfoAboutTown ;
struct UpgradeInfo ;
struct SThievesGuildInfo ;
struct CPath ;
class CGDwelling ;
struct InfoAboutHero ;
class CMapHeader ;
struct BattleAction ;
class CStack ;
2011-05-10 01:20:47 +03:00
class CSpell ;
class CCreatureSet ;
class CCreature ;
class CStackBasicDescriptor ;
2011-06-19 02:56:48 +03:00
struct TeamState ;
2012-05-16 20:29:05 +03:00
struct QuestInfo ;
2011-05-28 04:02:28 +03:00
class CGCreature ;
2011-05-03 06:14:18 +03:00
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CGameInfoCallback : public virtual CCallbackBase
2011-05-03 06:14:18 +03:00
{
protected :
CGameInfoCallback ( ) ;
2012-09-24 21:52:30 +03:00
CGameInfoCallback ( CGameState * GS , int Player ) ;
bool hasAccess ( int playerId ) const ;
bool isVisible ( int3 pos , int Player ) const ;
bool isVisible ( const CGObjectInstance * obj , int Player ) const ;
2011-05-03 06:14:18 +03:00
bool isVisible ( const CGObjectInstance * obj ) const ;
2011-05-10 01:20:47 +03:00
bool canGetFullInfo ( const CGObjectInstance * obj ) const ; //true we player owns obj or ally owns obj or privileged mode
2011-05-03 06:14:18 +03:00
bool isOwnedOrVisited ( const CGObjectInstance * obj ) const ;
public :
//various
int getDate ( int mode = 0 ) const ; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month
2012-05-23 00:08:16 +03:00
const StartInfo * getStartInfo ( bool beforeRandomization = false ) const ;
2011-05-03 06:14:18 +03:00
bool isAllowed ( int type , int id ) ; //type: 0 - spell; 1- artifact; 2 - secondary skill
//player
2012-09-24 21:52:30 +03:00
const PlayerState * getPlayer ( int color , bool verbose = true ) const ;
int getResource ( int Player , int which ) const ;
2011-05-03 06:14:18 +03:00
bool isVisible ( int3 pos ) const ;
2012-09-24 21:52:30 +03:00
int getPlayerRelations ( ui8 color1 , ui8 color2 ) const ; // 0 = enemy, 1 = ally, 2 = same player
2011-05-03 06:14:18 +03:00
void getThievesGuildInfo ( SThievesGuildInfo & thi , const CGObjectInstance * obj ) ; //get thieves' guild info obtainable while visiting given object
2012-09-24 21:52:30 +03:00
int getPlayerStatus ( int player ) const ; //-1 if no such player
2011-05-03 06:14:18 +03:00
int getCurrentPlayer ( ) const ; //player that currently makes move // TODO synchronous turns
2011-06-11 02:50:32 +03:00
virtual int getLocalPlayer ( ) const ; //player that is currently owning given client (if not a client, then returns current player)
2012-09-24 21:52:30 +03:00
const PlayerSettings * getPlayerSettings ( int color ) const ;
2011-05-03 06:14:18 +03:00
2011-05-10 01:20:47 +03:00
2011-05-03 06:14:18 +03:00
//armed object
void getUpgradeInfo ( const CArmedInstance * obj , int stackPos , UpgradeInfo & out ) const ;
//hero
2011-05-10 01:20:47 +03:00
const CGHeroInstance * getHero ( int objid ) const ;
2011-05-22 21:46:52 +03:00
const CGHeroInstance * getHeroWithSubid ( int subid ) const ;
2012-09-24 21:52:30 +03:00
int getHeroCount ( int player , bool includeGarrisoned ) const ;
2011-05-03 06:14:18 +03:00
bool getHeroInfo ( const CGObjectInstance * hero , InfoAboutHero & dest ) const ;
int getSpellCost ( const CSpell * sp , const CGHeroInstance * caster ) const ; //when called during battle, takes into account creatures' spell cost reduction
int estimateSpellDamage ( const CSpell * sp , const CGHeroInstance * hero ) const ; //estimates damage of given spell; returns 0 if spell causes no dmg
bool verifyPath ( CPath * path , bool blockSea ) const ;
2012-09-24 21:52:30 +03:00
const CGHeroInstance * getSelectedHero ( int player ) const ; //NULL if no hero is selected
2011-05-22 21:46:52 +03:00
const CGHeroInstance * getSelectedHero ( ) const ; //of current (active) player
2011-05-03 06:14:18 +03:00
//objects
const CGObjectInstance * getObj ( int objid , bool verbose = true ) const ;
std : : vector < const CGObjectInstance * > getBlockingObjs ( int3 pos ) const ;
2012-04-14 10:22:08 +03:00
std : : vector < const CGObjectInstance * > getVisitableObjs ( int3 pos , bool verbose = true ) const ;
2011-05-03 06:14:18 +03:00
std : : vector < const CGObjectInstance * > getFlaggableObjects ( int3 pos ) const ;
std : : vector < std : : string > getObjDescriptions ( int3 pos ) const ; //returns descriptions of objects at pos in order from the lowest to the highest
2012-09-24 21:52:30 +03:00
int getOwner ( int heroID ) const ;
2011-05-10 01:20:47 +03:00
const CGObjectInstance * getObjByQuestIdentifier ( int identifier ) const ; //NULL if object has been removed (eg. killed)
2008-12-27 03:01:59 +02:00
2011-05-03 06:14:18 +03:00
//map
int3 guardingCreaturePosition ( int3 pos ) const ;
2012-11-15 00:19:32 +03:00
std : : vector < const CGObjectInstance * > getGuardingCreatures ( int3 pos ) const ;
2011-05-03 06:14:18 +03:00
const CMapHeader * getMapHeader ( ) const ;
int3 getMapSize ( ) const ; //returns size of map - z is 1 for one - level map and 2 for two level map
2012-01-03 04:55:26 +03:00
const TerrainTile * getTile ( int3 tile , bool verbose = true ) const ;
bool isInTheMap ( const int3 & pos ) const ;
2011-05-03 06:14:18 +03:00
//town
2011-05-10 01:20:47 +03:00
const CGTownInstance * getTown ( int objid ) const ;
2011-05-03 06:14:18 +03:00
int howManyTowns ( int Player ) const ;
const CGTownInstance * getTownInfo ( int val , bool mode ) const ; //mode = 0 -> val = player town serial; mode = 1 -> val = object id (serial)
std : : vector < const CGHeroInstance * > getAvailableHeroes ( const CGObjectInstance * townOrTavern ) const ; //heroes that can be recruited
std : : string getTavernGossip ( const CGObjectInstance * townOrTavern ) const ;
int canBuildStructure ( const CGTownInstance * t , int ID ) ; //// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements
std : : set < int > getBuildingRequiments ( const CGTownInstance * t , int ID ) ;
virtual bool getTownInfo ( const CGObjectInstance * town , InfoAboutTown & dest ) const ;
2012-09-24 21:52:30 +03:00
const CTown * getNativeTown ( int color ) const ;
2011-05-10 01:20:47 +03:00
//from gs
const TeamState * getTeam ( ui8 teamID ) const ;
2012-09-24 21:52:30 +03:00
const TeamState * getPlayerTeam ( ui8 color ) const ;
2011-05-10 01:20:47 +03:00
std : : set < int > getBuildingRequiments ( const CGTownInstance * t , int ID ) const ;
int canBuildStructure ( const CGTownInstance * t , int ID ) const ; // 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build, 8 - lack of requirements
2011-05-03 06:14:18 +03:00
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CPlayerSpecificInfoCallback : public CGameInfoCallback
2011-05-03 06:14:18 +03:00
{
public :
int howManyTowns ( ) const ;
int howManyHeroes ( bool includeGarrisoned = true ) const ;
2011-12-14 00:23:17 +03:00
int3 getGrailPos ( double & outKnownRatio ) ;
2011-05-03 06:14:18 +03:00
int getMyColor ( ) const ;
std : : vector < const CGTownInstance * > getTownsInfo ( bool onlyOur = true ) const ; //true -> only owned; false -> all visible
2012-05-13 18:04:21 +03:00
int getHeroSerial ( const CGHeroInstance * hero , bool includeGarrisoned = true ) const ;
2011-05-03 06:14:18 +03:00
const CGTownInstance * getTownBySerial ( int serialId ) const ; // serial id is [0, number of towns)
2011-07-18 18:21:16 +03:00
const CGHeroInstance * getHeroBySerial ( int serialId , bool includeGarrisoned = true ) const ; // serial id is [0, number of heroes)
2011-05-03 06:14:18 +03:00
std : : vector < const CGHeroInstance * > getHeroesInfo ( bool onlyOur = true ) const ; //true -> only owned; false -> all visible
std : : vector < const CGDwelling * > getMyDwellings ( ) const ; //returns all dwellings that belong to player
std : : vector < const CGObjectInstance * > getMyObjects ( ) const ; //returns all objects flagged by belonging player
2012-07-06 23:19:54 +03:00
std : : vector < QuestInfo > getMyQuests ( ) const ;
2011-05-03 06:14:18 +03:00
2012-09-24 21:52:30 +03:00
int getResourceAmount ( int type ) const ;
2011-07-05 09:14:07 +03:00
TResources getResourceAmount ( ) const ;
2011-12-14 00:23:17 +03:00
const std : : vector < std : : vector < std : : vector < ui8 > > > & getVisibilityMap ( ) const ; //returns visibility map
2012-09-24 21:52:30 +03:00
const PlayerSettings * getPlayerSettings ( int color ) const ;
2011-05-03 06:14:18 +03:00
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CPrivilagedInfoCallback : public CGameInfoCallback
2011-05-03 06:14:18 +03:00
{
public :
2012-05-28 22:29:32 +03:00
CGameState * gameState ( ) ;
2011-05-03 06:14:18 +03:00
void getFreeTiles ( std : : vector < int3 > & tiles ) const ; //used for random spawns
2012-09-24 21:52:30 +03:00
void getTilesInRange ( boost : : unordered_set < int3 , ShashInt3 > & tiles , int3 pos , int radious , int player = - 1 , int mode = 0 ) const ; //mode 1 - only unrevealed tiles; mode 0 - all, mode -1 - only unrevealed
void getAllTiles ( boost : : unordered_set < int3 , ShashInt3 > & tiles , int player = - 1 , int level = - 1 , int surface = 0 ) const ; //returns all tiles on given level (-1 - both levels, otherwise number of level); surface: 0 - land and water, 1 - only land, 2 - only water
2011-05-03 06:14:18 +03:00
ui16 getRandomArt ( int flags ) ;
ui16 getArtSync ( ui32 rand , int flags ) ; //synchronous
void pickAllowedArtsSet ( std : : vector < const CArtifact * > & out ) ; //gives 3 treasures, 3 minors, 1 major -> used by Black Market and Artifact Merchant
void erasePickedArt ( si32 id ) ;
void getAllowedSpells ( std : : vector < ui16 > & out , ui16 level ) ;
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CNonConstInfoCallback : public CPrivilagedInfoCallback
2011-05-10 01:20:47 +03:00
{
public :
2012-09-24 21:52:30 +03:00
PlayerState * getPlayer ( ui8 color , bool verbose = true ) ;
2011-05-10 01:20:47 +03:00
TeamState * getTeam ( ui8 teamID ) ; //get team by team ID
2012-09-24 21:52:30 +03:00
TeamState * getPlayerTeam ( ui8 color ) ; // get team by player color
2011-05-10 01:20:47 +03:00
CGHeroInstance * getHero ( int objid ) ;
CGTownInstance * getTown ( int objid ) ;
TerrainTile * getTile ( int3 pos ) ;
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE IGameEventRealizer
2011-05-03 06:14:18 +03:00
{
public :
2011-05-22 21:46:52 +03:00
virtual void commitPackage ( CPackForClient * pack ) = 0 ;
2008-12-27 03:01:59 +02:00
2011-05-22 21:46:52 +03:00
virtual void showInfoDialog ( InfoWindow * iw ) ;
2011-05-28 04:02:28 +03:00
virtual void setObjProperty ( int objid , int prop , si64 val ) ;
2011-06-11 02:50:32 +03:00
virtual void showInfoDialog ( const std : : string & msg , int player ) ;
2011-05-22 21:46:52 +03:00
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE IGameEventCallback : public IGameEventRealizer
2011-05-22 21:46:52 +03:00
{
public :
2008-12-27 03:01:59 +02:00
virtual void changeSpells ( int hid , bool give , const std : : set < ui32 > & spells ) = 0 ;
2009-04-16 03:28:54 +03:00
virtual bool removeObject ( int objid ) = 0 ;
2008-12-27 03:01:59 +02:00
virtual void setBlockVis ( int objid , bool bv ) = 0 ;
virtual void setOwner ( int objid , ui8 owner ) = 0 ;
virtual void setHoverName ( int objid , MetaString * name ) = 0 ;
2009-08-16 18:39:18 +03:00
virtual void changePrimSkill ( int ID , int which , si64 val , bool abs = false ) = 0 ;
2009-01-11 00:08:18 +02:00
virtual void changeSecSkill ( int ID , int which , int val , bool abs = false ) = 0 ;
2009-04-11 04:32:50 +03:00
virtual void showBlockingDialog ( BlockingDialog * iw , const CFunctionList < void ( ui32 ) > & callback ) = 0 ;
2009-04-12 03:58:41 +03:00
virtual ui32 showBlockingDialog ( BlockingDialog * iw ) = 0 ; //synchronous version of above //TODO:
2009-09-09 20:49:03 +03:00
virtual void showGarrisonDialog ( int upobj , int hid , bool removableUnits , const boost : : function < void ( ) > & cb ) = 0 ; //cb will be called when player closes garrison window
2012-03-07 17:05:54 +03:00
virtual void showThievesGuildWindow ( int player , int requestingObjId ) = 0 ;
2008-12-27 03:01:59 +02:00
virtual void giveResource ( int player , int which , int val ) = 0 ;
2010-12-26 16:34:11 +02:00
2011-05-10 01:20:47 +03:00
virtual void giveCreatures ( const CArmedInstance * objid , const CGHeroInstance * h , const CCreatureSet & creatures , bool remove ) = 0 ;
virtual void takeCreatures ( int objid , const std : : vector < CStackBasicDescriptor > & creatures ) = 0 ;
2010-11-27 22:17:28 +02:00
virtual bool changeStackCount ( const StackLocation & sl , TQuantity count , bool absoluteValue = false ) = 0 ;
virtual bool changeStackType ( const StackLocation & sl , CCreature * c ) = 0 ;
virtual bool insertNewStack ( const StackLocation & sl , const CCreature * c , TQuantity count = - 1 ) = 0 ; //count -1 => moves whole stack
2010-12-12 01:11:26 +02:00
virtual bool eraseStack ( const StackLocation & sl , bool forceRemoval = false ) = 0 ;
2010-11-27 22:17:28 +02:00
virtual bool swapStacks ( const StackLocation & sl1 , const StackLocation & sl2 ) = 0 ;
virtual bool addToSlot ( const StackLocation & sl , const CCreature * c , TQuantity count ) = 0 ; //makes new stack or increases count of already existing
2010-12-13 01:44:16 +02:00
virtual void tryJoiningArmy ( const CArmedInstance * src , const CArmedInstance * dst , bool removeObjWhenFinished , bool allowMerging ) = 0 ; //merges army from src do dst or opens a garrison window
2010-11-27 22:17:28 +02:00
virtual bool moveStack ( const StackLocation & src , const StackLocation & dst , TQuantity count ) = 0 ;
2010-12-26 16:34:11 +02:00
virtual void giveHeroNewArtifact ( const CGHeroInstance * h , const CArtifact * artType , int pos ) = 0 ;
virtual void giveHeroArtifact ( const CGHeroInstance * h , const CArtifactInstance * a , int pos ) = 0 ; //pos==-1 - first free slot in backpack=0; pos==-2 - default if available or backpack
virtual void putArtifact ( const ArtifactLocation & al , const CArtifactInstance * a ) = 0 ;
virtual void removeArtifact ( const ArtifactLocation & al ) = 0 ;
2012-04-14 05:20:22 +03:00
virtual bool moveArtifact ( const ArtifactLocation & al1 , const ArtifactLocation & al2 ) = 0 ;
2010-12-26 16:34:11 +02:00
2008-12-27 03:01:59 +02:00
virtual void showCompInfo ( ShowInInfobox * comp ) = 0 ;
virtual void heroVisitCastle ( int obj , int heroID ) = 0 ;
virtual void stopHeroVisitCastle ( int obj , int heroID ) = 0 ;
2009-09-13 01:17:23 +03:00
virtual 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 ) = 0 ; //use hero=NULL for no hero
virtual void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , boost : : function < void ( BattleResult * ) > cb = 0 , bool creatureBank = false ) = 0 ; //if any of armies is hero, hero will be used
virtual void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , boost : : function < void ( BattleResult * ) > cb = 0 , bool creatureBank = false ) = 0 ; //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
virtual void setAmount ( int objid , ui32 val ) = 0 ;
2009-04-16 03:28:54 +03:00
virtual bool moveHero ( si32 hid , int3 dst , ui8 instant , ui8 asker = 255 ) = 0 ;
2009-02-04 15:40:54 +02:00
virtual void giveHeroBonus ( GiveBonus * bonus ) = 0 ;
virtual void setMovePoints ( SetMovePoints * smp ) = 0 ;
2009-02-06 13:15:39 +02:00
virtual void setManaPoints ( int hid , int val ) = 0 ;
2009-02-14 21:12:40 +02:00
virtual void giveHero ( int id , int player ) = 0 ;
2009-02-20 12:36:15 +02:00
virtual void changeObjPos ( int objid , int3 newPos , ui8 flags ) = 0 ;
2009-03-14 13:25:25 +02:00
virtual void sendAndApply ( CPackForClient * info ) = 0 ;
2009-06-16 14:18:14 +03:00
virtual void heroExchange ( si32 hero1 , si32 hero2 ) = 0 ; //when two heroes meet on adventure map
2012-09-24 21:52:30 +03:00
virtual void addQuest ( int player , QuestInfo & quest ) { } ;
2011-05-22 21:46:52 +03:00
} ;
/// Interface class for handling general game logic and actions
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE IGameCallback : public CPrivilagedInfoCallback , public IGameEventCallback
2011-05-22 21:46:52 +03:00
{
public :
virtual ~ IGameCallback ( ) { } ;
//do sth
2011-05-28 04:02:28 +03:00
const CGObjectInstance * putNewObject ( int ID , int subID , int3 pos ) ;
const CGCreature * putNewMonster ( int creID , int count , int3 pos ) ;
2009-03-14 13:25:25 +02:00
2009-09-21 12:00:33 +03:00
friend struct CPack ;
2009-03-07 00:25:19 +02:00
friend struct CPackForClient ;
2009-03-09 12:37:49 +02:00
friend struct CPackForServer ;
2008-12-27 03:01:59 +02:00
} ;