NetPacks.h 16 KB

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