NetPacks.h 9.3 KB

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