CCreatureHandler.cpp 17 KB

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