CHeroHandler.cpp 7.3 KB

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