NetPacks.h 9.9 KB

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