NetPacks.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. #ifndef __NETPACKS_H__
  2. #define __NETPACKS_H__
  3. #include "../global.h"
  4. #include "BattleAction.h"
  5. struct IPack
  6. {
  7. virtual ui16 getType()const = 0 ;
  8. //template<ui16 Type>
  9. //static bool isType(const IPack * ip)
  10. //{
  11. // return Type == ip->getType();
  12. //}
  13. template<ui16 Type>
  14. static bool isType(IPack * ip)
  15. {
  16. return Type == ip->getType();
  17. }
  18. //template<ui16 Type>
  19. //static bool isType(const IPack & ip)
  20. //{
  21. // return Type == ip.getType();
  22. //}
  23. };
  24. template <typename T> struct CPack
  25. :public IPack
  26. {
  27. ui16 type;
  28. ui16 getType() const{return type;}
  29. T* This(){return static_cast<T*>(this);};
  30. };
  31. template <typename T> struct Query
  32. :public CPack<T>
  33. {
  34. ui32 id;
  35. };
  36. struct MetaString : public CPack<MetaString> //2001 helper for object scrips
  37. {
  38. std::vector<std::string> strings;
  39. std::vector<std::pair<ui8,ui32> > texts; //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
  40. std::vector<si32> message;
  41. std::vector<std::string> replacements;
  42. template <typename Handler> void serialize(Handler &h, const int version)
  43. {
  44. h & strings & texts & message & replacements;
  45. }
  46. MetaString& operator<<(const std::pair<ui8,ui32> &txt)
  47. {
  48. message.push_back(-((si32)texts.size())-1);
  49. texts.push_back(txt);
  50. return *this;
  51. }
  52. MetaString& operator<<(const std::string &txt)
  53. {
  54. message.push_back(strings.size()+1);
  55. strings.push_back(txt);
  56. return *this;
  57. }
  58. void clear()
  59. {
  60. strings.clear();
  61. texts.clear();
  62. message.clear();
  63. }
  64. MetaString(){type = 2001;};
  65. };
  66. struct SetResources : public CPack<SetResources> //104
  67. {
  68. SetResources(){res.resize(RESOURCE_QUANTITY);type = 104;};
  69. ui8 player;
  70. std::vector<si32> res; //res[resid] => res amount
  71. template <typename Handler> void serialize(Handler &h, const int version)
  72. {
  73. h & player & res;
  74. }
  75. };
  76. struct SetResource : public CPack<SetResource> //102
  77. {
  78. SetResource(){type = 102;};
  79. ui8 player, resid;
  80. si32 val;
  81. template <typename Handler> void serialize(Handler &h, const int version)
  82. {
  83. h & player & resid & val;
  84. }
  85. };
  86. struct SetPrimSkill : public CPack<SetPrimSkill> //105
  87. {
  88. SetPrimSkill(){type = 105;};
  89. ui8 abs; //0 - changes by value; 1 - sets to value
  90. si32 id;
  91. ui16 which, val;
  92. template <typename Handler> void serialize(Handler &h, const int version)
  93. {
  94. h & abs & id & which & val;
  95. }
  96. };
  97. struct SetSecSkill : public CPack<SetSecSkill> //106
  98. {
  99. SetSecSkill(){type = 106;};
  100. ui8 abs; //0 - changes by value; 1 - sets to value
  101. si32 id;
  102. ui16 which, val;
  103. template <typename Handler> void serialize(Handler &h, const int version)
  104. {
  105. h & abs & id & which & val;
  106. }
  107. };
  108. struct HeroVisitCastle : public CPack<HeroVisitCastle> //108
  109. {
  110. HeroVisitCastle(){flags=0;type = 108;};
  111. ui8 flags; //1 - start, 2 - garrison
  112. ui32 tid, hid;
  113. bool start() //if hero is entering castle (if false - leaving)
  114. {
  115. return flags & 1;
  116. }
  117. bool garrison() //if hero is entering/leaving garrison (if false - it's only visiting hero)
  118. {
  119. return flags & 2;
  120. }
  121. template <typename Handler> void serialize(Handler &h, const int version)
  122. {
  123. h & flags & tid & hid;
  124. }
  125. };
  126. struct ChangeSpells : public CPack<ChangeSpells> //109
  127. {
  128. ChangeSpells(){type = 109;};
  129. ui8 learn; //1 - gives spell, 0 - takes
  130. ui32 hid;
  131. std::set<ui32> spells;
  132. template <typename Handler> void serialize(Handler &h, const int version)
  133. {
  134. h & learn & hid & spells;
  135. }
  136. };
  137. struct SetMana : public CPack<SetMana> //110
  138. {
  139. SetMana(){type = 110;};
  140. ui32 hid, val;
  141. template <typename Handler> void serialize(Handler &h, const int version)
  142. {
  143. h & val & hid;
  144. }
  145. };
  146. struct SetMovePoints : public CPack<SetMovePoints> //111
  147. {
  148. SetMovePoints(){type = 111;};
  149. ui32 hid, val;
  150. template <typename Handler> void serialize(Handler &h, const int version)
  151. {
  152. h & val & hid;
  153. }
  154. };
  155. struct FoWChange : public CPack<FoWChange> //112
  156. {
  157. FoWChange(){type = 112;};
  158. std::set<int3> tiles;
  159. ui8 player, mode; //mode==0 - hide, mode==1 - reveal
  160. template <typename Handler> void serialize(Handler &h, const int version)
  161. {
  162. h & tiles & player;
  163. }
  164. };
  165. struct SetAvailableHeroes : public CPack<SetAvailableHeroes> //113
  166. {
  167. SetAvailableHeroes(){type = 113;flags=0;};
  168. ui8 player;
  169. ui32 hid1, hid2;
  170. ui8 flags; //1 - reset army of hero1; 2 - reset army of hero 2
  171. template <typename Handler> void serialize(Handler &h, const int version)
  172. {
  173. h & player & hid1 & hid2 & flags;
  174. }
  175. };
  176. struct GiveBonus : public CPack<GiveBonus> //115
  177. {
  178. GiveBonus(){type = 115;};
  179. ui8 bduration;
  180. ui8 btype;
  181. si32 bval;
  182. ui32 bid;
  183. ui32 hid;
  184. MetaString bdescr;
  185. template <typename Handler> void serialize(Handler &h, const int version)
  186. {
  187. h & bduration & btype & bval & bid & hid & bdescr;
  188. }
  189. };
  190. struct RemoveObject : public CPack<RemoveObject> //500
  191. {
  192. RemoveObject(){type = 500;};
  193. RemoveObject(si32 ID){id = ID;type = 500;};
  194. si32 id;
  195. template <typename Handler> void serialize(Handler &h, const int version)
  196. {
  197. h & id;
  198. }
  199. };
  200. struct TryMoveHero : public CPack<TryMoveHero> //501
  201. {
  202. TryMoveHero(){type = 501;};
  203. ui32 id, movePoints;
  204. ui8 result; //0 - failed; 1- succes -normal move; 2 - teleportation, 3 - instant jump
  205. int3 start, end;
  206. std::set<int3> fowRevealed; //revealed tiles
  207. template <typename Handler> void serialize(Handler &h, const int version)
  208. {
  209. h & id & result & start & end & movePoints & fowRevealed;
  210. }
  211. };
  212. struct SetGarrisons : public CPack<SetGarrisons> //502
  213. {
  214. SetGarrisons(){type = 502;};
  215. std::map<ui32,CCreatureSet> garrs;
  216. template <typename Handler> void serialize(Handler &h, const int version)
  217. {
  218. h & garrs;
  219. }
  220. };
  221. struct NewStructures : public CPack<NewStructures> //504
  222. {
  223. NewStructures(){type = 504;};
  224. si32 tid;
  225. std::set<si32> bid;
  226. si16 builded;
  227. template <typename Handler> void serialize(Handler &h, const int version)
  228. {
  229. h & tid & bid & builded;
  230. }
  231. };
  232. struct SetAvailableCreatures : public CPack<SetAvailableCreatures> //506
  233. {
  234. SetAvailableCreatures(){type = 506;};
  235. si32 tid;
  236. std::map<si32,ui32> creatures;
  237. template <typename Handler> void serialize(Handler &h, const int version)
  238. {
  239. h & tid & creatures;
  240. }
  241. };
  242. struct SetHeroesInTown : public CPack<SetHeroesInTown> //508
  243. {
  244. SetHeroesInTown(){type = 508;};
  245. si32 tid, visiting, garrison; //id of town, visiting hero, hero in garrison
  246. template <typename Handler> void serialize(Handler &h, const int version)
  247. {
  248. h & tid & visiting & garrison;
  249. }
  250. };
  251. struct SetHeroArtifacts : public CPack<SetHeroArtifacts> //509
  252. {
  253. SetHeroArtifacts(){type = 509;};
  254. si32 hid;
  255. std::vector<ui32> artifacts; //hero's artifacts from bag
  256. std::map<ui16,ui32> 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
  257. template <typename Handler> void serialize(Handler &h, const int version)
  258. {
  259. h & hid & artifacts & artifWorn;
  260. }
  261. };
  262. struct SetSelection : public CPack<SetSelection> //514
  263. {
  264. SetSelection(){type = 514;};
  265. ui8 player;
  266. ui32 id;
  267. template <typename Handler> void serialize(Handler &h, const int version)
  268. {
  269. h & id & player;
  270. }
  271. };
  272. struct HeroRecruited : public CPack<HeroRecruited> //515
  273. {
  274. HeroRecruited(){type = 515;};
  275. si32 hid, tid; //subID of hero
  276. int3 tile;
  277. ui8 player;
  278. template <typename Handler> void serialize(Handler &h, const int version)
  279. {
  280. h & hid & tid & tile & player;
  281. }
  282. };
  283. struct NewTurn : public CPack<NewTurn> //101
  284. {
  285. struct Hero
  286. {
  287. ui32 id, move, mana; //id is a general serial id
  288. template <typename Handler> void serialize(Handler &h, const int version)
  289. {
  290. h & id & move & mana;
  291. }
  292. bool operator<(const Hero&h)const{return id < h.id;}
  293. };
  294. std::set<Hero> heroes; //updates movement and mana points
  295. std::vector<SetResources> res;//resource list
  296. std::vector<SetAvailableCreatures> cres;//resource list
  297. ui32 day;
  298. bool resetBuilded;
  299. NewTurn(){type = 101;};
  300. template <typename Handler> void serialize(Handler &h, const int version)
  301. {
  302. h & heroes & cres & res & day & resetBuilded;
  303. }
  304. };
  305. //struct SetStrInfo : public CPack<SetStrInfo> //503
  306. //{
  307. // SetStrInfo(){type = 503;};
  308. // SetAvailableCreatures sac;
  309. //
  310. // template <typename Handler> void serialize(Handler &h, const int version)
  311. // {
  312. // h & sac;
  313. // }
  314. //};
  315. struct Component : public CPack<Component> //2002 helper for object scrips informations
  316. {
  317. ui16 id, subtype; //ids: 0 - primskill; 1 - secskill; 2 - resource; 3 - creature; 4 - artifact; 5 - experience (sub==0 exp points; sub==1 levels)
  318. si32 val; // + give; - take
  319. si16 when; // 0 - now; +x - within x days; -x - per x days
  320. template <typename Handler> void serialize(Handler &h, const int version)
  321. {
  322. h & id & subtype & val & when;
  323. }
  324. Component(){type = 2002;};
  325. Component(ui16 Type, ui16 Subtype, si32 Val, si16 When):id(Type),subtype(Subtype),val(Val),when(When){type = 2002;};
  326. };
  327. struct InfoWindow : public CPack<InfoWindow> //103 - displays simple info window
  328. {
  329. MetaString text;
  330. std::vector<Component> components;
  331. ui8 player;
  332. template <typename Handler> void serialize(Handler &h, const int version)
  333. {
  334. h & text & components & player;
  335. }
  336. InfoWindow(){type = 103;};
  337. };
  338. struct SetObjectProperty : public CPack<SetObjectProperty>//1001
  339. {
  340. ui32 id;
  341. ui8 what; //1 - owner; 2 - blockvis
  342. ui32 val;
  343. SetObjectProperty(){type = 1001;};
  344. SetObjectProperty(ui32 ID, ui8 What, ui32 Val):id(ID),what(What),val(Val){type = 1001;};
  345. template <typename Handler> void serialize(Handler &h, const int version)
  346. {
  347. h & id & what & val;
  348. }
  349. };
  350. struct SetHoverName : public CPack<SetHoverName>//1002
  351. {
  352. ui32 id;
  353. MetaString name;
  354. SetHoverName(){type = 1002;};
  355. SetHoverName(ui32 ID, MetaString& Name):id(ID),name(Name){type = 1002;};
  356. template <typename Handler> void serialize(Handler &h, const int version)
  357. {
  358. h & id & name;
  359. }
  360. };
  361. struct HeroLevelUp : public Query<HeroLevelUp>//2000
  362. {
  363. si32 heroid;
  364. ui8 primskill, level;
  365. std::vector<ui16> skills;
  366. HeroLevelUp(){type = 2000;};
  367. template <typename Handler> void serialize(Handler &h, const int version)
  368. {
  369. h & id & heroid & primskill & level & skills;
  370. }
  371. };
  372. struct SelectionDialog : public Query<SelectionDialog>//2001
  373. {
  374. MetaString text;
  375. std::vector<Component> components;
  376. ui8 player;
  377. SelectionDialog(){type = 2001;};
  378. template <typename Handler> void serialize(Handler &h, const int version)
  379. {
  380. h & id & text & components & player;
  381. }
  382. };
  383. struct YesNoDialog : public Query<YesNoDialog>//2002
  384. {
  385. MetaString text;
  386. std::vector<Component> components;
  387. ui8 player;
  388. YesNoDialog(){type = 2002;};
  389. template <typename Handler> void serialize(Handler &h, const int version)
  390. {
  391. h & id & text & components & player;
  392. }
  393. };
  394. struct BattleInfo;
  395. struct BattleStart : public CPack<BattleStart>//3000
  396. {
  397. BattleInfo * info;
  398. BattleStart(){type = 3000;};
  399. template <typename Handler> void serialize(Handler &h, const int version)
  400. {
  401. h & info;
  402. }
  403. };
  404. struct BattleNextRound : public CPack<BattleNextRound>//3001
  405. {
  406. si32 round;
  407. BattleNextRound(){type = 3001;};
  408. template <typename Handler> void serialize(Handler &h, const int version)
  409. {
  410. h & round;
  411. }
  412. };
  413. struct BattleSetActiveStack : public CPack<BattleSetActiveStack>//3002
  414. {
  415. ui32 stack;
  416. BattleSetActiveStack(){type = 3002;};
  417. template <typename Handler> void serialize(Handler &h, const int version)
  418. {
  419. h & stack;
  420. }
  421. };
  422. struct BattleResult : public CPack<BattleResult>//3003
  423. {
  424. ui8 result; //0 - normal victory; 1 - escape; 2 - surrender
  425. ui8 winner; //0 - attacker, 1 - defender, [2 - draw (should be possible?)]
  426. std::set<std::pair<ui32,si32> > casualties[2]; //first => casualties of attackers - set of pairs crid<>number
  427. ui32 exp[2]; //exp for attacker and defender
  428. std::set<ui32> artifacts; //artifacts taken from loser to winner
  429. BattleResult(){type = 3003;};
  430. template <typename Handler> void serialize(Handler &h, const int version)
  431. {
  432. h & result & winner & casualties[0] & casualties[1] & exp & artifacts;
  433. }
  434. };
  435. struct BattleStackMoved : public CPack<BattleStackMoved>//3004
  436. {
  437. ui32 stack, tile;
  438. BattleStackMoved(){type = 3004;};
  439. template <typename Handler> void serialize(Handler &h, const int version)
  440. {
  441. h & stack & tile;
  442. }
  443. };
  444. struct BattleStackAttacked : public CPack<BattleStackAttacked>//3005
  445. {
  446. ui32 stackAttacked;
  447. ui32 newAmount, newHP, killedAmount, damageAmount;
  448. ui8 flags; //1 - is stack killed; 2 - is there special effect to be shown
  449. ui32 effect; //set only if flag 2 is present
  450. BattleStackAttacked(){flags = 0; type = 3005;};
  451. bool killed() //if target stack was killed
  452. {
  453. return flags & 1;
  454. }
  455. bool isEffect() //if target stack was killed
  456. {
  457. return flags & 2;
  458. }
  459. template <typename Handler> void serialize(Handler &h, const int version)
  460. {
  461. h & stackAttacked & newAmount & newHP & flags & killedAmount & damageAmount & effect;
  462. }
  463. };
  464. struct BattleAttack : public CPack<BattleAttack>//3006
  465. {
  466. BattleStackAttacked bsa;
  467. ui32 stackAttacking;
  468. ui8 flags;
  469. BattleAttack(){flags = 0; type = 3006;};
  470. bool shot()//distance attack - decrease number of shots
  471. {
  472. return flags & 1;
  473. }
  474. bool counter()//is it counterattack?
  475. {
  476. return flags & 2;
  477. }
  478. bool killed() //if target stack was killed
  479. {
  480. return bsa.killed();
  481. }
  482. template <typename Handler> void serialize(Handler &h, const int version)
  483. {
  484. h & bsa & stackAttacking & flags;
  485. }
  486. };
  487. struct StartAction : public CPack<StartAction>//3007
  488. {
  489. BattleAction ba;
  490. StartAction(){type = 3007;};
  491. StartAction(const BattleAction &act){ba = act; type = 3007;};
  492. template <typename Handler> void serialize(Handler &h, const int version)
  493. {
  494. h & ba;
  495. }
  496. };
  497. struct SpellCasted : public CPack<SpellCasted>//3009
  498. {
  499. ui8 side; //which hero casted spell: 0 - attacker, 1 - defender
  500. ui32 id;
  501. ui8 skill;
  502. ui16 tile; //destination tile (may not be set in some global/mass spells
  503. SpellCasted(){type = 3009;};
  504. template <typename Handler> void serialize(Handler &h, const int version)
  505. {
  506. h & side & id & skill & tile;
  507. }
  508. };
  509. struct SetStackEffect : public CPack<SetStackEffect> //3010
  510. {
  511. ui32 stack;
  512. CStack::StackEffect effect;
  513. SetStackEffect(){type = 3010;};
  514. template <typename Handler> void serialize(Handler &h, const int version)
  515. {
  516. h & stack & effect;
  517. }
  518. };
  519. struct ShowInInfobox : public CPack<ShowInInfobox> //107
  520. {
  521. ShowInInfobox(){type = 107;};
  522. ui8 player;
  523. Component c;
  524. MetaString text;
  525. template <typename Handler> void serialize(Handler &h, const int version)
  526. {
  527. h & player & c & text;
  528. }
  529. };
  530. #endif //__NETPACKS_H__