2009-04-16 14:14:13 +03:00
# ifndef __CGAMEINTERFACE_H__
# define __CGAMEINTERFACE_H__
# include "global.h"
# include <set>
# include <vector>
# include "lib/BattleAction.h"
# include "client/FunctionList.h"
2009-04-15 17:03:31 +03:00
/*
* CGameInterface . 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
*/
using namespace boost : : logic ;
class CCallback ;
2011-05-03 06:14:18 +03:00
class CBattleCallback ;
2009-04-16 14:14:13 +03:00
class ICallback ;
class CGlobalAI ;
2010-02-10 04:56:00 +02:00
struct Component ;
2009-04-16 14:14:13 +03:00
class CSelectableComponent ;
2009-07-03 22:57:14 +03:00
struct TryMoveHero ;
2009-04-16 14:14:13 +03:00
class CGHeroInstance ;
class CGTownInstance ;
class CGObjectInstance ;
2010-06-27 19:03:01 +03:00
class CGBlackMarket ;
2009-07-06 22:41:27 +03:00
class CGDwelling ;
2009-04-16 14:14:13 +03:00
class CCreatureSet ;
class CArmedInstance ;
2009-07-26 06:33:13 +03:00
class IShipyard ;
2010-05-18 10:01:54 +03:00
class IMarket ;
2009-04-16 14:14:13 +03:00
struct BattleResult ;
struct BattleAttack ;
struct BattleStackAttacked ;
2010-05-16 16:42:19 +03:00
struct BattleSpellCast ;
2009-04-16 14:14:13 +03:00
struct SetStackEffect ;
2010-05-02 21:20:26 +03:00
struct Bonus ;
2009-04-16 14:14:13 +03:00
struct PackageApplied ;
2009-07-30 15:49:45 +03:00
struct SetObjectProperty ;
2009-09-01 16:54:13 +03:00
struct CatapultAttack ;
2009-09-05 17:10:26 +03:00
struct BattleStacksRemoved ;
2010-12-14 23:55:23 +02:00
struct StackLocation ;
class CStackInstance ;
2010-12-23 22:18:10 +02:00
class CStack ;
2010-12-14 23:55:23 +02:00
class CCreature ;
2009-04-16 14:14:13 +03:00
class CLoadFile ;
class CSaveFile ;
2010-12-22 22:14:40 +02:00
typedef si32 TQuantity ;
2009-04-16 14:14:13 +03:00
template < typename Serializer > class CISer ;
template < typename Serializer > class COSer ;
2011-01-06 22:00:19 +02:00
struct ArtifactLocation ;
2009-04-16 14:14:13 +03:00
2010-12-22 22:14:40 +02:00
class CBattleGameInterface
2009-04-16 14:14:13 +03:00
{
public :
bool human ;
2010-08-03 14:36:52 +03:00
int playerID ;
2009-04-16 14:14:13 +03:00
std : : string dllName ;
2010-12-22 22:14:40 +02:00
virtual ~ CBattleGameInterface ( ) { } ;
2011-05-03 06:14:18 +03:00
virtual void init ( CBattleCallback * CB ) { } ;
2010-12-22 22:14:40 +02:00
//battle call-ins
virtual void actionFinished ( const BattleAction * action ) { } ; //occurs AFTER every action taken by any stack or by the hero
virtual void actionStarted ( const BattleAction * action ) { } ; //occurs BEFORE every action taken by any stack or by the hero
2010-12-23 22:18:10 +02:00
virtual BattleAction activeStack ( const CStack * stack ) = 0 ; //called when it's turn of that stack
2010-12-22 22:14:40 +02:00
virtual void battleAttack ( const BattleAttack * ba ) { } ; //called when stack is performing attack
virtual void battleStacksAttacked ( const std : : vector < BattleStackAttacked > & bsa ) { } ; //called when stack receives damage (after battleAttack())
virtual void battleEnd ( const BattleResult * br ) { } ;
virtual void battleResultsApplied ( ) { } ; //called when all effects of last battle are applied
virtual void battleNewRoundFirst ( int round ) { } ; //called at the beginning of each turn before changes are applied;
2011-05-03 06:14:18 +03:00
virtual void battleNewRound ( int round ) { } ; //called at the beginning of each turn, round=-1 is the tactic phase, round=0 is the first "normal" turn
2010-12-24 23:44:48 +02:00
virtual void battleStackMoved ( const CStack * stack , THex dest , int distance , bool end ) { } ;
2010-12-22 22:14:40 +02:00
virtual void battleSpellCast ( const BattleSpellCast * sc ) { } ;
virtual void battleStacksEffectsSet ( const SetStackEffect & sse ) { } ; //called when a specific effect is set to stacks
virtual void battleStart ( const CCreatureSet * army1 , const CCreatureSet * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool side ) { } ; //called by engine when battle starts; side=0 - left, side=1 - right
virtual void battleStacksHealedRes ( const std : : vector < std : : pair < ui32 , ui32 > > & healedStacks , bool lifeDrain , si32 lifeDrainFrom ) { } ; //called when stacks are healed / resurrected first element of pair - stack id, second - healed hp
2010-12-23 22:18:10 +02:00
virtual void battleNewStackAppeared ( const CStack * stack ) { } ; //not called at the beginning of a battle or by resurrection; called eg. when elemental is summoned
2010-12-22 22:14:40 +02:00
virtual void battleObstaclesRemoved ( const std : : set < si32 > & removedObstacles ) { } ; //called when a certain set of obstacles is removed from batlefield; IDs of them are given
virtual void battleCatapultAttacked ( const CatapultAttack & ca ) { } ; //called when catapult makes an attack
virtual void battleStacksRemoved ( const BattleStacksRemoved & bsr ) { } ; //called when certain stack is completely removed from battlefield
} ;
2011-02-22 13:52:36 +02:00
/// Central class for managing human player / AI interface logic
2010-12-22 22:14:40 +02:00
class CGameInterface : public CBattleGameInterface
{
public :
2009-04-16 14:14:13 +03:00
virtual void buildChanged ( const CGTownInstance * town , int buildingID , int what ) { } ; //what: 1 - built, 2 - demolished
2010-12-14 23:55:23 +02:00
//garrison operations
virtual void stackChagedCount ( const StackLocation & location , const TQuantity & change , bool isAbsolute ) { } ; //if absolute, change is the new count; otherwise count was modified by adding change
virtual void stackChangedType ( const StackLocation & location , const CCreature & newType ) { } ; //used eg. when upgrading creatures
virtual void stacksErased ( const StackLocation & location ) { } ; //stack removed from previously filled slot
virtual void stacksSwapped ( const StackLocation & loc1 , const StackLocation & loc2 ) { } ;
virtual void newStackInserted ( const StackLocation & location , const CStackInstance & stack ) { } ; //new stack inserted at given (previously empty position)
virtual void stacksRebalanced ( const StackLocation & src , const StackLocation & dst , TQuantity count ) { } ; //moves creatures from src stack to dst slot, may be used for merging/splittint/moving stacks
//virtual void garrisonChanged(const CGObjectInstance * obj){};
//artifacts operations
2011-01-06 22:00:19 +02:00
virtual void artifactPut ( const ArtifactLocation & al ) { } ;
virtual void artifactRemoved ( const ArtifactLocation & al ) { } ;
2011-01-22 05:43:20 +02:00
virtual void artifactAssembled ( const ArtifactLocation & al ) { } ;
virtual void artifactDisassembled ( const ArtifactLocation & al ) { } ;
2011-01-06 22:00:19 +02:00
virtual void artifactMoved ( const ArtifactLocation & src , const ArtifactLocation & dst ) { } ;
2010-12-14 23:55:23 +02:00
2009-04-16 14:14:13 +03:00
virtual void heroCreated ( const CGHeroInstance * ) { } ;
virtual void heroGotLevel ( const CGHeroInstance * hero , int pskill , std : : vector < ui16 > & skills , boost : : function < void ( ui32 ) > & callback ) = 0 ; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
virtual void heroInGarrisonChange ( const CGTownInstance * town ) { } ;
2009-08-13 04:03:11 +03:00
//virtual void heroKilled(const CGHeroInstance*){};
2009-07-03 22:57:14 +03:00
virtual void heroMoved ( const TryMoveHero & details ) { } ;
2009-08-16 18:39:18 +03:00
virtual void heroPrimarySkillChanged ( const CGHeroInstance * hero , int which , si64 val ) { } ;
2010-07-20 17:08:13 +03:00
virtual void heroSecondarySkillChanged ( const CGHeroInstance * hero , int which , int val ) { } ;
2009-04-16 14:14:13 +03:00
virtual void heroManaPointsChanged ( const CGHeroInstance * hero ) { } //not called at the beginning of turn and after spell casts
virtual void heroMovePointsChanged ( const CGHeroInstance * hero ) { } //not called at the beginning of turn and after movement
virtual void heroVisitsTown ( const CGHeroInstance * hero , const CGTownInstance * town ) { } ;
2011-05-03 06:14:18 +03:00
virtual void init ( CCallback * CB ) { } ;
2009-04-16 14:14:13 +03:00
virtual void receivedResource ( int type , int val ) { } ;
2009-04-30 17:59:30 +03:00
virtual void showInfoDialog ( const std : : string & text , const std : : vector < Component * > & components , int soundID ) { } ;
2009-07-26 13:43:22 +03:00
virtual void showRecruitmentDialog ( const CGDwelling * dwelling , const CArmedInstance * dst , int level ) { }
2009-07-26 06:33:13 +03:00
virtual void showShipyardDialog ( const IShipyard * obj ) { } //obj may be town or shipyard; state: 0 - can buid, 1 - lack of resources, 2 - dest tile is blocked, 3 - no water
2009-04-30 17:59:30 +03:00
virtual void showBlockingDialog ( const std : : string & text , const std : : vector < Component > & components , ui32 askID , const int soundID , bool selection , bool cancel ) = 0 ; //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID.
2009-09-09 20:49:03 +03:00
virtual void showGarrisonDialog ( const CArmedInstance * up , const CGHeroInstance * down , bool removableUnits , boost : : function < void ( ) > & onEnd ) = 0 ; //all stacks operations between these objects become allowed, interface has to call onEnd when done
2010-02-10 04:56:00 +02:00
virtual void showPuzzleMap ( ) { } ;
2010-05-18 10:01:54 +03:00
virtual void showMarketWindow ( const IMarket * market , const CGHeroInstance * visitor ) { } ;
2010-07-20 17:08:13 +03:00
virtual void showUniversityWindow ( const IMarket * market , const CGHeroInstance * visitor ) { } ;
2010-07-22 03:32:45 +03:00
virtual void showHillFortWindow ( const CGObjectInstance * object , const CGHeroInstance * visitor ) { } ;
2010-07-09 02:03:27 +03:00
virtual void showTavernWindow ( const CGObjectInstance * townOrTavern ) { } ;
2010-05-16 16:42:19 +03:00
virtual void advmapSpellCast ( const CGHeroInstance * caster , int spellID ) { } ; //called when a hero casts a spell
2011-01-20 19:25:15 +02:00
virtual void tileHidden ( const boost : : unordered_set < int3 , ShashInt3 > & pos ) { } ;
virtual void tileRevealed ( const boost : : unordered_set < int3 , ShashInt3 > & pos ) { } ;
2009-07-26 06:33:13 +03:00
virtual void newObject ( const CGObjectInstance * obj ) { } ; //eg. ship built in shipyard
2010-06-27 19:03:01 +03:00
virtual void availableArtifactsChanged ( const CGBlackMarket * bm = NULL ) { } ; //bm may be NULL, then artifacts are changed in the global pool (used by merchants in towns)
2009-04-16 14:14:13 +03:00
virtual void yourTurn ( ) { } ;
2009-08-13 04:03:11 +03:00
virtual void centerView ( int3 pos , int focusTime ) { } ;
2009-07-26 13:43:22 +03:00
virtual void availableCreaturesChanged ( const CGDwelling * town ) { } ;
2010-05-02 21:20:26 +03:00
virtual void heroBonusChanged ( const CGHeroInstance * hero , const Bonus & bonus , bool gain ) { } ; //if gain hero received bonus, else he lost it
virtual void playerBonusChanged ( const Bonus & bonus , bool gain ) { } ; //if gain hero received bonus, else he lost it
2009-06-16 14:18:14 +03:00
virtual void requestRealized ( PackageApplied * pa ) { } ;
virtual void heroExchangeStarted ( si32 hero1 , si32 hero2 ) { } ;
2009-07-30 15:49:45 +03:00
virtual void objectPropertyChanged ( const SetObjectProperty * sop ) { } ; //eg. mine has been flagged
2009-08-04 02:53:18 +03:00
virtual void objectRemoved ( const CGObjectInstance * obj ) { } ; //eg. collected resource, picked artifact, beaten hero
virtual void playerBlocked ( int reason ) { } ; //reason: 0 - upcoming battle
2010-01-29 22:52:45 +02:00
virtual void gameOver ( ui8 player , bool victory ) { } ; //player lost or won the game
2009-04-16 14:14:13 +03:00
virtual void serialize ( COSer < CSaveFile > & h , const int version ) { } ; //saving
virtual void serialize ( CISer < CLoadFile > & h , const int version ) { } ; //loading
} ;
2010-12-22 22:14:40 +02:00
2009-04-16 14:14:13 +03:00
class CAIHandler
{
public :
2011-02-23 05:57:45 +02:00
static CGlobalAI * getNewAI ( std : : string dllname ) ;
static CBattleGameInterface * getNewBattleAI ( std : : string dllname ) ;
2009-04-16 14:14:13 +03:00
} ;
class CGlobalAI : public CGameInterface // AI class (to derivate)
{
public :
//CGlobalAI();
2010-12-23 22:18:10 +02:00
virtual void yourTurn ( ) OVERRIDE { } ;
2009-04-16 14:14:13 +03:00
virtual void heroKilled ( const CGHeroInstance * ) { } ;
2010-12-23 22:18:10 +02:00
virtual void heroCreated ( const CGHeroInstance * ) OVERRIDE { } ;
2010-12-24 23:44:48 +02:00
virtual void battleStackMoved ( const CStack * stack , THex dest , int distance , bool end ) OVERRIDE { } ;
2010-12-23 22:18:10 +02:00
virtual void battleStackAttacking ( int ID , int dest ) { } ;
virtual void battleStacksAttacked ( const std : : vector < BattleStackAttacked > & bsa ) OVERRIDE { } ;
virtual BattleAction activeStack ( const CStack * stack ) OVERRIDE ;
2009-04-16 14:14:13 +03:00
} ;
# endif // __CGAMEINTERFACE_H__