CHeroHandler.cpp 8.5 KB

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