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 ;
2013-02-19 01:37:22 +03:00
class CSaveFile ;
class CLoadFile ;
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 ( ) ;
2013-03-03 20:06:03 +03:00
CGameInfoCallback ( CGameState * GS , boost : : optional < PlayerColor > Player ) ;
bool hasAccess ( boost : : optional < PlayerColor > playerId ) const ;
bool isVisible ( int3 pos , boost : : optional < PlayerColor > Player ) const ;
bool isVisible ( const CGObjectInstance * obj , boost : : optional < PlayerColor > 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
2013-02-02 11:29:57 +03:00
int getDate ( Date : : EDateType mode = Date : : DAY ) 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
2013-03-03 20:06:03 +03:00
const PlayerState * getPlayer ( PlayerColor color , bool verbose = true ) const ;
int getResource ( PlayerColor Player , Res : : ERes which ) const ;
2011-05-03 06:14:18 +03:00
bool isVisible ( int3 pos ) const ;
2013-03-03 20:06:03 +03:00
PlayerRelations : : PlayerRelations getPlayerRelations ( PlayerColor color1 , PlayerColor color2 ) const ;
2011-05-03 06:14:18 +03:00
void getThievesGuildInfo ( SThievesGuildInfo & thi , const CGObjectInstance * obj ) ; //get thieves' guild info obtainable while visiting given object
2013-03-03 20:06:03 +03:00
EPlayerStatus : : EStatus getPlayerStatus ( PlayerColor player ) const ; //-1 if no such player
PlayerColor getCurrentPlayer ( ) const ; //player that currently makes move // TODO synchronous turns
virtual PlayerColor getLocalPlayer ( ) const ; //player that is currently owning given client (if not a client, then returns current player)
const PlayerSettings * getPlayerSettings ( PlayerColor 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
2013-02-16 17:03:47 +03:00
void getUpgradeInfo ( const CArmedInstance * obj , SlotID stackPos , UpgradeInfo & out ) const ;
2011-05-03 06:14:18 +03:00
//hero
2013-02-14 02:55:42 +03:00
const CGHeroInstance * getHero ( ObjectInstanceID objid ) const ;
2011-05-22 21:46:52 +03:00
const CGHeroInstance * getHeroWithSubid ( int subid ) const ;
2013-03-03 20:06:03 +03:00
int getHeroCount ( PlayerColor 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
2013-03-03 20:06:03 +03:00
const CGHeroInstance * getSelectedHero ( PlayerColor player ) const ; //NULL if no hero is selected
2011-05-22 21:46:52 +03:00
const CGHeroInstance * getSelectedHero ( ) const ; //of current (active) player
2013-02-14 02:55:42 +03:00
const CArtifactInstance * getArtInstance ( ArtifactInstanceID aid ) const ;
const CGObjectInstance * getObjInstance ( ObjectInstanceID oid ) const ;
2011-05-03 06:14:18 +03:00
//objects
2013-02-14 02:55:42 +03:00
const CGObjectInstance * getObj ( ObjectInstanceID objid , bool verbose = true ) const ;
2011-05-03 06:14:18 +03:00
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
2013-03-03 20:06:03 +03:00
PlayerColor getOwner ( ObjectInstanceID 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
2013-02-14 02:55:42 +03:00
const CGTownInstance * getTown ( ObjectInstanceID objid ) const ;
2013-03-03 20:06:03 +03:00
int howManyTowns ( PlayerColor Player ) const ;
2011-05-03 06:14:18 +03:00
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 ;
2013-02-11 22:11:34 +03:00
EBuildingState : : 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
std : : set < BuildingID > getBuildingRequiments ( const CGTownInstance * t , BuildingID ID ) ;
2011-05-03 06:14:18 +03:00
virtual bool getTownInfo ( const CGObjectInstance * town , InfoAboutTown & dest ) const ;
2013-03-03 20:06:03 +03:00
const CTown * getNativeTown ( PlayerColor color ) const ;
2011-05-10 01:20:47 +03:00
//from gs
2013-03-03 20:06:03 +03:00
const TeamState * getTeam ( TeamID teamID ) const ;
const TeamState * getPlayerTeam ( PlayerColor color ) const ;
2013-02-14 02:55:42 +03:00
std : : set < BuildingID > getBuildingRequiments ( const CGTownInstance * t , BuildingID ID ) const ;
2013-02-11 22:11:34 +03:00
EBuildingState : : 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
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 ) ;
2013-03-03 20:06:03 +03:00
boost : : optional < PlayerColor > getMyColor ( ) const ;
2011-05-03 06:14:18 +03:00
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
2013-02-09 15:56:35 +03:00
int getResourceAmount ( Res : : ERes 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
2013-03-03 20:06:03 +03:00
const PlayerSettings * getPlayerSettings ( PlayerColor 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
2013-03-03 20:06:03 +03:00
void getTilesInRange ( boost : : unordered_set < int3 , ShashInt3 > & tiles , int3 pos , int radious , boost : : optional < PlayerColor > player = boost : : optional < PlayerColor > ( ) , int mode = 0 ) const ; //mode 1 - only unrevealed tiles; mode 0 - all, mode -1 - only unrevealed
void getAllTiles ( boost : : unordered_set < int3 , ShashInt3 > & tiles , boost : : optional < PlayerColor > player = boost : : optional < PlayerColor > ( ) , 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
2013-02-13 01:24:48 +03:00
ArtifactID getRandomArt ( int flags ) ;
ArtifactID getArtSync ( ui32 rand , int flags , bool erasePicked ) ; //synchronous
2011-05-03 06:14:18 +03:00
void pickAllowedArtsSet ( std : : vector < const CArtifact * > & out ) ; //gives 3 treasures, 3 minors, 1 major -> used by Black Market and Artifact Merchant
2013-02-11 02:24:57 +03:00
void getAllowedSpells ( std : : vector < SpellID > & out , ui16 level ) ;
2013-02-19 01:37:22 +03:00
template < typename Saver >
void saveCommonState ( Saver & out ) const ; //stores GS and VLC
template < typename Loader >
void loadCommonState ( Loader & in ) ; //loads GS and VLC
2011-05-03 06:14:18 +03:00
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CNonConstInfoCallback : public CPrivilagedInfoCallback
2011-05-10 01:20:47 +03:00
{
public :
2013-03-03 20:06:03 +03:00
PlayerState * getPlayer ( PlayerColor color , bool verbose = true ) ;
TeamState * getTeam ( TeamID teamID ) ; //get team by team ID
TeamState * getPlayerTeam ( PlayerColor color ) ; // get team by player color
2013-02-14 02:55:42 +03:00
CGHeroInstance * getHero ( ObjectInstanceID objid ) ;
CGTownInstance * getTown ( ObjectInstanceID objid ) ;
2011-05-10 01:20:47 +03:00
TerrainTile * getTile ( int3 pos ) ;
2013-02-14 02:55:42 +03:00
CArtifactInstance * getArtInstance ( ArtifactInstanceID aid ) ;
CGObjectInstance * getObjInstance ( ObjectInstanceID oid ) ;
2011-05-10 01:20:47 +03:00
} ;
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 ) ;
2013-02-14 02:55:42 +03:00
virtual void setObjProperty ( ObjectInstanceID objid , int prop , si64 val ) ;
2011-06-11 02:50:32 +03:00
2013-03-03 20:06:03 +03:00
virtual void showInfoDialog ( const std : : string & msg , PlayerColor 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 :
2013-02-11 02:24:57 +03:00
virtual void changeSpells ( const CGHeroInstance * hero , bool give , const std : : set < SpellID > & spells ) = 0 ;
2013-02-09 00:17:39 +03:00
virtual bool removeObject ( const CGObjectInstance * obj ) = 0 ;
2013-02-14 02:55:42 +03:00
virtual void setBlockVis ( ObjectInstanceID objid , bool bv ) = 0 ;
2013-03-03 20:06:03 +03:00
virtual void setOwner ( const CGObjectInstance * objid , PlayerColor owner ) = 0 ;
2013-02-09 01:42:46 +03:00
virtual void setHoverName ( const CGObjectInstance * obj , MetaString * name ) = 0 ;
2013-02-09 00:17:39 +03:00
virtual void changePrimSkill ( const CGHeroInstance * hero , PrimarySkill : : PrimarySkill which , si64 val , bool abs = false ) = 0 ;
2013-02-12 22:49:40 +03:00
virtual void changeSecSkill ( const CGHeroInstance * hero , SecondarySkill which , int val , bool abs = false ) = 0 ;
2013-04-20 14:34:01 +03:00
virtual void showBlockingDialog ( BlockingDialog * iw ) = 0 ;
2013-02-14 02:55:42 +03:00
virtual void showGarrisonDialog ( ObjectInstanceID upobj , ObjectInstanceID hid , bool removableUnits , const boost : : function < void ( ) > & cb ) = 0 ; //cb will be called when player closes garrison window
2013-03-03 20:06:03 +03:00
virtual void showThievesGuildWindow ( PlayerColor player , ObjectInstanceID requestingObjId ) = 0 ;
virtual void giveResource ( PlayerColor player , Res : : ERes which , int val ) = 0 ;
2013-04-20 14:34:01 +03:00
virtual void giveResources ( PlayerColor player , TResources resources ) = 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 ;
2013-02-14 02:55:42 +03:00
virtual void takeCreatures ( ObjectInstanceID 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
2013-02-12 22:49:40 +03:00
virtual void giveHeroNewArtifact ( const CGHeroInstance * h , const CArtifact * artType , ArtifactPosition pos ) = 0 ;
virtual void giveHeroArtifact ( const CGHeroInstance * h , const CArtifactInstance * a , ArtifactPosition pos ) = 0 ; //pos==-1 - first free slot in backpack=0; pos==-2 - default if available or backpack
2010-12-26 16:34:11 +02:00
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 ;
2013-02-19 01:37:22 +03:00
virtual void synchronizeArtifactHandlerLists ( ) = 0 ;
2010-12-26 16:34:11 +02:00
2008-12-27 03:01:59 +02:00
virtual void showCompInfo ( ShowInInfobox * comp ) = 0 ;
2013-02-09 00:17:39 +03:00
virtual void heroVisitCastle ( const CGTownInstance * obj , const CGHeroInstance * hero ) = 0 ;
virtual void stopHeroVisitCastle ( const CGTownInstance * obj , const CGHeroInstance * hero ) = 0 ;
2013-04-20 14:34:01 +03:00
virtual void startBattlePrimary ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , const CGHeroInstance * hero1 , const CGHeroInstance * hero2 , bool creatureBank = false , const CGTownInstance * town = NULL ) = 0 ; //use hero=NULL for no hero
virtual void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , int3 tile , bool creatureBank = false ) = 0 ; //if any of armies is hero, hero will be used
virtual void startBattleI ( const CArmedInstance * army1 , const CArmedInstance * army2 , bool creatureBank = false ) = 0 ; //if any of armies is hero, hero will be used, visitable tile of second obj is place of battle
2013-02-14 02:55:42 +03:00
virtual void setAmount ( ObjectInstanceID objid , ui32 val ) = 0 ;
2013-04-20 14:34:01 +03:00
virtual bool moveHero ( ObjectInstanceID hid , int3 dst , ui8 teleporting , PlayerColor asker = PlayerColor : : NEUTRAL ) = 0 ;
2009-02-04 15:40:54 +02:00
virtual void giveHeroBonus ( GiveBonus * bonus ) = 0 ;
virtual void setMovePoints ( SetMovePoints * smp ) = 0 ;
2013-02-14 02:55:42 +03:00
virtual void setManaPoints ( ObjectInstanceID hid , int val ) = 0 ;
2013-03-03 20:06:03 +03:00
virtual void giveHero ( ObjectInstanceID id , PlayerColor player ) = 0 ;
2013-02-14 02:55:42 +03:00
virtual void changeObjPos ( ObjectInstanceID objid , int3 newPos , ui8 flags ) = 0 ;
2009-03-14 13:25:25 +02:00
virtual void sendAndApply ( CPackForClient * info ) = 0 ;
2013-02-14 02:55:42 +03:00
virtual void heroExchange ( ObjectInstanceID hero1 , ObjectInstanceID 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
2013-02-11 02:24:57 +03:00
const CGObjectInstance * putNewObject ( Obj ID , int subID , int3 pos ) ;
2013-03-03 20:06:03 +03:00
const CGCreature * putNewMonster ( CreatureID 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
} ;