2011-12-14 00:23:17 +03:00
# pragma once
2008-12-27 03:01:59 +02:00
# include "../client/FunctionList.h"
2009-05-20 13:08:56 +03:00
# include "../lib/CGameState.h"
2008-12-27 03:01:59 +02:00
# include "../lib/Connection.h"
# include "../lib/IGameCallback.h"
2009-03-09 12:37:49 +02:00
# include "../lib/BattleAction.h"
2010-08-18 17:24:30 +03:00
# include "../lib/NetPacks.h"
2009-04-15 17:03:31 +03:00
/*
* CGameHandler . 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
*
*/
2010-12-12 01:11:26 +02:00
class CGameHandler ;
2008-12-27 03:01:59 +02:00
class CVCMIServer ;
class CGameState ;
struct StartInfo ;
class CCPPObjectScript ;
class CScriptCallback ;
struct BattleResult ;
struct BattleAttack ;
struct BattleStackAttacked ;
2009-03-07 00:11:17 +02:00
struct CPack ;
struct Query ;
2010-01-30 14:46:15 +02:00
struct SetGarrisons ;
struct SetResource ;
struct SetResources ;
struct NewStructures ;
2008-12-27 03:01:59 +02:00
class CGHeroInstance ;
2010-05-18 10:01:54 +03:00
class IMarket ;
2008-12-27 03:01:59 +02:00
extern std : : map < ui32 , CFunctionList < void ( ui32 ) > > callbacks ; //question id => callback functions - for selection dialogs
extern boost : : mutex gsm ;
struct PlayerStatus
{
bool makingTurn , engagedIntoBattle ;
std : : set < ui32 > queries ;
PlayerStatus ( ) : makingTurn ( false ) , engagedIntoBattle ( false ) { } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & makingTurn & engagedIntoBattle & queries ;
}
} ;
class PlayerStatuses
{
public :
2012-09-24 19:14:53 +03:00
std : : map < TPlayerColor , PlayerStatus > players ;
2008-12-27 03:01:59 +02:00
boost : : mutex mx ;
boost : : condition_variable cv ; //notifies when any changes are made
2012-09-24 19:14:53 +03:00
void addPlayer ( TPlayerColor player ) ;
PlayerStatus operator [ ] ( TPlayerColor player ) ;
int getQueriesCount ( TPlayerColor player ) ; //returns 0 if there is no such player
bool checkFlag ( TPlayerColor player , bool PlayerStatus : : * flag ) ;
void setFlag ( TPlayerColor player , bool PlayerStatus : : * flag , bool val ) ;
void addQuery ( TPlayerColor player , ui32 id ) ;
void removeQuery ( TPlayerColor player , ui32 id ) ;
2008-12-27 03:01:59 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & players ;
}
} ;
2010-12-12 01:11:26 +02:00
struct CasualtiesAfterBattle
{
typedef std : : pair < StackLocation , int > TStackAndItsNewCount ;
enum { ERASE = - 1 } ;
std : : vector < TStackAndItsNewCount > newStackCounts ;
2013-02-14 02:55:42 +03:00
ObjectInstanceID heroWithDeadCommander ; //TODO: unify stack loactions
2010-12-12 01:11:26 +02:00
CasualtiesAfterBattle ( const CArmedInstance * army , BattleInfo * bat ) ;
void takeFromArmy ( CGameHandler * gh ) ;
} ;
2012-03-31 00:36:07 +03:00
class CGameHandler : public IGameCallback , CBattleInfoCallback
2008-12-27 03:01:59 +02:00
{
2010-12-04 21:15:20 +02:00
private :
void makeStackDoNothing ( const CStack * next ) ;
2013-02-14 02:55:42 +03:00
bool isAllowedExchangeForQuery ( ObjectInstanceID id1 , ObjectInstanceID id2 ) ;
2009-03-09 12:37:49 +02:00
public :
2008-12-27 03:01:59 +02:00
CVCMIServer * s ;
2009-04-12 03:58:41 +03:00
std : : map < int , CConnection * > connections ; //player color -> connection to client with interface of that player
2008-12-27 03:01:59 +02:00
PlayerStatuses states ; //player color -> player state
std : : set < CConnection * > conns ;
2009-04-12 03:58:41 +03:00
//queries stuff
2009-04-12 04:48:50 +03:00
boost : : recursive_mutex gsm ;
2009-04-12 03:58:41 +03:00
ui32 QID ;
2012-07-15 18:34:00 +03:00
//TODO get rid of cfunctionlist (or similar) and use serialziable callback structure
2009-04-12 03:58:41 +03:00
std : : map < ui32 , CFunctionList < void ( ui32 ) > > callbacks ; //query id => callback function - for selection and yes/no dialogs
2013-02-14 02:55:42 +03:00
std : : map < ui32 , std : : pair < ObjectInstanceID , ObjectInstanceID > > allowedExchanges ;
2009-04-12 03:58:41 +03:00
2013-02-09 00:17:39 +03:00
bool isBlockedByQueries ( const CPack * pack , int packType , TPlayerColor player ) ;
2013-02-14 02:55:42 +03:00
bool isAllowedExchange ( ObjectInstanceID id1 , ObjectInstanceID id2 ) ;
2011-09-17 21:15:10 +03:00
bool isAllowedArrangePack ( const ArrangeStacks * pack ) ;
2008-12-27 03:01:59 +02:00
void giveSpells ( const CGTownInstance * t , const CGHeroInstance * h ) ;
2011-12-22 16:05:19 +03:00
int moveStack ( int stack , BattleHex dest ) ; //returned value - travelled distance
2010-12-22 22:14:40 +02:00
void startBattle ( const CArmedInstance * armies [ 2 ] , int3 tile , const CGHeroInstance * heroes [ 2 ] , bool creatureBank , boost : : function < void ( BattleResult * ) > cb , const CGTownInstance * town = NULL ) ; //use hero=NULL for no hero
void runBattle ( ) ;
2013-02-06 02:16:13 +03:00
void checkLossVictory ( TPlayerColor player ) ;
2010-01-29 22:52:45 +02:00
void winLoseHandle ( ui8 players = 255 ) ; //players: bit field - colours of players to be checked; default: all
2013-02-07 20:34:50 +03:00
void getLossVicMessage ( TPlayerColor player , si8 standard , bool victory , InfoWindow & out ) const ;
2010-01-29 22:52:45 +02:00
2009-09-28 17:21:48 +03:00
////used only in endBattle - don't touch elsewhere
boost : : function < void ( BattleResult * ) > * battleEndCallback ;
2011-01-08 20:33:40 +02:00
//const CArmedInstance * bEndArmy1, * bEndArmy2;
2010-05-27 00:59:58 +03:00
bool visitObjectAfterVictory ;
2009-09-28 17:21:48 +03:00
//
void endBattle ( int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 ) ; //ends battle
2011-07-05 09:07:36 +03:00
void prepareAttack ( BattleAttack & bat , const CStack * att , const CStack * def , int distance , int targetHex ) ; //distance - number of hexes travelled before attacking
2011-07-04 22:34:49 +03:00
void applyBattleEffects ( BattleAttack & bat , const CStack * att , const CStack * def , int distance , bool secondary ) ; //damage, drain life & fire shield
2012-08-27 15:34:43 +03:00
void checkForBattleEnd ( ) ;
2010-12-22 22:14:40 +02:00
void setupBattle ( int3 tile , const CArmedInstance * armies [ 2 ] , const CGHeroInstance * heroes [ 2 ] , bool creatureBank , const CGTownInstance * town ) ;
2013-02-04 22:43:16 +03:00
void setBattleResult ( BattleResult : : EResult resultType , int victoriusSide ) ;
2008-12-27 03:01:59 +02:00
CGameHandler ( void ) ;
~ CGameHandler ( void ) ;
//////////////////////////////////////////////////////////////////////////
//from IGameCallback
//do sth
2013-02-11 02:24:57 +03:00
void changeSpells ( const CGHeroInstance * hero , bool give , const std : : set < SpellID > & spells ) OVERRIDE ;
2013-02-09 00:17:39 +03:00
bool removeObject ( const CGObjectInstance * obj ) OVERRIDE ;
2013-02-14 02:55:42 +03:00
void setBlockVis ( ObjectInstanceID objid , bool bv ) OVERRIDE ;
2013-02-09 00:17:39 +03:00
void setOwner ( const CGObjectInstance * obj , TPlayerColor owner ) OVERRIDE ;
2013-02-09 01:42:46 +03:00
void setHoverName ( const CGObjectInstance * objid , MetaString * name ) OVERRIDE ;
2013-02-09 00:17:39 +03:00
void changePrimSkill ( const CGHeroInstance * hero , PrimarySkill : : PrimarySkill which , si64 val , bool abs = false ) OVERRIDE ;
2013-02-12 22:49:40 +03:00
void changeSecSkill ( const CGHeroInstance * hero , SecondarySkill which , int val , bool abs = false ) OVERRIDE ;
2011-05-22 21:46:52 +03:00
//void showInfoDialog(InfoWindow *iw) OVERRIDE;
2010-12-26 16:34:11 +02:00
void showBlockingDialog ( BlockingDialog * iw , const CFunctionList < void ( ui32 ) > & callback ) OVERRIDE ;
ui32 showBlockingDialog ( BlockingDialog * iw ) OVERRIDE ; //synchronous version of above
2013-02-14 02:55:42 +03:00
void showGarrisonDialog ( ObjectInstanceID upobj , ObjectInstanceID hid , bool removableUnits , const boost : : function < void ( ) > & cb ) OVERRIDE ;
void showThievesGuildWindow ( TPlayerColor player , ObjectInstanceID requestingObjId ) OVERRIDE ;
2013-02-09 00:17:39 +03:00
void giveResource ( TPlayerColor player , Res : : ERes which , int val ) OVERRIDE ;
2010-12-26 16:34:11 +02:00
2011-05-10 01:20:47 +03:00
void giveCreatures ( const CArmedInstance * objid , const CGHeroInstance * h , const CCreatureSet & creatures , bool remove ) OVERRIDE ;
2013-02-14 02:55:42 +03:00
void takeCreatures ( ObjectInstanceID objid , const std : : vector < CStackBasicDescriptor > & creatures ) OVERRIDE ;
2010-12-26 16:34:11 +02:00
bool changeStackType ( const StackLocation & sl , CCreature * c ) OVERRIDE ;
bool changeStackCount ( const StackLocation & sl , TQuantity count , bool absoluteValue = false ) OVERRIDE ;
bool insertNewStack ( const StackLocation & sl , const CCreature * c , TQuantity count ) OVERRIDE ;
bool eraseStack ( const StackLocation & sl , bool forceRemoval = false ) OVERRIDE ;
bool swapStacks ( const StackLocation & sl1 , const StackLocation & sl2 ) OVERRIDE ;
bool addToSlot ( const StackLocation & sl , const CCreature * c , TQuantity count ) OVERRIDE ;
void tryJoiningArmy ( const CArmedInstance * src , const CArmedInstance * dst , bool removeObjWhenFinished , bool allowMerging ) OVERRIDE ;
bool moveStack ( const StackLocation & src , const StackLocation & dst , TQuantity count = - 1 ) OVERRIDE ;
2013-02-12 22:49:40 +03:00
void giveHeroNewArtifact ( const CGHeroInstance * h , const CArtifact * artType , ArtifactPosition pos ) OVERRIDE ;
void giveHeroArtifact ( const CGHeroInstance * h , const CArtifactInstance * a , ArtifactPosition pos ) OVERRIDE ;
2010-12-26 16:34:11 +02:00
void putArtifact ( const ArtifactLocation & al , const CArtifactInstance * a ) OVERRIDE ;
void removeArtifact ( const ArtifactLocation & al ) OVERRIDE ;
2012-04-14 05:20:22 +03:00
bool moveArtifact ( const ArtifactLocation & al1 , const ArtifactLocation & al2 ) OVERRIDE ;
2013-02-19 01:37:22 +03:00
void synchronizeArtifactHandlerLists ( ) OVERRIDE ;
2010-12-26 16:34:11 +02:00
void showCompInfo ( ShowInInfobox * comp ) OVERRIDE ;
2013-02-09 00:17:39 +03:00
void heroVisitCastle ( const CGTownInstance * obj , const CGHeroInstance * hero ) OVERRIDE ;
void stopHeroVisitCastle ( const CGTownInstance * obj , const CGHeroInstance * hero ) OVERRIDE ;
2010-12-29 23:04:22 +02:00
//bool removeArtifact(const CArtifact* art, int hid) OVERRIDE;
2010-12-26 16:34:11 +02:00
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 ) OVERRIDE ; //use hero=NULL for no hero
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , boost : : function < void ( BattleResult * ) > cb = 0 , bool creatureBank = false ) OVERRIDE ; //if any of armies is hero, hero will be used
void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , boost : : function < void ( BattleResult * ) > cb = 0 , bool creatureBank = false ) OVERRIDE ; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle//void startBattleI(int heroID, CCreatureSet army, int3 tile, boost::function<void(BattleResult*)> cb) OVERRIDE; //for hero<=>neutral army
2013-02-14 02:55:42 +03:00
void setAmount ( ObjectInstanceID objid , ui32 val ) OVERRIDE ;
bool moveHero ( ObjectInstanceID hid , int3 dst , ui8 instant , TPlayerColor asker = GameConstants : : NEUTRAL_PLAYER ) OVERRIDE ;
2010-12-26 16:34:11 +02:00
void giveHeroBonus ( GiveBonus * bonus ) OVERRIDE ;
void setMovePoints ( SetMovePoints * smp ) OVERRIDE ;
2013-02-14 02:55:42 +03:00
void setManaPoints ( ObjectInstanceID hid , int val ) OVERRIDE ;
void giveHero ( ObjectInstanceID id , TPlayerColor player ) OVERRIDE ;
void changeObjPos ( ObjectInstanceID objid , int3 newPos , ui8 flags ) OVERRIDE ;
void heroExchange ( ObjectInstanceID hero1 , ObjectInstanceID hero2 ) OVERRIDE ;
2010-12-26 16:34:11 +02:00
//////////////////////////////////////////////////////////////////////////
2013-02-14 02:55:42 +03:00
void useScholarSkill ( ObjectInstanceID hero1 , ObjectInstanceID hero2 ) ;
2010-08-24 17:26:57 +03:00
void setPortalDwelling ( const CGTownInstance * town , bool forced , bool clear ) ;
2010-12-26 16:34:11 +02:00
bool tryAttackingGuard ( const int3 & guardPos , const CGHeroInstance * h ) ;
void visitObjectOnTile ( const TerrainTile & t , const CGHeroInstance * h ) ;
2013-02-14 02:55:42 +03:00
bool teleportHero ( ObjectInstanceID hid , ObjectInstanceID dstid , ui8 source , TPlayerColor asker = GameConstants : : NEUTRAL_PLAYER ) ;
2010-12-26 16:34:11 +02:00
void vistiCastleObjects ( const CGTownInstance * t , const CGHeroInstance * h ) ;
2013-02-12 22:49:40 +03:00
void levelUpHero ( const CGHeroInstance * hero , SecondarySkill skill ) ; //handle client respond and send one more request if needed
2013-02-09 01:42:46 +03:00
void levelUpHero ( const CGHeroInstance * hero ) ; //initial call - check if hero have remaining levelups & handle them
2012-05-18 17:02:27 +03:00
void levelUpCommander ( const CCommanderInstance * c , int skill ) ; //secondary skill 1 to 6, special skill : skill - 100
2012-05-07 15:54:22 +03:00
void levelUpCommander ( const CCommanderInstance * c ) ;
2011-07-21 17:16:45 +03:00
void afterBattleCallback ( ) ; // called after level-ups are finished
2008-12-27 03:01:59 +02:00
//////////////////////////////////////////////////////////////////////////
2011-05-22 21:46:52 +03:00
void commitPackage ( CPackForClient * pack ) OVERRIDE ;
2012-03-27 23:08:54 +03:00
void init ( StartInfo * si ) ;
2008-12-27 03:01:59 +02:00
void handleConnection ( std : : set < int > players , CConnection & c ) ;
2013-02-11 17:42:09 +03:00
TPlayerColor getPlayerAt ( CConnection * c ) const ;
2009-03-09 12:37:49 +02:00
2013-02-04 00:05:44 +03:00
void playerMessage ( TPlayerColor player , const std : : string & message ) ;
2009-04-16 03:28:54 +03:00
bool makeBattleAction ( BattleAction & ba ) ;
2012-08-27 15:34:43 +03:00
bool makeAutomaticAction ( const CStack * stack , BattleAction & ba ) ; //used when action is taken by stack without volition of player (eg. unguided catapult attack)
2013-02-14 02:55:42 +03:00
void handleSpellCasting ( SpellID spellID , int spellLvl , BattleHex destination , ui8 casterSide , TPlayerColor casterColor , const CGHeroInstance * caster , const CGHeroInstance * secHero ,
2012-04-28 22:40:27 +03:00
int usedSpellPower , ECastingMode : : ECastingMode mode , const CStack * stack , si32 selectedStack = - 1 ) ;
2009-04-16 03:28:54 +03:00
bool makeCustomAction ( BattleAction & ba ) ;
2011-10-08 16:02:58 +03:00
void stackTurnTrigger ( const CStack * stack ) ;
2012-08-26 12:07:48 +03:00
void handleDamageFromObstacle ( const CObstacleInstance & obstacle , const CStack * curStack ) ; //checks if obstacle is land mine and handles possible consequences
2012-05-18 23:50:16 +03:00
void removeObstacle ( const CObstacleInstance & obstacle ) ;
2013-02-09 00:17:39 +03:00
bool queryReply ( ui32 qid , ui32 answer , TPlayerColor player ) ;
bool hireHero ( const CGObjectInstance * obj , ui8 hid , TPlayerColor player ) ;
2013-02-14 02:55:42 +03:00
bool buildBoat ( ObjectInstanceID objid ) ;
bool setFormation ( ObjectInstanceID hid , ui8 formation ) ;
2013-02-09 00:17:39 +03:00
bool tradeResources ( const IMarket * market , ui32 val , TPlayerColor player , ui32 id1 , ui32 id2 ) ;
2013-02-16 17:03:47 +03:00
bool sacrificeCreatures ( const IMarket * market , const CGHeroInstance * hero , SlotID slot , ui32 count ) ;
2013-02-04 22:43:16 +03:00
bool sendResources ( ui32 val , TPlayerColor player , Res : : ERes r1 , TPlayerColor r2 ) ;
2013-02-16 17:03:47 +03:00
bool sellCreatures ( ui32 count , const IMarket * market , const CGHeroInstance * hero , SlotID slot , Res : : ERes resourceID ) ;
bool transformInUndead ( const IMarket * market , const CGHeroInstance * hero , SlotID slot ) ;
bool assembleArtifacts ( ObjectInstanceID heroID , ArtifactPosition artifactSlot , bool assemble , ArtifactID assembleTo ) ;
2013-02-14 02:55:42 +03:00
bool buyArtifact ( ObjectInstanceID hid , ArtifactID aid ) ; //for blacksmith and mage guild only -> buying for gold in common buildings
2013-02-11 02:24:57 +03:00
bool buyArtifact ( const IMarket * m , const CGHeroInstance * h , Res : : ERes rid , ArtifactID aid ) ; //for artifact merchant and black market -> buying for any resource in special building / advobject
2013-02-14 02:55:42 +03:00
bool sellArtifact ( const IMarket * m , const CGHeroInstance * h , ArtifactInstanceID aid , Res : : ERes rid ) ; //for artifact merchant selling
2012-05-02 11:37:11 +03:00
//void lootArtifacts (TArtHolder source, TArtHolder dest, std::vector<ui32> &arts); //after battle - move al arts to winer
2013-02-12 22:49:40 +03:00
bool buySecSkill ( const IMarket * m , const CGHeroInstance * h , SecondarySkill skill ) ;
2013-02-14 02:55:42 +03:00
bool garrisonSwap ( ObjectInstanceID tid ) ;
2013-02-16 17:03:47 +03:00
bool upgradeCreature ( ObjectInstanceID objid , SlotID pos , CreatureID upgID ) ;
2013-02-14 02:55:42 +03:00
bool recruitCreatures ( ObjectInstanceID objid , CreatureID crid , ui32 cram , si32 level ) ;
bool buildStructure ( ObjectInstanceID tid , BuildingID bid , bool force = false ) ; //force - for events: no cost, no checkings
bool razeStructure ( ObjectInstanceID tid , BuildingID bid ) ;
2013-02-16 17:03:47 +03:00
bool disbandCreature ( ObjectInstanceID id , SlotID pos ) ;
bool arrangeStacks ( ObjectInstanceID id1 , ObjectInstanceID id2 , ui8 what , SlotID p1 , SlotID p2 , si32 val , TPlayerColor player ) ;
2009-03-09 12:37:49 +02:00
void save ( const std : : string & fname ) ;
void close ( ) ;
2009-03-09 21:40:43 +02:00
void handleTimeEvents ( ) ;
2013-02-14 02:55:42 +03:00
void handleTownEvents ( CGTownInstance * town , NewTurn & n , std : : map < ObjectInstanceID , std : : map < si32 , si32 > > & newCreas ) ;
2009-03-27 01:05:40 +02:00
bool complain ( const std : : string & problem ) ; //sends message to all clients, prints on the logs and return true
2009-07-06 22:41:27 +03:00
void objectVisited ( const CGObjectInstance * obj , const CGHeroInstance * h ) ;
2013-02-07 20:34:50 +03:00
void engageIntoBattle ( TPlayerColor player ) ;
2010-02-21 17:03:30 +02:00
bool dig ( const CGHeroInstance * h ) ;
2013-02-11 02:24:57 +03:00
bool castSpell ( const CGHeroInstance * h , SpellID spellID , const int3 & pos ) ;
2010-12-13 01:44:16 +02:00
void moveArmy ( const CArmedInstance * src , const CArmedInstance * dst , bool allowMerging ) ;
2009-03-09 12:37:49 +02:00
2008-12-27 03:01:59 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-01-11 00:08:18 +02:00
h & QID & states ;
2008-12-27 03:01:59 +02:00
}
2009-03-09 12:37:49 +02:00
2013-02-07 20:34:50 +03:00
ui32 getQueryResult ( TPlayerColor player , int queryID ) ;
2009-03-09 12:37:49 +02:00
void sendMessageToAll ( const std : : string & message ) ;
void sendMessageTo ( CConnection & c , const std : : string & message ) ;
2013-02-09 00:17:39 +03:00
void applyAndAsk ( Query * sel , TPlayerColor player , boost : : function < void ( ui32 ) > & callback ) ;
void prepareNewQuery ( Query * queryPack , TPlayerColor player , const boost : : function < void ( ui32 ) > & callback = 0 ) ; //generates unique query id and writes it to the pack; blocks the player till query is answered (then callback is called)
void ask ( Query * sel , TPlayerColor player , const CFunctionList < void ( ui32 ) > & callback ) ;
2009-03-09 12:37:49 +02:00
void sendToAllClients ( CPackForClient * info ) ;
void sendAndApply ( CPackForClient * info ) ;
2011-09-06 12:59:06 +03:00
void applyAndSend ( CPackForClient * info ) ;
2010-12-06 01:10:02 +02:00
void sendAndApply ( CGarrisonOperationPack * info ) ;
2010-01-30 14:46:15 +02:00
void sendAndApply ( SetResource * info ) ;
void sendAndApply ( SetResources * info ) ;
void sendAndApply ( NewStructures * info ) ;
2009-03-09 12:37:49 +02:00
2010-10-24 14:35:14 +03:00
void run ( bool resume ) ;
2008-12-27 03:01:59 +02:00
void newTurn ( ) ;
2011-07-16 09:42:44 +03:00
void handleAttackBeforeCasting ( const BattleAttack & bat ) ;
void handleAfterAttackCasting ( const BattleAttack & bat ) ;
void attackCasting ( const BattleAttack & bat , Bonus : : BonusType attackMode , const CStack * attacker ) ;
2013-02-12 22:49:40 +03:00
bool sacrificeArtifact ( const IMarket * m , const CGHeroInstance * hero , ArtifactPosition slot ) ;
2013-02-11 02:24:57 +03:00
void spawnWanderingMonsters ( CreatureID creatureID ) ;
2008-12-27 03:01:59 +02:00
friend class CVCMIServer ;
friend class CScriptCallback ;
} ;
2011-09-17 21:15:10 +03:00
void makeStackDoNothing ( ) ;