CCreatureHandler.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  1. #include "../stdafx.h"
  2. #include "../CGameInfo.h"
  3. #include "CDefHandler.h"
  4. #include "CCreatureHandler.h"
  5. #include "CLodHandler.h"
  6. #include <sstream>
  7. #include <boost/assign/std/vector.hpp>
  8. #include <boost/algorithm/string.hpp>
  9. #include <boost/algorithm/string/replace.hpp>
  10. int CCreature::getQuantityID(int quantity)
  11. {
  12. if (quantity<5)
  13. return 0;
  14. if (quantity<10)
  15. return 1;
  16. if (quantity<20)
  17. return 2;
  18. if (quantity<50)
  19. return 3;
  20. if (quantity<100)
  21. return 4;
  22. if (quantity<250)
  23. return 5;
  24. if (quantity<500)
  25. return 5;
  26. if (quantity<1000)
  27. return 6;
  28. if (quantity<4000)
  29. return 7;
  30. return 8;
  31. }
  32. void CCreatureHandler::loadCreatures()
  33. {
  34. std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("ZCRTRAIT.TXT");
  35. int andame = buf.size();
  36. int i=0; //buf iterator
  37. int hmcr=0;
  38. for(i; i<andame; ++i)
  39. {
  40. if(buf[i]=='\r')
  41. ++hmcr;
  42. if(hmcr==2)
  43. break;
  44. }
  45. i+=2;
  46. while(i<buf.size())
  47. {
  48. CCreature ncre;
  49. ncre.level=0;
  50. int befi=i;
  51. for(i; i<andame; ++i)
  52. {
  53. if(buf[i]=='\t')
  54. break;
  55. }
  56. ncre.nameSing = buf.substr(befi, i-befi);
  57. ++i;
  58. befi=i;
  59. for(i; i<andame; ++i)
  60. {
  61. if(buf[i]=='\t')
  62. break;
  63. }
  64. ncre.namePl = buf.substr(befi, i-befi);
  65. ++i;
  66. befi=i;
  67. for(i; i<andame; ++i)
  68. {
  69. if(buf[i]=='\t')
  70. break;
  71. }
  72. ncre.wood = atoi(buf.substr(befi, i-befi).c_str());
  73. ++i;
  74. befi=i;
  75. for(i; i<andame; ++i)
  76. {
  77. if(buf[i]=='\t')
  78. break;
  79. }
  80. ncre.mercury = atoi(buf.substr(befi, i-befi).c_str());
  81. ++i;
  82. befi=i;
  83. for(i; i<andame; ++i)
  84. {
  85. if(buf[i]=='\t')
  86. break;
  87. }
  88. ncre.ore = atoi(buf.substr(befi, i-befi).c_str());
  89. ++i;
  90. befi=i;
  91. for(i; i<andame; ++i)
  92. {
  93. if(buf[i]=='\t')
  94. break;
  95. }
  96. ncre.sulfur = atoi(buf.substr(befi, i-befi).c_str());
  97. ++i;
  98. befi=i;
  99. for(i; i<andame; ++i)
  100. {
  101. if(buf[i]=='\t')
  102. break;
  103. }
  104. ncre.crystal = atoi(buf.substr(befi, i-befi).c_str());
  105. ++i;
  106. befi=i;
  107. for(i; i<andame; ++i)
  108. {
  109. if(buf[i]=='\t')
  110. break;
  111. }
  112. ncre.gems = atoi(buf.substr(befi, i-befi).c_str());
  113. ++i;
  114. befi=i;
  115. for(i; i<andame; ++i)
  116. {
  117. if(buf[i]=='\t')
  118. break;
  119. }
  120. ncre.gold = atoi(buf.substr(befi, i-befi).c_str());
  121. ++i;
  122. befi=i;
  123. for(i; i<andame; ++i)
  124. {
  125. if(buf[i]=='\t')
  126. break;
  127. }
  128. ncre.fightValue = atoi(buf.substr(befi, i-befi).c_str());
  129. ++i;
  130. befi=i;
  131. for(i; i<andame; ++i)
  132. {
  133. if(buf[i]=='\t')
  134. break;
  135. }
  136. ncre.AIValue = atoi(buf.substr(befi, i-befi).c_str());
  137. ++i;
  138. befi=i;
  139. for(i; i<andame; ++i)
  140. {
  141. if(buf[i]=='\t')
  142. break;
  143. }
  144. ncre.growth = atoi(buf.substr(befi, i-befi).c_str());
  145. ++i;
  146. befi=i;
  147. for(i; i<andame; ++i)
  148. {
  149. if(buf[i]=='\t')
  150. break;
  151. }
  152. ncre.hordeGrowth = atoi(buf.substr(befi, i-befi).c_str());
  153. ++i;
  154. befi=i;
  155. for(i; i<andame; ++i)
  156. {
  157. if(buf[i]=='\t')
  158. break;
  159. }
  160. ncre.hitPoints = atoi(buf.substr(befi, i-befi).c_str());
  161. ++i;
  162. befi=i;
  163. for(i; i<andame; ++i)
  164. {
  165. if(buf[i]=='\t')
  166. break;
  167. }
  168. ncre.speed = atoi(buf.substr(befi, i-befi).c_str());
  169. ++i;
  170. befi=i;
  171. for(i; i<andame; ++i)
  172. {
  173. if(buf[i]=='\t')
  174. break;
  175. }
  176. ncre.attack = atoi(buf.substr(befi, i-befi).c_str());
  177. ++i;
  178. befi=i;
  179. for(i; i<andame; ++i)
  180. {
  181. if(buf[i]=='\t')
  182. break;
  183. }
  184. ncre.defence = atoi(buf.substr(befi, i-befi).c_str());
  185. ++i;
  186. befi=i;
  187. for(i; i<andame; ++i)
  188. {
  189. if(buf[i]=='\t')
  190. break;
  191. }
  192. ncre.low1 = atoi(buf.substr(befi, i-befi).c_str());
  193. ++i;
  194. befi=i;
  195. for(i; i<andame; ++i)
  196. {
  197. if(buf[i]=='\t')
  198. break;
  199. }
  200. ncre.high1 = atoi(buf.substr(befi, i-befi).c_str());
  201. ++i;
  202. befi=i;
  203. for(i; i<andame; ++i)
  204. {
  205. if(buf[i]=='\t')
  206. break;
  207. }
  208. ncre.shots = atoi(buf.substr(befi, i-befi).c_str());
  209. ++i;
  210. befi=i;
  211. for(i; i<andame; ++i)
  212. {
  213. if(buf[i]=='\t')
  214. break;
  215. }
  216. ncre.spells = atoi(buf.substr(befi, i-befi).c_str());
  217. ++i;
  218. befi=i;
  219. for(i; i<andame; ++i)
  220. {
  221. if(buf[i]=='\t')
  222. break;
  223. }
  224. ncre.low2 = atoi(buf.substr(befi, i-befi).c_str());
  225. ++i;
  226. befi=i;
  227. for(i; i<andame; ++i)
  228. {
  229. if(buf[i]=='\t')
  230. break;
  231. }
  232. ncre.high2 = atoi(buf.substr(befi, i-befi).c_str());
  233. ++i;
  234. befi=i;
  235. for(i; i<andame; ++i)
  236. {
  237. if(buf[i]=='\t')
  238. break;
  239. }
  240. ncre.abilityText = buf.substr(befi, i-befi);
  241. ++i;
  242. befi=i;
  243. for(i; i<andame; ++i)
  244. {
  245. if(buf[i]=='\r')
  246. break;
  247. }
  248. ncre.abilityRefs = buf.substr(befi, i-befi);
  249. i+=2;
  250. if(ncre.nameSing!=std::string("") && ncre.namePl!=std::string(""))
  251. {
  252. ncre.idNumber = creatures.size();
  253. ncre.isDefinite = true;
  254. creatures.push_back(ncre);
  255. }
  256. }
  257. for(int bb=1; bb<8; ++bb)
  258. {
  259. CCreature ncre;
  260. ncre.isDefinite = false;
  261. ncre.indefLevel = bb;
  262. ncre.indefUpgraded = false;
  263. creatures.push_back(ncre);
  264. ncre.indefUpgraded = true;
  265. creatures.push_back(ncre);
  266. }
  267. //loading reference names
  268. std::ifstream ifs("config/crerefnam.txt");
  269. int tempi;
  270. std::string temps;
  271. for (;;)
  272. {
  273. ifs >> tempi >> temps;
  274. if (tempi>=creatures.size())
  275. break;
  276. boost::assign::insert(nameToID)(temps,tempi);
  277. creatures[tempi].nameRef=temps;
  278. }
  279. ifs.close();
  280. ifs.clear();
  281. for(int i=1;i<=10;i++)
  282. levelCreatures.insert(std::pair<int,std::vector<CCreature*> >(i,std::vector<CCreature*>()));
  283. ifs.open("config/monsters.txt");
  284. {
  285. while(!ifs.eof())
  286. {
  287. int id, lvl;
  288. ifs >> id >> lvl;
  289. if(lvl>0)
  290. {
  291. creatures[id].level = lvl;
  292. levelCreatures[lvl].push_back(&(creatures[id]));
  293. }
  294. }
  295. }
  296. //loading 32x32px imgs
  297. CDefHandler *smi = CGI->spriteh->giveDef("CPRSMALL.DEF");
  298. smi->notFreeImgs = true;
  299. for (int i=0; i<smi->ourImages.size(); i++)
  300. {
  301. boost::assign::insert(smallImgs)(i-2,smi->ourImages[i].bitmap);
  302. }
  303. delete smi;
  304. smi = CGI->spriteh->giveDef("TWCRPORT.DEF");
  305. smi->notFreeImgs = true;
  306. for (int i=0; i<smi->ourImages.size(); i++)
  307. {
  308. boost::assign::insert(bigImgs)(i-2,smi->ourImages[i].bitmap);
  309. }
  310. delete smi;
  311. //
  312. //loading unit animation def names
  313. std::ifstream inp("config/CREDEFS.TXT", std::ios::in | std::ios::binary); //this file is not in lod
  314. inp.seekg(0,std::ios::end); // na koniec
  315. int andame2 = inp.tellg(); // read length
  316. inp.seekg(0,std::ios::beg); // wracamy na poczatek
  317. char * bufor = new char[andame2]; // allocate memory
  318. inp.read((char*)bufor, andame2); // read map file to buffer
  319. inp.close();
  320. buf = std::string(bufor);
  321. delete [andame2] bufor;
  322. i = 0; //buf iterator
  323. hmcr = 0;
  324. for(i; i<andame2; ++i) //omitting rubbish
  325. {
  326. if(buf[i]=='\r')
  327. break;
  328. }
  329. i+=2;
  330. for(int s=0; s<creatures.size()-16; ++s)
  331. {
  332. int befi=i;
  333. std::string rub;
  334. for(i; i<andame2; ++i)
  335. {
  336. if(buf[i]==' ')
  337. break;
  338. }
  339. rub = buf.substr(befi, i-befi);
  340. ++i;
  341. befi=i;
  342. for(i; i<andame2; ++i)
  343. {
  344. if(buf[i]=='\r')
  345. break;
  346. }
  347. std::string defName = buf.substr(befi, i-befi);
  348. creatures[s].animDefName = defName;
  349. }
  350. loadAnimationInfo();
  351. }
  352. void CCreatureHandler::loadAnimationInfo()
  353. {
  354. std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("CRANIM.TXT");
  355. int andame = buf.size();
  356. int i=0; //buf iterator
  357. int hmcr=0;
  358. for(i; i<andame; ++i)
  359. {
  360. if(buf[i]=='\r')
  361. ++hmcr;
  362. if(hmcr==2)
  363. break;
  364. }
  365. i+=2;
  366. for(int dd=0; dd<creatures.size()-16; ++dd)
  367. {
  368. loadUnitAnimInfo(creatures[dd], buf, i);
  369. }
  370. return;
  371. }
  372. void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, std::string & src, int & i)
  373. {
  374. int befi=i;
  375. for(i; i<src.size(); ++i)
  376. {
  377. if(src[i]=='\t')
  378. break;
  379. }
  380. unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
  381. ++i;
  382. while(unit.timeBetweenFidgets == 0.0)
  383. {
  384. for(i; i<src.size(); ++i)
  385. {
  386. if(src[i]=='\r')
  387. break;
  388. }
  389. i+=2;
  390. befi=i;
  391. for(i; i<src.size(); ++i)
  392. {
  393. if(src[i]=='\t')
  394. break;
  395. }
  396. unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
  397. ++i;
  398. }
  399. befi=i;
  400. for(i; i<src.size(); ++i)
  401. {
  402. if(src[i]=='\t')
  403. break;
  404. }
  405. unit.walkAnimationTime = atof(src.substr(befi, i-befi).c_str());
  406. ++i;
  407. befi=i;
  408. for(i; i<src.size(); ++i)
  409. {
  410. if(src[i]=='\t')
  411. break;
  412. }
  413. unit.attackAnimationTime = atof(src.substr(befi, i-befi).c_str());
  414. ++i;
  415. befi=i;
  416. for(i; i<src.size(); ++i)
  417. {
  418. if(src[i]=='\t')
  419. break;
  420. }
  421. unit.flightAnimationDistance = atof(src.substr(befi, i-befi).c_str());
  422. ++i;
  423. ///////////////////////
  424. befi=i;
  425. for(i; i<src.size(); ++i)
  426. {
  427. if(src[i]=='\t')
  428. break;
  429. }
  430. unit.upperRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  431. ++i;
  432. befi=i;
  433. for(i; i<src.size(); ++i)
  434. {
  435. if(src[i]=='\t')
  436. break;
  437. }
  438. unit.upperRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  439. ++i;
  440. befi=i;
  441. for(i; i<src.size(); ++i)
  442. {
  443. if(src[i]=='\t')
  444. break;
  445. }
  446. unit.rightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  447. ++i;
  448. befi=i;
  449. for(i; i<src.size(); ++i)
  450. {
  451. if(src[i]=='\t')
  452. break;
  453. }
  454. unit.rightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  455. ++i;
  456. befi=i;
  457. for(i; i<src.size(); ++i)
  458. {
  459. if(src[i]=='\t')
  460. break;
  461. }
  462. unit.lowerRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  463. ++i;
  464. befi=i;
  465. for(i; i<src.size(); ++i)
  466. {
  467. if(src[i]=='\t')
  468. break;
  469. }
  470. unit.lowerRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  471. ++i;
  472. ///////////////////////
  473. for(int jjj=0; jjj<12; ++jjj)
  474. {
  475. befi=i;
  476. for(i; i<src.size(); ++i)
  477. {
  478. if(src[i]=='\t')
  479. break;
  480. }
  481. unit.missleFrameAngles[jjj] = atof(src.substr(befi, i-befi).c_str());
  482. ++i;
  483. }
  484. befi=i;
  485. for(i; i<src.size(); ++i)
  486. {
  487. if(src[i]=='\t')
  488. break;
  489. }
  490. unit.troopCountLocationOffset= atoi(src.substr(befi, i-befi).c_str());
  491. ++i;
  492. befi=i;
  493. for(i; i<src.size(); ++i)
  494. {
  495. if(src[i]=='\t')
  496. break;
  497. }
  498. unit.attackClimaxFrame = atoi(src.substr(befi, i-befi).c_str());
  499. ++i;
  500. for(i; i<src.size(); ++i)
  501. {
  502. if(src[i]=='\r')
  503. break;
  504. }
  505. i+=2;
  506. }
  507. void CCreatureHandler::loadUnitAnimations()
  508. {
  509. std::ifstream inp("config/CREDEFS.TXT", std::ios::in | std::ios::binary); //this file is not in lod
  510. inp.seekg(0,std::ios::end); // na koniec
  511. int andame = inp.tellg(); // read length
  512. inp.seekg(0,std::ios::beg); // wracamy na poczatek
  513. char * bufor = new char[andame]; // allocate memory
  514. inp.read((char*)bufor, andame); // read map file to buffer
  515. inp.close();
  516. std::string buf = std::string(bufor);
  517. delete [andame] bufor;
  518. int i = 0; //buf iterator
  519. int hmcr = 0;
  520. for(i; i<andame; ++i) //omitting rubbish
  521. {
  522. if(buf[i]=='\r')
  523. break;
  524. }
  525. i+=2;
  526. for(int s=0; s<creatures.size(); ++s)
  527. {
  528. int befi=i;
  529. std::string rub;
  530. for(i; i<andame; ++i)
  531. {
  532. if(buf[i]==' ')
  533. break;
  534. }
  535. rub = buf.substr(befi, i-befi);
  536. ++i;
  537. befi=i;
  538. for(i; i<andame; ++i)
  539. {
  540. if(buf[i]=='\r')
  541. break;
  542. }
  543. std::string defName = buf.substr(befi, i-befi);
  544. if(defName != std::string("x"))
  545. creatures[s].battleAnimation = CGameInfo::mainObj->spriteh->giveDef(defName);
  546. else
  547. creatures[s].battleAnimation = NULL;
  548. i+=2;
  549. }
  550. }
  551. int CCreatureAnimation::getType() const
  552. {
  553. return type;
  554. }
  555. void CCreatureAnimation::setType(int type)
  556. {
  557. this->type = type;
  558. curFrame = 0;
  559. if(type!=-1)
  560. {
  561. if(SEntries[curFrame].group!=type) //rewind
  562. {
  563. int j=-1; //first frame in displayed group
  564. for(int g=0; g<SEntries.size(); ++g)
  565. {
  566. if(SEntries[g].group==type && j==-1)
  567. {
  568. j = g;
  569. break;
  570. }
  571. }
  572. if(curFrame!=-1)
  573. curFrame = j;
  574. }
  575. }
  576. else
  577. {
  578. if(curFrame>=frames)
  579. curFrame = 0;
  580. }
  581. }
  582. CCreatureAnimation::CCreatureAnimation(std::string name) : RLEntries(NULL), RWEntries(NULL)
  583. {
  584. //load main file
  585. std::string data2 = CGI->spriteh->getTextFile(name);
  586. FDef = new unsigned char[data2.size()];
  587. for(int g=0; g<data2.size(); ++g)
  588. {
  589. FDef[g] = data2[g];
  590. }
  591. //init anim data
  592. int i,j, totalInBlock;
  593. char Buffer[13];
  594. defName=name;
  595. int andame = data2.size();
  596. i = 0;
  597. DEFType = readNormalNr(i,4); i+=4;
  598. fullWidth = readNormalNr(i,4); i+=4;
  599. fullHeight = readNormalNr(i,4); i+=4;
  600. i=0xc;
  601. totalBlocks = readNormalNr(i,4); i+=4;
  602. i=0x10;
  603. for (int it=0;it<256;it++)
  604. {
  605. palette[it].R = FDef[i++];
  606. palette[it].G = FDef[i++];
  607. palette[it].B = FDef[i++];
  608. palette[it].F = 0;
  609. }
  610. i=0x310;
  611. totalEntries=0;
  612. for (int z=0; z<totalBlocks; z++)
  613. {
  614. int unknown1 = readNormalNr(i,4); i+=4;
  615. totalInBlock = readNormalNr(i,4); i+=4;
  616. for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
  617. SEntries.push_back(SEntry());
  618. int unknown2 = readNormalNr(i,4); i+=4;
  619. int unknown3 = readNormalNr(i,4); i+=4;
  620. for (j=0; j<totalInBlock; j++)
  621. {
  622. for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
  623. i+=13;
  624. SEntries[totalEntries+j].name=Buffer;
  625. }
  626. for (j=0; j<totalInBlock; j++)
  627. {
  628. SEntries[totalEntries+j].offset = readNormalNr(i,4);
  629. int unknown4 = readNormalNr(i,4); i+=4;
  630. }
  631. //totalEntries+=totalInBlock;
  632. for(int hh=0; hh<totalInBlock; ++hh)
  633. {
  634. SEntries[totalEntries].group = z;
  635. ++totalEntries;
  636. }
  637. }
  638. for(j=0; j<SEntries.size(); ++j)
  639. {
  640. SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
  641. }
  642. //pictures don't have to be readed here
  643. //for(int i=0; i<SEntries.size(); ++i)
  644. //{
  645. // Cimage nimg;
  646. // nimg.bitmap = getSprite(i);
  647. // nimg.imName = SEntries[i].name;
  648. // nimg.groupNumber = SEntries[i].group;
  649. // ourImages.push_back(nimg);
  650. //}
  651. //delete FDef;
  652. //FDef = NULL;
  653. //init vars
  654. curFrame = 0;
  655. type = -1;
  656. frames = totalEntries;
  657. }
  658. int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str, bool cyclic)
  659. {
  660. int ret=0;
  661. int amp=1;
  662. if (str)
  663. {
  664. for (int i=0; i<bytCon; i++)
  665. {
  666. ret+=str[pos+i]*amp;
  667. amp*=256;
  668. }
  669. }
  670. else
  671. {
  672. for (int i=0; i<bytCon; i++)
  673. {
  674. ret+=FDef[pos+i]*amp;
  675. amp*=256;
  676. }
  677. }
  678. if(cyclic && bytCon<4 && ret>=amp/2)
  679. {
  680. ret = ret-amp;
  681. }
  682. return ret;
  683. }
  684. int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y)
  685. {
  686. if(dest->format->BytesPerPixel<3)
  687. return -1; //not enough depth
  688. int SIndex = curFrame++; //TODO: finish
  689. if(type!=-1)
  690. {
  691. if(SEntries[curFrame].group!=type) //rewind
  692. {
  693. int j=-1; //first frame in displayed group
  694. for(int g=0; g<SEntries.size(); ++g)
  695. {
  696. if(SEntries[g].group==type && j==-1)
  697. {
  698. j = g;
  699. break;
  700. }
  701. }
  702. if(curFrame!=-1)
  703. curFrame = j;
  704. }
  705. }
  706. else
  707. {
  708. if(curFrame>=frames)
  709. curFrame = 0;
  710. }
  711. long BaseOffset,
  712. SpriteWidth, SpriteHeight, //format sprite'a
  713. LeftMargin, RightMargin, TopMargin,BottomMargin,
  714. i, add, FullHeight,FullWidth,
  715. TotalRowLength, // dlugosc przeczytanego segmentu
  716. NextSpriteOffset, RowAdd;
  717. unsigned char SegmentType, SegmentLength, BL, BR;
  718. std::string FTemp;
  719. i=BaseOffset=SEntries[SIndex].offset;
  720. int prSize=readNormalNr(i,4,FDef);i+=4;
  721. int defType2 = readNormalNr(i,4,FDef);i+=4;
  722. FullWidth = readNormalNr(i,4,FDef);i+=4;
  723. FullHeight = readNormalNr(i,4,FDef);i+=4;
  724. SpriteWidth = readNormalNr(i,4,FDef);i+=4;
  725. SpriteHeight = readNormalNr(i,4,FDef);i+=4;
  726. LeftMargin = readNormalNr(i,4,FDef);i+=4;
  727. TopMargin = readNormalNr(i,4,FDef);i+=4;
  728. RightMargin = FullWidth - SpriteWidth - LeftMargin;
  729. BottomMargin = FullHeight - SpriteHeight - TopMargin;
  730. add = 4 - FullWidth%4;
  731. int BaseOffsetor = BaseOffset = i;
  732. if (defType2==1) //as it should be allways in creature animations
  733. {
  734. if (add==4)
  735. add=0; ////////was 3
  736. if (TopMargin>0)
  737. {
  738. for (int i=0;i<TopMargin;i++)
  739. {
  740. for (int j=0;j<FullWidth+add;j++)
  741. FTemp+='\0';
  742. }
  743. }
  744. RLEntries = new int[SpriteHeight];
  745. for (int i=0;i<SpriteHeight;i++)
  746. {
  747. RLEntries[i]=readNormalNr(BaseOffset,4,FDef);BaseOffset+=4;
  748. }
  749. for (int i=0;i<SpriteHeight;i++)
  750. {
  751. BaseOffset=BaseOffsetor+RLEntries[i];
  752. if (LeftMargin>0)
  753. {
  754. for (int j=0;j<LeftMargin;j++)
  755. FTemp+='\0';
  756. }
  757. TotalRowLength=0;
  758. do
  759. {
  760. SegmentType=FDef[BaseOffset++];
  761. SegmentLength=FDef[BaseOffset++];
  762. if (SegmentType==0xFF)
  763. {
  764. for (int k=0;k<=SegmentLength;k++)
  765. {
  766. FTemp+=FDef[BaseOffset+k];
  767. if ((TotalRowLength+k+1)>=SpriteWidth)
  768. break;
  769. }
  770. BaseOffset+=SegmentLength+1;////
  771. TotalRowLength+=SegmentLength+1;
  772. }
  773. else
  774. {
  775. for (int k=0;k<SegmentLength+1;k++)
  776. {
  777. FTemp+=SegmentType;//
  778. //FTemp+='\0';
  779. }
  780. TotalRowLength+=SegmentLength+1;
  781. }
  782. }while(TotalRowLength<SpriteWidth);
  783. RowAdd=SpriteWidth-TotalRowLength;
  784. if (RightMargin>0)
  785. {
  786. for (int j=0;j<RightMargin;j++)
  787. FTemp+='\0';
  788. }
  789. if (add>0)
  790. {
  791. for (int j=0;j<add+RowAdd;j++)
  792. FTemp+='\0';
  793. }
  794. }
  795. delete [] RLEntries;
  796. RLEntries = NULL;
  797. if (BottomMargin>0)
  798. {
  799. for (int i=0;i<BottomMargin;i++)
  800. {
  801. for (int j=0;j<FullWidth+add;j++)
  802. FTemp+='\0';
  803. }
  804. }
  805. }
  806. for (int i=0; i<FullHeight; ++i)
  807. {
  808. for (int j=0;j<FullWidth+add;j++)
  809. {
  810. if( i+y<dest->h && j+x<dest->w && i+y>=0 && j+x>=0)
  811. {
  812. unsigned char coln = FTemp[i*(FullWidth+add)+j]; //number of color from palette
  813. if(coln==0)
  814. continue;
  815. unsigned char* ptr = ((unsigned char*)dest->pixels + dest->format->BytesPerPixel * ((i + y)*dest->w + j + x));
  816. if(coln>7 || coln == 5) //normal or yellow border
  817. {
  818. *ptr = palette[coln].B;
  819. *(ptr+1) = palette[coln].G;
  820. *(ptr+2) = palette[coln].R;
  821. }
  822. else if(coln<5) //shadow
  823. {
  824. *ptr = ((*ptr) * (palette[coln].G + 50)) /200;
  825. *(ptr+1) = ((*(ptr+1)) * (palette[coln].G + 50)) /200 ;
  826. *(ptr+2) = ((*(ptr+2)) * (palette[coln].G + 50)) /200 ;
  827. }
  828. else if(coln == 6) //yellow border shadowed
  829. {
  830. *ptr = ((*ptr) + palette[coln-1].B) / 2;
  831. *(ptr+1) = ((*(ptr+1)) + palette[coln-1].G) / 2;
  832. *(ptr+2) = ((*(ptr+2)) + palette[coln-1].R) / 2;
  833. }
  834. }
  835. }
  836. }
  837. SDL_UpdateRect(dest, x, y, FullWidth+add, FullHeight);
  838. return 0;
  839. }
  840. CCreatureAnimation::~CCreatureAnimation()
  841. {
  842. delete [] FDef;
  843. if (RWEntries)
  844. delete [] RWEntries;
  845. if (RLEntries)
  846. delete [] RLEntries;
  847. }