2008-12-26 17:00:34 +02:00
# ifndef __NETPACKS_H__
# define __NETPACKS_H__
2011-01-20 19:25:15 +02:00
# include <boost/unordered_set.hpp>
2008-07-26 09:39:44 +03:00
# include "../global.h"
2008-09-29 00:01:49 +03:00
# include "BattleAction.h"
2009-02-04 15:40:54 +02:00
# include "HeroBonus.h"
2009-03-07 00:11:17 +02:00
# include <set>
2010-05-02 21:20:26 +03:00
# include "CCreatureSet.h"
2010-10-25 22:37:21 +03:00
# include "CMapInfo.h"
# include "../StartInfo.h"
2010-12-14 23:55:23 +02:00
# include "ConstTransitivePtr.h"
2011-01-20 19:25:15 +02:00
# include "../int3.h"
2009-02-04 15:40:54 +02:00
2009-04-15 17:03:31 +03:00
/*
* NetPacks . 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-03-07 00:11:17 +02:00
class CClient ;
class CGameState ;
2009-03-09 12:37:49 +02:00
class CGameHandler ;
class CConnection ;
2010-08-20 16:34:39 +03:00
class CCampaignState ;
2010-06-26 19:02:10 +03:00
class CArtifact ;
2010-09-03 21:42:54 +03:00
class CSelectionScreen ;
2010-12-25 21:23:30 +02:00
class CGObjectInstance ;
2010-12-26 16:34:11 +02:00
class CArtifactInstance ;
2010-10-25 22:37:21 +03:00
//class CMapInfo;
2010-12-26 16:34:11 +02:00
struct ArtSlotInfo ;
2010-06-26 19:02:10 +03:00
2009-03-07 00:11:17 +02:00
struct CPack
2008-07-26 16:57:32 +03:00
{
2009-03-07 00:11:17 +02:00
ui16 type ;
CPack ( ) { } ;
2009-03-07 17:54:12 +02:00
virtual ~ CPack ( ) { } ;
2009-03-07 00:11:17 +02:00
ui16 getType ( ) const { return type ; }
2009-03-07 00:25:19 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
2008-07-28 15:44:08 +03:00
{
2009-03-07 17:54:12 +02:00
tlog1 < < " CPack serialized... this should not happen! \n " ;
2008-07-28 15:44:08 +03:00
}
2009-03-09 12:37:49 +02:00
DLL_EXPORT void applyGs ( CGameState * gs )
{ } ;
2008-07-26 16:57:32 +03:00
} ;
2009-03-07 00:11:17 +02:00
struct CPackForClient : public CPack
2008-07-26 16:57:32 +03:00
{
2009-03-09 12:37:49 +02:00
CPackForClient ( ) { type = 1 ; } ;
2009-03-07 00:11:17 +02:00
2009-03-09 12:37:49 +02:00
CGameState * GS ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
void applyFirstCl ( CClient * cl ) //called before applying to gs
2009-03-09 12:37:49 +02:00
{ } ;
2009-03-07 00:25:19 +02:00
void applyCl ( CClient * cl ) //called after applying to gs
2009-03-09 12:37:49 +02:00
{ } ;
} ;
struct CPackForServer : public CPack
{
CConnection * c ;
CGameState * GS ( CGameHandler * gh ) ;
CPackForServer ( )
2009-03-07 00:25:19 +02:00
{
2009-03-09 12:37:49 +02:00
type = 2 ;
c = NULL ;
} ;
2009-05-24 00:37:33 +03:00
bool applyGh ( CGameHandler * gh ) ; //called after applying to gs
2008-07-26 16:57:32 +03:00
} ;
2009-03-07 00:11:17 +02:00
2009-03-09 12:37:49 +02:00
2009-03-07 00:11:17 +02:00
struct Query : public CPackForClient
2008-08-13 03:44:31 +03:00
{
ui32 id ;
} ;
2009-02-03 07:28:05 +02:00
2009-07-09 22:15:22 +03:00
2009-03-07 00:11:17 +02:00
struct MetaString : public CPack //2001 helper for object scrips
2009-02-03 07:28:05 +02:00
{
2009-07-09 22:15:22 +03:00
private :
2010-08-26 10:23:08 +03:00
enum EMessage { TEXACT_STRING , TLOCAL_STRING , TNUMBER , TREPLACE_ESTRING , TREPLACE_LSTRING , TREPLACE_NUMBER , TREPLACE_PLUSNUMBER } ;
2009-07-09 22:15:22 +03:00
public :
2009-03-14 13:25:25 +02:00
enum { GENERAL_TXT = 1 , XTRAINFO_TXT , OBJ_NAMES , RES_NAMES , ART_NAMES , ARRAY_TXT , CRE_PL_NAMES , CREGENS , MINE_NAMES ,
2010-03-01 20:22:22 +02:00
MINE_EVNTS , ADVOB_TXT , ART_EVNTS , SPELL_NAME , SEC_SKILL_NAME , CRE_SING_NAMES , CREGENS4 , COLOR , ART_DESCR } ;
2009-07-09 22:15:22 +03:00
std : : vector < ui8 > message ; //vector of EMessage
2010-05-02 21:20:26 +03:00
std : : vector < std : : pair < ui8 , ui32 > > localStrings ; //pairs<text handler type, text number>; types: 1 - generaltexthandler->all; 2 - objh->xtrainfo; 3 - objh->names; 4 - objh->restypes; 5 - arth->artifacts[id].name; 6 - generaltexth->arraytxt; 7 - creh->creatures[os->subID].namePl; 8 - objh->creGens; 9 - objh->mines[ID]->first; 10 - objh->mines[ID]->second; 11 - objh->advobtxt
2009-07-09 22:15:22 +03:00
std : : vector < std : : string > exactStrings ;
std : : vector < si32 > numbers ;
2009-02-03 07:28:05 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-07-09 22:15:22 +03:00
h & exactStrings & localStrings & message & numbers ;
2009-02-03 07:28:05 +02:00
}
2009-03-14 13:25:25 +02:00
void addTxt ( ui8 type , ui32 serial )
{
2009-07-09 22:15:22 +03:00
message . push_back ( TLOCAL_STRING ) ;
localStrings . push_back ( std : : pair < ui8 , ui32 > ( type , serial ) ) ;
2009-03-14 13:25:25 +02:00
}
2009-02-03 07:28:05 +02:00
MetaString & operator < < ( const std : : pair < ui8 , ui32 > & txt )
{
2009-07-09 22:15:22 +03:00
message . push_back ( TLOCAL_STRING ) ;
localStrings . push_back ( txt ) ;
2009-02-03 07:28:05 +02:00
return * this ;
}
MetaString & operator < < ( const std : : string & txt )
{
2009-07-09 22:15:22 +03:00
message . push_back ( TEXACT_STRING ) ;
exactStrings . push_back ( txt ) ;
2009-02-03 07:28:05 +02:00
return * this ;
}
2009-07-09 22:15:22 +03:00
MetaString & operator < < ( int txt )
{
message . push_back ( TNUMBER ) ;
numbers . push_back ( txt ) ;
return * this ;
}
void addReplacement ( ui8 type , ui32 serial )
{
message . push_back ( TREPLACE_LSTRING ) ;
localStrings . push_back ( std : : pair < ui8 , ui32 > ( type , serial ) ) ;
}
void addReplacement ( const std : : string & txt )
{
message . push_back ( TREPLACE_ESTRING ) ;
exactStrings . push_back ( txt ) ;
}
void addReplacement ( int txt )
{
message . push_back ( TREPLACE_NUMBER ) ;
numbers . push_back ( txt ) ;
}
2010-08-26 10:23:08 +03:00
void addReplacement2 ( int txt )
{
message . push_back ( TREPLACE_PLUSNUMBER ) ;
numbers . push_back ( txt ) ;
}
2010-11-22 02:34:46 +02:00
DLL_EXPORT void addCreReplacement ( TCreature id , TQuantity count ) ; //adds sing or plural name;
DLL_EXPORT void addReplacement ( const CStackBasicDescriptor & stack ) ; //adds sing or plural name;
2009-09-16 19:16:57 +03:00
DLL_EXPORT std : : string buildList ( ) const ;
2009-02-03 07:28:05 +02:00
void clear ( )
{
2009-07-09 22:15:22 +03:00
exactStrings . clear ( ) ;
localStrings . clear ( ) ;
2009-02-03 07:28:05 +02:00
message . clear ( ) ;
2009-07-09 22:15:22 +03:00
numbers . clear ( ) ;
2009-02-03 07:28:05 +02:00
}
2009-07-09 22:15:22 +03:00
DLL_EXPORT void toString ( std : : string & dst ) const ;
2010-07-13 08:25:40 +03:00
DLL_EXPORT std : : string toString ( ) const ;
2009-07-09 22:15:22 +03:00
void getLocalString ( const std : : pair < ui8 , ui32 > & txt , std : : string & dst ) const ;
2009-02-03 07:28:05 +02:00
2009-07-09 22:15:22 +03:00
MetaString ( )
{
type = 2001 ;
}
2009-02-03 07:28:05 +02:00
} ;
2009-03-09 12:37:49 +02:00
/***********************************************************************************************************/
2009-04-16 03:28:54 +03:00
struct PackageApplied : public CPackForClient //94
{
PackageApplied ( ) { type = 94 ; }
PackageApplied ( ui8 Result ) : result ( Result ) { type = 94 ; }
void applyCl ( CClient * cl ) ;
ui8 result ; //0 - something went wrong, request hasn't been realized; 1 - OK
ui32 packType ; //type id of applied package
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-07-31 23:27:44 +03:00
h & result & packType ;
2009-04-16 03:28:54 +03:00
}
} ;
2009-03-07 00:11:17 +02:00
struct SystemMessage : public CPackForClient //95
2008-07-26 09:39:44 +03:00
{
2009-03-09 12:37:49 +02:00
SystemMessage ( const std : : string Text ) : text ( Text ) { type = 95 ; } ;
2009-03-07 00:11:17 +02:00
SystemMessage ( ) { type = 95 ; } ;
void applyCl ( CClient * cl ) ;
2008-07-26 09:39:44 +03:00
2009-03-07 00:11:17 +02:00
std : : string text ;
2009-03-07 00:25:19 +02:00
2008-07-26 09:39:44 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-03-07 00:25:19 +02:00
h & text ;
2008-07-26 09:39:44 +03:00
}
2008-08-10 07:46:16 +03:00
} ;
2009-03-07 00:11:17 +02:00
2009-08-04 02:53:18 +03:00
struct PlayerBlocked : public CPackForClient //96
{
PlayerBlocked ( ) { type = 96 ; } ;
void applyCl ( CClient * cl ) ;
enum EReason { UPCOMING_BATTLE } ;
ui8 reason ;
ui8 player ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & reason & player ;
}
} ;
2009-03-07 00:11:17 +02:00
struct YourTurn : public CPackForClient //100
{
YourTurn ( ) { type = 100 ; } ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-10 07:46:16 +03:00
ui8 player ;
2008-07-26 09:39:44 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-03-07 00:25:19 +02:00
h & player ;
2008-07-26 09:39:44 +03:00
}
2008-08-10 07:46:16 +03:00
} ;
2009-03-07 00:11:17 +02:00
struct SetResource : public CPackForClient //102
2008-07-31 00:27:15 +03:00
{
SetResource ( ) { type = 102 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2008-07-31 00:27:15 +03:00
ui8 player , resid ;
si32 val ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & player & resid & val ;
}
} ;
2009-11-28 03:42:08 +02:00
struct SetResources : public CPackForClient //104
{
SetResources ( ) { res . resize ( RESOURCE_QUANTITY ) ; type = 104 ; } ;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
ui8 player ;
std : : vector < si32 > res ; //res[resid] => res amount
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & player & res ;
}
} ;
2009-03-07 00:11:17 +02:00
struct SetPrimSkill : public CPackForClient //105
2008-08-04 18:56:36 +03:00
{
SetPrimSkill ( ) { type = 105 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-04 18:56:36 +03:00
ui8 abs ; //0 - changes by value; 1 - sets to value
si32 id ;
2009-08-16 18:39:18 +03:00
ui16 which ;
si64 val ;
2008-08-04 18:56:36 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & abs & id & which & val ;
}
} ;
2009-03-07 00:11:17 +02:00
struct SetSecSkill : public CPackForClient //106
2008-08-13 03:44:31 +03:00
{
SetSecSkill ( ) { type = 106 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-13 03:44:31 +03:00
ui8 abs ; //0 - changes by value; 1 - sets to value
si32 id ;
ui16 which , val ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & abs & id & which & val ;
}
} ;
2009-03-07 00:11:17 +02:00
struct HeroVisitCastle : public CPackForClient //108
2008-08-13 12:28:06 +03:00
{
HeroVisitCastle ( ) { flags = 0 ; type = 108 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2011-02-04 16:58:14 +02:00
ui8 flags ; //1 - start
2008-08-13 12:28:06 +03:00
ui32 tid , hid ;
bool start ( ) //if hero is entering castle (if false - leaving)
{
return flags & 1 ;
}
2011-02-04 16:58:14 +02:00
// bool garrison() //if hero is entering/leaving garrison (if false - it's only visiting hero)
// {
// return flags & 2;
// }
2008-08-13 12:28:06 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & flags & tid & hid ;
}
} ;
2009-03-07 00:11:17 +02:00
struct ChangeSpells : public CPackForClient //109
2008-09-12 11:51:46 +03:00
{
ChangeSpells ( ) { type = 109 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-09-12 11:51:46 +03:00
ui8 learn ; //1 - gives spell, 0 - takes
ui32 hid ;
std : : set < ui32 > spells ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & learn & hid & spells ;
}
} ;
2008-10-19 02:20:48 +03:00
2009-03-07 00:11:17 +02:00
struct SetMana : public CPackForClient //110
2008-10-19 02:20:48 +03:00
{
SetMana ( ) { type = 110 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2009-07-18 00:53:28 +03:00
si32 hid , val ;
2008-10-19 02:20:48 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & val & hid ;
}
2011-01-20 19:25:15 +02:00
} ;
2009-03-07 00:11:17 +02:00
struct SetMovePoints : public CPackForClient //111
2008-10-19 02:20:48 +03:00
{
SetMovePoints ( ) { type = 111 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-10-19 02:20:48 +03:00
ui32 hid , val ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & val & hid ;
}
2011-01-20 19:25:15 +02:00
} ;
2009-03-07 00:11:17 +02:00
struct FoWChange : public CPackForClient //112
2008-10-19 02:20:48 +03:00
{
FoWChange ( ) { type = 112 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2011-01-20 19:25:15 +02:00
boost : : unordered_set < int3 , struct ShashInt3 > tiles ;
2008-10-19 02:20:48 +03:00
ui8 player , mode ; //mode==0 - hide, mode==1 - reveal
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-03-28 22:13:26 +02:00
h & tiles & player & mode ;
2008-10-19 02:20:48 +03:00
}
} ;
2008-10-26 22:58:34 +02:00
2009-03-07 00:11:17 +02:00
struct SetAvailableHeroes : public CPackForClient //113
2008-10-26 22:58:34 +02:00
{
2010-07-08 08:52:11 +03:00
SetAvailableHeroes ( )
{
type = 113 ;
for ( int i = 0 ; i < AVAILABLE_HEROES_PER_PLAYER ; i + + )
2011-01-28 04:11:58 +02:00
army [ i ] . clear ( ) ;
2010-07-08 08:52:11 +03:00
}
~ SetAvailableHeroes ( )
{
}
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-10-26 22:58:34 +02:00
ui8 player ;
2010-07-08 08:52:11 +03:00
si32 hid [ AVAILABLE_HEROES_PER_PLAYER ] ; //-1 if no hero
2011-01-28 04:11:58 +02:00
CSimpleArmy army [ AVAILABLE_HEROES_PER_PLAYER ] ;
2008-10-26 22:58:34 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-07-08 08:52:11 +03:00
h & player & hid & army ;
2008-10-26 22:58:34 +02:00
}
} ;
2009-03-07 00:11:17 +02:00
struct GiveBonus : public CPackForClient //115
2009-02-03 07:28:05 +02:00
{
2010-02-10 04:56:00 +02:00
GiveBonus ( ui8 Who = 0 )
{
who = Who ;
type = 115 ;
}
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-02-03 07:28:05 +02:00
2010-06-07 08:28:12 +03:00
enum { HERO , PLAYER , TOWN } ;
2010-02-10 04:56:00 +02:00
ui8 who ; //who receives bonus, uses enum above
2010-06-13 16:59:59 +03:00
ui32 id ; //hero. town or player id - whoever receives it
2010-05-02 21:20:26 +03:00
Bonus bonus ;
2009-02-03 07:28:05 +02:00
MetaString bdescr ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-02-10 04:56:00 +02:00
h & bonus & id & bdescr & who ;
2009-02-03 07:28:05 +02:00
}
} ;
2009-03-07 00:11:17 +02:00
struct ChangeObjPos : public CPackForClient //116
2009-02-20 12:36:15 +02:00
{
2010-03-11 01:16:30 +02:00
ChangeObjPos ( )
{
type = 116 ;
flags = 0 ;
}
2009-03-07 00:11:17 +02:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-02-20 12:36:15 +02:00
ui32 objid ;
int3 nPos ;
ui8 flags ; //bit flags: 1 - redraw
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & objid & nPos & flags ;
}
} ;
2010-01-29 22:52:45 +02:00
struct PlayerEndsGame : public CPackForClient //117
{
PlayerEndsGame ( )
{
type = 117 ;
}
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
ui8 player ;
ui8 victory ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & player & victory ;
}
} ;
2010-02-10 04:56:00 +02:00
struct RemoveBonus : public CPackForClient //118
{
RemoveBonus ( ui8 Who = 0 )
{
who = Who ;
type = 118 ;
}
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2010-06-13 16:59:59 +03:00
enum { HERO , PLAYER , TOWN } ;
2010-02-10 04:56:00 +02:00
ui8 who ; //who receives bonus, uses enum above
2010-06-13 16:59:59 +03:00
ui32 whoID ; //hero, town or player id - whoever loses bonus
2010-02-10 04:56:00 +02:00
//vars to identify bonus: its source
ui8 source ;
ui32 id ; //source id
//used locally: copy of removed bonus
2010-05-02 21:20:26 +03:00
Bonus bonus ;
2010-02-10 04:56:00 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & source & id & who & whoID ;
}
} ;
2010-08-20 16:34:39 +03:00
struct UpdateCampaignState : public CPackForClient //119
{
UpdateCampaignState ( )
{
type = 119 ;
}
CCampaignState * camp ;
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & camp ;
}
} ;
2009-03-07 00:11:17 +02:00
struct RemoveObject : public CPackForClient //500
2008-08-02 00:41:38 +03:00
{
2008-08-13 07:41:11 +03:00
RemoveObject ( ) { type = 500 ; } ;
RemoveObject ( si32 ID ) { id = ID ; type = 500 ; } ;
2009-03-07 00:11:17 +02:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-02 00:41:38 +03:00
si32 id ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id ;
}
} ;
2009-03-07 00:11:17 +02:00
struct TryMoveHero : public CPackForClient //501
2008-07-28 15:44:08 +03:00
{
2010-05-06 15:13:31 +03:00
TryMoveHero ( ) { type = 501 ; humanKnows = false ; attackedFrom = int3 ( - 1 , - 1 , - 1 ) ; } ;
2009-03-07 00:11:17 +02:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2009-03-07 17:54:12 +02:00
void applyGs ( CGameState * gs ) ;
2008-07-28 15:44:08 +03:00
2009-07-03 22:57:14 +03:00
enum EResult
{
2009-07-19 04:00:19 +03:00
FAILED , SUCCESS , TELEPORTATION , RESERVED___ , BLOCKING_VISIT , EMBARK , DISEMBARK
2009-07-03 22:57:14 +03:00
} ;
2008-07-28 15:44:08 +03:00
ui32 id , movePoints ;
2009-07-03 22:57:14 +03:00
ui8 result ; //uses EResult
2010-03-21 00:17:19 +02:00
int3 start , end ; //h3m format
2011-01-20 19:25:15 +02:00
boost : : unordered_set < int3 , ShashInt3 > fowRevealed ; //revealed tiles
2010-05-06 15:13:31 +03:00
int3 attackedFrom ; // Set when stepping into endangered tile.
2008-07-28 15:44:08 +03:00
2009-12-28 06:08:24 +02:00
bool humanKnows ; //used locally during applying to client
2008-07-28 15:44:08 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-05-06 15:13:31 +03:00
h & id & result & start & end & movePoints & fowRevealed & attackedFrom ;
2008-07-28 15:44:08 +03:00
}
2010-11-27 03:46:19 +02:00
} ;
2010-12-06 01:10:02 +02:00
// struct SetGarrisons : public CPackForClient //502
// {
// SetGarrisons(){type = 502;};
// void applyCl(CClient *cl);
// DLL_EXPORT void applyGs(CGameState *gs);
//
// std::map<ui32,CCreatureSet> garrs;
//
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & garrs;
// }
// };
2009-03-07 00:11:17 +02:00
struct NewStructures : public CPackForClient //504
2008-08-01 14:21:15 +03:00
{
2008-08-10 07:46:16 +03:00
NewStructures ( ) { type = 504 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-09-22 17:27:46 +03:00
DLL_EXPORT virtual void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-01 14:21:15 +03:00
si32 tid ;
2008-08-10 07:46:16 +03:00
std : : set < si32 > bid ;
si16 builded ;
2008-08-01 14:21:15 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2008-08-10 07:46:16 +03:00
h & tid & bid & builded ;
2008-08-01 14:21:15 +03:00
}
2009-09-22 17:27:46 +03:00
} ;
2009-09-24 20:54:02 +03:00
struct RazeStructures : public CPackForClient //505
2009-09-22 17:27:46 +03:00
{
RazeStructures ( ) { type = 505 ; } ;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-09-24 20:54:02 +03:00
si32 tid ;
std : : set < si32 > bid ;
si16 destroyed ;
2009-09-22 17:27:46 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-09-24 20:54:02 +03:00
h & tid & bid & destroyed ;
2009-09-22 17:27:46 +03:00
}
} ;
2009-03-07 00:11:17 +02:00
struct SetAvailableCreatures : public CPackForClient //506
2008-08-01 14:21:15 +03:00
{
2008-08-10 07:46:16 +03:00
SetAvailableCreatures ( ) { type = 506 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-01 14:21:15 +03:00
si32 tid ;
2009-07-06 22:41:27 +03:00
std : : vector < std : : pair < ui32 , std : : vector < ui32 > > > creatures ;
2008-08-01 14:21:15 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2008-08-10 07:46:16 +03:00
h & tid & creatures ;
}
} ;
2009-03-07 00:11:17 +02:00
struct SetHeroesInTown : public CPackForClient //508
2008-08-16 11:47:41 +03:00
{
SetHeroesInTown ( ) { type = 508 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-16 11:47:41 +03:00
si32 tid , visiting , garrison ; //id of town, visiting hero, hero in garrison
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & tid & visiting & garrison ;
}
2010-12-06 01:10:02 +02:00
} ;
2010-12-17 00:32:53 +02:00
2011-01-18 20:56:14 +02:00
// struct SetHeroArtifacts : public CPackForClient //509
// {
// SetHeroArtifacts(){type = 509;};
// void applyCl(CClient *cl);
// DLL_EXPORT void applyGs(CGameState *gs);
// DLL_EXPORT void setArtAtPos(ui16 pos, const CArtifact* art);
//
// si32 hid;
// std::vector<const CArtifact*> artifacts; //hero's artifacts from bag
// std::map<ui16, const CArtifact*> artifWorn; //map<position,artifact_id>; positions: 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5
//
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & hid & artifacts & artifWorn;
// }
//
// std::vector<const CArtifact*> equiped, unequiped; //used locally
// BonusList gained, lost; //used locally as hlp when applying
// };
2008-12-27 03:01:59 +02:00
2009-03-07 00:11:17 +02:00
struct HeroRecruited : public CPackForClient //515
2008-10-26 22:58:34 +02:00
{
HeroRecruited ( ) { type = 515 ; } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-10-26 22:58:34 +02:00
si32 hid , tid ; //subID of hero
int3 tile ;
ui8 player ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid & tid & tile & player ;
}
} ;
2009-02-14 21:12:40 +02:00
2009-03-07 00:11:17 +02:00
struct GiveHero : public CPackForClient //516
2009-02-14 21:12:40 +02:00
{
GiveHero ( ) { type = 516 ; } ;
2009-03-07 00:11:17 +02:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2009-02-14 21:12:40 +02:00
ui32 id ; //object id
ui8 player ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id & player ;
}
} ;
2009-07-06 22:41:27 +03:00
struct OpenWindow : public CPackForClient //517
2009-06-16 14:18:14 +03:00
{
2009-07-06 22:41:27 +03:00
OpenWindow ( ) { type = 517 ; } ;
2009-06-16 14:18:14 +03:00
void applyCl ( CClient * cl ) ;
2010-07-22 03:32:45 +03:00
enum EWindow { EXCHANGE_WINDOW , RECRUITMENT_FIRST , RECRUITMENT_ALL , SHIPYARD_WINDOW , THIEVES_GUILD ,
UNIVERSITY_WINDOW , HILL_FORT_WINDOW , MARKET_WINDOW , PUZZLE_MAP , TAVERN_WINDOW } ;
2009-07-06 22:41:27 +03:00
ui8 window ;
ui32 id1 , id2 ;
2009-06-16 14:18:14 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-07-06 22:41:27 +03:00
h & window & id1 & id2 ;
2009-06-16 14:18:14 +03:00
}
} ;
2009-07-26 06:33:13 +03:00
struct NewObject : public CPackForClient //518
{
NewObject ( ) { type = 518 ; } ;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
ui32 ID , subID ;
int3 pos ;
int id ; //used internally
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ID & subID & pos ;
}
} ;
2010-06-26 19:02:10 +03:00
struct SetAvailableArtifacts : public CPackForClient //519
{
SetAvailableArtifacts ( ) { type = 519 ; } ;
2010-06-27 19:03:01 +03:00
void applyCl ( CClient * cl ) ;
2010-06-26 19:02:10 +03:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
si32 id ; //two variants: id < 0: set artifact pool for Artifact Merchants in towns; id >= 0: set pool for adv. map Black Market (id is the id of Black Market instance then)
std : : vector < const CArtifact * > arts ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id & arts ;
}
} ;
2010-12-17 00:32:53 +02:00
struct NewArtifact : public CPackForClient //520
2010-11-10 02:06:25 +02:00
{
NewArtifact ( ) { type = 520 ; } ;
//void applyCl(CClient *cl);
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2010-12-26 16:34:11 +02:00
ConstTransitivePtr < CArtifactInstance > art ;
2010-11-10 02:06:25 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-12-26 16:34:11 +02:00
h & art ;
2010-11-10 02:06:25 +02:00
}
} ;
2010-11-27 03:46:19 +02:00
struct StackLocation
{
2010-12-14 23:55:23 +02:00
ConstTransitivePtr < CArmedInstance > army ;
2010-11-27 03:46:19 +02:00
TSlot slot ;
StackLocation ( )
{
slot = - 1 ;
}
StackLocation ( const CArmedInstance * Army , TSlot Slot )
{
army = const_cast < CArmedInstance * > ( Army ) ; //we are allowed here to const cast -> change will go through one of our packages... do not abuse!
slot = Slot ;
}
2010-12-14 23:55:23 +02:00
DLL_EXPORT const CStackInstance * getStack ( ) ;
2010-11-27 03:46:19 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & army & slot ;
}
} ;
2010-11-27 22:17:28 +02:00
struct CGarrisonOperationPack : CPackForClient
{
} ;
2011-01-22 05:43:20 +02:00
struct CArtifactOperationPack : CPackForClient
{
} ;
2010-11-27 22:17:28 +02:00
struct ChangeStackCount : CGarrisonOperationPack //521
2010-11-27 03:46:19 +02:00
{
StackLocation sl ;
TQuantity count ;
ui8 absoluteValue ; //if not -> count will be added (or subtracted if negative)
2010-11-27 22:17:28 +02:00
void applyCl ( CClient * cl ) ;
2010-11-27 03:46:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-12-12 01:11:26 +02:00
h & sl & count & absoluteValue ;
2010-11-27 03:46:19 +02:00
}
} ;
2010-11-27 22:17:28 +02:00
struct SetStackType : CGarrisonOperationPack //522
2010-11-27 03:46:19 +02:00
{
StackLocation sl ;
CCreature * type ;
2010-11-27 22:17:28 +02:00
void applyCl ( CClient * cl ) ;
2010-11-27 03:46:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & sl & type ;
}
} ;
2010-11-27 22:17:28 +02:00
struct EraseStack : CGarrisonOperationPack //523
2010-11-27 03:46:19 +02:00
{
StackLocation sl ;
2010-11-27 22:17:28 +02:00
void applyCl ( CClient * cl ) ;
2010-11-27 03:46:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & sl ;
}
} ;
2010-11-27 22:17:28 +02:00
struct SwapStacks : CGarrisonOperationPack //524
2010-11-27 03:46:19 +02:00
{
StackLocation sl1 , sl2 ;
2010-11-27 22:17:28 +02:00
void applyCl ( CClient * cl ) ;
2010-11-27 03:46:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & sl1 & sl2 ;
}
} ;
2010-11-27 22:17:28 +02:00
struct InsertNewStack : CGarrisonOperationPack //525
2010-11-27 03:46:19 +02:00
{
StackLocation sl ;
2010-12-06 01:10:02 +02:00
CStackBasicDescriptor stack ;
2010-11-27 03:46:19 +02:00
2010-11-27 22:17:28 +02:00
void applyCl ( CClient * cl ) ;
2010-11-27 03:46:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & sl & stack ;
}
} ;
//moves creatures from src stack to dst slot, may be used for merging/splittint/moving stacks
2010-12-06 01:10:02 +02:00
struct RebalanceStacks : CGarrisonOperationPack //526
2010-11-27 03:46:19 +02:00
{
StackLocation src , dst ;
TQuantity count ;
2010-11-27 22:17:28 +02:00
void applyCl ( CClient * cl ) ;
2010-11-27 03:46:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & src & dst & count ;
}
} ;
2010-12-17 00:32:53 +02:00
typedef si32 TArtPos ;
struct ArtifactLocation
{
ConstTransitivePtr < CGHeroInstance > hero ;
TArtPos slot ;
ArtifactLocation ( )
{
slot = - 1 ;
}
ArtifactLocation ( const CGHeroInstance * Hero , TArtPos Slot )
{
hero = const_cast < CGHeroInstance * > ( Hero ) ; //we are allowed here to const cast -> change will go through one of our packages... do not abuse!
slot = Slot ;
}
2010-12-26 16:34:11 +02:00
DLL_EXPORT const CArtifactInstance * getArt ( ) const ;
DLL_EXPORT CArtifactInstance * getArt ( ) ;
DLL_EXPORT const ArtSlotInfo * getSlot ( ) const ;
2010-12-17 00:32:53 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hero & slot ;
}
} ;
2011-01-22 05:43:20 +02:00
struct PutArtifact : CArtifactOperationPack //526
2010-12-17 00:32:53 +02:00
{
ArtifactLocation al ;
2010-12-26 16:34:11 +02:00
ConstTransitivePtr < CArtifactInstance > art ;
2010-12-17 00:32:53 +02:00
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-12-26 16:34:11 +02:00
h & al & art ;
2010-12-17 00:32:53 +02:00
}
} ;
2011-01-22 05:43:20 +02:00
struct EraseArtifact : CArtifactOperationPack //527
2010-12-17 00:32:53 +02:00
{
ArtifactLocation al ;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & al ;
}
} ;
2011-01-22 05:43:20 +02:00
struct MoveArtifact : CArtifactOperationPack //528
2010-12-17 00:32:53 +02:00
{
ArtifactLocation src , dst ;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & src & dst ;
}
} ;
2011-01-22 05:43:20 +02:00
struct AssembledArtifact : CArtifactOperationPack //529
{
ArtifactLocation al ; //where assembly will be put
CArtifact * builtArt ;
//std::vector<CArtifactInstance *> constituents;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & al & builtArt /* & constituents*/ ;
}
} ;
struct DisassembledArtifact : CArtifactOperationPack //530
{
ArtifactLocation al ;
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & al ;
}
} ;
2009-03-07 00:11:17 +02:00
struct NewTurn : public CPackForClient //101
2008-08-10 07:46:16 +03:00
{
2010-08-26 10:23:08 +03:00
enum weekType { NORMAL , DOUBLE_GROWTH , BONUS_GROWTH , DEITYOFFIRE , PLAGUE , CUSTOM , NO_ACTION , NONE } ;
2010-08-22 21:21:45 +03:00
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-10 07:46:16 +03:00
struct Hero
{
ui32 id , move , mana ; //id is a general serial id
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id & move & mana ;
}
bool operator < ( const Hero & h ) const { return id < h . id ; }
} ;
std : : set < Hero > heroes ; //updates movement and mana points
2009-11-28 03:42:08 +02:00
//std::vector<SetResources> res;//resource list
std : : map < ui8 , std : : vector < si32 > > res ; //player ID => resource value[res_id]
std : : vector < SetAvailableCreatures > cres ; //creatures to be placed in towns
2008-08-10 07:46:16 +03:00
ui32 day ;
bool resetBuilded ;
2010-08-26 10:23:08 +03:00
ui8 specialWeek ; //weekType
TCreature creatureid ; //for creature weeks
2008-08-10 07:46:16 +03:00
NewTurn ( ) { type = 101 ; } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-08-26 10:23:08 +03:00
h & heroes & cres & res & day & resetBuilded & specialWeek & creatureid ;
2008-08-01 14:21:15 +03:00
}
} ;
2009-03-07 00:11:17 +02:00
struct Component : public CPack //2002 helper for object scrips informations
2008-07-31 00:27:15 +03:00
{
2010-05-18 10:01:54 +03:00
enum EComponentType { PRIM_SKILL , SEC_SKILL , RESOURCE , CREATURE , ARTIFACT , EXPERIENCE , SPELL , MORALE = 8 , LUCK , BUILDING , HERO , FLAG } ;
2009-03-09 21:40:43 +02:00
ui16 id , subtype ; //id uses ^^^ enums, when id==EXPPERIENCE subtype==0 means exp points and subtype==1 levels)
2008-07-31 00:27:15 +03:00
si32 val ; // + give; - take
si16 when ; // 0 - now; +x - within x days; -x - per x days
template < typename Handler > void serialize ( Handler & h , const int version )
{
2008-07-31 13:35:22 +03:00
h & id & subtype & val & when ;
2008-07-31 00:27:15 +03:00
}
2010-04-02 05:07:40 +03:00
Component ( )
{
type = 2002 ;
}
2010-11-22 02:34:46 +02:00
DLL_EXPORT explicit Component ( const CStackBasicDescriptor & stack ) ;
2010-04-02 05:07:40 +03:00
Component ( ui16 Type , ui16 Subtype , si32 Val , si16 When )
: id ( Type ) , subtype ( Subtype ) , val ( Val ) , when ( When )
{
type = 2002 ;
}
2008-07-31 00:27:15 +03:00
} ;
2009-03-07 00:11:17 +02:00
struct InfoWindow : public CPackForClient //103 - displays simple info window
2008-07-31 00:27:15 +03:00
{
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2008-07-31 00:27:15 +03:00
MetaString text ;
std : : vector < Component > components ;
ui8 player ;
2009-04-22 21:48:56 +03:00
ui16 soundID ;
2008-07-31 00:27:15 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-04-22 21:48:56 +03:00
h & text & components & player & soundID ;
2008-07-31 00:27:15 +03:00
}
2010-03-11 01:16:30 +02:00
InfoWindow ( )
{
2009-04-22 21:48:56 +03:00
type = 103 ;
soundID = 0 ;
2010-03-11 01:16:30 +02:00
}
2008-07-30 20:51:19 +03:00
} ;
2010-05-02 21:20:26 +03:00
namespace ObjProperty
{
//TODO: move non general properties out to the appropriate objs classes
2010-07-31 03:26:34 +03:00
enum { OWNER = 1 , BLOCKVIS = 2 , PRIMARY_STACK_COUNT = 3 , VISITORS = 4 , VISITED = 5 , ID = 6 , AVAILABLE_CREATURE = 7 , SUBID = 8 } ;
2010-05-02 21:20:26 +03:00
}
2009-03-07 00:11:17 +02:00
struct SetObjectProperty : public CPackForClient //1001
2008-07-30 20:51:19 +03:00
{
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-07-30 15:49:45 +03:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:11:17 +02:00
2008-07-30 20:51:19 +03:00
ui32 id ;
2009-02-14 21:12:40 +02:00
ui8 what ; //1 - owner; 2 - blockvis; 3 - first stack count; 4 - visitors; 5 - visited; 6 - ID (if 34 then also def is replaced)
2008-07-30 20:51:19 +03:00
ui32 val ;
SetObjectProperty ( ) { type = 1001 ; } ;
SetObjectProperty ( ui32 ID , ui8 What , ui32 Val ) : id ( ID ) , what ( What ) , val ( Val ) { type = 1001 ; } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id & what & val ;
}
} ;
2009-03-07 00:11:17 +02:00
struct SetHoverName : public CPackForClient //1002
2008-07-30 20:51:19 +03:00
{
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-07-30 20:51:19 +03:00
ui32 id ;
MetaString name ;
SetHoverName ( ) { type = 1002 ; } ;
SetHoverName ( ui32 ID , MetaString & Name ) : id ( ID ) , name ( Name ) { type = 1002 ; } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id & name ;
}
2008-08-04 18:56:36 +03:00
} ;
2009-03-07 00:11:17 +02:00
struct HeroLevelUp : public Query //2000
2008-08-04 18:56:36 +03:00
{
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-13 03:44:31 +03:00
si32 heroid ;
2008-08-04 18:56:36 +03:00
ui8 primskill , level ;
2008-08-13 03:44:31 +03:00
std : : vector < ui16 > skills ;
2008-08-04 18:56:36 +03:00
HeroLevelUp ( ) { type = 2000 ; } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2008-08-13 03:44:31 +03:00
h & id & heroid & primskill & level & skills ;
2008-08-04 18:56:36 +03:00
}
} ;
2008-08-13 03:44:31 +03:00
2009-09-21 12:00:33 +03:00
struct TradeComponents : public CPackForClient , public CPackForServer
{
2009-09-25 07:05:01 +03:00
///used to handle info about components available in shops
2009-09-21 12:00:33 +03:00
void applyCl ( CClient * cl ) ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
si32 heroid ;
ui32 objectid ;
2009-09-25 07:05:01 +03:00
std : : map < ui16 , Component > available , chosen , bought ;
2009-09-21 12:00:33 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-10-03 14:16:42 +03:00
h & heroid & objectid & available & chosen & bought ;
2009-09-21 12:00:33 +03:00
}
} ;
2009-04-11 04:32:50 +03:00
//A dialog that requires making decision by player - it may contain components to choose between or has yes/no options
//Client responds with QueryReply, where answer: 0 - cancel pressed, choice doesn't matter; 1/2/... - first/second/... component selected and OK pressed
//Until sending reply player won't be allowed to take any actions
struct BlockingDialog : public Query //2003
2008-08-13 03:44:31 +03:00
{
2009-04-11 04:32:50 +03:00
enum { ALLOW_CANCEL = 1 , SELECTION = 2 } ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2008-08-13 03:44:31 +03:00
MetaString text ;
std : : vector < Component > components ;
ui8 player ;
2009-04-11 04:32:50 +03:00
ui8 flags ;
2009-04-22 21:48:56 +03:00
ui16 soundID ;
2008-08-13 03:44:31 +03:00
2009-04-11 04:32:50 +03:00
bool cancel ( ) const
2008-08-13 03:44:31 +03:00
{
2009-04-11 04:32:50 +03:00
return flags & ALLOW_CANCEL ;
}
bool selection ( ) const
{
return flags & SELECTION ;
2008-08-13 03:44:31 +03:00
}
2008-08-22 15:21:09 +03:00
2009-04-11 04:32:50 +03:00
BlockingDialog ( bool yesno , bool Selection )
{
2009-04-14 13:46:42 +03:00
type = 2003 ;
flags = 0 ;
2009-04-22 21:48:56 +03:00
soundID = 0 ;
2009-04-11 04:32:50 +03:00
if ( yesno ) flags | = ALLOW_CANCEL ;
if ( Selection ) flags | = SELECTION ;
}
BlockingDialog ( )
{
type = 2003 ;
2009-04-14 13:46:42 +03:00
flags = 0 ;
2009-04-22 21:48:56 +03:00
soundID = 0 ;
2009-04-11 04:32:50 +03:00
} ;
2008-08-22 15:21:09 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-04-22 21:48:56 +03:00
h & id & text & components & player & flags & soundID ;
2008-08-22 15:21:09 +03:00
}
} ;
2009-04-12 03:58:41 +03:00
struct GarrisonDialog : public Query //2004
{
GarrisonDialog ( ) { type = 2004 ; }
void applyCl ( CClient * cl ) ;
si32 objid , hid ;
2009-09-09 20:49:03 +03:00
bool removableUnits ;
2009-04-12 03:58:41 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-09-09 20:49:03 +03:00
h & id & objid & hid & removableUnits ;
2009-04-12 03:58:41 +03:00
}
} ;
2008-08-04 18:56:36 +03:00
struct BattleInfo ;
2009-03-07 00:11:17 +02:00
struct BattleStart : public CPackForClient //3000
2008-08-04 18:56:36 +03:00
{
2009-03-07 00:11:17 +02:00
BattleStart ( ) { type = 3000 ; } ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-04 18:56:36 +03:00
BattleInfo * info ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & info ;
}
} ;
2009-03-07 00:11:17 +02:00
struct BattleNextRound : public CPackForClient //3001
{
BattleNextRound ( ) { type = 3001 ; } ;
2010-05-07 15:29:41 +03:00
void applyFirstCl ( CClient * cl ) ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2010-05-07 15:29:41 +03:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2008-08-04 18:56:36 +03:00
si32 round ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & round ;
}
} ;
2009-03-07 00:11:17 +02:00
struct BattleSetActiveStack : public CPackForClient //3002
2008-08-04 18:56:36 +03:00
{
2009-03-07 00:11:17 +02:00
BattleSetActiveStack ( ) { type = 3002 ; } ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-04 18:56:36 +03:00
ui32 stack ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & stack ;
}
} ;
2009-03-07 00:11:17 +02:00
struct BattleResult : public CPackForClient //3003
2008-08-04 18:56:36 +03:00
{
2009-03-07 00:11:17 +02:00
BattleResult ( ) { type = 3003 ; } ;
void applyFirstCl ( CClient * cl ) ;
2009-03-07 19:08:40 +02:00
void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2008-08-04 18:56:36 +03:00
ui8 result ; //0 - normal victory; 1 - escape; 2 - surrender
ui8 winner ; //0 - attacker, 1 - defender, [2 - draw (should be possible?)]
2009-09-24 16:23:52 +03:00
std : : map < ui32 , si32 > casualties [ 2 ] ; //first => casualties of attackers - map crid => number
2010-08-15 19:24:58 +03:00
expType exp [ 2 ] ; //exp for attacker and defender
2008-08-04 18:56:36 +03:00
std : : set < ui32 > artifacts ; //artifacts taken from loser to winner
template < typename Handler > void serialize ( Handler & h , const int version )
{
2008-09-08 14:32:16 +03:00
h & result & winner & casualties [ 0 ] & casualties [ 1 ] & exp & artifacts ;
2008-08-04 18:56:36 +03:00
}
} ;
2009-03-07 00:11:17 +02:00
struct BattleStackMoved : public CPackForClient //3004
2008-08-05 02:04:15 +03:00
{
2011-01-09 19:41:46 +02:00
ui32 stack ;
THex tile ;
2010-05-07 17:05:48 +03:00
ui8 ending , distance , teleporting ;
2008-09-29 00:01:49 +03:00
BattleStackMoved ( ) { type = 3004 ; } ;
2009-03-07 00:11:17 +02:00
void applyFirstCl ( CClient * cl ) ;
2009-03-07 19:08:40 +02:00
void applyGs ( CGameState * gs ) ;
2008-08-05 02:04:15 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-03-31 23:47:53 +03:00
h & stack & tile & ending & distance ;
2008-08-05 02:04:15 +03:00
}
} ;
2010-05-07 15:29:41 +03:00
struct StacksHealedOrResurrected : public CPackForClient //3013
{
StacksHealedOrResurrected ( ) { type = 3013 ; }
DLL_EXPORT void applyGs ( CGameState * gs ) ;
void applyCl ( CClient * cl ) ;
struct HealInfo
{
ui32 stackID ;
ui32 healedHP ;
ui8 lowLevelResurrection ; //in case this stack is resurrected by this heal, it will be marked as SUMMONED
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & stackID & healedHP & lowLevelResurrection ;
}
} ;
std : : vector < HealInfo > healedStacks ;
ui8 lifeDrain ; //if true, this heal is an effect of life drain
si32 drainedFrom ; //if life drain - then stack life was drain from
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & healedStacks & lifeDrain & drainedFrom ;
}
} ;
2009-03-07 00:11:17 +02:00
struct BattleStackAttacked : public CPackForClient //3005
2008-08-09 02:02:32 +03:00
{
2009-03-07 00:11:17 +02:00
BattleStackAttacked ( ) { flags = 0 ; type = 3005 ; } ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
2009-09-15 15:20:11 +03:00
ui32 stackAttacked , attackerID ;
2008-08-09 02:02:32 +03:00
ui32 newAmount , newHP , killedAmount , damageAmount ;
2011-02-24 17:33:03 +02:00
enum EFlags { KILLED = 1 , EFFECT = 2 } ;
ui8 flags ; //uses EFlags (above)
ui32 effect ; //set only if flag EFFECT is set
2010-05-07 15:29:41 +03:00
std : : vector < StacksHealedOrResurrected > healedStacks ; //used when life drain
2008-08-09 02:02:32 +03:00
2011-02-24 17:33:03 +02:00
2009-03-24 23:28:17 +02:00
bool killed ( ) const //if target stack was killed
2008-08-09 02:02:32 +03:00
{
2011-02-24 17:33:03 +02:00
return flags & KILLED ;
2008-08-09 02:02:32 +03:00
}
2010-05-07 15:29:41 +03:00
bool isEffect ( ) const //if stack has been attacked by a spell
2008-10-18 14:41:24 +03:00
{
2011-02-24 17:33:03 +02:00
return flags & EFFECT ;
2008-10-18 14:41:24 +03:00
}
2010-05-07 15:29:41 +03:00
bool lifeDrain ( ) const //if this attack involves life drain effect
{
return healedStacks . size ( ) > 0 ;
}
2008-08-09 02:02:32 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-05-07 15:29:41 +03:00
h & stackAttacked & attackerID & newAmount & newHP & flags & killedAmount & damageAmount & effect
& healedStacks ;
2008-08-09 02:02:32 +03:00
}
2009-03-21 14:49:58 +02:00
bool operator < ( const BattleStackAttacked & b ) const
{
return stackAttacked < b . stackAttacked ;
}
2008-08-09 02:02:32 +03:00
} ;
2009-03-07 00:11:17 +02:00
struct BattleAttack : public CPackForClient //3006
2008-08-09 02:02:32 +03:00
{
2009-03-07 00:11:17 +02:00
BattleAttack ( ) { flags = 0 ; type = 3006 ; } ;
void applyFirstCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2010-02-20 15:24:38 +02:00
std : : vector < BattleStackAttacked > bsa ;
2008-08-09 02:02:32 +03:00
ui32 stackAttacking ;
2011-02-24 17:33:03 +02:00
ui8 flags ; //usues Eflags (below)
enum EFlags { SHOT = 1 , COUNTER = 2 , LUCKY = 4 , UNLUCKY = 8 , BALLISTA_DOUBLE_DMG = 16 } ;
2008-08-09 02:02:32 +03:00
2010-12-04 21:44:23 +02:00
bool shot ( ) const //distance attack - decrease number of shots
2008-08-09 02:02:32 +03:00
{
2011-02-24 17:33:03 +02:00
return flags & SHOT ;
2008-08-09 02:02:32 +03:00
}
2010-12-04 21:44:23 +02:00
bool counter ( ) const //is it counterattack?
2008-09-12 11:51:46 +03:00
{
2011-02-24 17:33:03 +02:00
return flags & COUNTER ;
2008-09-12 11:51:46 +03:00
}
2010-12-04 21:44:23 +02:00
bool lucky ( ) const
2009-03-21 14:49:58 +02:00
{
2011-02-24 17:33:03 +02:00
return flags & LUCKY ;
2009-03-21 14:49:58 +02:00
}
2010-12-04 21:44:23 +02:00
bool unlucky ( ) const
2008-08-09 02:02:32 +03:00
{
2009-03-21 14:49:58 +02:00
//TODO: support?
2011-02-24 17:33:03 +02:00
return flags & UNLUCKY ;
}
bool ballistaDoubleDmg ( ) const //if it's ballista attack and does double dmg
{
return flags & BALLISTA_DOUBLE_DMG ;
2008-08-09 02:02:32 +03:00
}
2009-03-21 14:49:58 +02:00
//bool killed() //if target stack was killed
//{
// return bsa.killed();
//}
2008-08-09 02:02:32 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & bsa & stackAttacking & flags ;
}
} ;
2009-03-07 00:11:17 +02:00
struct StartAction : public CPackForClient //3007
2008-09-29 00:01:49 +03:00
{
StartAction ( ) { type = 3007 ; } ;
StartAction ( const BattleAction & act ) { ba = act ; type = 3007 ; } ;
2009-03-07 00:11:17 +02:00
void applyFirstCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
BattleAction ba ;
2008-09-29 00:01:49 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ba ;
}
} ;
2009-03-07 00:11:17 +02:00
struct EndAction : public CPackForClient //3008
2008-10-18 14:41:24 +03:00
{
2009-03-07 00:11:17 +02:00
EndAction ( ) { type = 3008 ; } ;
void applyCl ( CClient * cl ) ;
2009-03-07 00:25:19 +02:00
2009-03-07 00:11:17 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
}
} ;
2010-05-16 16:42:19 +03:00
struct BattleSpellCast : public CPackForClient //3009
2008-10-18 14:41:24 +03:00
{
2010-05-16 16:42:19 +03:00
BattleSpellCast ( ) { type = 3009 ; } ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2009-11-08 16:44:58 +02:00
si32 dmgToDisplay ; //this amount will be displayed as amount of damage dealt by spell
2009-05-12 06:35:51 +03:00
ui8 side ; //which hero did cast spell: 0 - attacker, 1 - defender
2009-08-06 17:02:21 +03:00
ui32 id ; //id of spell
ui8 skill ; //caster's skill level
2008-10-18 14:41:24 +03:00
ui16 tile ; //destination tile (may not be set in some global/mass spells
2009-07-26 15:15:38 +03:00
std : : vector < ui32 > resisted ; //ids of creatures that resisted this spell
2009-08-04 20:05:49 +03:00
std : : set < ui32 > affectedCres ; //ids of creatures affected by this spell, generally used if spell does not set any effect (like dispel or cure)
2010-02-23 17:39:31 +02:00
ui8 castedByHero ; //if true - spell has been casted by hero, otherwise by a creature
2008-10-18 14:41:24 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-02-23 17:39:31 +02:00
h & dmgToDisplay & side & id & skill & tile & resisted & affectedCres & castedByHero ;
2008-10-18 14:41:24 +03:00
}
} ;
2009-03-07 00:11:17 +02:00
struct SetStackEffect : public CPackForClient //3010
2008-11-09 00:29:19 +02:00
{
2009-03-07 00:11:17 +02:00
SetStackEffect ( ) { type = 3010 ; } ;
2009-03-07 00:25:19 +02:00
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-03-07 00:11:17 +02:00
void applyCl ( CClient * cl ) ;
2010-02-20 15:24:38 +02:00
std : : vector < ui32 > stacks ; //affected stacks (IDs)
2011-01-20 21:57:12 +02:00
std : : vector < Bonus > effect ; //bonuses to apply
2008-11-09 00:29:19 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-03-21 14:49:58 +02:00
h & stacks & effect ;
2008-11-09 00:29:19 +02:00
}
} ;
2009-04-16 03:28:54 +03:00
struct StacksInjured : public CPackForClient //3011
{
StacksInjured ( ) { type = 3011 ; }
DLL_EXPORT void applyGs ( CGameState * gs ) ;
void applyCl ( CClient * cl ) ;
2010-02-20 15:24:38 +02:00
std : : vector < BattleStackAttacked > stacks ;
2009-04-16 03:28:54 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & stacks ;
}
} ;
2009-08-04 02:53:18 +03:00
struct BattleResultsApplied : public CPackForClient //3012
{
BattleResultsApplied ( ) { type = 3012 ; }
ui8 player1 , player2 ;
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & player1 & player2 ;
}
} ;
2009-08-19 13:59:42 +03:00
struct ObstaclesRemoved : public CPackForClient //3014
{
ObstaclesRemoved ( ) { type = 3014 ; }
DLL_EXPORT void applyGs ( CGameState * gs ) ;
void applyCl ( CClient * cl ) ;
std : : set < si32 > obstacles ; //uniqueIDs of removed obstacles
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & obstacles ;
}
2009-09-01 16:54:13 +03:00
} ;
struct CatapultAttack : public CPackForClient //3015
{
CatapultAttack ( ) { type = 3015 ; }
DLL_EXPORT void applyGs ( CGameState * gs ) ;
void applyCl ( CClient * cl ) ;
2009-09-24 16:44:55 +03:00
std : : set < std : : pair < std : : pair < ui8 , si16 > , ui8 > > attackedParts ; // < <attackedPartOfWall, attacked hex >, damageDealt>
2009-09-07 15:30:10 +03:00
//attackedPartOfWall; //[0] - keep, [1] - bottom tower, [2] - bottom wall, [3] - below gate, [4] - over gate, [5] - upper wall, [6] - uppert tower, [7] - gate;
//damageDealt;
2009-09-24 16:44:55 +03:00
int attacker ; //if -1, then a spell caused this
2009-09-01 16:54:13 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-09-24 16:44:55 +03:00
h & attackedParts & attacker ;
2009-09-01 16:54:13 +03:00
}
2009-09-05 17:10:26 +03:00
} ;
struct BattleStacksRemoved : public CPackForClient //3016
{
BattleStacksRemoved ( ) { type = 3016 ; }
DLL_EXPORT void applyGs ( CGameState * gs ) ;
void applyCl ( CClient * cl ) ;
std : : set < ui32 > stackIDs ; //IDs of removed stacks
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & stackIDs ;
}
2009-08-19 13:59:42 +03:00
} ;
2009-03-07 00:11:17 +02:00
struct ShowInInfobox : public CPackForClient //107
2008-08-04 18:56:36 +03:00
{
ShowInInfobox ( ) { type = 107 ; } ;
ui8 player ;
Component c ;
MetaString text ;
2009-03-07 00:25:19 +02:00
void applyCl ( CClient * cl ) ;
2008-08-04 18:56:36 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & player & c & text ;
}
2010-05-16 16:42:19 +03:00
} ;
struct AdvmapSpellCast : public CPackForClient //108
{
AdvmapSpellCast ( ) { type = 108 ; }
const CGHeroInstance * caster ;
si32 spellID ;
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & caster & spellID ;
}
2008-12-26 17:00:34 +02:00
} ;
2009-03-09 12:37:49 +02:00
/***********************************************************************************************************/
struct CloseServer : public CPackForServer
{
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{ }
} ;
struct EndTurn : public CPackForServer
{
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{ }
} ;
struct DismissHero : public CPackForServer
{
DismissHero ( ) { } ;
2009-03-28 02:38:48 +02:00
DismissHero ( si32 HID ) : hid ( HID ) { } ;
2009-03-09 12:37:49 +02:00
si32 hid ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid ;
}
} ;
struct MoveHero : public CPackForServer
{
MoveHero ( ) { } ;
MoveHero ( const int3 & Dest , si32 HID ) : dest ( Dest ) , hid ( HID ) { } ;
int3 dest ;
si32 hid ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
2010-06-30 22:27:35 +03:00
{
h & dest & hid ;
}
} ;
struct CastleTeleportHero : public CPackForServer
{
CastleTeleportHero ( ) { } ;
CastleTeleportHero ( const si32 HID , si32 Dest , ui8 Source ) : dest ( Dest ) , hid ( HID ) , source ( Source ) { } ;
si32 dest ;
si32 hid ;
si8 source ; //who give teleporting, 1=castle gate
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
2009-03-09 12:37:49 +02:00
{
h & dest & hid ;
}
} ;
struct ArrangeStacks : public CPackForServer
{
ArrangeStacks ( ) { } ;
ArrangeStacks ( ui8 W , ui8 P1 , ui8 P2 , si32 ID1 , si32 ID2 , si32 VAL )
: what ( W ) , p1 ( P1 ) , p2 ( P2 ) , id1 ( ID1 ) , id2 ( ID2 ) , val ( VAL ) { } ;
ui8 what ; //1 - swap; 2 - merge; 3 - split
ui8 p1 , p2 ; //positions of first and second stack
si32 id1 , id2 ; //ids of objects with garrison
si32 val ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & what & p1 & p2 & id1 & id2 & val ;
}
} ;
struct DisbandCreature : public CPackForServer
{
DisbandCreature ( ) { } ;
DisbandCreature ( ui8 Pos , si32 ID ) : pos ( Pos ) , id ( ID ) { } ;
ui8 pos ; //stack pos
si32 id ; //object id
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & pos & id ;
}
} ;
struct BuildStructure : public CPackForServer
{
BuildStructure ( ) { } ;
2009-04-15 13:20:47 +03:00
BuildStructure ( si32 TID , si32 BID ) : bid ( BID ) , tid ( TID ) { } ;
2009-03-09 12:37:49 +02:00
si32 bid , tid ; //structure and town ids
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & tid & bid ;
}
} ;
2009-09-22 17:27:46 +03:00
struct RazeStructure : public BuildStructure
{
RazeStructure ( ) { } ;
//RazeStructure(si32 TID, si32 BID):bid(BID),tid(TID){};
2009-03-09 12:37:49 +02:00
2009-09-22 17:27:46 +03:00
bool applyGh ( CGameHandler * gh ) ;
} ;
2009-03-09 12:37:49 +02:00
struct RecruitCreatures : public CPackForServer
{
RecruitCreatures ( ) { } ;
2010-07-10 19:50:23 +03:00
RecruitCreatures ( si32 TID , si32 CRID , si32 Amount , si32 Level ) : tid ( TID ) , crid ( CRID ) , amount ( Amount ) , level ( Level ) { } ;
2009-03-09 12:37:49 +02:00
si32 tid ; //town id
ui32 crid , amount ; //creature ID and amount
2010-07-10 19:50:23 +03:00
si32 level ; //dwelling level to buy from, -1 if any
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-07-10 19:50:23 +03:00
h & tid & crid & amount & level ;
2009-03-09 12:37:49 +02:00
}
} ;
struct UpgradeCreature : public CPackForServer
{
UpgradeCreature ( ) { } ;
UpgradeCreature ( ui8 Pos , si32 ID , si32 CRID ) : pos ( Pos ) , id ( ID ) , cid ( CRID ) { } ;
ui8 pos ; //stack pos
si32 id ; //object id
si32 cid ; //id of type to which we want make upgrade
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & pos & id & cid ;
}
} ;
struct GarrisonHeroSwap : public CPackForServer
{
GarrisonHeroSwap ( ) { } ;
GarrisonHeroSwap ( si32 TID ) : tid ( TID ) { } ;
si32 tid ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & tid ;
}
} ;
struct ExchangeArtifacts : public CPackForServer
{
ExchangeArtifacts ( ) { } ;
ExchangeArtifacts ( si32 H1 , si32 H2 , ui16 S1 , ui16 S2 )
: hid1 ( H1 ) , hid2 ( H2 ) , slot1 ( S1 ) , slot2 ( S2 ) { } ;
si32 hid1 , hid2 ;
ui16 slot1 , slot2 ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid1 & hid2 & slot1 & slot2 ;
}
} ;
2010-02-16 16:39:56 +02:00
struct AssembleArtifacts : public CPackForServer
{
AssembleArtifacts ( ) { } ;
AssembleArtifacts ( si32 _heroID , ui16 _artifactSlot , bool _assemble , ui32 _assembleTo )
: heroID ( _heroID ) , artifactSlot ( _artifactSlot ) , assemble ( _assemble ) , assembleTo ( _assembleTo ) { } ;
si32 heroID ;
ui16 artifactSlot ;
bool assemble ; // True to assemble artifact, false to disassemble.
ui32 assembleTo ; // Artifact to assemble into.
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & heroID & artifactSlot & assemble & assembleTo ;
}
} ;
2009-03-09 12:37:49 +02:00
struct BuyArtifact : public CPackForServer
{
BuyArtifact ( ) { } ;
BuyArtifact ( si32 HID , si32 AID ) : hid ( HID ) , aid ( AID ) { } ;
si32 hid , aid ; //hero and artifact id
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid & aid ;
}
} ;
struct TradeOnMarketplace : public CPackForServer
{
TradeOnMarketplace ( ) { } ;
2010-05-18 10:01:54 +03:00
const CGObjectInstance * market ;
const CGHeroInstance * hero ; //needed when trading artifacts / creatures
2010-07-20 17:08:13 +03:00
ui8 mode ; //enum EMarketMode
2010-07-23 15:02:15 +03:00
ui32 r1 , r2 ; //mode 0: r1 - sold resource, r2 - bought res (exception: when sacrificing art r1 is art id [todo: make r2 preferred slot?]
2009-03-09 12:37:49 +02:00
ui32 val ; //units of sold resource
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-05-18 10:01:54 +03:00
h & market & hero & mode & r1 & r2 & val ;
2009-03-09 12:37:49 +02:00
}
} ;
struct SetFormation : public CPackForServer
{
SetFormation ( ) { } ;
SetFormation ( si32 HID , ui8 Formation ) : hid ( HID ) , formation ( Formation ) { } ;
si32 hid ;
ui8 formation ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid & formation ;
}
} ;
struct HireHero : public CPackForServer
{
HireHero ( ) { } ;
HireHero ( si32 HID , si32 TID ) : hid ( HID ) , tid ( TID ) { } ;
2010-07-09 02:03:27 +03:00
si32 hid , tid ; //available hero serial and town (tavern) id
ui8 player ;
2009-03-09 12:37:49 +02:00
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-07-09 02:03:27 +03:00
h & hid & tid & player ;
2009-03-09 12:37:49 +02:00
}
} ;
2009-07-26 06:33:13 +03:00
struct BuildBoat : public CPackForServer
{
BuildBoat ( ) { } ;
si32 objid ; //where player wants to buy a boat
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & objid ;
}
} ;
2009-03-09 12:37:49 +02:00
struct QueryReply : public CPackForServer
{
2009-08-04 02:53:18 +03:00
QueryReply ( ) { type = 6000 ; } ;
QueryReply ( ui32 QID , ui32 Answer ) : qid ( QID ) , answer ( Answer ) { type = 6000 ; } ;
2009-03-09 12:37:49 +02:00
ui32 qid , answer ; //hero and artifact id
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & qid & answer ;
}
} ;
struct MakeAction : public CPackForServer
{
MakeAction ( ) { } ;
2009-03-09 21:40:43 +02:00
MakeAction ( const BattleAction & BA ) : ba ( BA ) { } ;
2009-03-09 12:37:49 +02:00
BattleAction ba ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ba ;
}
} ;
struct MakeCustomAction : public CPackForServer
{
MakeCustomAction ( ) { } ;
2009-03-20 20:51:48 +02:00
MakeCustomAction ( const BattleAction & BA ) : ba ( BA ) { } ;
2009-03-09 12:37:49 +02:00
BattleAction ba ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ba ;
}
} ;
2010-02-21 17:03:30 +02:00
struct DigWithHero : public CPackForServer
{
DigWithHero ( ) { }
si32 id ; //digging hero id
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id ;
}
} ;
2010-03-11 01:16:30 +02:00
struct CastAdvSpell : public CPackForServer
{
CastAdvSpell ( ) { }
si32 hid ; //hero id
ui32 sid ; //spell id
int3 pos ; //selected tile (not always used)
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid & sid & pos ;
}
} ;
2009-03-09 12:37:49 +02:00
/***********************************************************************************************************/
2009-03-28 20:46:20 +02:00
struct SaveGame : public CPackForClient , public CPackForServer
{
SaveGame ( ) { } ;
SaveGame ( const std : : string & Fname ) : fname ( Fname ) { } ;
std : : string fname ;
void applyCl ( CClient * cl ) ;
void applyGs ( CGameState * gs ) { } ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-28 20:46:20 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & fname ;
}
} ;
2009-03-09 12:37:49 +02:00
struct PlayerMessage : public CPackForClient , public CPackForServer //513
{
PlayerMessage ( ) { CPackForClient : : type = 513 ; } ;
PlayerMessage ( ui8 Player , const std : : string & Text )
: player ( Player ) , text ( Text )
{ CPackForClient : : type = 513 ; } ;
void applyCl ( CClient * cl ) ;
void applyGs ( CGameState * gs ) { } ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 12:37:49 +02:00
ui8 player ;
std : : string text ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & text & player ;
}
} ;
struct SetSelection : public CPackForClient , public CPackForServer //514
{
SetSelection ( ) { CPackForClient : : type = 514 ; } ;
DLL_EXPORT void applyGs ( CGameState * gs ) ;
2009-04-16 03:28:54 +03:00
bool applyGh ( CGameHandler * gh ) ;
2009-08-30 15:47:40 +03:00
void applyCl ( CClient * cl ) ;
2009-03-09 12:37:49 +02:00
ui8 player ;
ui32 id ;
2009-08-11 10:50:29 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id & player ;
}
} ;
2009-08-13 04:03:11 +03:00
struct CenterView : public CPackForClient //515
2009-08-11 10:50:29 +03:00
{
2009-08-13 04:03:11 +03:00
CenterView ( ) { CPackForClient : : type = 515 ; } ;
2009-08-11 10:50:29 +03:00
void applyCl ( CClient * cl ) ;
ui8 player ;
2009-08-13 04:03:11 +03:00
int3 pos ;
ui32 focusTime ; //ms
2009-08-11 10:50:29 +03:00
2009-03-09 12:37:49 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-08-13 04:03:11 +03:00
h & pos & player & focusTime ;
2009-03-09 12:37:49 +02:00
}
2010-02-06 15:49:14 +02:00
} ;
2010-09-03 21:42:54 +03:00
/***********************************************************************************************************/
struct CPackForSelectionScreen : public CPack
{
void apply ( CSelectionScreen * selScreen ) { } ; //that functions are implemented in CPreGame.cpp
} ;
2010-10-24 14:35:14 +03:00
class CPregamePackToPropagate : public CPackForSelectionScreen
{ } ;
class CPregamePackToHost : public CPackForSelectionScreen
{ } ;
struct ChatMessage : public CPregamePackToPropagate
2010-09-03 21:42:54 +03:00
{
std : : string playerName , message ;
void apply ( CSelectionScreen * selScreen ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & playerName & message ;
}
} ;
2009-08-11 10:50:29 +03:00
2010-10-24 14:35:14 +03:00
struct QuitMenuWithoutStarting : public CPregamePackToPropagate
{
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{ }
} ;
struct PlayerJoined : public CPregamePackToHost
{
std : : string playerName ;
ui8 connectionID ;
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & playerName & connectionID ;
}
} ;
struct SelectMap : public CPregamePackToPropagate
{
const CMapInfo * mapInfo ;
bool free ;
SelectMap ( const CMapInfo & src )
{
mapInfo = & src ;
free = false ;
}
SelectMap ( )
{
mapInfo = NULL ;
free = true ;
}
~ SelectMap ( )
{
if ( free )
delete mapInfo ;
}
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & mapInfo ;
}
} ;
struct UpdateStartOptions : public CPregamePackToPropagate
{
StartInfo * options ;
bool free ;
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
UpdateStartOptions ( StartInfo & src )
{
options = & src ;
free = false ;
}
UpdateStartOptions ( )
{
options = NULL ;
free = true ;
}
~ UpdateStartOptions ( )
{
if ( free )
delete options ;
}
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & options ;
}
} ;
struct PregameGuiAction : public CPregamePackToPropagate
{
enum { NO_TAB , OPEN_OPTIONS , OPEN_SCENARIO_LIST } ;
ui8 action ;
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & action ;
}
} ;
struct RequestOptionsChange : public CPregamePackToHost
{
enum { TOWN , HERO , BONUS } ;
ui8 what ;
si8 direction ; //-1 or +1
ui8 playerID ;
RequestOptionsChange ( ui8 What , si8 Dir , ui8 Player )
: what ( What ) , direction ( Dir ) , playerID ( Player )
{ }
RequestOptionsChange ( ) { }
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & what & direction & playerID ;
}
} ;
struct PlayerLeft : public CPregamePackToPropagate
{
ui8 playerID ;
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & playerID ;
}
} ;
struct PlayersNames : public CPregamePackToPropagate
{
public :
std : : map < ui32 , std : : string > playerNames ;
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & playerNames ;
}
} ;
struct StartWithCurrentSettings : public CPregamePackToPropagate
{
public :
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
//h & playerNames;
}
} ;
2009-05-12 06:35:51 +03:00
# endif //__NETPACKS_H__