CHeroHandler.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. #include "stdafx.h"
  2. #include "CHeroHandler.h"
  3. #include "CGameInfo.h"
  4. void CHeroHandler::loadHeroes()
  5. {
  6. int ID=0;
  7. std::ifstream inp("H3bitmap.lod\\HOTRAITS.TXT", std::ios::in);
  8. std::string dump;
  9. for(int i=0; i<25; ++i)
  10. {
  11. inp>>dump;
  12. }
  13. inp.ignore();
  14. while(!inp.eof())
  15. {
  16. CHero nher;
  17. std::string base;
  18. char * tab = new char[500];
  19. int iit = 0;
  20. inp.getline(tab, 500);
  21. base = std::string(tab);
  22. if(base.size()<2) //ended, but some rubbish could still stay end we have something useless
  23. {
  24. loadSpecialAbilities();
  25. loadBiographies();
  26. loadHeroClasses();
  27. inp.close();
  28. return;
  29. }
  30. while(base[iit]!='\t')
  31. {
  32. ++iit;
  33. }
  34. nher.name = base.substr(0, iit);
  35. ++iit;
  36. for(int i=iit; i<iit+100; ++i)
  37. {
  38. if(base[i]==(char)(10) || base[i]==(char)(9))
  39. {
  40. nher.low1stack = atoi(base.substr(iit, i).c_str());
  41. iit=i+1;
  42. break;
  43. }
  44. }
  45. for(int i=iit; i<iit+100; ++i)
  46. {
  47. if(base[i]==(char)(10) || base[i]==(char)(9))
  48. {
  49. nher.high1stack = atoi(base.substr(iit, i).c_str());
  50. iit=i+1;
  51. break;
  52. }
  53. }
  54. int ipom=iit;
  55. while(base[ipom]!='\t')
  56. {
  57. ++ipom;
  58. }
  59. nher.refType1stack = base.substr(iit, ipom-iit);
  60. iit=ipom+1;
  61. for(int i=iit; i<iit+100; ++i)
  62. {
  63. if(base[i]==(char)(10) || base[i]==(char)(9))
  64. {
  65. nher.low2stack = atoi(base.substr(iit, i-iit).c_str());
  66. iit=i+1;
  67. break;
  68. }
  69. }
  70. for(int i=iit; i<iit+100; ++i)
  71. {
  72. if(base[i]==(char)(10) || base[i]==(char)(9))
  73. {
  74. nher.high2stack = atoi(base.substr(iit, i-iit).c_str());
  75. iit=i+1;
  76. break;
  77. }
  78. }
  79. ipom=iit;
  80. while(base[ipom]!='\t')
  81. {
  82. ++ipom;
  83. }
  84. nher.refType2stack = base.substr(iit, ipom-iit);
  85. iit=ipom+1;
  86. for(int i=iit; i<iit+100; ++i)
  87. {
  88. if(base[i]==(char)(10) || base[i]==(char)(9))
  89. {
  90. nher.low3stack = atoi(base.substr(iit, i-iit).c_str());
  91. iit=i+1;
  92. break;
  93. }
  94. }
  95. for(int i=iit; i<iit+100; ++i)
  96. {
  97. if(base[i]==(char)(10) || base[i]==(char)(9))
  98. {
  99. nher.high3stack = atoi(base.substr(iit, i-iit).c_str());
  100. iit=i+1;
  101. break;
  102. }
  103. }
  104. nher.refType3stack = base.substr(iit, base.size()-iit);
  105. nher.ID=ID++;
  106. heroes.push_back(nher);
  107. delete[500] tab;
  108. }
  109. loadSpecialAbilities();
  110. }
  111. void CHeroHandler::loadSpecialAbilities()
  112. {
  113. std::ifstream inp("H3bitmap.lod\\HEROSPEC.txt", std::ios::in);
  114. std::string dump;
  115. for(int i=0; i<7; ++i)
  116. {
  117. inp>>dump;
  118. }
  119. inp.ignore();
  120. int whHero=0;
  121. while(!inp.eof() && whHero<heroes.size())
  122. {
  123. std::string base;
  124. char * tab = new char[500];
  125. int iitBef = 0;
  126. int iit = 0;
  127. inp.getline(tab, 500);
  128. base = std::string(tab);
  129. if(base.size()<2) //ended, but some rubbish could still stay end we have something useless
  130. {
  131. inp.close();
  132. return; //add counter
  133. }
  134. while(base[iit]!='\t')
  135. {
  136. ++iit;
  137. }
  138. heroes[whHero].bonusName = base.substr(0, iit);
  139. ++iit;
  140. iitBef=iit;
  141. if(heroes[whHero].bonusName == std::string("Ogry"))
  142. {
  143. char * tab2 = new char[500];
  144. inp.getline(tab2, 500);
  145. base += std::string(tab2);
  146. delete [500] tab2;
  147. }
  148. while(base[iit]!='\t')
  149. {
  150. ++iit;
  151. }
  152. heroes[whHero].shortBonus = base.substr(iitBef, iit-iitBef);
  153. ++iit;
  154. iitBef=iit;
  155. while(base[iit]!='\t' && iit<base.size())
  156. {
  157. ++iit;
  158. }
  159. heroes[whHero].longBonus = base.substr(iitBef, iit-iitBef);
  160. ++whHero;
  161. delete [500] tab;
  162. }
  163. inp.close();
  164. }
  165. void CHeroHandler::loadBiographies()
  166. {
  167. std::ifstream inp("H3bitmap.lod\\HEROBIOS.TXT", std::ios::in | std::ios::binary);
  168. inp.seekg(0,std::ios::end); // na koniec
  169. int andame = inp.tellg(); // read length
  170. inp.seekg(0,std::ios::beg); // wracamy na poczatek
  171. char * bufor = new char[andame]; // allocate memory
  172. inp.read((char*)bufor, andame); // read map file to buffer
  173. inp.close();
  174. std::string buf = std::string(bufor);
  175. delete [andame] bufor;
  176. int i = 0; //buf iterator
  177. for(int q=0; q<heroes.size(); ++q)
  178. {
  179. int befi=i;
  180. for(i; i<andame; ++i)
  181. {
  182. if(buf[i]=='\r')
  183. break;
  184. }
  185. heroes[q].biography = buf.substr(befi, i-befi);
  186. i+=2;
  187. }
  188. }
  189. void CHeroHandler::loadHeroClasses()
  190. {
  191. std::ifstream inp("H3bitmap.lod\\HCTRAITS.TXT", std::ios::in | std::ios::binary);
  192. inp.seekg(0,std::ios::end); // na koniec
  193. int andame = inp.tellg(); // read length
  194. inp.seekg(0,std::ios::beg); // wracamy na poczatek
  195. char * bufor = new char[andame]; // allocate memory
  196. inp.read((char*)bufor, andame); // read map file to buffer
  197. inp.close();
  198. std::string buf = std::string(bufor);
  199. delete [andame] bufor;
  200. int i = 0; //buf iterator
  201. int hmcr = 0;
  202. for(i; i<andame; ++i) //omitting rubbish
  203. {
  204. if(buf[i]=='\r')
  205. ++hmcr;
  206. if(hmcr==2)
  207. break;
  208. }
  209. i+=2;
  210. for(int ss=0; ss<18; ++ss) //18 classes of hero (including conflux)
  211. {
  212. CHeroClass * hc = new CHeroClass;
  213. int befi=i;
  214. for(i; i<andame; ++i)
  215. {
  216. if(buf[i]=='\t')
  217. break;
  218. }
  219. hc->name = buf.substr(befi, i-befi);
  220. ++i;
  221. befi=i;
  222. for(i; i<andame; ++i)
  223. {
  224. if(buf[i]=='\t')
  225. break;
  226. }
  227. hc->aggression = atof(buf.substr(befi, i-befi).c_str());
  228. ++i;
  229. befi=i;
  230. for(i; i<andame; ++i)
  231. {
  232. if(buf[i]=='\t')
  233. break;
  234. }
  235. hc->initialAttack = atoi(buf.substr(befi, i-befi).c_str());
  236. ++i;
  237. befi=i;
  238. for(i; i<andame; ++i)
  239. {
  240. if(buf[i]=='\t')
  241. break;
  242. }
  243. hc->initialDefence = atoi(buf.substr(befi, i-befi).c_str());
  244. ++i;
  245. befi=i;
  246. for(i; i<andame; ++i)
  247. {
  248. if(buf[i]=='\t')
  249. break;
  250. }
  251. hc->initialPower = atoi(buf.substr(befi, i-befi).c_str());
  252. ++i;
  253. befi=i;
  254. for(i; i<andame; ++i)
  255. {
  256. if(buf[i]=='\t')
  257. break;
  258. }
  259. hc->initialKnowledge = atoi(buf.substr(befi, i-befi).c_str());
  260. ++i;
  261. befi=i;
  262. for(i; i<andame; ++i)
  263. {
  264. if(buf[i]=='\t')
  265. break;
  266. }
  267. hc->proAttack[0] = atoi(buf.substr(befi, i-befi).c_str());
  268. ++i;
  269. befi=i;
  270. for(i; i<andame; ++i)
  271. {
  272. if(buf[i]=='\t')
  273. break;
  274. }
  275. hc->proDefence[0] = atoi(buf.substr(befi, i-befi).c_str());
  276. ++i;
  277. befi=i;
  278. for(i; i<andame; ++i)
  279. {
  280. if(buf[i]=='\t')
  281. break;
  282. }
  283. hc->proPower[0] = atoi(buf.substr(befi, i-befi).c_str());
  284. ++i;
  285. befi=i;
  286. for(i; i<andame; ++i)
  287. {
  288. if(buf[i]=='\t')
  289. break;
  290. }
  291. hc->proKnowledge[0] = atoi(buf.substr(befi, i-befi).c_str());
  292. ++i;
  293. befi=i;
  294. for(i; i<andame; ++i)
  295. {
  296. if(buf[i]=='\t')
  297. break;
  298. }
  299. hc->proAttack[1] = atoi(buf.substr(befi, i-befi).c_str());
  300. ++i;
  301. befi=i;
  302. for(i; i<andame; ++i)
  303. {
  304. if(buf[i]=='\t')
  305. break;
  306. }
  307. hc->proDefence[1] = atoi(buf.substr(befi, i-befi).c_str());
  308. ++i;
  309. befi=i;
  310. for(i; i<andame; ++i)
  311. {
  312. if(buf[i]=='\t')
  313. break;
  314. }
  315. hc->proPower[1] = atoi(buf.substr(befi, i-befi).c_str());
  316. ++i;
  317. befi=i;
  318. for(i; i<andame; ++i)
  319. {
  320. if(buf[i]=='\t')
  321. break;
  322. }
  323. hc->proKnowledge[1] = atoi(buf.substr(befi, i-befi).c_str());
  324. ++i;
  325. CHero kkk = heroes[0];
  326. for(int dd=0; dd<CGameInfo::mainObj->abilh->abilities.size(); ++dd)
  327. {
  328. befi=i;
  329. for(i; i<andame; ++i)
  330. {
  331. if(buf[i]=='\t')
  332. break;
  333. }
  334. int buff = atoi(buf.substr(befi, i-befi).c_str());
  335. ++i;
  336. hc->proSec.push_back(buff);
  337. }
  338. for(int dd=0; dd<9; ++dd)
  339. {
  340. befi=i;
  341. for(i; i<andame; ++i)
  342. {
  343. if(buf[i]=='\t' || buf[i]=='\r')
  344. break;
  345. }
  346. hc->selectionProbability[dd] = atoi(buf.substr(befi, i-befi).c_str());
  347. ++i;
  348. }
  349. ++i;
  350. heroClasses.push_back(hc);
  351. }
  352. }