2017-07-13 11:26:03 +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
*
*/
2011-12-13 21:23:17 +00:00
# pragma once
2014-01-16 20:24:06 +00:00
# include "NetPacksBase.h"
2017-06-24 16:42:05 +02:00
# include "battle/BattleAction.h"
2014-06-05 19:52:14 +03:00
# include "mapObjects/CGHeroInstance.h"
2010-12-14 21:55:23 +00:00
# include "ConstTransitivePtr.h"
2011-12-13 21:23:17 +00:00
# include "int3.h"
2011-07-05 06:14:07 +00:00
# include "ResourceSet.h"
2014-06-25 17:11:07 +03:00
# include "CGameStateFwd.h"
2015-12-02 21:05:10 +02:00
# include "mapping/CMapDefines.h"
2017-06-24 16:42:05 +02:00
# include "battle/CObstacleInstance.h"
2009-02-04 13:40:54 +00:00
2015-02-26 17:15:17 +03:00
# include "spells/ViewSpellInt.h"
2010-08-20 13:34:39 +00:00
class CCampaignState ;
2010-06-26 16:02:10 +00:00
class CArtifact ;
2010-09-03 18:42:54 +00:00
class CSelectionScreen ;
2010-12-25 19:23:30 +00:00
class CGObjectInstance ;
2010-12-26 14:34:11 +00:00
class CArtifactInstance ;
2012-05-18 14:02:27 +00:00
struct StackLocation ;
2010-12-26 14:34:11 +00:00
struct ArtSlotInfo ;
2012-05-16 17:29:05 +00:00
struct QuestInfo ;
2014-06-25 17:11:07 +03:00
class CMapInfo ;
2016-08-30 05:13:45 +03:00
struct StartInfo ;
2017-07-20 07:08:49 +03:00
class IBattleState ;
2009-03-06 22:11:17 +00:00
struct Query : public CPackForClient
2008-08-13 00:44:31 +00:00
{
2013-05-27 10:53:28 +00:00
QueryID queryID ; // equals to -1 if it is not an actual query (and should not be answered)
2012-09-15 19:16:16 +00:00
2012-07-15 15:34:00 +00:00
Query ( )
{
}
2008-08-13 00:44:31 +00:00
} ;
2009-02-03 05:28:05 +00:00
2012-05-18 14:02:27 +00:00
struct StackLocation
{
ConstTransitivePtr < CArmedInstance > army ;
2013-02-16 14:03:47 +00:00
SlotID slot ;
2012-05-18 14:02:27 +00:00
StackLocation ( )
2013-02-16 14:03:47 +00:00
{ }
2013-11-07 12:48:41 +00:00
StackLocation ( const CArmedInstance * Army , SlotID 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 )
2012-05-18 14:02:27 +00:00
{
}
2012-08-30 16:01:19 +00:00
2012-05-18 14:02:27 +00:00
DLL_LINKAGE const CStackInstance * getStack ( ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & army ;
h & slot ;
2012-05-18 14:02:27 +00:00
}
} ;
2009-03-09 10:37:49 +00:00
/***********************************************************************************************************/
2011-05-22 18:46:52 +00:00
2016-11-18 17:45:59 +03:00
struct PackageApplied : public CPackForClient
2009-04-16 00:28:54 +00:00
{
2016-11-25 20:04:07 +03:00
PackageApplied ( )
: result ( 0 ) , packType ( 0 ) , requestID ( 0 )
{ }
PackageApplied ( ui8 Result )
: result ( Result ) , packType ( 0 ) , requestID ( 0 )
{ }
2009-04-16 00:28:54 +00:00
void applyCl ( CClient * cl ) ;
ui8 result ; //0 - something went wrong, request hasn't been realized; 1 - OK
ui32 packType ; //type id of applied package
2012-03-25 22:46:14 +00:00
ui32 requestID ; //an ID given by client to the request that was applied
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-04-16 00:28:54 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & result ;
h & packType ;
h & requestID ;
h & player ;
2009-04-16 00:28:54 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct SystemMessage : public CPackForClient
2008-07-26 06:39:44 +00:00
{
2016-11-25 20:04:07 +03:00
SystemMessage ( const std : : string & Text ) : text ( Text ) { }
SystemMessage ( ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2008-07-26 06:39:44 +00:00
2009-03-06 22:11:17 +00:00
std : : string text ;
2009-03-06 22:25:19 +00:00
2008-07-26 06:39:44 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2009-03-06 22:25:19 +00:00
h & text ;
2008-07-26 06:39:44 +00:00
}
2008-08-10 04:46:16 +00:00
} ;
2009-03-06 22:11:17 +00:00
2016-11-18 17:45:59 +03:00
struct PlayerBlocked : public CPackForClient
2009-08-03 23:53:18 +00:00
{
2016-11-25 20:04:07 +03:00
PlayerBlocked ( ) : reason ( UPCOMING_BATTLE ) , startOrEnd ( BLOCKADE_STARTED ) { }
2009-08-03 23:53:18 +00:00
void applyCl ( CClient * cl ) ;
2013-09-27 23:46:58 +00:00
enum EReason { UPCOMING_BATTLE , ONGOING_MOVEMENT } ;
enum EMode { BLOCKADE_STARTED , BLOCKADE_ENDED } ;
2016-08-30 05:13:45 +03:00
2013-02-13 23:55:42 +00:00
EReason reason ;
2013-09-27 23:46:58 +00:00
EMode startOrEnd ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-08-03 23:53:18 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & reason ;
h & startOrEnd ;
h & player ;
2009-08-03 23:53:18 +00:00
}
} ;
2017-06-02 03:34:50 +03:00
struct PlayerCheated : public CPackForClient
{
PlayerCheated ( ) : losingCheatCode ( false ) , winningCheatCode ( false ) { }
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
PlayerColor player ;
bool losingCheatCode ;
bool winningCheatCode ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & losingCheatCode ;
h & winningCheatCode ;
2017-06-02 03:34:50 +03:00
}
} ;
2016-11-18 17:45:59 +03:00
struct YourTurn : public CPackForClient
2009-03-06 22:11:17 +00:00
{
2016-11-25 20:04:07 +03:00
YourTurn ( ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2015-10-24 17:02:00 +02:00
boost : : optional < ui8 > daysWithoutCastle ;
2008-07-26 06:39:44 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & daysWithoutCastle ;
2008-07-26 06:39:44 +00:00
}
2008-08-10 04:46:16 +00:00
} ;
2009-03-06 22:11:17 +00:00
2016-11-18 17:45:59 +03:00
struct SetResources : public CPackForClient
{
2016-11-26 15:14:43 +03:00
SetResources ( ) : abs ( true ) { } ;
2016-11-18 17:45:59 +03:00
void applyCl ( CClient * cl ) ;
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2012-09-15 19:16:16 +00:00
2016-11-26 15:14:43 +03:00
bool abs ; //false - changes by value; 1 - sets to value
2016-11-18 17:45:59 +03:00
PlayerColor player ;
TResources res ; //res[resid] => res amount
2009-03-06 22:11:17 +00:00
2016-11-18 17:45:59 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & abs ;
h & player ;
h & res ;
2016-11-18 17:45:59 +03:00
}
} ;
struct SetPrimSkill : public CPackForClient
2008-08-04 15:56:36 +00:00
{
2016-11-25 20:04:07 +03:00
SetPrimSkill ( )
: abs ( 0 ) , which ( PrimarySkill : : ATTACK ) , val ( 0 )
{ }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2008-08-04 15:56:36 +00:00
ui8 abs ; //0 - changes by value; 1 - sets to value
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ;
2013-02-04 19:43:16 +00:00
PrimarySkill : : PrimarySkill which ;
2009-08-16 15:39:18 +00:00
si64 val ;
2008-08-04 15:56:36 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & abs ;
h & id ;
h & which ;
h & val ;
2008-08-04 15:56:36 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct SetSecSkill : public CPackForClient
2008-08-13 00:44:31 +00:00
{
2016-11-25 20:04:07 +03:00
SetSecSkill ( )
: abs ( 0 ) , val ( 0 )
{ }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2008-08-13 00:44:31 +00:00
ui8 abs ; //0 - changes by value; 1 - sets to value
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ;
2013-02-12 19:49:40 +00:00
SecondarySkill which ;
2013-02-04 19:43:16 +00:00
ui16 val ;
2008-08-13 00:44:31 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & abs ;
h & id ;
h & which ;
h & val ;
2008-08-13 00:44:31 +00:00
}
2012-05-07 12:54:22 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct HeroVisitCastle : public CPackForClient
2008-08-13 09:28:06 +00:00
{
2016-11-18 17:45:59 +03:00
HeroVisitCastle ( ) { flags = 0 ; } ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2011-02-04 14:58:14 +00:00
ui8 flags ; //1 - start
2013-02-13 23:55:42 +00:00
ObjectInstanceID tid , hid ;
2008-08-13 09:28:06 +00:00
bool start ( ) //if hero is entering castle (if false - leaving)
{
return flags & 1 ;
}
2016-11-18 17:45:59 +03:00
2008-08-13 09:28:06 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & flags ;
h & tid ;
h & hid ;
2008-08-13 09:28:06 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2016-11-25 20:04:07 +03:00
2016-11-18 17:45:59 +03:00
struct ChangeSpells : public CPackForClient
2008-09-12 08:51:46 +00:00
{
2016-11-25 20:04:07 +03:00
ChangeSpells ( ) : learn ( 1 ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2008-09-12 08:51:46 +00:00
ui8 learn ; //1 - gives spell, 0 - takes
2013-02-13 23:55:42 +00:00
ObjectInstanceID hid ;
2013-02-10 23:24:57 +00:00
std : : set < SpellID > spells ;
2008-09-12 08:51:46 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & learn ;
h & hid ;
h & spells ;
2008-09-12 08:51:46 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2008-10-18 23:20:48 +00:00
2016-11-18 17:45:59 +03:00
struct SetMana : public CPackForClient
2008-10-18 23:20:48 +00:00
{
2016-11-25 20:04:07 +03:00
SetMana ( ) { val = 0 ; absolute = true ; }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID hid ;
si32 val ;
2014-11-26 13:30:55 +03:00
bool absolute ;
2008-10-18 23:20:48 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & val ;
h & hid ;
h & absolute ;
2008-10-18 23:20:48 +00:00
}
2011-01-20 17:25:15 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct SetMovePoints : public CPackForClient
2008-10-18 23:20:48 +00:00
{
2017-05-11 20:52:10 +02:00
SetMovePoints ( ) { val = 0 ; absolute = true ; }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID hid ;
si32 val ;
2017-05-11 20:52:10 +02:00
bool absolute ;
2008-10-18 23:20:48 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & val ;
h & hid ;
h & absolute ;
2008-10-18 23:20:48 +00:00
}
2011-01-20 17:25:15 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct FoWChange : public CPackForClient
2008-10-18 23:20:48 +00:00
{
2016-11-25 20:04:07 +03:00
FoWChange ( ) { mode = 0 ; waitForDialogs = false ; }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-06-29 13:05:48 +00:00
std : : unordered_set < int3 , struct ShashInt3 > tiles ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
ui8 mode ; //mode==0 - hide, mode==1 - reveal
2014-06-21 17:41:05 +04:00
bool waitForDialogs ;
2008-10-18 23:20:48 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tiles ;
h & player ;
h & mode ;
h & waitForDialogs ;
2008-10-18 23:20:48 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2008-10-26 20:58:34 +00:00
2016-11-18 17:45:59 +03:00
struct SetAvailableHeroes : public CPackForClient
2008-10-26 20:58:34 +00:00
{
2010-07-08 05:52:11 +00:00
SetAvailableHeroes ( )
{
2011-12-13 21:23:17 +00:00
for ( int i = 0 ; i < GameConstants : : AVAILABLE_HEROES_PER_PLAYER ; i + + )
2011-01-28 02:11:58 +00:00
army [ i ] . clear ( ) ;
2010-07-08 05:52:11 +00:00
}
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2011-12-13 21:23:17 +00:00
si32 hid [ GameConstants : : AVAILABLE_HEROES_PER_PLAYER ] ; //-1 if no hero
CSimpleArmy army [ GameConstants : : AVAILABLE_HEROES_PER_PLAYER ] ;
2008-10-26 20:58:34 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & hid ;
h & army ;
2008-10-26 20:58:34 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct GiveBonus : public CPackForClient
2009-02-03 05:28:05 +00:00
{
2010-02-10 02:56:00 +00:00
GiveBonus ( ui8 Who = 0 )
{
2012-09-15 19:16:16 +00:00
who = Who ;
2016-11-25 20:04:07 +03:00
id = 0 ;
2010-02-10 02:56:00 +00:00
}
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-02-03 05:28:05 +00:00
2010-06-07 05:28:12 +00:00
enum { HERO , PLAYER , TOWN } ;
2010-02-10 02:56:00 +00:00
ui8 who ; //who receives bonus, uses enum above
2013-02-13 23:55:42 +00:00
si32 id ; //hero. town or player id - whoever receives it
2010-05-02 18:20:26 +00:00
Bonus bonus ;
2009-02-03 05:28:05 +00:00
MetaString bdescr ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & bonus ;
h & id ;
h & bdescr ;
h & who ;
2015-12-05 01:39:14 +02:00
assert ( id ! = - 1 ) ;
2009-02-03 05:28:05 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct ChangeObjPos : public CPackForClient
2009-02-20 10:36:15 +00:00
{
2010-03-10 23:16:30 +00:00
ChangeObjPos ( )
{
flags = 0 ;
}
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-02-20 10:36:15 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID objid ;
2009-02-20 10:36:15 +00:00
int3 nPos ;
ui8 flags ; //bit flags: 1 - redraw
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & objid ;
h & nPos ;
h & flags ;
2009-02-20 10:36:15 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct PlayerEndsGame : public CPackForClient
2010-01-29 20:52:45 +00:00
{
PlayerEndsGame ( )
{
}
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-01-29 20:52:45 +00:00
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2013-11-17 17:57:04 +00:00
EVictoryLossCheckResult victoryLossCheckResult ;
2010-01-29 20:52:45 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & victoryLossCheckResult ;
2010-01-29 20:52:45 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct RemoveBonus : public CPackForClient
2010-02-10 02:56:00 +00:00
{
RemoveBonus ( ui8 Who = 0 )
{
2012-09-15 19:16:16 +00:00
who = Who ;
2016-11-25 20:04:07 +03:00
whoID = 0 ;
source = 0 ;
id = 0 ;
2010-02-10 02:56:00 +00:00
}
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-02-10 02:56:00 +00:00
2010-06-13 13:59:59 +00:00
enum { HERO , PLAYER , TOWN } ;
2010-02-10 02:56:00 +00:00
ui8 who ; //who receives bonus, uses enum above
2010-06-13 13:59:59 +00:00
ui32 whoID ; //hero, town or player id - whoever loses bonus
2010-02-10 02:56:00 +00:00
//vars to identify bonus: its source
ui8 source ;
ui32 id ; //source id
//used locally: copy of removed bonus
2010-05-02 18:20:26 +00:00
Bonus bonus ;
2010-02-10 02:56:00 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & source ;
h & id ;
h & who ;
h & whoID ;
2010-02-10 02:56:00 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct UpdateCampaignState : public CPackForClient
2010-08-20 13:34:39 +00:00
{
2016-11-18 17:45:59 +03:00
UpdateCampaignState ( ) { }
2015-12-29 05:43:33 +03:00
std : : shared_ptr < CCampaignState > camp ;
2010-08-20 13:34:39 +00:00
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & camp ;
}
} ;
2016-11-18 17:45:59 +03:00
struct SetCommanderProperty : public CPackForClient
2012-05-07 12:54:22 +00:00
{
2012-05-18 19:44:15 +00:00
enum ECommanderProperty { ALIVE , BONUS , SECONDARY_SKILL , EXPERIENCE , SPECIAL_SKILL } ;
2012-05-07 12:54:22 +00:00
2016-11-25 20:04:07 +03:00
SetCommanderProperty ( )
: which ( ALIVE ) , amount ( 0 ) , additionalInfo ( 0 )
{ }
2012-05-07 12:54:22 +00:00
void applyCl ( CClient * cl ) { } ;
2012-05-18 14:02:27 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID heroid ; //for commander attached to hero
2012-05-18 14:02:27 +00:00
StackLocation sl ; //for commander not on the hero?
2012-05-07 12:54:22 +00:00
2013-02-04 19:43:16 +00:00
ECommanderProperty which ;
2012-09-23 18:01:04 +00:00
TExpType amount ; //0 for dead, >0 for alive
2012-05-18 14:02:27 +00:00
si32 additionalInfo ; //for secondary skills choice
2012-05-07 12:54:22 +00:00
Bonus accumulatedBonus ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & heroid ;
h & sl ;
h & which ;
h & amount ;
h & additionalInfo ;
h & accumulatedBonus ;
2012-05-07 12:54:22 +00:00
}
2012-05-16 17:29:05 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct AddQuest : public CPackForClient
2012-05-16 17:29:05 +00:00
{
2016-11-18 17:45:59 +03:00
AddQuest ( ) { } ;
2012-05-16 17:29:05 +00:00
void applyCl ( CClient * cl ) { } ;
2012-07-06 19:12:04 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2012-05-16 17:29:05 +00:00
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2012-05-16 17:29:05 +00:00
QuestInfo quest ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & quest ;
2012-05-16 17:29:05 +00:00
}
} ;
2010-08-20 13:34:39 +00:00
2016-11-18 17:45:59 +03:00
struct PrepareForAdvancingCampaign : public CPackForClient
2013-02-09 18:18:55 +00:00
{
2016-11-18 17:45:59 +03:00
PrepareForAdvancingCampaign ( ) { }
2013-02-09 18:18:55 +00:00
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
}
} ;
2016-11-18 17:45:59 +03:00
struct UpdateArtHandlerLists : public CPackForClient
2013-02-18 22:37:22 +00:00
{
2016-11-25 20:04:07 +03:00
UpdateArtHandlerLists ( ) { }
2013-02-18 22:37:22 +00:00
std : : vector < CArtifact * > treasures , minors , majors , relics ;
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & treasures ;
h & minors ;
h & majors ;
h & relics ;
2013-02-18 22:37:22 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct UpdateMapEvents : public CPackForClient
2013-02-18 22:37:22 +00:00
{
2016-11-18 17:45:59 +03:00
UpdateMapEvents ( ) { }
2013-02-18 22:37:22 +00:00
std : : list < CMapEvent > events ;
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & events ;
}
} ;
2016-11-18 17:45:59 +03:00
struct UpdateCastleEvents : public CPackForClient
2013-02-18 22:37:22 +00:00
{
2016-11-18 17:45:59 +03:00
UpdateCastleEvents ( ) { }
2013-02-18 22:37:22 +00:00
ObjectInstanceID town ;
std : : list < CCastleEvent > events ;
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & town ;
h & events ;
2013-02-18 22:37:22 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct ChangeFormation : public CPackForClient
2016-09-08 19:29:15 +03:00
{
2016-11-25 20:04:07 +03:00
ChangeFormation ( ) : formation ( 0 ) { }
2016-09-08 19:29:15 +03:00
ObjectInstanceID hid ;
ui8 formation ;
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hid ;
h & formation ;
2016-09-08 19:29:15 +03:00
}
} ;
2016-11-18 17:45:59 +03:00
struct RemoveObject : public CPackForClient
2008-08-01 21:41:38 +00:00
{
2016-11-25 20:04:07 +03:00
RemoveObject ( ) { }
2016-11-18 17:45:59 +03:00
RemoveObject ( ObjectInstanceID ID ) { id = ID ; } ;
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ;
2008-08-01 21:41:38 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id ;
}
2012-09-15 19:16:16 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct TryMoveHero : public CPackForClient
2008-07-28 12:44:08 +00:00
{
2016-11-25 20:04:07 +03:00
TryMoveHero ( )
: movePoints ( 0 ) , result ( FAILED ) , humanKnows ( false )
{ }
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2009-03-07 15:54:12 +00:00
void applyGs ( CGameState * gs ) ;
2008-07-28 12:44:08 +00:00
2009-07-03 19:57:14 +00:00
enum EResult
{
2009-07-19 01:00:19 +00:00
FAILED , SUCCESS , TELEPORTATION , RESERVED___ , BLOCKING_VISIT , EMBARK , DISEMBARK
2009-07-03 19:57:14 +00:00
} ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ;
ui32 movePoints ;
2013-02-04 19:43:16 +00:00
EResult result ; //uses EResult
2010-03-20 22:17:19 +00:00
int3 start , end ; //h3m format
2013-06-29 13:05:48 +00:00
std : : unordered_set < int3 , ShashInt3 > fowRevealed ; //revealed tiles
2013-04-20 11:34:01 +00:00
boost : : optional < int3 > attackedFrom ; // Set when stepping into endangered tile.
2008-07-28 12:44:08 +00:00
2009-12-28 04:08:24 +00:00
bool humanKnows ; //used locally during applying to client
2017-09-16 10:42:27 +03:00
bool stopMovement ( ) const ;
2008-07-28 12:44:08 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & id ;
h & result ;
h & start ;
h & end ;
h & movePoints ;
h & fowRevealed ;
h & attackedFrom ;
2008-07-28 12:44:08 +00:00
}
2010-11-27 01:46:19 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct NewStructures : public CPackForClient
2008-08-01 11:21:15 +00:00
{
2016-11-25 20:04:07 +03:00
NewStructures ( ) : builded ( 0 ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2012-09-15 19:16:16 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID tid ;
2013-02-11 19:11:34 +00:00
std : : set < BuildingID > bid ;
2012-09-15 19:16:16 +00:00
si16 builded ;
2008-08-01 11:21:15 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tid ;
h & bid ;
h & builded ;
2008-08-01 11:21:15 +00:00
}
2009-09-22 14:27:46 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct RazeStructures : public CPackForClient
2009-09-22 14:27:46 +00:00
{
2016-11-25 20:04:07 +03:00
RazeStructures ( ) : destroyed ( 0 ) { }
2009-09-22 14:27:46 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-09-22 14:27:46 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID tid ;
2013-02-11 19:11:34 +00:00
std : : set < BuildingID > bid ;
2012-09-15 19:16:16 +00:00
si16 destroyed ;
2009-09-24 17:54:02 +00:00
2009-09-22 14:27:46 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tid ;
h & bid ;
h & destroyed ;
2009-09-22 14:27:46 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct SetAvailableCreatures : public CPackForClient
2008-08-01 11:21:15 +00:00
{
2016-11-25 20:04:07 +03:00
SetAvailableCreatures ( ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID tid ;
2013-02-10 23:24:57 +00:00
std : : vector < std : : pair < ui32 , std : : vector < CreatureID > > > creatures ;
2008-08-01 11:21:15 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tid ;
h & creatures ;
2008-08-10 04:46:16 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct SetHeroesInTown : public CPackForClient
2008-08-16 08:47:41 +00:00
{
2016-11-25 20:04:07 +03:00
SetHeroesInTown ( ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID tid , visiting , garrison ; //id of town, visiting hero, hero in garrison
2008-08-16 08:47:41 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tid ;
h & visiting ;
h & garrison ;
2008-08-16 08:47:41 +00:00
}
2010-12-05 23:10:02 +00:00
} ;
2010-12-16 22:32:53 +00:00
2016-11-18 17:45:59 +03:00
struct HeroRecruited : public CPackForClient
2008-10-26 20:58:34 +00:00
{
2016-11-25 20:04:07 +03:00
HeroRecruited ( ) : hid ( - 1 ) { }
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
si32 hid ; //subID of hero
ObjectInstanceID tid ;
2008-10-26 20:58:34 +00:00
int3 tile ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2008-10-26 20:58:34 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hid ;
h & tid ;
h & tile ;
h & player ;
2008-10-26 20:58:34 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2009-02-14 19:12:40 +00:00
2016-11-18 17:45:59 +03:00
struct GiveHero : public CPackForClient
2009-02-14 19:12:40 +00:00
{
2016-11-25 20:04:07 +03:00
GiveHero ( ) { }
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ; //object id
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-02-14 19:12:40 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & id ;
h & player ;
2009-02-14 19:12:40 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2009-02-14 19:12:40 +00:00
2016-11-18 17:45:59 +03:00
struct OpenWindow : public CPackForClient
2009-06-16 11:18:14 +00:00
{
2016-11-25 20:04:07 +03:00
OpenWindow ( ) : id1 ( - 1 ) , id2 ( - 1 ) { }
2009-06-16 11:18:14 +00:00
void applyCl ( CClient * cl ) ;
2010-07-22 00:32:45 +00: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 19:41:27 +00:00
ui8 window ;
2013-02-13 23:55:42 +00:00
si32 id1 , id2 ;
2009-06-16 11:18:14 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & window ;
h & id1 ;
h & id2 ;
2009-06-16 11:18:14 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct NewObject : public CPackForClient
2009-07-26 03:33:13 +00:00
{
2016-11-25 20:04:07 +03:00
NewObject ( ) : subID ( 0 ) { }
2009-07-26 03:33:13 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-07-26 03:33:13 +00:00
2013-02-10 23:24:57 +00:00
Obj ID ;
2013-02-07 17:34:50 +00:00
ui32 subID ;
2009-07-26 03:33:13 +00:00
int3 pos ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ; //used locally, filled during applyGs
2009-07-26 03:33:13 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & ID ;
h & subID ;
h & pos ;
2009-07-26 03:33:13 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct SetAvailableArtifacts : public CPackForClient
2010-06-26 16:02:10 +00:00
{
2016-11-25 20:04:07 +03:00
SetAvailableArtifacts ( ) : id ( 0 ) { }
2010-06-27 16:03:01 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-06-26 16:02:10 +00:00
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 )
{
2017-07-31 16:35:42 +03:00
h & id ;
h & arts ;
2010-06-26 16:02:10 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct NewArtifact : public CPackForClient
2010-11-10 00:06:25 +00:00
{
2016-11-25 20:04:07 +03:00
NewArtifact ( ) { }
2010-11-10 00:06:25 +00:00
//void applyCl(CClient *cl);
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-10 00:06:25 +00:00
2010-12-26 14:34:11 +00:00
ConstTransitivePtr < CArtifactInstance > art ;
2010-11-10 00:06:25 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-12-26 14:34:11 +00:00
h & art ;
2010-11-10 00:06:25 +00:00
}
} ;
2010-11-27 20:17:28 +00:00
struct CGarrisonOperationPack : CPackForClient
{
} ;
2016-11-18 17:45:59 +03:00
2011-01-22 03:43:20 +00:00
struct CArtifactOperationPack : CPackForClient
{
} ;
2016-11-18 17:45:59 +03:00
struct ChangeStackCount : CGarrisonOperationPack
2010-11-27 01:46:19 +00:00
{
StackLocation sl ;
TQuantity count ;
ui8 absoluteValue ; //if not -> count will be added (or subtracted if negative)
2010-11-27 20:17:28 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-27 01:46:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & sl ;
h & count ;
h & absoluteValue ;
2010-11-27 01:46:19 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct SetStackType : CGarrisonOperationPack
2010-11-27 01:46:19 +00:00
{
StackLocation sl ;
2015-09-04 18:08:25 +03:00
const CCreature * type ;
2010-11-27 01:46:19 +00:00
2010-11-27 20:17:28 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-27 01:46:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & sl ;
h & type ;
2010-11-27 01:46:19 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct EraseStack : CGarrisonOperationPack
2010-11-27 01:46:19 +00:00
{
StackLocation sl ;
2010-11-27 20:17:28 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-27 01:46:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & sl ;
}
} ;
2016-11-18 17:45:59 +03:00
struct SwapStacks : CGarrisonOperationPack
2010-11-27 01:46:19 +00:00
{
StackLocation sl1 , sl2 ;
2010-11-27 20:17:28 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-27 01:46:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & sl1 ;
h & sl2 ;
2010-11-27 01:46:19 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct InsertNewStack : CGarrisonOperationPack
2010-11-27 01:46:19 +00:00
{
StackLocation sl ;
2010-12-05 23:10:02 +00:00
CStackBasicDescriptor stack ;
2010-11-27 01:46:19 +00:00
2010-11-27 20:17:28 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-27 01:46:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & sl ;
h & stack ;
2010-11-27 01:46:19 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
///moves creatures from src stack to dst slot, may be used for merging/splittint/moving stacks
struct RebalanceStacks : CGarrisonOperationPack
2010-11-27 01:46:19 +00:00
{
StackLocation src , dst ;
TQuantity count ;
2010-11-27 20:17:28 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-11-27 01:46:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & src ;
h & dst ;
h & count ;
2010-11-27 01:46:19 +00:00
}
} ;
2013-05-31 22:23:53 +00:00
struct GetEngagedHeroIds : boost : : static_visitor < boost : : optional < ObjectInstanceID > >
{
boost : : optional < ObjectInstanceID > operator ( ) ( const ConstTransitivePtr < CGHeroInstance > & h ) const
{
return h - > id ;
}
boost : : optional < ObjectInstanceID > operator ( ) ( const ConstTransitivePtr < CStackInstance > & s ) const
{
if ( s - > armyObj & & s - > armyObj - > ID = = Obj : : HERO )
return s - > armyObj - > id ;
return boost : : optional < ObjectInstanceID > ( ) ;
}
} ;
2016-11-18 17:45:59 +03:00
struct PutArtifact : CArtifactOperationPack
2010-12-16 22:32:53 +00:00
{
ArtifactLocation al ;
2010-12-26 14:34:11 +00:00
ConstTransitivePtr < CArtifactInstance > art ;
2010-12-16 22:32:53 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-12-16 22:32:53 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & al ;
h & art ;
2010-12-16 22:32:53 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct EraseArtifact : CArtifactOperationPack
2010-12-16 22:32:53 +00:00
{
ArtifactLocation al ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-12-16 22:32:53 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & al ;
}
} ;
2016-11-18 17:45:59 +03:00
struct MoveArtifact : CArtifactOperationPack
2010-12-16 22:32:53 +00:00
{
ArtifactLocation src , dst ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2010-12-16 22:32:53 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & src ;
h & dst ;
2010-12-16 22:32:53 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct AssembledArtifact : CArtifactOperationPack
2011-01-22 03:43:20 +00:00
{
ArtifactLocation al ; //where assembly will be put
CArtifact * builtArt ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2011-01-22 03:43:20 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & al ;
h & builtArt ;
2011-01-22 03:43:20 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct DisassembledArtifact : CArtifactOperationPack
2011-01-22 03:43:20 +00:00
{
ArtifactLocation al ;
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2011-01-22 03:43:20 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & al ;
}
} ;
2016-11-18 17:45:59 +03:00
struct HeroVisit : CPackForClient
2011-05-09 22:20:47 +00:00
{
const CGHeroInstance * hero ;
const CGObjectInstance * obj ;
2013-09-28 00:30:12 +00:00
PlayerColor player ; //if hero was killed during the visit, its color is already reset
2011-05-09 22:20:47 +00:00
bool starting ; //false -> ending
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2011-05-09 22:20:47 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hero ;
h & obj ;
h & player ;
h & starting ;
2011-05-09 22:20:47 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct NewTurn : public CPackForClient
2008-08-10 04:46:16 +00:00
{
2011-08-26 20:32:05 +00:00
enum weekType { NORMAL , DOUBLE_GROWTH , BONUS_GROWTH , DEITYOFFIRE , PLAGUE , NO_ACTION } ;
2010-08-22 18:21:45 +00:00
2011-08-25 15:24:37 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2008-08-10 04:46:16 +00:00
struct Hero
{
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ;
ui32 move , mana ; //id is a general serial id
2008-08-10 04:46:16 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & id ;
h & move ;
h & mana ;
2008-08-10 04:46:16 +00:00
}
bool operator < ( const Hero & h ) const { return id < h . id ; }
} ;
std : : set < Hero > heroes ; //updates movement and mana points
2013-03-03 17:06:03 +00:00
std : : map < PlayerColor , TResources > res ; //player ID => resource value[res_id]
2013-03-14 20:44:00 +00:00
std : : map < ObjectInstanceID , SetAvailableCreatures > cres ; //creatures to be placed in towns
2008-08-10 04:46:16 +00:00
ui32 day ;
2010-08-26 07:23:08 +00:00
ui8 specialWeek ; //weekType
2013-02-10 23:24:57 +00:00
CreatureID creatureid ; //for creature weeks
2008-08-10 04:46:16 +00:00
2016-11-25 20:04:07 +03:00
NewTurn ( ) : day ( 0 ) , specialWeek ( 0 ) { } ;
2008-08-10 04:46:16 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & heroes ;
h & cres ;
h & res ;
h & day ;
h & specialWeek ;
h & creatureid ;
2008-08-01 11:21:15 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2009-03-06 22:11:17 +00:00
struct InfoWindow : public CPackForClient //103 - displays simple info window
2008-07-30 21:27:15 +00:00
{
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2008-07-30 21:27:15 +00:00
MetaString text ;
std : : vector < Component > components ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-04-22 18:48:56 +00:00
ui16 soundID ;
2008-07-30 21:27:15 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & text ;
h & components ;
h & player ;
h & soundID ;
2008-07-30 21:27:15 +00:00
}
2012-09-15 19:16:16 +00:00
InfoWindow ( )
{
soundID = 0 ;
2010-03-10 23:16:30 +00:00
}
2008-07-30 17:51:19 +00:00
} ;
2010-05-02 18:20:26 +00:00
namespace ObjProperty
{
2011-05-28 01:02:28 +00:00
enum { OWNER = 1 , BLOCKVIS = 2 , PRIMARY_STACK_COUNT = 3 , VISITORS = 4 , VISITED = 5 , ID = 6 , AVAILABLE_CREATURE = 7 , SUBID = 8 ,
2013-04-20 11:34:01 +00:00
MONSTER_COUNT = 10 , MONSTER_POWER = 11 , MONSTER_EXP = 12 , MONSTER_RESTORE_TYPE = 13 , MONSTER_REFUSED_JOIN ,
2016-08-30 05:13:45 +03:00
2013-02-14 13:19:03 +00:00
//town-specific
STRUCTURE_ADD_VISITING_HERO , STRUCTURE_CLEAR_VISITORS , STRUCTURE_ADD_GARRISONED_HERO , //changing buildings state
2013-02-18 22:37:22 +00:00
BONUS_VALUE_FIRST , BONUS_VALUE_SECOND , //used in Rampart for special building that generates resources (storing resource type and quantity)
2013-02-14 13:19:03 +00:00
2013-02-18 22:37:22 +00:00
//creature-bank specific
2014-06-22 13:39:40 +03:00
BANK_DAYCOUNTER , BANK_RESET , BANK_CLEAR ,
2013-09-17 12:02:33 +00:00
2014-04-07 20:32:15 +03:00
//object with reward
REWARD_RESET , REWARD_SELECT
2013-02-14 13:19:03 +00:00
} ;
2010-05-02 18:20:26 +00:00
}
2016-11-18 17:45:59 +03:00
struct SetObjectProperty : public CPackForClient
2008-07-30 17:51:19 +00:00
{
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-07-30 12:49:45 +00:00
void applyCl ( CClient * cl ) ;
2009-03-06 22:11:17 +00:00
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ;
2014-04-07 20:32:15 +03:00
ui8 what ; // see ObjProperty enum
2008-07-30 17:51:19 +00:00
ui32 val ;
2016-11-25 20:04:07 +03:00
SetObjectProperty ( ) : what ( 0 ) , val ( 0 ) { }
2016-11-18 17:45:59 +03:00
SetObjectProperty ( ObjectInstanceID ID , ui8 What , ui32 Val ) : id ( ID ) , what ( What ) , val ( Val ) { } ;
2012-09-15 19:16:16 +00:00
2008-07-30 17:51:19 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & id ;
h & what ;
h & val ;
2008-07-30 17:51:19 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct ChangeObjectVisitors : public CPackForClient
2014-04-07 20:32:15 +03:00
{
enum VisitMode
{
2016-09-20 22:05:44 +02:00
VISITOR_ADD , // mark hero as one that have visited this object
VISITOR_ADD_TEAM , // mark team as one that have visited this object
VISITOR_REMOVE , // unmark visitor, reversed to ADD
VISITOR_CLEAR // clear all visitors from this object (object reset)
2014-04-07 20:32:15 +03:00
} ;
ui32 mode ; // uses VisitMode enum
ObjectInstanceID object ;
ObjectInstanceID hero ; // note: hero owner will be also marked as "visited" this object
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2014-04-11 22:49:25 +03:00
ChangeObjectVisitors ( )
2016-11-25 20:04:07 +03:00
: mode ( VISITOR_CLEAR )
{ }
2014-04-11 22:49:25 +03:00
2014-04-07 20:32:15 +03:00
ChangeObjectVisitors ( ui32 mode , ObjectInstanceID object , ObjectInstanceID heroID = ObjectInstanceID ( - 1 ) ) :
mode ( mode ) ,
object ( object ) ,
hero ( heroID )
2016-11-25 20:04:07 +03:00
{ }
2014-04-07 20:32:15 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & object ;
h & hero ;
h & mode ;
2014-04-07 20:32:15 +03:00
}
} ;
2016-11-18 17:45:59 +03:00
struct PrepareHeroLevelUp : public CPackForClient
2016-09-08 00:24:05 +03:00
{
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
const CGHeroInstance * hero ;
/// Do not serialize, used by server only
std : : vector < SecondarySkill > skills ;
2016-11-25 20:04:07 +03:00
PrepareHeroLevelUp ( ) : hero ( nullptr ) { }
2016-09-08 00:24:05 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hero ;
}
} ;
2016-11-18 17:45:59 +03:00
struct HeroLevelUp : public Query
2008-08-04 15:56:36 +00:00
{
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-04-20 11:34:01 +00:00
const CGHeroInstance * hero ;
2013-02-04 19:43:16 +00:00
PrimarySkill : : PrimarySkill primskill ;
2013-02-12 19:49:40 +00:00
std : : vector < SecondarySkill > skills ;
2008-08-04 15:56:36 +00:00
2016-11-25 20:04:07 +03:00
HeroLevelUp ( ) : hero ( nullptr ) , primskill ( PrimarySkill : : ATTACK ) { }
2012-09-15 19:16:16 +00:00
2008-08-04 15:56:36 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & hero ;
h & primskill ;
h & skills ;
2008-08-04 15:56:36 +00:00
}
} ;
2008-08-13 00:44:31 +00:00
2012-05-07 12:54:22 +00:00
struct CommanderLevelUp : public Query
{
2012-05-16 17:29:05 +00:00
void applyCl ( CClient * cl ) ;
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2012-05-07 12:54:22 +00:00
2013-04-20 11:34:01 +00:00
const CGHeroInstance * hero ;
2012-05-18 14:02:27 +00:00
2012-07-03 08:07:34 +00:00
std : : vector < ui32 > skills ; //0-5 - secondary skills, val-100 - special skill
2012-05-07 12:54:22 +00:00
2016-11-25 20:04:07 +03:00
CommanderLevelUp ( ) : hero ( nullptr ) { }
2012-05-07 12:54:22 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & hero ;
h & skills ;
2012-05-07 12:54:22 +00:00
}
} ;
2009-04-11 01:32:50 +00: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
2016-11-18 17:45:59 +03:00
struct BlockingDialog : public Query
2008-08-13 00:44:31 +00:00
{
2009-04-11 01:32:50 +00:00
enum { ALLOW_CANCEL = 1 , SELECTION = 2 } ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2008-08-13 00:44:31 +00:00
MetaString text ;
std : : vector < Component > components ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-04-11 01:32:50 +00:00
ui8 flags ;
2009-04-22 18:48:56 +00:00
ui16 soundID ;
2008-08-13 00:44:31 +00:00
2009-04-11 01:32:50 +00:00
bool cancel ( ) const
2008-08-13 00:44:31 +00:00
{
2009-04-11 01:32:50 +00:00
return flags & ALLOW_CANCEL ;
}
bool selection ( ) const
{
return flags & SELECTION ;
2008-08-13 00:44:31 +00:00
}
2008-08-22 12:21:09 +00:00
2009-04-11 01:32:50 +00:00
BlockingDialog ( bool yesno , bool Selection )
{
2009-04-14 10:46:42 +00:00
flags = 0 ;
2009-04-22 18:48:56 +00:00
soundID = 0 ;
2009-04-11 01:32:50 +00:00
if ( yesno ) flags | = ALLOW_CANCEL ;
if ( Selection ) flags | = SELECTION ;
}
BlockingDialog ( )
{
2009-04-14 10:46:42 +00:00
flags = 0 ;
2009-04-22 18:48:56 +00:00
soundID = 0 ;
2009-04-11 01:32:50 +00:00
} ;
2008-08-22 12:21:09 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & text ;
h & components ;
h & player ;
h & flags ;
h & soundID ;
2008-08-22 12:21:09 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct GarrisonDialog : public Query
2009-04-12 00:58:41 +00:00
{
2016-11-25 20:04:07 +03:00
GarrisonDialog ( ) : removableUnits ( false ) { }
2009-04-12 00:58:41 +00:00
void applyCl ( CClient * cl ) ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID objid , hid ;
2009-09-09 17:49:03 +00:00
bool removableUnits ;
2009-04-12 00:58:41 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & objid ;
h & hid ;
h & removableUnits ;
2009-04-12 00:58:41 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct ExchangeDialog : public Query
2013-05-27 10:53:28 +00:00
{
2016-11-26 20:49:26 +03:00
ExchangeDialog ( )
{
heroes = { nullptr , nullptr } ;
}
2013-05-27 10:53:28 +00:00
void applyCl ( CClient * cl ) ;
std : : array < const CGHeroInstance * , 2 > heroes ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & heroes ;
2013-05-27 10:53:28 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct TeleportDialog : public Query
2015-03-08 16:37:33 +03:00
{
2016-11-26 20:49:26 +03:00
TeleportDialog ( )
: hero ( nullptr ) , impassable ( false )
{ }
2015-03-08 16:37:33 +03:00
TeleportDialog ( const CGHeroInstance * Hero , TeleportChannelID Channel )
: hero ( Hero ) , channel ( Channel ) , impassable ( false )
2016-11-26 20:49:26 +03:00
{ }
2015-03-08 16:37:33 +03:00
void applyCl ( CClient * cl ) ;
const CGHeroInstance * hero ;
TeleportChannelID channel ;
2015-11-28 02:41:30 +03:00
TTeleportExitsList exits ;
2015-03-08 16:37:33 +03:00
bool impassable ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & hero ;
h & channel ;
h & exits ;
h & impassable ;
2015-03-08 16:37:33 +03:00
}
} ;
2017-06-06 07:53:51 +03:00
struct MapObjectSelectDialog : public Query
{
PlayerColor player ;
Component icon ;
MetaString title ;
MetaString description ;
std : : vector < ObjectInstanceID > objects ;
MapObjectSelectDialog ( ) { } ;
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & queryID ;
h & player ;
h & icon ;
h & title ;
h & description ;
h & objects ;
2017-06-06 07:53:51 +03:00
}
} ;
2017-07-20 07:08:49 +03:00
class BattleInfo ;
2016-11-18 17:45:59 +03:00
struct BattleStart : public CPackForClient
2008-08-04 15:56:36 +00:00
{
2016-11-26 20:49:26 +03:00
BattleStart ( )
: info ( nullptr )
{ }
2013-09-14 19:09:35 +00:00
void applyFirstCl ( CClient * cl ) ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2008-08-04 15:56:36 +00:00
BattleInfo * info ;
2012-09-15 19:16:16 +00:00
2008-08-04 15:56:36 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & info ;
}
} ;
2016-11-26 20:49:26 +03:00
2016-11-18 17:45:59 +03:00
struct BattleNextRound : public CPackForClient
2012-09-15 19:16:16 +00:00
{
2016-11-26 20:49:26 +03:00
BattleNextRound ( ) : round ( 0 ) { } ;
2010-05-07 12:29:41 +00:00
void applyFirstCl ( CClient * cl ) ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2008-08-04 15:56:36 +00:00
si32 round ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & round ;
}
} ;
2016-11-26 20:49:26 +03:00
2016-11-18 17:45:59 +03:00
struct BattleSetActiveStack : public CPackForClient
2008-08-04 15:56:36 +00:00
{
2012-08-27 12:34:43 +00:00
BattleSetActiveStack ( )
{
2016-11-26 20:49:26 +03:00
stack = 0 ;
2012-08-27 12:34:43 +00:00
askPlayerInterface = true ;
}
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2008-08-04 15:56:36 +00:00
ui32 stack ;
2012-08-27 12:34:43 +00:00
ui8 askPlayerInterface ;
2008-08-04 15:56:36 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & stack ;
h & askPlayerInterface ;
2008-08-04 15:56:36 +00:00
}
} ;
2016-11-26 20:49:26 +03:00
2016-11-18 17:45:59 +03:00
struct BattleResult : public CPackForClient
2008-08-04 15:56:36 +00:00
{
2012-05-01 08:52:22 +00:00
enum EResult { NORMAL = 0 , ESCAPE = 1 , SURRENDER = 2 } ;
2016-11-26 20:49:26 +03:00
BattleResult ( )
: result ( NORMAL ) , winner ( 2 )
{
exp [ 0 ] = 0 ;
exp [ 1 ] = 0 ;
} ;
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
2009-03-07 17:08:40 +00:00
void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
2013-02-04 19:43:16 +00:00
EResult result ;
2008-08-04 15:56:36 +00:00
ui8 winner ; //0 - attacker, 1 - defender, [2 - draw (should be possible?)]
2009-09-24 13:23:52 +00:00
std : : map < ui32 , si32 > casualties [ 2 ] ; //first => casualties of attackers - map crid => number
2012-09-23 18:01:04 +00:00
TExpType exp [ 2 ] ; //exp for attacker and defender
2013-02-13 23:55:42 +00:00
std : : set < ArtifactInstanceID > artifacts ; //artifacts taken from loser to winner - currently unused
2008-08-04 15:56:36 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & result ;
h & winner ;
h & casualties [ 0 ] ;
h & casualties [ 1 ] ;
h & exp ;
h & artifacts ;
2008-08-04 15:56:36 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct BattleStackMoved : public CPackForClient
2008-08-04 23:04:15 +00:00
{
2011-01-09 17:41:46 +00:00
ui32 stack ;
2011-12-22 13:05:19 +00:00
std : : vector < BattleHex > tilesToMove ;
2017-07-20 07:08:49 +03:00
int distance ;
bool teleporting ;
2016-11-26 20:49:26 +03:00
BattleStackMoved ( )
2017-07-20 07:08:49 +03:00
: stack ( 0 ) ,
distance ( 0 ) ,
teleporting ( false )
2016-11-26 20:49:26 +03:00
{ } ;
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
2008-08-04 23:04:15 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & stack ;
h & tilesToMove ;
h & distance ;
2008-08-04 23:04:15 +00:00
}
} ;
2017-07-20 07:08:49 +03:00
struct BattleUnitsChanged : public CPackForClient
2010-05-07 12:29:41 +00:00
{
2017-07-20 07:08:49 +03:00
BattleUnitsChanged ( ) { }
2010-05-07 12:29:41 +00:00
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
2010-05-07 12:29:41 +00:00
void applyCl ( CClient * cl ) ;
2017-07-20 07:08:49 +03:00
std : : vector < UnitChanges > changedStacks ;
std : : vector < MetaString > battleLog ;
std : : vector < CustomEffectInfo > customEffects ;
2010-05-07 12:29:41 +00:00
2017-07-20 07:08:49 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
2010-05-07 12:29:41 +00:00
{
2017-07-20 07:08:49 +03:00
h & changedStacks ;
h & battleLog ;
h & customEffects ;
2010-05-07 12:29:41 +00:00
}
} ;
2017-07-20 07:08:49 +03:00
struct BattleStackAttacked
2008-08-08 23:02:32 +00:00
{
2014-11-28 00:36:14 +03:00
BattleStackAttacked ( ) :
2016-11-26 20:49:26 +03:00
stackAttacked ( 0 ) , attackerID ( 0 ) ,
2017-07-04 14:24:46 +03:00
killedAmount ( 0 ) , damageAmount ( 0 ) ,
2017-07-20 07:08:49 +03:00
newState ( ) ,
2016-11-26 20:49:26 +03:00
flags ( 0 ) , effect ( 0 ) , spellID ( SpellID : : NONE )
{ } ;
2017-07-20 07:08:49 +03:00
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
2009-03-06 22:11:17 +00:00
2009-09-15 12:20:11 +00:00
ui32 stackAttacked , attackerID ;
2017-07-04 14:24:46 +03:00
ui32 killedAmount ;
2017-07-20 07:08:49 +03:00
int64_t damageAmount ;
UnitChanges newState ;
2014-11-28 00:36:14 +03:00
enum EFlags { KILLED = 1 , EFFECT = 2 /*deprecated */ , SECONDARY = 4 , REBIRTH = 8 , CLONE_KILLED = 16 , SPELL_EFFECT = 32 /*, BONUS_EFFECT = 64 */ } ;
ui32 flags ; //uses EFlags (above)
2011-02-24 15:33:03 +00:00
ui32 effect ; //set only if flag EFFECT is set
2014-11-28 00:36:14 +03:00
SpellID spellID ; //only if flag SPELL_EFFECT is set
2008-08-08 23:02:32 +00:00
2009-03-24 21:28:17 +00:00
bool killed ( ) const //if target stack was killed
2008-08-08 23:02:32 +00:00
{
2012-02-18 17:39:47 +00:00
return flags & KILLED | | flags & CLONE_KILLED ;
}
bool cloneKilled ( ) const
{
return flags & CLONE_KILLED ;
2008-08-08 23:02:32 +00:00
}
2010-05-07 12:29:41 +00:00
bool isEffect ( ) const //if stack has been attacked by a spell
2008-10-18 11:41:24 +00:00
{
2011-02-24 15:33:03 +00:00
return flags & EFFECT ;
2008-10-18 11:41:24 +00:00
}
2011-07-02 16:49:22 +00:00
bool isSecondary ( ) const //if stack was not a primary target (receives no spell effects)
{
return flags & SECONDARY ;
}
2014-11-28 00:36:14 +03:00
///Attacked with spell (SPELL_LIKE_ATTACK)
bool isSpell ( ) const
{
return flags & SPELL_EFFECT ;
}
2013-08-09 17:37:41 +00:00
bool willRebirth ( ) const //resurrection, e.g. Phoenix
2011-07-08 14:54:20 +00:00
{
return flags & REBIRTH ;
}
2008-08-08 23:02:32 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & stackAttacked ;
h & attackerID ;
2017-07-20 07:08:49 +03:00
h & newState ;
2017-07-31 16:35:42 +03:00
h & flags ;
h & killedAmount ;
h & damageAmount ;
h & effect ;
2014-11-28 00:36:14 +03:00
h & spellID ;
2008-08-08 23:02:32 +00:00
}
2009-03-21 12:49:58 +00:00
bool operator < ( const BattleStackAttacked & b ) const
{
return stackAttacked < b . stackAttacked ;
}
2008-08-08 23:02:32 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct BattleAttack : public CPackForClient
2008-08-08 23:02:32 +00:00
{
2016-11-26 20:49:26 +03:00
BattleAttack ( )
: stackAttacking ( 0 ) , flags ( 0 ) , spellID ( SpellID : : NONE )
{ } ;
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2017-07-20 07:08:49 +03:00
BattleUnitsChanged attackerChanges ;
2010-02-20 13:24:38 +00:00
std : : vector < BattleStackAttacked > bsa ;
2008-08-08 23:02:32 +00:00
ui32 stackAttacking ;
2014-11-28 00:36:14 +03:00
ui32 flags ; //uses Eflags (below)
enum EFlags { SHOT = 1 , COUNTER = 2 , LUCKY = 4 , UNLUCKY = 8 , BALLISTA_DOUBLE_DMG = 16 , DEATH_BLOW = 32 , SPELL_LIKE = 64 } ;
2016-08-30 05:13:45 +03:00
SpellID spellID ; //for SPELL_LIKE
2008-08-08 23:02:32 +00:00
2017-07-20 07:08:49 +03:00
std : : vector < MetaString > battleLog ;
std : : vector < CustomEffectInfo > customEffects ;
2010-12-04 19:44:23 +00:00
bool shot ( ) const //distance attack - decrease number of shots
2008-08-08 23:02:32 +00:00
{
2011-02-24 15:33:03 +00:00
return flags & SHOT ;
2008-08-08 23:02:32 +00:00
}
2010-12-04 19:44:23 +00:00
bool counter ( ) const //is it counterattack?
2008-09-12 08:51:46 +00:00
{
2011-02-24 15:33:03 +00:00
return flags & COUNTER ;
2008-09-12 08:51:46 +00:00
}
2010-12-04 19:44:23 +00:00
bool lucky ( ) const
2009-03-21 12:49:58 +00:00
{
2011-02-24 15:33:03 +00:00
return flags & LUCKY ;
2009-03-21 12:49:58 +00:00
}
2010-12-04 19:44:23 +00:00
bool unlucky ( ) const
2008-08-08 23:02:32 +00:00
{
2011-02-24 15:33:03 +00:00
return flags & UNLUCKY ;
}
bool ballistaDoubleDmg ( ) const //if it's ballista attack and does double dmg
{
return flags & BALLISTA_DOUBLE_DMG ;
2008-08-08 23:02:32 +00:00
}
2011-07-06 17:00:45 +00:00
bool deathBlow ( ) const
{
return flags & DEATH_BLOW ;
}
2014-11-28 00:36:14 +03:00
bool spellLike ( ) const
{
return flags & SPELL_LIKE ;
}
2008-08-08 23:02:32 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & bsa ;
h & stackAttacking ;
h & flags ;
h & spellID ;
2017-07-20 07:08:49 +03:00
h & battleLog ;
h & customEffects ;
h & attackerChanges ;
2008-08-08 23:02:32 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct StartAction : public CPackForClient
2008-09-28 21:01:49 +00:00
{
2016-11-18 17:45:59 +03:00
StartAction ( ) { } ;
StartAction ( const BattleAction & act ) { ba = act ; } ;
2009-03-06 22:11:17 +00:00
void applyFirstCl ( CClient * cl ) ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
BattleAction ba ;
2008-09-28 21:01:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ba ;
}
} ;
2016-11-18 17:45:59 +03:00
struct EndAction : public CPackForClient
2008-10-18 11:41:24 +00:00
{
2016-11-18 17:45:59 +03:00
EndAction ( ) { } ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2009-03-06 22:25:19 +00:00
2009-03-06 22:11:17 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
}
} ;
2016-11-18 17:45:59 +03:00
struct BattleSpellCast : public CPackForClient
2008-10-18 11:41:24 +00:00
{
2016-11-26 20:49:26 +03:00
BattleSpellCast ( )
{
side = 0 ;
manaGained = 0 ;
casterStack = - 1 ;
castByHero = true ;
2017-09-08 14:25:12 +03:00
activeCast = true ;
2016-11-26 20:49:26 +03:00
} ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2009-03-06 22:11:17 +00:00
void applyCl ( CClient * cl ) ;
2017-09-08 14:25:12 +03:00
bool activeCast ;
2009-05-12 03:35:51 +00:00
ui8 side ; //which hero did cast spell: 0 - attacker, 1 - defender
2017-07-20 07:08:49 +03:00
SpellID spellID ; //id of spell
2011-10-09 11:23:24 +00:00
ui8 manaGained ; //mana channeling ability
2011-12-22 13:05:19 +00:00
BattleHex tile ; //destination tile (may not be set in some global/mass spells
2017-07-20 07:08:49 +03:00
std : : vector < CustomEffectInfo > customEffects ;
2009-08-04 17:05:49 +00: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)
2014-11-27 20:47:37 +03:00
si32 casterStack ; // -1 if not cated by creature, >=0 caster stack ID
2015-09-21 12:19:35 +03:00
bool castByHero ; //if true - spell has been cast by hero, otherwise by a creature
2016-09-10 18:23:55 +03:00
std : : vector < MetaString > battleLog ;
2008-10-18 11:41:24 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & side ;
2017-07-20 07:08:49 +03:00
h & spellID ;
2017-07-31 16:35:42 +03:00
h & manaGained ;
h & tile ;
h & customEffects ;
h & affectedCres ;
h & casterStack ;
h & castByHero ;
2016-09-10 18:23:55 +03:00
h & battleLog ;
2017-09-08 14:25:12 +03:00
h & activeCast ;
2008-10-18 11:41:24 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct SetStackEffect : public CPackForClient
2008-11-08 22:29:19 +00:00
{
2016-11-18 17:45:59 +03:00
SetStackEffect ( ) { } ;
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
void applyCl ( CClient * cl ) ;
2016-11-02 20:11:01 +03:00
2017-07-20 07:08:49 +03:00
std : : vector < std : : pair < ui32 , std : : vector < Bonus > > > toAdd ;
std : : vector < std : : pair < ui32 , std : : vector < Bonus > > > toUpdate ;
std : : vector < std : : pair < ui32 , std : : vector < Bonus > > > toRemove ;
2016-11-02 20:11:01 +03:00
2017-07-10 04:05:36 +03:00
std : : vector < MetaString > battleLog ;
2017-07-20 07:08:49 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
2008-11-08 22:29:19 +00:00
{
2017-07-20 07:08:49 +03:00
h & toAdd ;
h & toUpdate ;
h & toRemove ;
2017-07-10 04:05:36 +03:00
h & battleLog ;
2008-11-08 22:29:19 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct StacksInjured : public CPackForClient
2009-04-16 00:28:54 +00:00
{
2016-11-18 17:45:59 +03:00
StacksInjured ( ) { }
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
void applyCl ( CClient * cl ) ;
2009-04-16 00:28:54 +00:00
2010-02-20 13:24:38 +00:00
std : : vector < BattleStackAttacked > stacks ;
2017-07-20 07:08:49 +03:00
std : : vector < MetaString > battleLog ;
template < typename Handler > void serialize ( Handler & h , const int version )
2009-04-16 00:28:54 +00:00
{
h & stacks ;
2017-07-20 07:08:49 +03:00
h & battleLog ;
2009-04-16 00:28:54 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct BattleResultsApplied : public CPackForClient
2009-08-03 23:53:18 +00:00
{
2016-11-18 17:45:59 +03:00
BattleResultsApplied ( ) { }
2009-08-03 23:53:18 +00:00
2013-03-03 17:06:03 +00:00
PlayerColor player1 , player2 ;
2009-08-03 23:53:18 +00:00
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player1 ;
h & player2 ;
2009-08-03 23:53:18 +00:00
}
} ;
2017-07-20 07:08:49 +03:00
struct BattleObstaclesChanged : public CPackForClient
2009-08-19 10:59:42 +00:00
{
2017-07-20 07:08:49 +03:00
BattleObstaclesChanged ( ) { }
2009-08-19 10:59:42 +00:00
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
void applyCl ( CClient * cl ) ;
2009-08-19 10:59:42 +00:00
2017-07-20 07:08:49 +03:00
std : : vector < ObstacleChanges > changes ;
2009-08-19 10:59:42 +00:00
2017-07-20 07:08:49 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
2009-08-19 10:59:42 +00:00
{
2017-07-20 07:08:49 +03:00
h & changes ;
2009-08-19 10:59:42 +00:00
}
2009-09-01 13:54:13 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct ELF_VISIBILITY CatapultAttack : public CPackForClient
2009-09-01 13:54:13 +00:00
{
2013-08-06 11:20:28 +00:00
struct AttackInfo
{
si16 destinationTile ;
ui8 attackedPart ;
ui8 damageDealt ;
2017-07-20 07:08:49 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
2013-08-06 11:20:28 +00:00
{
2017-07-31 16:35:42 +03:00
h & destinationTile ;
h & attackedPart ;
h & damageDealt ;
2013-08-06 11:20:28 +00:00
}
} ;
2014-06-24 18:17:25 +04:00
DLL_LINKAGE CatapultAttack ( ) ;
DLL_LINKAGE ~ CatapultAttack ( ) ;
2009-09-01 13:54:13 +00:00
2017-07-20 07:08:49 +03:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
DLL_LINKAGE void applyBattle ( IBattleState * battleState ) ;
void applyCl ( CClient * cl ) ;
2009-09-01 13:54:13 +00:00
2013-08-06 11:20:28 +00:00
std : : vector < AttackInfo > attackedParts ;
2009-09-24 13:44:55 +00:00
int attacker ; //if -1, then a spell caused this
2009-09-01 13:54:13 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & attackedParts ;
h & attacker ;
2009-09-01 13:54:13 +00:00
}
2009-09-05 14:10:26 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct BattleSetStackProperty : public CPackForClient
2011-10-02 13:59:12 +00:00
{
2016-11-26 20:49:26 +03:00
BattleSetStackProperty ( )
: stackID ( 0 ) , which ( CASTS ) , val ( 0 ) , absolute ( 0 )
{ } ;
2011-10-02 13:59:12 +00:00
2015-09-14 20:13:26 +03:00
enum BattleStackProperty { CASTS , ENCHANTER_COUNTER , UNBIND , CLONED , HAS_CLONE } ;
2011-10-02 13:59:12 +00:00
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2011-10-02 13:59:12 +00:00
int stackID ;
2013-02-04 19:43:16 +00:00
BattleStackProperty which ;
2011-10-02 13:59:12 +00:00
int val ;
int absolute ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & stackID ;
h & which ;
h & val ;
h & absolute ;
2011-10-02 13:59:12 +00:00
}
} ;
2016-11-26 20:49:26 +03:00
///activated at the beginning of turn
2016-11-18 17:45:59 +03:00
struct BattleTriggerEffect : public CPackForClient
2016-11-26 20:49:26 +03:00
{
BattleTriggerEffect ( )
: stackID ( 0 ) , effect ( 0 ) , val ( 0 ) , additionalInfo ( 0 )
{ } ;
2011-10-08 13:02:58 +00:00
2011-12-13 21:23:17 +00:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ; //effect
2011-10-08 13:02:58 +00:00
void applyCl ( CClient * cl ) ; //play animations & stuff
int stackID ;
2016-11-18 17:45:59 +03:00
int effect ; //use corresponding Bonus type
2011-10-08 13:02:58 +00:00
int val ;
int additionalInfo ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & stackID ;
h & effect ;
h & val ;
h & additionalInfo ;
2011-10-08 13:02:58 +00:00
}
} ;
2016-11-18 17:45:59 +03:00
struct BattleUpdateGateState : public CPackForClient
2016-01-29 22:35:11 +03:00
{
2016-11-26 20:49:26 +03:00
BattleUpdateGateState ( ) : state ( EGateState : : NONE ) { } ;
2016-01-29 22:35:11 +03:00
2016-02-10 07:10:32 +03:00
void applyFirstCl ( CClient * cl ) ;
2016-01-29 22:35:11 +03:00
DLL_LINKAGE void applyGs ( CGameState * gs ) ;
2016-02-13 17:40:31 +03:00
EGateState state ;
2016-01-29 22:35:11 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & state ;
}
} ;
2016-11-18 17:45:59 +03:00
struct ShowInInfobox : public CPackForClient
2008-08-04 15:56:36 +00:00
{
2016-11-18 17:45:59 +03:00
ShowInInfobox ( ) { } ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2008-08-04 15:56:36 +00:00
Component c ;
MetaString text ;
2009-03-06 22:25:19 +00:00
void applyCl ( CClient * cl ) ;
2008-08-04 15:56:36 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & c ;
h & text ;
2008-08-04 15:56:36 +00:00
}
2010-05-16 13:42:19 +00:00
} ;
2016-11-18 17:45:59 +03:00
struct AdvmapSpellCast : public CPackForClient
2010-05-16 13:42:19 +00:00
{
2016-11-26 20:49:26 +03:00
AdvmapSpellCast ( ) : caster ( nullptr ) { }
const CGHeroInstance * caster ; //todo: replace with ObjectInstanceID
2013-03-03 17:06:03 +00:00
SpellID spellID ;
2010-05-16 13:42:19 +00:00
void applyCl ( CClient * cl ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & caster ;
h & spellID ;
2010-05-16 13:42:19 +00:00
}
2008-12-26 15:00:34 +00:00
} ;
2009-03-09 10:37:49 +00:00
2016-11-18 17:45:59 +03:00
struct ShowWorldViewEx : public CPackForClient
2015-02-26 17:15:17 +03:00
{
PlayerColor player ;
2016-08-30 05:13:45 +03:00
2015-02-26 17:15:17 +03:00
std : : vector < ObjectPosInfo > objectPositions ;
2016-08-30 05:13:45 +03:00
2016-11-18 17:45:59 +03:00
ShowWorldViewEx ( ) { }
2016-08-30 05:13:45 +03:00
2015-02-26 17:15:17 +03:00
void applyCl ( CClient * cl ) ;
2016-08-30 05:13:45 +03:00
2015-02-26 17:15:17 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & player ;
h & objectPositions ;
2016-08-30 05:13:45 +03:00
}
2015-02-26 17:15:17 +03:00
} ;
2009-03-09 10:37:49 +00:00
/***********************************************************************************************************/
2011-05-22 18:46:52 +00:00
struct CommitPackage : public CPackForServer
{
2011-06-10 23:50:32 +00:00
bool freePack ; //for local usage, DO NOT serialize
2011-05-22 18:46:52 +00:00
bool applyGh ( CGameHandler * gh ) ;
CPackForClient * packToCommit ;
2011-06-10 23:50:32 +00:00
CommitPackage ( )
{
freePack = true ;
2016-11-26 20:49:26 +03:00
packToCommit = nullptr ;
2011-06-10 23:50:32 +00:00
}
2011-05-22 18:46:52 +00:00
~ CommitPackage ( )
{
2011-06-10 23:50:32 +00:00
if ( freePack )
delete packToCommit ;
2011-05-22 18:46:52 +00:00
}
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & packToCommit ;
}
} ;
2009-03-09 10:37:49 +00:00
struct CloseServer : public CPackForServer
{
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{ }
} ;
2017-05-31 09:45:26 +03:00
struct LeaveGame : public CPackForServer
{
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{ }
} ;
2009-03-09 10:37:49 +00:00
struct EndTurn : public CPackForServer
{
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{ }
} ;
struct DismissHero : public CPackForServer
{
DismissHero ( ) { } ;
2013-02-13 23:55:42 +00:00
DismissHero ( ObjectInstanceID HID ) : hid ( HID ) { } ;
ObjectInstanceID hid ;
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & hid ;
}
} ;
struct MoveHero : public CPackForServer
{
2016-11-26 20:49:26 +03:00
MoveHero ( ) : transit ( false ) { } ;
2015-03-08 17:04:09 +03:00
MoveHero ( const int3 & Dest , ObjectInstanceID HID , bool Transit ) : dest ( Dest ) , hid ( HID ) , transit ( Transit ) { } ;
2009-03-09 10:37:49 +00:00
int3 dest ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID hid ;
2015-03-08 17:04:09 +03:00
bool transit ;
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
2010-06-30 19:27:35 +00:00
{
2017-07-31 16:35:42 +03:00
h & dest ;
h & hid ;
h & transit ;
2010-06-30 19:27:35 +00:00
}
} ;
struct CastleTeleportHero : public CPackForServer
{
2016-11-26 20:49:26 +03:00
CastleTeleportHero ( ) : source ( 0 ) { } ;
2013-02-13 23:55:42 +00:00
CastleTeleportHero ( const ObjectInstanceID HID , ObjectInstanceID Dest , ui8 Source ) : dest ( Dest ) , hid ( HID ) , source ( Source ) { } ;
ObjectInstanceID dest ;
ObjectInstanceID hid ;
2010-06-30 19:27:35 +00:00
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 10:37:49 +00:00
{
2017-07-31 16:35:42 +03:00
h & dest ;
h & hid ;
2009-03-09 10:37:49 +00:00
}
} ;
struct ArrangeStacks : public CPackForServer
{
2016-11-26 20:49:26 +03:00
ArrangeStacks ( ) : what ( 0 ) , val ( 0 ) { } ;
2013-02-16 14:03:47 +00:00
ArrangeStacks ( ui8 W , SlotID P1 , SlotID P2 , ObjectInstanceID ID1 , ObjectInstanceID ID2 , si32 VAL )
2009-03-09 10:37:49 +00:00
: what ( W ) , p1 ( P1 ) , p2 ( P2 ) , id1 ( ID1 ) , id2 ( ID2 ) , val ( VAL ) { } ;
ui8 what ; //1 - swap; 2 - merge; 3 - split
2013-02-16 14:03:47 +00:00
SlotID p1 , p2 ; //positions of first and second stack
2013-02-13 23:55:42 +00:00
ObjectInstanceID id1 , id2 ; //ids of objects with garrison
2009-03-09 10:37:49 +00:00
si32 val ;
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & what ;
h & p1 ;
h & p2 ;
h & id1 ;
h & id2 ;
h & val ;
2009-03-09 10:37:49 +00:00
}
} ;
struct DisbandCreature : public CPackForServer
{
DisbandCreature ( ) { } ;
2013-02-16 14:03:47 +00:00
DisbandCreature ( SlotID Pos , ObjectInstanceID ID ) : pos ( Pos ) , id ( ID ) { } ;
SlotID pos ; //stack pos
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ; //object id
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & pos ;
h & id ;
2009-03-09 10:37:49 +00:00
}
} ;
struct BuildStructure : public CPackForServer
{
BuildStructure ( ) { } ;
2013-02-13 23:55:42 +00:00
BuildStructure ( ObjectInstanceID TID , BuildingID BID ) : tid ( TID ) , bid ( BID ) { } ;
ObjectInstanceID tid ; //town id
2013-02-11 19:11:34 +00:00
BuildingID bid ; //structure id
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tid ;
h & bid ;
2009-03-09 10:37:49 +00:00
}
} ;
2016-11-26 20:49:26 +03:00
2009-09-22 14:27:46 +00:00
struct RazeStructure : public BuildStructure
{
RazeStructure ( ) { } ;
2009-03-09 10:37:49 +00:00
2009-09-22 14:27:46 +00:00
bool applyGh ( CGameHandler * gh ) ;
} ;
2016-11-26 20:49:26 +03:00
2009-03-09 10:37:49 +00:00
struct RecruitCreatures : public CPackForServer
{
2016-11-26 20:49:26 +03:00
RecruitCreatures ( ) : amount ( 0 ) , level ( 0 ) { } ;
2014-09-19 00:18:49 +03:00
RecruitCreatures ( ObjectInstanceID TID , ObjectInstanceID DST , CreatureID CRID , si32 Amount , si32 Level ) :
tid ( TID ) , dst ( DST ) , crid ( CRID ) , amount ( Amount ) , level ( Level ) { } ;
ObjectInstanceID tid ; //dwelling id, or town
ObjectInstanceID dst ; //destination ID, e.g. hero
2013-02-10 23:24:57 +00:00
CreatureID crid ;
2013-02-07 17:34:50 +00:00
ui32 amount ; //creature amount
2010-07-10 16:50:23 +00:00
si32 level ; //dwelling level to buy from, -1 if any
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & tid ;
h & dst ;
h & crid ;
h & amount ;
h & level ;
2009-03-09 10:37:49 +00:00
}
} ;
struct UpgradeCreature : public CPackForServer
{
UpgradeCreature ( ) { } ;
2013-02-16 14:03:47 +00:00
UpgradeCreature ( SlotID Pos , ObjectInstanceID ID , CreatureID CRID ) : pos ( Pos ) , id ( ID ) , cid ( CRID ) { } ;
SlotID pos ; //stack pos
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ; //object id
2013-02-10 23:24:57 +00:00
CreatureID cid ; //id of type to which we want make upgrade
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & pos ;
h & id ;
h & cid ;
2009-03-09 10:37:49 +00:00
}
} ;
struct GarrisonHeroSwap : public CPackForServer
{
GarrisonHeroSwap ( ) { } ;
2013-02-13 23:55:42 +00:00
GarrisonHeroSwap ( ObjectInstanceID TID ) : tid ( TID ) { } ;
ObjectInstanceID tid ;
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & tid ;
}
} ;
struct ExchangeArtifacts : public CPackForServer
2012-01-30 16:07:52 +00:00
//TODO: allow exchange between heroes, stacks and commanders
2009-03-09 10:37:49 +00:00
{
2012-04-14 02:20:22 +00:00
ArtifactLocation src , dst ;
2009-03-09 10:37:49 +00:00
ExchangeArtifacts ( ) { } ;
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & src ;
h & dst ;
2009-03-09 10:37:49 +00:00
}
} ;
2010-02-16 14:39:56 +00:00
struct AssembleArtifacts : public CPackForServer
{
2016-11-26 20:49:26 +03:00
AssembleArtifacts ( ) : assemble ( false ) { } ;
2013-02-16 14:03:47 +00:00
AssembleArtifacts ( ObjectInstanceID _heroID , ArtifactPosition _artifactSlot , bool _assemble , ArtifactID _assembleTo )
2010-02-16 14:39:56 +00:00
: heroID ( _heroID ) , artifactSlot ( _artifactSlot ) , assemble ( _assemble ) , assembleTo ( _assembleTo ) { } ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID heroID ;
2013-02-12 19:49:40 +00:00
ArtifactPosition artifactSlot ;
2010-02-16 14:39:56 +00:00
bool assemble ; // True to assemble artifact, false to disassemble.
2013-02-16 14:03:47 +00:00
ArtifactID assembleTo ; // Artifact to assemble into.
2010-02-16 14:39:56 +00:00
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & heroID ;
h & artifactSlot ;
h & assemble ;
h & assembleTo ;
2010-02-16 14:39:56 +00:00
}
} ;
2009-03-09 10:37:49 +00:00
struct BuyArtifact : public CPackForServer
{
BuyArtifact ( ) { } ;
2013-02-13 23:55:42 +00:00
BuyArtifact ( ObjectInstanceID HID , ArtifactID AID ) : hid ( HID ) , aid ( AID ) { } ;
ObjectInstanceID hid ;
2013-02-10 23:24:57 +00:00
ArtifactID aid ;
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hid ;
h & aid ;
2009-03-09 10:37:49 +00:00
}
} ;
struct TradeOnMarketplace : public CPackForServer
{
2016-11-26 20:49:26 +03:00
TradeOnMarketplace ( )
2017-10-14 21:30:56 +02:00
: market ( nullptr ) , hero ( nullptr ) , mode ( EMarketMode : : RESOURCE_RESOURCE )
2016-11-26 20:49:26 +03:00
{ } ;
2010-05-18 07:01:54 +00:00
2016-11-26 20:49:26 +03:00
const CGObjectInstance * market ; //todo: replace with ObjectInstanceID
2010-05-18 07:01:54 +00:00
const CGHeroInstance * hero ; //needed when trading artifacts / creatures
2013-02-04 19:43:16 +00:00
EMarketMode : : EMarketMode mode ;
2017-10-14 21:30:56 +02:00
std : : vector < ui32 > r1 , r2 ; //mode 0: r1 - sold resource, r2 - bought res (exception: when sacrificing art r1 is art id [todo: make r2 preferred slot?]
std : : vector < ui32 > val ; //units of sold resource
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & market ;
h & hero ;
h & mode ;
h & r1 ;
h & r2 ;
h & val ;
2009-03-09 10:37:49 +00:00
}
} ;
struct SetFormation : public CPackForServer
{
2016-11-26 20:49:26 +03:00
SetFormation ( ) : formation ( 0 ) { } ;
2013-02-13 23:55:42 +00:00
SetFormation ( ObjectInstanceID HID , ui8 Formation ) : hid ( HID ) , formation ( Formation ) { } ;
ObjectInstanceID hid ;
2009-03-09 10:37:49 +00:00
ui8 formation ;
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hid ;
h & formation ;
2009-03-09 10:37:49 +00:00
}
} ;
struct HireHero : public CPackForServer
{
2016-11-26 20:49:26 +03:00
HireHero ( ) : hid ( 0 ) { } ;
2013-02-13 23:55:42 +00:00
HireHero ( si32 HID , ObjectInstanceID TID ) : hid ( HID ) , tid ( TID ) { } ;
si32 hid ; //available hero serial
ObjectInstanceID tid ; //town (tavern) id
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hid ;
h & tid ;
h & player ;
2009-03-09 10:37:49 +00:00
}
} ;
2012-09-15 19:16:16 +00:00
struct BuildBoat : public CPackForServer
2009-07-26 03:33:13 +00:00
{
BuildBoat ( ) { } ;
2013-02-13 23:55:42 +00:00
ObjectInstanceID objid ; //where player wants to buy a boat
2009-07-26 03:33:13 +00:00
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & objid ;
}
} ;
2009-03-09 10:37:49 +00:00
struct QueryReply : public CPackForServer
{
2017-06-06 07:53:51 +03:00
QueryReply ( ) { } ;
QueryReply ( QueryID QID , const JsonNode & Reply ) : qid ( QID ) , reply ( Reply ) { } ;
2013-05-27 10:53:28 +00:00
QueryID qid ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2017-06-06 07:53:51 +03:00
JsonNode reply ;
2009-03-09 10:37:49 +00:00
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & qid ;
h & player ;
h & reply ;
2009-03-09 10:37:49 +00:00
}
} ;
struct MakeAction : public CPackForServer
{
MakeAction ( ) { } ;
2009-03-09 19:40:43 +00:00
MakeAction ( const BattleAction & BA ) : ba ( BA ) { } ;
2009-03-09 10:37:49 +00:00
BattleAction ba ;
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ba ;
}
} ;
struct MakeCustomAction : public CPackForServer
{
MakeCustomAction ( ) { } ;
2009-03-20 18:51:48 +00:00
MakeCustomAction ( const BattleAction & BA ) : ba ( BA ) { } ;
2009-03-09 10:37:49 +00:00
BattleAction ba ;
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & ba ;
}
} ;
2010-02-21 15:03:30 +00:00
struct DigWithHero : public CPackForServer
{
DigWithHero ( ) { }
2013-02-13 23:55:42 +00:00
ObjectInstanceID id ; //digging hero id
2010-02-21 15:03:30 +00:00
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & id ;
}
} ;
2010-03-10 23:16:30 +00:00
struct CastAdvSpell : public CPackForServer
{
CastAdvSpell ( ) { }
2013-02-13 23:55:42 +00:00
ObjectInstanceID hid ; //hero id
2013-02-10 23:24:57 +00:00
SpellID sid ; //spell id
2010-03-10 23:16:30 +00:00
int3 pos ; //selected tile (not always used)
bool applyGh ( CGameHandler * gh ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & hid ;
h & sid ;
h & pos ;
2010-03-10 23:16:30 +00:00
}
} ;
2009-03-09 10:37:49 +00:00
/***********************************************************************************************************/
2009-03-28 18:46:20 +00: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 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-28 18:46:20 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & fname ;
}
} ;
2016-11-18 17:45:59 +03:00
struct PlayerMessage : public CPackForClient , public CPackForServer
2009-03-09 10:37:49 +00:00
{
2016-11-18 17:45:59 +03:00
PlayerMessage ( ) { } ;
2014-09-21 20:35:53 +03:00
PlayerMessage ( PlayerColor Player , const std : : string & Text , ObjectInstanceID obj )
: player ( Player ) , text ( Text ) , currObj ( obj )
2016-11-18 17:45:59 +03:00
{ } ;
2009-03-09 10:37:49 +00:00
void applyCl ( CClient * cl ) ;
void applyGs ( CGameState * gs ) { } ;
2009-04-16 00:28:54 +00:00
bool applyGh ( CGameHandler * gh ) ;
2009-03-09 10:37:49 +00:00
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-03-09 10:37:49 +00:00
std : : string text ;
2014-09-21 20:35:53 +03:00
ObjectInstanceID currObj ; // optional parameter that specifies current object. For cheats :)
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & text ;
h & player ;
h & currObj ;
2009-03-09 10:37:49 +00:00
}
2012-09-15 19:16:16 +00:00
} ;
2009-03-09 10:37:49 +00:00
2016-11-18 17:45:59 +03:00
struct CenterView : public CPackForClient
2009-08-11 07:50:29 +00:00
{
2016-11-26 20:49:26 +03:00
CenterView ( ) : focusTime ( 0 ) { } ;
2009-08-11 07:50:29 +00:00
void applyCl ( CClient * cl ) ;
2013-03-03 17:06:03 +00:00
PlayerColor player ;
2009-08-13 01:03:11 +00:00
int3 pos ;
ui32 focusTime ; //ms
2009-08-11 07:50:29 +00:00
2009-03-09 10:37:49 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & pos ;
h & player ;
h & focusTime ;
2009-03-09 10:37:49 +00:00
}
2010-02-06 13:49:14 +00:00
} ;
2010-09-03 18:42:54 +00:00
/***********************************************************************************************************/
struct CPackForSelectionScreen : public CPack
{
2016-10-02 22:41:57 +02:00
void apply ( CSelectionScreen * selScreen ) { } // implemented in CPreGame.cpp
2010-09-03 18:42:54 +00:00
} ;
2010-10-24 11:35:14 +00:00
class CPregamePackToPropagate : public CPackForSelectionScreen
{ } ;
class CPregamePackToHost : public CPackForSelectionScreen
{ } ;
struct ChatMessage : public CPregamePackToPropagate
2010-09-03 18:42:54 +00:00
{
std : : string playerName , message ;
void apply ( CSelectionScreen * selScreen ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & playerName ;
h & message ;
2010-09-03 18:42:54 +00:00
}
} ;
2009-08-11 07:50:29 +00:00
2010-10-24 11:35:14 +00: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 )
{
2017-07-31 16:35:42 +03:00
h & playerName ;
h & connectionID ;
2010-10-24 11:35:14 +00:00
}
} ;
2014-06-26 18:34:54 +03:00
struct ELF_VISIBILITY SelectMap : public CPregamePackToPropagate
2010-10-24 11:35:14 +00:00
{
const CMapInfo * mapInfo ;
2014-06-26 20:49:18 +04:00
bool free ; //local flag, do not serialize
2010-10-24 11:35:14 +00:00
2014-06-26 20:41:27 +04:00
DLL_LINKAGE SelectMap ( const CMapInfo & src ) ;
DLL_LINKAGE SelectMap ( ) ;
2014-06-25 17:11:07 +03:00
DLL_LINKAGE ~ SelectMap ( ) ;
2010-10-24 11:35:14 +00:00
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & mapInfo ;
}
} ;
2014-06-26 18:34:54 +03:00
struct ELF_VISIBILITY UpdateStartOptions : public CPregamePackToPropagate
2010-10-24 11:35:14 +00:00
{
StartInfo * options ;
2014-06-26 20:49:18 +04:00
bool free ; //local flag, do not serialize
2010-10-24 11:35:14 +00:00
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
2014-06-26 20:41:27 +04:00
DLL_LINKAGE UpdateStartOptions ( StartInfo & src ) ;
DLL_LINKAGE UpdateStartOptions ( ) ;
2014-06-25 17:11:07 +03:00
DLL_LINKAGE ~ UpdateStartOptions ( ) ;
2010-10-24 11:35:14 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & options ;
}
} ;
struct PregameGuiAction : public CPregamePackToPropagate
{
2016-08-30 05:13:45 +03:00
enum { NO_TAB , OPEN_OPTIONS , OPEN_SCENARIO_LIST , OPEN_RANDOM_MAP_OPTIONS }
2013-02-04 19:43:16 +00:00
action ;
2010-10-24 11:35:14 +00:00
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
{
2013-02-04 19:43:16 +00:00
enum EWhat { TOWN , HERO , BONUS } ;
2010-10-24 11:35:14 +00:00
ui8 what ;
2012-09-15 19:16:16 +00:00
si8 direction ; //-1 or +1
2013-03-03 17:06:03 +00:00
ui8 playerID ;
2010-10-24 11:35:14 +00:00
2013-03-03 17:06:03 +00:00
RequestOptionsChange ( ui8 What , si8 Dir , ui8 Player )
2010-10-24 11:35:14 +00:00
: what ( What ) , direction ( Dir ) , playerID ( Player )
{ }
2016-11-26 20:49:26 +03:00
RequestOptionsChange ( )
: what ( 0 ) , direction ( 0 ) , playerID ( 0 )
{ }
2010-10-24 11:35:14 +00:00
void apply ( CSelectionScreen * selScreen ) ; //that functions are implemented in CPreGame.cpp
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & what ;
h & direction ;
h & playerID ;
2010-10-24 11:35:14 +00:00
}
} ;
struct PlayerLeft : public CPregamePackToPropagate
{
2013-03-03 17:06:03 +00:00
ui8 playerID ;
2010-10-24 11:35:14 +00:00
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 :
2013-03-03 17:06:03 +00:00
std : : map < ui8 , std : : string > playerNames ;
2010-10-24 11:35:14 +00:00
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;
}
} ;