NetPacks.h 12 KB

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