CCreatureHandler.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  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. }
  470. int CCreatureAnimation::getType() const
  471. {
  472. return type;
  473. }
  474. void CCreatureAnimation::setType(int type)
  475. {
  476. this->type = type;
  477. curFrame = 0;
  478. }
  479. CCreatureAnimation::CCreatureAnimation(std::string name)
  480. {
  481. //load main file
  482. std::string data2 = CGI->spriteh->getTextFile(name);
  483. FDef = new unsigned char[data2.size()];
  484. for(int g=0; g<data2.size(); ++g)
  485. {
  486. FDef[g] = data2[g];
  487. }
  488. //init anim data
  489. int i,j, totalInBlock;
  490. char Buffer[13];
  491. defName=name;
  492. int andame = data2.size();
  493. i = 0;
  494. DEFType = readNormalNr(i,4); i+=4;
  495. fullWidth = readNormalNr(i,4); i+=4;
  496. fullHeight = readNormalNr(i,4); i+=4;
  497. i=0xc;
  498. totalBlocks = readNormalNr(i,4); i+=4;
  499. i=0x10;
  500. for (int it=0;it<256;it++)
  501. {
  502. palette[it].R = FDef[i++];
  503. palette[it].G = FDef[i++];
  504. palette[it].B = FDef[i++];
  505. palette[it].F = 0;
  506. }
  507. i=0x310;
  508. totalEntries=0;
  509. for (int z=0; z<totalBlocks; z++)
  510. {
  511. int unknown1 = readNormalNr(i,4); i+=4;
  512. totalInBlock = readNormalNr(i,4); i+=4;
  513. for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
  514. SEntries.push_back(SEntry());
  515. int unknown2 = readNormalNr(i,4); i+=4;
  516. int unknown3 = readNormalNr(i,4); i+=4;
  517. for (j=0; j<totalInBlock; j++)
  518. {
  519. for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
  520. i+=13;
  521. SEntries[totalEntries+j].name=Buffer;
  522. }
  523. for (j=0; j<totalInBlock; j++)
  524. {
  525. SEntries[totalEntries+j].offset = readNormalNr(i,4);
  526. int unknown4 = readNormalNr(i,4); i+=4;
  527. }
  528. //totalEntries+=totalInBlock;
  529. for(int hh=0; hh<totalInBlock; ++hh)
  530. {
  531. SEntries[totalEntries].group = z;
  532. ++totalEntries;
  533. }
  534. }
  535. for(j=0; j<SEntries.size(); ++j)
  536. {
  537. SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
  538. }
  539. //pictures don't have to be readed here
  540. //for(int i=0; i<SEntries.size(); ++i)
  541. //{
  542. // Cimage nimg;
  543. // nimg.bitmap = getSprite(i);
  544. // nimg.imName = SEntries[i].name;
  545. // nimg.groupNumber = SEntries[i].group;
  546. // ourImages.push_back(nimg);
  547. //}
  548. //delete FDef;
  549. //FDef = NULL;
  550. //init vars
  551. curFrame = 0;
  552. type = -1;
  553. frames = totalEntries;
  554. }
  555. int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str, bool cyclic)
  556. {
  557. int ret=0;
  558. int amp=1;
  559. if (str)
  560. {
  561. for (int i=0; i<bytCon; i++)
  562. {
  563. ret+=str[pos+i]*amp;
  564. amp*=256;
  565. }
  566. }
  567. else
  568. {
  569. for (int i=0; i<bytCon; i++)
  570. {
  571. ret+=FDef[pos+i]*amp;
  572. amp*=256;
  573. }
  574. }
  575. if(cyclic && bytCon<4 && ret>=amp/2)
  576. {
  577. ret = ret-amp;
  578. }
  579. return ret;
  580. }
  581. int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y)
  582. {
  583. if(dest->format->BytesPerPixel<3)
  584. return -1; //not enough depth
  585. int SIndex = curFrame++; //TODO: finish
  586. if(curFrame>=frames)
  587. curFrame = 0;
  588. long BaseOffset,
  589. SpriteWidth, SpriteHeight, //format sprite'a
  590. LeftMargin, RightMargin, TopMargin,BottomMargin,
  591. i, add, FullHeight,FullWidth,
  592. TotalRowLength, // dlugosc przeczytanego segmentu
  593. NextSpriteOffset, RowAdd;
  594. std::ifstream Fdef;
  595. unsigned char SegmentType, SegmentLength, BL, BR;
  596. unsigned char * TempDef; //memory
  597. std::string FTemp;
  598. i=BaseOffset=SEntries[SIndex].offset;
  599. int prSize=readNormalNr(i,4,FDef);i+=4;
  600. int defType2 = readNormalNr(i,4,FDef);i+=4;
  601. FullWidth = readNormalNr(i,4,FDef);i+=4;
  602. FullHeight = readNormalNr(i,4,FDef);i+=4;
  603. SpriteWidth = readNormalNr(i,4,FDef);i+=4;
  604. SpriteHeight = readNormalNr(i,4,FDef);i+=4;
  605. LeftMargin = readNormalNr(i,4,FDef);i+=4;
  606. TopMargin = readNormalNr(i,4,FDef);i+=4;
  607. RightMargin = FullWidth - SpriteWidth - LeftMargin;
  608. BottomMargin = FullHeight - SpriteHeight - TopMargin;
  609. BMPHeader tb;
  610. tb.x = FullWidth;
  611. tb.y = FullHeight;
  612. tb.dataSize2 = tb.dataSize1 = tb.x*tb.y;
  613. tb.fullSize = tb.dataSize1+436;
  614. tb._h3=tb.fullSize-36;
  615. //add = (int)(4*(((float)1) - ((int)(((int)((float)FullWidth/(float)4))-((float)FullWidth/(float)4)))));
  616. add = 4 - FullWidth%4;
  617. /*if (add==4)
  618. add=0;*/ //moved to defcompression dependent block
  619. #if SDL_BYTEORDER == SDL_BIG_ENDIAN
  620. int rmask = 0xff000000;
  621. int gmask = 0x00ff0000;
  622. int bmask = 0x0000ff00;
  623. int amask = 0x000000ff;
  624. #else
  625. int rmask = 0x000000ff;
  626. int gmask = 0x0000ff00;
  627. int bmask = 0x00ff0000;
  628. int amask = 0xff000000;
  629. #endif
  630. //ret = SDL_CreateRGBSurface(SDL_SWSURFACE, FullWidth, FullHeight, 8, 0, 0, 0, 0);
  631. //int tempee2 = readNormalNr(0,4,((unsigned char *)tempee.c_str()));
  632. int BaseOffsetor = BaseOffset = i;
  633. /*for(int i=0; i<256; ++i)
  634. {
  635. SDL_Color pr;
  636. pr.r = palette[i].R;
  637. pr.g = palette[i].G;
  638. pr.b = palette[i].B;
  639. pr.unused = palette[i].F;
  640. (*(ret->format->palette->colors+i))=pr;
  641. }*/
  642. for (int i=0;i<800;i++)
  643. fbuffer[i]=0;
  644. if (defType2==1) //as it should be allways in creature animations
  645. {
  646. if (add==4)
  647. add=0; ////////was 3
  648. if (TopMargin>0)
  649. {
  650. for (int i=0;i<TopMargin;i++)
  651. {
  652. for (int j=0;j<FullWidth+add;j++)
  653. FTemp+=fbuffer[j];
  654. }
  655. }
  656. RLEntries = new int[SpriteHeight];
  657. for (int i=0;i<SpriteHeight;i++)
  658. {
  659. RLEntries[i]=readNormalNr(BaseOffset,4,FDef);BaseOffset+=4;
  660. }
  661. for (int i=0;i<SpriteHeight;i++)
  662. {
  663. BaseOffset=BaseOffsetor+RLEntries[i];
  664. if (LeftMargin>0)
  665. {
  666. for (int j=0;j<LeftMargin;j++)
  667. FTemp+=fbuffer[j];
  668. }
  669. TotalRowLength=0;
  670. do
  671. {
  672. SegmentType=FDef[BaseOffset++];
  673. SegmentLength=FDef[BaseOffset++];
  674. if (SegmentType==0xFF)
  675. {
  676. for (int k=0;k<=SegmentLength;k++)
  677. {
  678. FTemp+=FDef[BaseOffset+k];
  679. if ((TotalRowLength+k+1)>=SpriteWidth)
  680. break;
  681. }
  682. BaseOffset+=SegmentLength+1;////
  683. TotalRowLength+=SegmentLength+1;
  684. }
  685. else
  686. {
  687. for (int k=0;k<SegmentLength+1;k++)
  688. {
  689. FTemp+=SegmentType;//
  690. //FTemp+='\0';
  691. }
  692. TotalRowLength+=SegmentLength+1;
  693. }
  694. }while(TotalRowLength<SpriteWidth);
  695. RowAdd=SpriteWidth-TotalRowLength;
  696. if (RightMargin>0)
  697. {
  698. for (int j=0;j<RightMargin;j++)
  699. FTemp+=fbuffer[j];
  700. }
  701. if (add>0)
  702. {
  703. for (int j=0;j<add+RowAdd;j++)
  704. FTemp+=fbuffer[j];
  705. }
  706. }
  707. delete RLEntries;
  708. RLEntries = NULL;
  709. if (BottomMargin>0)
  710. {
  711. for (int i=0;i<BottomMargin;i++)
  712. {
  713. for (int j=0;j<FullWidth+add;j++)
  714. FTemp+=fbuffer[j];
  715. }
  716. }
  717. }
  718. for (int i=0; i<FullHeight; ++i)
  719. {
  720. for (int j=0;j<FullWidth+add;j++)
  721. {
  722. if( i+y<dest->h && j+x<dest->w && i+y>=0 && j+x>=0)
  723. {
  724. unsigned char coln = FTemp[i*(FullWidth+add)+j]; //number of color from palette
  725. if(coln==0)
  726. continue;
  727. unsigned char* ptr = ((unsigned char*)dest->pixels + dest->format->BytesPerPixel * ((i + y)*dest->w + j + x));
  728. if(coln>7 || coln == 5) //normal or yellow border
  729. {
  730. *ptr = palette[coln].B;
  731. *(ptr+1) = palette[coln].G;
  732. *(ptr+2) = palette[coln].R;
  733. }
  734. else if(coln<5) //shadow
  735. {
  736. *ptr = ((*ptr) * (palette[coln].G + 50)) /200;
  737. *(ptr+1) = ((*(ptr+1)) * (palette[coln].G + 50)) /200 ;
  738. *(ptr+2) = ((*(ptr+2)) * (palette[coln].G + 50)) /200 ;
  739. }
  740. else if(coln == 6) //yellow border shadowed
  741. {
  742. *ptr = ((*ptr) + palette[coln-1].B) / 2;
  743. *(ptr+1) = ((*(ptr+1)) + palette[coln-1].G) / 2;
  744. *(ptr+2) = ((*(ptr+2)) + palette[coln-1].R) / 2;
  745. }
  746. }
  747. }
  748. }
  749. SDL_UpdateRect(dest, x, y, FullWidth+add, FullHeight);
  750. return 0;
  751. }