NetPacks.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  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 RemoveObject : public CPack<RemoveObject> //500
  94. {
  95. RemoveObject(){type = 500;};
  96. RemoveObject(si32 ID){id = ID;type = 500;};
  97. si32 id;
  98. template <typename Handler> void serialize(Handler &h, const int version)
  99. {
  100. h & id;
  101. }
  102. };
  103. struct TryMoveHero : public CPack<TryMoveHero> //501
  104. {
  105. TryMoveHero(){type = 501;};
  106. ui32 id, movePoints;
  107. ui8 result;
  108. int3 start, end;
  109. std::set<int3> fowRevealed; //revealed tiles
  110. template <typename Handler> void serialize(Handler &h, const int version)
  111. {
  112. h & id & result & start & end & movePoints & fowRevealed;
  113. }
  114. };
  115. struct SetGarrisons : public CPack<SetGarrisons> //502
  116. {
  117. SetGarrisons(){type = 502;};
  118. std::map<ui32,CCreatureSet> garrs;
  119. template <typename Handler> void serialize(Handler &h, const int version)
  120. {
  121. h & garrs;
  122. }
  123. };
  124. struct NewStructures : public CPack<NewStructures> //504
  125. {
  126. NewStructures(){type = 504;};
  127. si32 tid;
  128. std::set<si32> bid;
  129. si16 builded;
  130. template <typename Handler> void serialize(Handler &h, const int version)
  131. {
  132. h & tid & bid & builded;
  133. }
  134. };
  135. struct SetAvailableCreatures : public CPack<SetAvailableCreatures> //506
  136. {
  137. SetAvailableCreatures(){type = 506;};
  138. si32 tid;
  139. std::map<si32,ui32> creatures;
  140. template <typename Handler> void serialize(Handler &h, const int version)
  141. {
  142. h & tid & creatures;
  143. }
  144. };
  145. struct SetHeroesInTown : public CPack<SetHeroesInTown> //508
  146. {
  147. SetHeroesInTown(){type = 508;};
  148. si32 tid, visiting, garrison; //id of town, visiting hero, hero in garrison
  149. template <typename Handler> void serialize(Handler &h, const int version)
  150. {
  151. h & tid & visiting & garrison;
  152. }
  153. };
  154. struct SetHeroArtifacts : public CPack<SetHeroArtifacts> //509
  155. {
  156. SetHeroArtifacts(){type = 509;};
  157. si32 hid;
  158. std::vector<ui32> artifacts; //hero's artifacts from bag
  159. 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
  160. template <typename Handler> void serialize(Handler &h, const int version)
  161. {
  162. h & hid & artifacts & artifWorn;
  163. }
  164. };
  165. struct NewTurn : public CPack<NewTurn> //101
  166. {
  167. struct Hero
  168. {
  169. ui32 id, move, mana; //id is a general serial id
  170. template <typename Handler> void serialize(Handler &h, const int version)
  171. {
  172. h & id & move & mana;
  173. }
  174. bool operator<(const Hero&h)const{return id < h.id;}
  175. };
  176. std::set<Hero> heroes; //updates movement and mana points
  177. std::vector<SetResources> res;//resource list
  178. std::vector<SetAvailableCreatures> cres;//resource list
  179. ui32 day;
  180. bool resetBuilded;
  181. NewTurn(){type = 101;};
  182. template <typename Handler> void serialize(Handler &h, const int version)
  183. {
  184. h & heroes & cres & res & day & resetBuilded;
  185. }
  186. };
  187. //struct SetStrInfo : public CPack<SetStrInfo> //503
  188. //{
  189. // SetStrInfo(){type = 503;};
  190. // SetAvailableCreatures sac;
  191. //
  192. // template <typename Handler> void serialize(Handler &h, const int version)
  193. // {
  194. // h & sac;
  195. // }
  196. //};
  197. struct MetaString : public CPack<MetaString> //2001 helper for object scrips
  198. {
  199. std::vector<std::string> strings;
  200. 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
  201. std::vector<si32> message;
  202. std::vector<std::string> replacements;
  203. template <typename Handler> void serialize(Handler &h, const int version)
  204. {
  205. h & strings & texts & message & replacements;
  206. }
  207. MetaString& operator<<(const std::pair<ui8,ui32> &txt)
  208. {
  209. message.push_back(-((si32)texts.size())-1);
  210. texts.push_back(txt);
  211. return *this;
  212. }
  213. MetaString& operator<<(const std::string &txt)
  214. {
  215. message.push_back(strings.size()+1);
  216. strings.push_back(txt);
  217. return *this;
  218. }
  219. void clear()
  220. {
  221. strings.clear();
  222. texts.clear();
  223. message.clear();
  224. }
  225. MetaString(){type = 2001;};
  226. };
  227. struct Component : public CPack<Component> //2002 helper for object scrips informations
  228. {
  229. ui16 id, subtype; //ids: 0 - primskill; 1 - secskill; 2 - resource; 3 - creature; 4 - artifact; 5 - experience (sub==0 exp points; sub==1 levels)
  230. si32 val; // + give; - take
  231. si16 when; // 0 - now; +x - within x days; -x - per x days
  232. template <typename Handler> void serialize(Handler &h, const int version)
  233. {
  234. h & id & subtype & val & when;
  235. }
  236. Component(){type = 2002;};
  237. Component(ui16 Type, ui16 Subtype, si32 Val, si16 When):id(Type),subtype(Subtype),val(Val),when(When){type = 2002;};
  238. };
  239. struct InfoWindow : public CPack<InfoWindow> //103 - displays simple info window
  240. {
  241. MetaString text;
  242. std::vector<Component> components;
  243. ui8 player;
  244. template <typename Handler> void serialize(Handler &h, const int version)
  245. {
  246. h & text & components & player;
  247. }
  248. InfoWindow(){type = 103;};
  249. };
  250. struct SetObjectProperty : public CPack<SetObjectProperty>//1001
  251. {
  252. ui32 id;
  253. ui8 what; //1 - owner; 2 - blockvis
  254. ui32 val;
  255. SetObjectProperty(){type = 1001;};
  256. SetObjectProperty(ui32 ID, ui8 What, ui32 Val):id(ID),what(What),val(Val){type = 1001;};
  257. template <typename Handler> void serialize(Handler &h, const int version)
  258. {
  259. h & id & what & val;
  260. }
  261. };
  262. struct SetHoverName : public CPack<SetHoverName>//1002
  263. {
  264. ui32 id;
  265. MetaString name;
  266. SetHoverName(){type = 1002;};
  267. SetHoverName(ui32 ID, MetaString& Name):id(ID),name(Name){type = 1002;};
  268. template <typename Handler> void serialize(Handler &h, const int version)
  269. {
  270. h & id & name;
  271. }
  272. };
  273. struct HeroLevelUp : public Query<HeroLevelUp>//2000
  274. {
  275. si32 heroid;
  276. ui8 primskill, level;
  277. std::vector<ui16> skills;
  278. HeroLevelUp(){type = 2000;};
  279. template <typename Handler> void serialize(Handler &h, const int version)
  280. {
  281. h & id & heroid & primskill & level & skills;
  282. }
  283. };
  284. struct SelectionDialog : public Query<SelectionDialog>//2001
  285. {
  286. MetaString text;
  287. std::vector<Component> components;
  288. ui8 player;
  289. SelectionDialog(){type = 2001;};
  290. template <typename Handler> void serialize(Handler &h, const int version)
  291. {
  292. h & id & text & components & player;
  293. }
  294. };
  295. struct YesNoDialog : public Query<YesNoDialog>//2002
  296. {
  297. MetaString text;
  298. std::vector<Component> components;
  299. ui8 player;
  300. YesNoDialog(){type = 2002;};
  301. template <typename Handler> void serialize(Handler &h, const int version)
  302. {
  303. h & id & text & components & player;
  304. }
  305. };
  306. struct BattleInfo;
  307. struct BattleStart : public CPack<BattleStart>//3000
  308. {
  309. BattleInfo * info;
  310. BattleStart(){type = 3000;};
  311. template <typename Handler> void serialize(Handler &h, const int version)
  312. {
  313. h & info;
  314. }
  315. };
  316. struct BattleNextRound : public CPack<BattleNextRound>//3001
  317. {
  318. si32 round;
  319. BattleNextRound(){type = 3001;};
  320. template <typename Handler> void serialize(Handler &h, const int version)
  321. {
  322. h & round;
  323. }
  324. };
  325. struct BattleSetActiveStack : public CPack<BattleSetActiveStack>//3002
  326. {
  327. ui32 stack;
  328. BattleSetActiveStack(){type = 3002;};
  329. template <typename Handler> void serialize(Handler &h, const int version)
  330. {
  331. h & stack;
  332. }
  333. };
  334. struct BattleResult : public CPack<BattleResult>//3003
  335. {
  336. ui8 result; //0 - normal victory; 1 - escape; 2 - surrender
  337. ui8 winner; //0 - attacker, 1 - defender, [2 - draw (should be possible?)]
  338. std::set<std::pair<ui32,si32> > s1, s2; //first => casualties of attackers - set of pairs crid<>number
  339. ui32 exp[2]; //exp for attacker and defender
  340. std::set<ui32> artifacts; //artifacts taken from loser to winner
  341. BattleResult(){type = 3003;};
  342. template <typename Handler> void serialize(Handler &h, const int version)
  343. {
  344. h & result & winner & s1 & s2 & exp & artifacts;
  345. }
  346. };
  347. struct BattleStackMoved : public CPack<BattleStackMoved>//3004
  348. {
  349. ui32 stack, tile;
  350. ui8 flags; // 1 - start moving, 2 - end moving
  351. BattleStackMoved(){flags = 0; type = 3004;};
  352. bool startMoving()
  353. {
  354. return flags & 1;
  355. }
  356. bool endMoving()
  357. {
  358. return flags & 2;
  359. }
  360. template <typename Handler> void serialize(Handler &h, const int version)
  361. {
  362. h & stack & tile & flags;
  363. }
  364. };
  365. struct BattleStackAttacked : public CPack<BattleStackAttacked>//3005
  366. {
  367. ui32 stackAttacked;
  368. ui32 newAmount, newHP, killedAmount, damageAmount;
  369. ui8 flags; //1 - is stack killed
  370. BattleStackAttacked(){flags = 0; type = 3005;};
  371. bool killed() //if target stack was killed
  372. {
  373. return flags & 1;
  374. }
  375. template <typename Handler> void serialize(Handler &h, const int version)
  376. {
  377. h & stackAttacked & newAmount & newHP & flags & killedAmount & damageAmount;
  378. }
  379. };
  380. struct BattleAttack : public CPack<BattleAttack>//3006
  381. {
  382. BattleStackAttacked bsa;
  383. ui32 stackAttacking;
  384. ui8 flags;
  385. BattleAttack(){flags = 0; type = 3006;};
  386. bool shot()//distance attack - decrease number of shots
  387. {
  388. return flags & 1;
  389. }
  390. bool killed() //if target stack was killed
  391. {
  392. return bsa.killed();
  393. }
  394. template <typename Handler> void serialize(Handler &h, const int version)
  395. {
  396. h & bsa & stackAttacking & flags;
  397. }
  398. };
  399. struct ShowInInfobox : public CPack<ShowInInfobox> //107
  400. {
  401. ShowInInfobox(){type = 107;};
  402. ui8 player;
  403. Component c;
  404. MetaString text;
  405. template <typename Handler> void serialize(Handler &h, const int version)
  406. {
  407. h & player & c & text;
  408. }
  409. };