NetPacks.h 14 KB

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