2014-04-19 21:44:21 +04:00
/*
2014-04-20 12:58:58 +04:00
* CGameInfoCallback . h , part of VCMI engine
2014-04-19 21:44:21 +04:00
*
* 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
*
*/
2017-07-13 11:26:03 +03:00
# pragma once
2025-05-11 11:58:09 +03:00
# include "IGameInfoCallback.h"
2023-08-30 22:07:02 +03:00
2025-05-11 11:58:09 +03:00
# include "../int3.h"
2022-07-26 16:07:42 +03:00
VCMI_LIB_NAMESPACE_BEGIN
2014-04-19 21:44:21 +04:00
struct PlayerSettings ;
struct TerrainTile ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
struct InfoAboutHero ;
2014-04-19 21:44:21 +04:00
struct InfoAboutTown ;
2025-05-11 11:58:09 +03:00
struct SThievesGuildInfo ;
struct TeamState ;
struct TurnTimerInfo ;
struct ArtifactLocation ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
2025-05-11 11:58:09 +03:00
class IGameSettings ;
class PlayerState ;
2024-11-19 10:49:14 +01:00
class UpgradeInfo ;
2014-04-19 21:44:21 +04:00
class CMapHeader ;
2017-07-20 07:08:49 +03:00
class CGameState ;
2018-10-07 14:51:27 +03:00
class PathfinderConfig ;
2023-10-23 19:37:18 +03:00
class CArtifactSet ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
class CArmedInstance ;
class CGTeleport ;
class CGTownInstance ;
2024-08-20 17:15:50 +03:00
class IMarket ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
2025-05-14 13:39:37 +03:00
# if SCRIPTING_ENABLED
namespace scripting
{
class Pool ;
}
# endif
namespace vstd
{
class RNG ;
}
2023-08-30 22:07:02 +03:00
class DLL_LINKAGE CGameInfoCallback : public IGameInfoCallback
2014-04-19 21:44:21 +04:00
{
protected :
2023-04-16 20:42:56 +03:00
bool hasAccess ( std : : optional < PlayerColor > playerId ) const ;
2014-04-19 21:44:21 +04:00
bool canGetFullInfo ( const CGObjectInstance * obj ) const ; //true we player owns obj or ally owns obj or privileged mode
bool isOwnedOrVisited ( const CGObjectInstance * obj ) const ;
public :
2025-05-14 13:39:37 +03:00
virtual CGameState & gameState ( ) = 0 ;
virtual const CGameState & gameState ( ) const = 0 ;
2014-04-19 21:44:21 +04:00
//various
2023-08-19 22:35:44 +03:00
int getDate ( Date mode = Date : : DAY ) const override ; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month
2025-03-03 14:46:15 +00:00
const StartInfo * getStartInfo ( ) const override ;
const StartInfo * getInitialStartInfo ( ) const override ;
2023-11-05 15:24:26 +02:00
bool isAllowed ( SpellID id ) const override ;
bool isAllowed ( ArtifactID id ) const override ;
bool isAllowed ( SecondarySkill id ) const override ;
2024-08-31 11:00:36 +00:00
const IGameSettings & getSettings ( ) const ;
2014-04-19 21:44:21 +04:00
//player
2023-08-30 22:07:02 +03:00
std : : optional < PlayerColor > getPlayerID ( ) const override ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
const Player * getPlayer ( PlayerColor color ) const override ;
virtual const PlayerState * getPlayerState ( PlayerColor color , bool verbose = true ) const ;
2023-04-05 03:26:29 +03:00
virtual int getResource ( PlayerColor Player , GameResID which ) const ;
2023-08-19 21:43:50 +03:00
virtual PlayerRelations getPlayerRelations ( PlayerColor color1 , PlayerColor color2 ) const ;
2018-07-26 12:06:55 +02:00
virtual void getThievesGuildInfo ( SThievesGuildInfo & thi , const CGObjectInstance * obj ) ; //get thieves' guild info obtainable while visiting given object
2023-08-19 21:43:50 +03:00
virtual EPlayerStatus getPlayerStatus ( PlayerColor player , bool verbose = true ) const ; //-1 if no such player
2023-08-25 01:08:48 +03:00
virtual bool isPlayerMakingTurn ( PlayerColor player ) const ; //player that currently makes move // TODO synchronous turns
2018-07-26 12:06:55 +02:00
virtual const PlayerSettings * getPlayerSettings ( PlayerColor color ) const ;
2023-08-14 02:16:25 +04:00
virtual TurnTimerInfo getPlayerTurnTime ( PlayerColor color ) const ;
2014-04-19 21:44:21 +04:00
2022-12-07 21:50:45 +02:00
//map
2023-04-16 20:42:56 +03:00
virtual bool isVisible ( int3 pos , const std : : optional < PlayerColor > & Player ) const ;
virtual bool isVisible ( const CGObjectInstance * obj , const std : : optional < PlayerColor > & Player ) const ;
virtual bool isVisible ( const CGObjectInstance * obj ) const ;
2022-12-07 21:50:45 +02:00
virtual bool isVisible ( int3 pos ) const ;
2014-04-19 21:44:21 +04:00
//armed object
2024-11-19 10:49:14 +01:00
virtual void fillUpgradeInfo ( const CArmedInstance * obj , SlotID stackPos , UpgradeInfo & out ) const ;
2014-04-19 21:44:21 +04:00
//hero
2024-02-10 20:22:08 +01:00
const CGHeroInstance * getHero ( ObjectInstanceID objid ) const override ;
2018-07-26 12:06:55 +02:00
virtual int getHeroCount ( PlayerColor player , bool includeGarrisoned ) const ;
virtual bool getHeroInfo ( const CGObjectInstance * hero , InfoAboutHero & dest , const CGObjectInstance * selectedObject = nullptr ) const ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
virtual int32_t getSpellCost ( const spells : : Spell * sp , const CGHeroInstance * caster ) const ; //when called during battle, takes into account creatures' spell cost reduction
2018-07-26 12:06:55 +02:00
virtual int64_t estimateSpellDamage ( const CSpell * sp , const CGHeroInstance * hero ) const ; //estimates damage of given spell; returns 0 if spell causes no dmg
virtual const CArtifactInstance * getArtInstance ( ArtifactInstanceID aid ) const ;
virtual const CGObjectInstance * getObjInstance ( ObjectInstanceID oid ) const ;
2024-02-01 10:43:16 +02:00
virtual const CArtifactSet * getArtSet ( const ArtifactLocation & loc ) const ;
2018-07-26 12:06:55 +02:00
//virtual const CGObjectInstance * getArmyInstance(ObjectInstanceID oid) const;
2014-04-19 21:44:21 +04:00
//objects
2024-02-10 20:22:08 +01:00
const CGObjectInstance * getObj ( ObjectInstanceID objid , bool verbose = true ) const override ;
2025-03-03 13:49:54 +00:00
virtual std : : vector < const CGObjectInstance * > getBlockingObjs ( int3 pos ) const ;
std : : vector < const CGObjectInstance * > getVisitableObjs ( int3 pos , bool verbose = true ) const override ;
std : : vector < const CGObjectInstance * > getAllVisitableObjs ( ) const ;
virtual std : : vector < const CGObjectInstance * > getFlaggableObjects ( int3 pos ) const ;
virtual const CGObjectInstance * getTopObj ( int3 pos ) const ;
2018-07-26 12:06:55 +02:00
virtual PlayerColor getOwner ( ObjectInstanceID heroID ) const ;
2024-08-20 17:15:50 +03:00
virtual const IMarket * getMarket ( ObjectInstanceID objid ) const ;
2014-04-19 21:44:21 +04:00
//map
2018-07-26 12:06:55 +02:00
virtual int3 guardingCreaturePosition ( int3 pos ) const ;
virtual std : : vector < const CGObjectInstance * > getGuardingCreatures ( int3 pos ) const ;
2024-04-10 18:19:48 +03:00
virtual bool isTileGuardedUnchecked ( int3 tile ) const ;
2018-07-26 12:06:55 +02:00
virtual const CMapHeader * getMapHeader ( ) const ;
virtual int3 getMapSize ( ) const ; //returns size of map - z is 1 for one - level map and 2 for two level map
virtual const TerrainTile * getTile ( int3 tile , bool verbose = true ) const ;
2024-04-10 18:19:48 +03:00
virtual const TerrainTile * getTileUnchecked ( int3 tile ) const ;
2018-07-26 12:06:55 +02:00
virtual bool isInTheMap ( const int3 & pos ) const ;
2023-04-16 01:48:49 +03:00
virtual void getVisibleTilesInRange ( std : : unordered_set < int3 > & tiles , int3 pos , int radious , int3 : : EDistanceFormula distanceFormula = int3 : : DIST_2D ) const ;
2025-01-23 14:39:56 +00:00
virtual void calculatePaths ( const std : : shared_ptr < PathfinderConfig > & config ) const ;
2023-02-22 17:24:42 +02:00
virtual EDiggingStatus getTileDigStatus ( int3 tile , bool verbose = true ) const ;
2014-04-19 21:44:21 +04:00
//town
2018-07-26 12:06:55 +02:00
virtual const CGTownInstance * getTown ( ObjectInstanceID objid ) const ;
virtual int howManyTowns ( PlayerColor Player ) const ;
//virtual const CGTownInstance * getTownInfo(int val, bool mode)const; //mode = 0 -> val = player town serial; mode = 1 -> val = object id (serial)
virtual std : : vector < const CGHeroInstance * > getAvailableHeroes ( const CGObjectInstance * townOrTavern ) const ; //heroes that can be recruited
virtual std : : string getTavernRumor ( const CGObjectInstance * townOrTavern ) const ;
2023-08-19 22:35:44 +03:00
virtual EBuildingState canBuildStructure ( const CGTownInstance * t , BuildingID 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
2015-02-06 17:36:09 +03:00
virtual bool getTownInfo ( const CGObjectInstance * town , InfoAboutTown & dest , const CGObjectInstance * selectedObject = nullptr ) const ;
2014-04-19 21:44:21 +04:00
//from gs
2018-07-26 12:06:55 +02:00
virtual const TeamState * getTeam ( TeamID teamID ) const ;
virtual const TeamState * getPlayerTeam ( PlayerColor color ) const ;
2023-08-19 22:35:44 +03:00
//virtual EBuildingState canBuildStructure(const CGTownInstance *t, BuildingID 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
2015-03-08 16:21:14 +03:00
//teleport
2018-07-26 12:06:55 +02:00
virtual std : : vector < ObjectInstanceID > getVisibleTeleportObjects ( std : : vector < ObjectInstanceID > ids , PlayerColor player ) const ;
2024-06-24 03:23:26 +02:00
virtual std : : vector < ObjectInstanceID > getTeleportChannelEntrances ( TeleportChannelID id , PlayerColor Player = PlayerColor : : UNFLAGGABLE ) const ;
2018-07-26 12:06:55 +02:00
virtual std : : vector < ObjectInstanceID > getTeleportChannelExits ( TeleportChannelID id , PlayerColor Player = PlayerColor : : UNFLAGGABLE ) const ;
virtual ETeleportChannelType getTeleportChannelType ( TeleportChannelID id , PlayerColor player = PlayerColor : : UNFLAGGABLE ) const ;
virtual bool isTeleportChannelImpassable ( TeleportChannelID id , PlayerColor player = PlayerColor : : UNFLAGGABLE ) const ;
virtual bool isTeleportChannelBidirectional ( TeleportChannelID id , PlayerColor player = PlayerColor : : UNFLAGGABLE ) const ;
virtual bool isTeleportChannelUnidirectional ( TeleportChannelID id , PlayerColor player = PlayerColor : : UNFLAGGABLE ) const ;
virtual bool isTeleportEntrancePassable ( const CGTeleport * obj , PlayerColor player ) const ;
2025-05-14 13:39:37 +03:00
//used for random spawns
void getFreeTiles ( std : : vector < int3 > & tiles ) const ;
//mode 1 - only unrevealed tiles; mode 0 - all, mode -1 - only revealed
void getTilesInRange ( std : : unordered_set < int3 > & tiles ,
const int3 & pos ,
int radius ,
ETileVisibility mode ,
std : : optional < PlayerColor > player = std : : optional < PlayerColor > ( ) ,
int3 : : EDistanceFormula formula = int3 : : DIST_2D ) const ;
//returns all tiles on given level (-1 - both levels, otherwise number of level)
void getAllTiles ( std : : unordered_set < int3 > & tiles , std : : optional < PlayerColor > player , int level , std : : function < bool ( const TerrainTile * ) > filter ) const ;
//gives 3 treasures, 3 minors, 1 major -> used by Black Market and Artifact Merchant
void pickAllowedArtsSet ( std : : vector < ArtifactID > & out , vstd : : RNG & rand ) ;
void getAllowedSpells ( std : : vector < SpellID > & out , std : : optional < ui16 > level = std : : nullopt ) ;
# if SCRIPTING_ENABLED
virtual scripting : : Pool * getGlobalContextPool ( ) const ;
# endif
2014-04-19 21:44:21 +04:00
} ;
2022-07-26 16:07:42 +03:00
VCMI_LIB_NAMESPACE_END