2007-08-01 17:06:04 +03:00
# ifndef CGAMEINTERFACE_H
# define CGAMEINTERFACE_H
2007-11-19 00:58:28 +02:00
# include "global.h"
2008-05-18 20:33:39 +03:00
# include <set>
2008-04-07 20:51:46 +03:00
# include <vector>
2008-08-04 18:56:36 +03:00
# include "lib/BattleAction.h"
2008-08-15 15:11:42 +03:00
# include "client/FunctionList.h"
2007-09-18 16:30:26 +03:00
2007-08-04 00:47:34 +03:00
using namespace boost : : logic ;
2007-09-14 16:11:10 +03:00
class CCallback ;
2008-04-07 20:51:46 +03:00
class ICallback ;
2007-11-19 00:58:28 +02:00
class CGlobalAI ;
2007-10-27 22:38:48 +03:00
class CGHeroInstance ;
2008-07-31 00:27:15 +03:00
class Component ;
2007-12-27 02:11:46 +02:00
class CSelectableComponent ;
2008-04-07 20:51:46 +03:00
struct HeroMoveDetails ;
class CGHeroInstance ;
class CGTownInstance ;
class CGObjectInstance ;
class CCreatureSet ;
2008-04-15 19:52:31 +03:00
class CArmedInstance ;
2008-08-04 18:56:36 +03:00
struct BattleResult ;
2008-08-09 02:02:32 +03:00
struct BattleAttack ;
2008-02-25 01:06:27 +02:00
class CObstacle
{
int ID ;
int position ;
//TODO: add some kind of the blockmap
} ;
2008-05-18 20:33:39 +03:00
struct StackState
{
2008-06-04 16:00:56 +03:00
StackState ( ) { attackBonus = defenseBonus = healthBonus = speedBonus = morale = luck = shotsLeft = currentHealth = 0 ; } ;
2008-05-18 20:33:39 +03:00
int attackBonus , defenseBonus , healthBonus , speedBonus ;
int currentHealth ;
int shotsLeft ;
2008-08-02 18:08:03 +03:00
std : : set < int > effects ;
2008-05-18 20:33:39 +03:00
int morale , luck ;
} ;
2007-08-04 00:47:34 +03:00
class CGameInterface
{
2007-08-04 22:01:22 +03:00
public :
bool human ;
2007-08-06 07:03:34 +03:00
int playerID , serialID ;
2007-08-04 22:01:22 +03:00
2008-08-22 15:21:09 +03:00
virtual void buildChanged ( const CGTownInstance * town , int buildingID , int what ) { } ; //what: 1 - built, 2 - demolished
virtual void garrisonChanged ( const CGObjectInstance * obj ) { } ;
2008-08-02 18:08:03 +03:00
virtual void heroCreated ( const CGHeroInstance * ) { } ;
2008-08-22 15:21:09 +03:00
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 ) { } ;
virtual void heroKilled ( const CGHeroInstance * ) { } ;
2008-08-02 18:08:03 +03:00
virtual void heroMoved ( const HeroMoveDetails & details ) { } ;
2008-08-22 15:21:09 +03:00
virtual void heroPrimarySkillChanged ( const CGHeroInstance * hero , int which , int val ) { } ;
2008-01-28 16:01:09 +02:00
virtual void heroVisitsTown ( const CGHeroInstance * hero , const CGTownInstance * town ) { } ;
2008-08-22 15:21:09 +03:00
virtual void init ( ICallback * CB ) { } ;
2007-11-25 15:16:45 +02:00
virtual void receivedResource ( int type , int val ) { } ;
2008-08-20 09:57:53 +03:00
virtual void showInfoDialog ( std : : string & text , const std : : vector < Component * > & components ) { } ;
virtual void showSelDialog ( std : : string & text , const std : : vector < Component * > & components , ui32 askID ) { } ;
2008-08-22 15:21:09 +03:00
virtual void showYesNoDialog ( std : : string & text , const std : : vector < Component * > & components , ui32 askID ) { } ;
virtual void tileHidden ( int3 pos ) { } ;
virtual void tileRevealed ( int3 pos ) { } ;
virtual void yourTurn ( ) { } ;
2008-08-02 18:08:03 +03:00
//battle call-ins
2008-08-09 02:02:32 +03:00
//virtual void actionFinished(BattleAction action){};//occurs AFTER every action taken by any stack or by the hero
2008-08-22 15:21:09 +03:00
//virtual void actionStarted(BattleAction action){};//occurs BEFORE every action taken by any stack or by the hero
2008-04-15 19:52:31 +03:00
virtual BattleAction activeStack ( int stackID ) = 0 ; //called when it's turn of that stack
2008-08-09 02:02:32 +03:00
virtual void battleAttack ( BattleAttack * ba ) { } ;
2008-08-22 15:21:09 +03:00
virtual void battleEnd ( BattleResult * br ) { } ;
virtual void battleNewRound ( int round ) { } ; //called at the beggining of each turn, round=-1 is the tactic phase, round=0 is the first "normal" turn
2008-08-02 18:08:03 +03:00
virtual void battleStackKilled ( int ID , int dmg , int killed , int IDby , bool byShooting ) = 0 ;
2008-08-22 15:21:09 +03:00
virtual void battleStackMoved ( int ID , int dest , bool startMoving , bool endMoving ) = 0 ;
virtual void battleStart ( CCreatureSet * army1 , CCreatureSet * army2 , int3 tile , CGHeroInstance * hero1 , CGHeroInstance * hero2 , bool side ) { } ; //called by engine when battle starts; side=0 - left, side=1 - right
virtual void battlefieldPrepared ( int battlefieldType , std : : vector < CObstacle * > obstacles ) { } ; //called when battlefield is prepared, prior the battle beginning
2008-02-25 01:06:27 +02:00
//
2007-08-04 00:47:34 +03:00
} ;
2007-10-21 19:45:13 +03:00
class CAIHandler
{
public :
static CGlobalAI * getNewAI ( CCallback * cb , std : : string dllname ) ;
} ;
2007-08-25 07:56:25 +03:00
class CGlobalAI : public CGameInterface // AI class (to derivate)
2007-08-04 00:47:34 +03:00
{
2007-08-04 22:01:22 +03:00
public :
2007-10-21 19:45:13 +03:00
//CGlobalAI();
2007-08-04 22:01:22 +03:00
virtual void yourTurn ( ) { } ;
2007-10-27 22:38:48 +03:00
virtual void heroKilled ( const CGHeroInstance * ) { } ;
virtual void heroCreated ( const CGHeroInstance * ) { } ;
2008-04-14 21:24:46 +03:00
virtual void battleStackMoved ( int ID , int dest , bool startMoving , bool endMoving ) { } ;
2008-05-30 14:53:04 +03:00
virtual void battleStackAttacking ( int ID , int dest ) { } ;
2008-08-02 18:08:03 +03:00
virtual void battleStackIsAttacked ( int ID , int dmg , int killed , int IDby , bool byShooting ) { } ;
virtual void battleStackKilled ( int ID , int dmg , int killed , int IDby , bool byShooting ) { } ;
2008-04-15 19:52:31 +03:00
virtual BattleAction activeStack ( int stackID ) { BattleAction ba ; ba . actionType = 3 ; ba . stackNumber = stackID ; return ba ; } ;
2007-07-28 12:44:10 +03:00
} ;
2008-08-02 18:08:03 +03:00
# endif //CGAMEINTERFACE_H