CCreatureHandler.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. #include "stdafx.h"
  2. #include "../CGameInfo.h"
  3. #include "CCreatureHandler.h"
  4. #include "CLodHandler.h"
  5. #include <sstream>
  6. #include <boost/assign/std/vector.hpp>
  7. #include <boost/algorithm/string.hpp>
  8. #include <boost/algorithm/string/replace.hpp>
  9. void CCreatureHandler::loadCreatures()
  10. {
  11. std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("ZCRTRAIT.TXT");
  12. int andame = buf.size();
  13. int i=0; //buf iterator
  14. int hmcr=0;
  15. for(i; i<andame; ++i)
  16. {
  17. if(buf[i]=='\r')
  18. ++hmcr;
  19. if(hmcr==2)
  20. break;
  21. }
  22. i+=2;
  23. while(i<buf.size())
  24. {
  25. //if(creatures.size()>190 && buf.substr(i, buf.size()-i).find('\r')==std::string::npos)
  26. //{
  27. // loadAnimationInfo();
  28. // loadUnitAnimations();
  29. // break;
  30. //}
  31. CCreature ncre;
  32. int befi=i;
  33. for(i; i<andame; ++i)
  34. {
  35. if(buf[i]=='\t')
  36. break;
  37. }
  38. ncre.nameSing = buf.substr(befi, i-befi);
  39. ++i;
  40. befi=i;
  41. for(i; i<andame; ++i)
  42. {
  43. if(buf[i]=='\t')
  44. break;
  45. }
  46. ncre.namePl = buf.substr(befi, i-befi);
  47. ++i;
  48. befi=i;
  49. for(i; i<andame; ++i)
  50. {
  51. if(buf[i]=='\t')
  52. break;
  53. }
  54. ncre.wood = atoi(buf.substr(befi, i-befi).c_str());
  55. ++i;
  56. befi=i;
  57. for(i; i<andame; ++i)
  58. {
  59. if(buf[i]=='\t')
  60. break;
  61. }
  62. ncre.mercury = atoi(buf.substr(befi, i-befi).c_str());
  63. ++i;
  64. befi=i;
  65. for(i; i<andame; ++i)
  66. {
  67. if(buf[i]=='\t')
  68. break;
  69. }
  70. ncre.ore = atoi(buf.substr(befi, i-befi).c_str());
  71. ++i;
  72. befi=i;
  73. for(i; i<andame; ++i)
  74. {
  75. if(buf[i]=='\t')
  76. break;
  77. }
  78. ncre.sulfur = atoi(buf.substr(befi, i-befi).c_str());
  79. ++i;
  80. befi=i;
  81. for(i; i<andame; ++i)
  82. {
  83. if(buf[i]=='\t')
  84. break;
  85. }
  86. ncre.crystal = atoi(buf.substr(befi, i-befi).c_str());
  87. ++i;
  88. befi=i;
  89. for(i; i<andame; ++i)
  90. {
  91. if(buf[i]=='\t')
  92. break;
  93. }
  94. ncre.gems = atoi(buf.substr(befi, i-befi).c_str());
  95. ++i;
  96. befi=i;
  97. for(i; i<andame; ++i)
  98. {
  99. if(buf[i]=='\t')
  100. break;
  101. }
  102. ncre.gold = atoi(buf.substr(befi, i-befi).c_str());
  103. ++i;
  104. befi=i;
  105. for(i; i<andame; ++i)
  106. {
  107. if(buf[i]=='\t')
  108. break;
  109. }
  110. ncre.fightValue = atoi(buf.substr(befi, i-befi).c_str());
  111. ++i;
  112. befi=i;
  113. for(i; i<andame; ++i)
  114. {
  115. if(buf[i]=='\t')
  116. break;
  117. }
  118. ncre.AIValue = atoi(buf.substr(befi, i-befi).c_str());
  119. ++i;
  120. befi=i;
  121. for(i; i<andame; ++i)
  122. {
  123. if(buf[i]=='\t')
  124. break;
  125. }
  126. ncre.growth = atoi(buf.substr(befi, i-befi).c_str());
  127. ++i;
  128. befi=i;
  129. for(i; i<andame; ++i)
  130. {
  131. if(buf[i]=='\t')
  132. break;
  133. }
  134. ncre.hordeGrowth = atoi(buf.substr(befi, i-befi).c_str());
  135. ++i;
  136. befi=i;
  137. for(i; i<andame; ++i)
  138. {
  139. if(buf[i]=='\t')
  140. break;
  141. }
  142. ncre.hitPoints = atoi(buf.substr(befi, i-befi).c_str());
  143. ++i;
  144. befi=i;
  145. for(i; i<andame; ++i)
  146. {
  147. if(buf[i]=='\t')
  148. break;
  149. }
  150. ncre.speed = atoi(buf.substr(befi, i-befi).c_str());
  151. ++i;
  152. befi=i;
  153. for(i; i<andame; ++i)
  154. {
  155. if(buf[i]=='\t')
  156. break;
  157. }
  158. ncre.attack = atoi(buf.substr(befi, i-befi).c_str());
  159. ++i;
  160. befi=i;
  161. for(i; i<andame; ++i)
  162. {
  163. if(buf[i]=='\t')
  164. break;
  165. }
  166. ncre.defence = atoi(buf.substr(befi, i-befi).c_str());
  167. ++i;
  168. befi=i;
  169. for(i; i<andame; ++i)
  170. {
  171. if(buf[i]=='\t')
  172. break;
  173. }
  174. ncre.low1 = atoi(buf.substr(befi, i-befi).c_str());
  175. ++i;
  176. befi=i;
  177. for(i; i<andame; ++i)
  178. {
  179. if(buf[i]=='\t')
  180. break;
  181. }
  182. ncre.high1 = atoi(buf.substr(befi, i-befi).c_str());
  183. ++i;
  184. befi=i;
  185. for(i; i<andame; ++i)
  186. {
  187. if(buf[i]=='\t')
  188. break;
  189. }
  190. ncre.shots = atoi(buf.substr(befi, i-befi).c_str());
  191. ++i;
  192. befi=i;
  193. for(i; i<andame; ++i)
  194. {
  195. if(buf[i]=='\t')
  196. break;
  197. }
  198. ncre.spells = atoi(buf.substr(befi, i-befi).c_str());
  199. ++i;
  200. befi=i;
  201. for(i; i<andame; ++i)
  202. {
  203. if(buf[i]=='\t')
  204. break;
  205. }
  206. ncre.low2 = atoi(buf.substr(befi, i-befi).c_str());
  207. ++i;
  208. befi=i;
  209. for(i; i<andame; ++i)
  210. {
  211. if(buf[i]=='\t')
  212. break;
  213. }
  214. ncre.high2 = atoi(buf.substr(befi, i-befi).c_str());
  215. ++i;
  216. befi=i;
  217. for(i; i<andame; ++i)
  218. {
  219. if(buf[i]=='\t')
  220. break;
  221. }
  222. ncre.abilityText = buf.substr(befi, i-befi);
  223. ++i;
  224. befi=i;
  225. for(i; i<andame; ++i)
  226. {
  227. if(buf[i]=='\r')
  228. break;
  229. }
  230. ncre.abilityRefs = buf.substr(befi, i-befi);
  231. i+=2;
  232. if(ncre.nameSing!=std::string("") && ncre.namePl!=std::string(""))
  233. {
  234. ncre.idNumber = creatures.size();
  235. ncre.isDefinite = true;
  236. creatures.push_back(ncre);
  237. }
  238. }
  239. for(int bb=1; bb<8; ++bb)
  240. {
  241. CCreature ncre;
  242. ncre.isDefinite = false;
  243. ncre.indefLevel = bb;
  244. ncre.indefUpgraded = false;
  245. creatures.push_back(ncre);
  246. ncre.indefUpgraded = true;
  247. creatures.push_back(ncre);
  248. }
  249. //loading reference names
  250. std::ifstream ifs("config/crerefnam.txt");
  251. int tempi;
  252. std::string temps;
  253. for (;;)
  254. {
  255. ifs >> tempi >> temps;
  256. if (tempi>=creatures.size())
  257. break;
  258. boost::assign::insert(nameToID)(temps,tempi);
  259. creatures[tempi].nameRef=temps;
  260. }
  261. ifs.close();
  262. //loading 32x32px imgs
  263. CDefHandler *smi = CGI->spriteh->giveDef("CPRSMALL.DEF");
  264. smi->notFreeImgs = true;
  265. for (int i=0; i<smi->ourImages.size(); i++)
  266. {
  267. boost::assign::insert(smallImgs)(i-2,smi->ourImages[i].bitmap);
  268. }
  269. delete smi;
  270. }
  271. void CCreatureHandler::loadAnimationInfo()
  272. {
  273. //std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("CRANIM.TXT");
  274. //int andame = buf.size();
  275. //int i=0; //buf iterator
  276. //hmcr=0;
  277. //for(i; i<andame; ++i)
  278. //{
  279. // if(buf[i]=='\r')
  280. // ++hmcr;
  281. // if(hmcr==2)
  282. // break;
  283. //}
  284. //i+=2;
  285. //for(int dd=0; dd<creatures.size(); ++dd)
  286. //{
  287. // loadUnitAnimInfo(creatures[dd], buf, i);
  288. //}
  289. return;
  290. }
  291. void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, std::string & src, int & i)
  292. {
  293. int befi=i;
  294. for(i; i<src.size(); ++i)
  295. {
  296. if(src[i]=='\t')
  297. break;
  298. }
  299. unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
  300. ++i;
  301. while(unit.timeBetweenFidgets == 0.0)
  302. {
  303. for(i; i<src.size(); ++i)
  304. {
  305. if(src[i]=='\r')
  306. break;
  307. }
  308. i+=2;
  309. befi=i;
  310. for(i; i<src.size(); ++i)
  311. {
  312. if(src[i]=='\t')
  313. break;
  314. }
  315. unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
  316. ++i;
  317. }
  318. befi=i;
  319. for(i; i<src.size(); ++i)
  320. {
  321. if(src[i]=='\t')
  322. break;
  323. }
  324. unit.walkAnimationTime = atof(src.substr(befi, i-befi).c_str());
  325. ++i;
  326. befi=i;
  327. for(i; i<src.size(); ++i)
  328. {
  329. if(src[i]=='\t')
  330. break;
  331. }
  332. unit.attackAnimationTime = atof(src.substr(befi, i-befi).c_str());
  333. ++i;
  334. befi=i;
  335. for(i; i<src.size(); ++i)
  336. {
  337. if(src[i]=='\t')
  338. break;
  339. }
  340. unit.flightAnimationDistance = atof(src.substr(befi, i-befi).c_str());
  341. ++i;
  342. ///////////////////////
  343. befi=i;
  344. for(i; i<src.size(); ++i)
  345. {
  346. if(src[i]=='\t')
  347. break;
  348. }
  349. unit.upperRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  350. ++i;
  351. befi=i;
  352. for(i; i<src.size(); ++i)
  353. {
  354. if(src[i]=='\t')
  355. break;
  356. }
  357. unit.upperRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  358. ++i;
  359. befi=i;
  360. for(i; i<src.size(); ++i)
  361. {
  362. if(src[i]=='\t')
  363. break;
  364. }
  365. unit.rightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  366. ++i;
  367. befi=i;
  368. for(i; i<src.size(); ++i)
  369. {
  370. if(src[i]=='\t')
  371. break;
  372. }
  373. unit.rightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  374. ++i;
  375. befi=i;
  376. for(i; i<src.size(); ++i)
  377. {
  378. if(src[i]=='\t')
  379. break;
  380. }
  381. unit.lowerRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  382. ++i;
  383. befi=i;
  384. for(i; i<src.size(); ++i)
  385. {
  386. if(src[i]=='\t')
  387. break;
  388. }
  389. unit.lowerRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  390. ++i;
  391. ///////////////////////
  392. for(int jjj=0; jjj<12; ++jjj)
  393. {
  394. befi=i;
  395. for(i; i<src.size(); ++i)
  396. {
  397. if(src[i]=='\t')
  398. break;
  399. }
  400. unit.missleFrameAngles[jjj] = atof(src.substr(befi, i-befi).c_str());
  401. ++i;
  402. }
  403. befi=i;
  404. for(i; i<src.size(); ++i)
  405. {
  406. if(src[i]=='\t')
  407. break;
  408. }
  409. unit.troopCountLocationOffset= atoi(src.substr(befi, i-befi).c_str());
  410. ++i;
  411. befi=i;
  412. for(i; i<src.size(); ++i)
  413. {
  414. if(src[i]=='\t')
  415. break;
  416. }
  417. unit.attackClimaxFrame = atoi(src.substr(befi, i-befi).c_str());
  418. ++i;
  419. for(i; i<src.size(); ++i)
  420. {
  421. if(src[i]=='\r')
  422. break;
  423. }
  424. i+=2;
  425. }
  426. void CCreatureHandler::loadUnitAnimations()
  427. {
  428. std::ifstream inp("config/CREDEFS.TXT", std::ios::in | std::ios::binary); //this file is not in lod
  429. inp.seekg(0,std::ios::end); // na koniec
  430. int andame = inp.tellg(); // read length
  431. inp.seekg(0,std::ios::beg); // wracamy na poczatek
  432. char * bufor = new char[andame]; // allocate memory
  433. inp.read((char*)bufor, andame); // read map file to buffer
  434. inp.close();
  435. std::string buf = std::string(bufor);
  436. delete [andame] bufor;
  437. int i = 0; //buf iterator
  438. int hmcr = 0;
  439. for(i; i<andame; ++i) //omitting rubbish
  440. {
  441. if(buf[i]=='\r')
  442. break;
  443. }
  444. i+=2;
  445. for(int s=0; s<creatures.size(); ++s)
  446. {
  447. int befi=i;
  448. std::string rub;
  449. for(i; i<andame; ++i)
  450. {
  451. if(buf[i]==' ')
  452. break;
  453. }
  454. rub = buf.substr(befi, i-befi);
  455. ++i;
  456. befi=i;
  457. for(i; i<andame; ++i)
  458. {
  459. if(buf[i]=='\r')
  460. break;
  461. }
  462. std::string defName = buf.substr(befi, i-befi);
  463. if(defName != std::string("x"))
  464. creatures[s].battleAnimation = CGameInfo::mainObj->spriteh->giveDef(defName);
  465. else
  466. creatures[s].battleAnimation = NULL;
  467. i+=2;
  468. }
  469. }