CCreatureHandler.cpp 17 KB

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