CCreatureHandler.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  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. void CCreatureHandler::loadAnimationInfo()
  313. {
  314. //std::string buf = CGameInfo::mainObj->bitmaph->getTextFile("CRANIM.TXT");
  315. //int andame = buf.size();
  316. //int i=0; //buf iterator
  317. //hmcr=0;
  318. //for(i; i<andame; ++i)
  319. //{
  320. // if(buf[i]=='\r')
  321. // ++hmcr;
  322. // if(hmcr==2)
  323. // break;
  324. //}
  325. //i+=2;
  326. //for(int dd=0; dd<creatures.size(); ++dd)
  327. //{
  328. // loadUnitAnimInfo(creatures[dd], buf, i);
  329. //}
  330. return;
  331. }
  332. void CCreatureHandler::loadUnitAnimInfo(CCreature & unit, std::string & src, int & i)
  333. {
  334. int befi=i;
  335. for(i; i<src.size(); ++i)
  336. {
  337. if(src[i]=='\t')
  338. break;
  339. }
  340. unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
  341. ++i;
  342. while(unit.timeBetweenFidgets == 0.0)
  343. {
  344. for(i; i<src.size(); ++i)
  345. {
  346. if(src[i]=='\r')
  347. break;
  348. }
  349. i+=2;
  350. befi=i;
  351. for(i; i<src.size(); ++i)
  352. {
  353. if(src[i]=='\t')
  354. break;
  355. }
  356. unit.timeBetweenFidgets = atof(src.substr(befi, i-befi).c_str());
  357. ++i;
  358. }
  359. befi=i;
  360. for(i; i<src.size(); ++i)
  361. {
  362. if(src[i]=='\t')
  363. break;
  364. }
  365. unit.walkAnimationTime = atof(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.attackAnimationTime = atof(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.flightAnimationDistance = atof(src.substr(befi, i-befi).c_str());
  382. ++i;
  383. ///////////////////////
  384. befi=i;
  385. for(i; i<src.size(); ++i)
  386. {
  387. if(src[i]=='\t')
  388. break;
  389. }
  390. unit.upperRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  391. ++i;
  392. befi=i;
  393. for(i; i<src.size(); ++i)
  394. {
  395. if(src[i]=='\t')
  396. break;
  397. }
  398. unit.upperRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  399. ++i;
  400. befi=i;
  401. for(i; i<src.size(); ++i)
  402. {
  403. if(src[i]=='\t')
  404. break;
  405. }
  406. unit.rightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  407. ++i;
  408. befi=i;
  409. for(i; i<src.size(); ++i)
  410. {
  411. if(src[i]=='\t')
  412. break;
  413. }
  414. unit.rightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  415. ++i;
  416. befi=i;
  417. for(i; i<src.size(); ++i)
  418. {
  419. if(src[i]=='\t')
  420. break;
  421. }
  422. unit.lowerRightMissleOffsetX = atoi(src.substr(befi, i-befi).c_str());
  423. ++i;
  424. befi=i;
  425. for(i; i<src.size(); ++i)
  426. {
  427. if(src[i]=='\t')
  428. break;
  429. }
  430. unit.lowerRightMissleOffsetY = atoi(src.substr(befi, i-befi).c_str());
  431. ++i;
  432. ///////////////////////
  433. for(int jjj=0; jjj<12; ++jjj)
  434. {
  435. befi=i;
  436. for(i; i<src.size(); ++i)
  437. {
  438. if(src[i]=='\t')
  439. break;
  440. }
  441. unit.missleFrameAngles[jjj] = atof(src.substr(befi, i-befi).c_str());
  442. ++i;
  443. }
  444. befi=i;
  445. for(i; i<src.size(); ++i)
  446. {
  447. if(src[i]=='\t')
  448. break;
  449. }
  450. unit.troopCountLocationOffset= atoi(src.substr(befi, i-befi).c_str());
  451. ++i;
  452. befi=i;
  453. for(i; i<src.size(); ++i)
  454. {
  455. if(src[i]=='\t')
  456. break;
  457. }
  458. unit.attackClimaxFrame = atoi(src.substr(befi, i-befi).c_str());
  459. ++i;
  460. for(i; i<src.size(); ++i)
  461. {
  462. if(src[i]=='\r')
  463. break;
  464. }
  465. i+=2;
  466. }
  467. void CCreatureHandler::loadUnitAnimations()
  468. {
  469. std::ifstream inp("config/CREDEFS.TXT", std::ios::in | std::ios::binary); //this file is not in lod
  470. inp.seekg(0,std::ios::end); // na koniec
  471. int andame = inp.tellg(); // read length
  472. inp.seekg(0,std::ios::beg); // wracamy na poczatek
  473. char * bufor = new char[andame]; // allocate memory
  474. inp.read((char*)bufor, andame); // read map file to buffer
  475. inp.close();
  476. std::string buf = std::string(bufor);
  477. delete [andame] bufor;
  478. int i = 0; //buf iterator
  479. int hmcr = 0;
  480. for(i; i<andame; ++i) //omitting rubbish
  481. {
  482. if(buf[i]=='\r')
  483. break;
  484. }
  485. i+=2;
  486. for(int s=0; s<creatures.size(); ++s)
  487. {
  488. int befi=i;
  489. std::string rub;
  490. for(i; i<andame; ++i)
  491. {
  492. if(buf[i]==' ')
  493. break;
  494. }
  495. rub = buf.substr(befi, i-befi);
  496. ++i;
  497. befi=i;
  498. for(i; i<andame; ++i)
  499. {
  500. if(buf[i]=='\r')
  501. break;
  502. }
  503. std::string defName = buf.substr(befi, i-befi);
  504. if(defName != std::string("x"))
  505. creatures[s].battleAnimation = CGameInfo::mainObj->spriteh->giveDef(defName);
  506. else
  507. creatures[s].battleAnimation = NULL;
  508. i+=2;
  509. }
  510. }
  511. int CCreatureAnimation::getType() const
  512. {
  513. return type;
  514. }
  515. void CCreatureAnimation::setType(int type)
  516. {
  517. this->type = type;
  518. curFrame = 0;
  519. }
  520. CCreatureAnimation::CCreatureAnimation(std::string name)
  521. {
  522. //load main file
  523. std::string data2 = CGI->spriteh->getTextFile(name);
  524. FDef = new unsigned char[data2.size()];
  525. for(int g=0; g<data2.size(); ++g)
  526. {
  527. FDef[g] = data2[g];
  528. }
  529. //init anim data
  530. int i,j, totalInBlock;
  531. char Buffer[13];
  532. defName=name;
  533. int andame = data2.size();
  534. i = 0;
  535. DEFType = readNormalNr(i,4); i+=4;
  536. fullWidth = readNormalNr(i,4); i+=4;
  537. fullHeight = readNormalNr(i,4); i+=4;
  538. i=0xc;
  539. totalBlocks = readNormalNr(i,4); i+=4;
  540. i=0x10;
  541. for (int it=0;it<256;it++)
  542. {
  543. palette[it].R = FDef[i++];
  544. palette[it].G = FDef[i++];
  545. palette[it].B = FDef[i++];
  546. palette[it].F = 0;
  547. }
  548. i=0x310;
  549. totalEntries=0;
  550. for (int z=0; z<totalBlocks; z++)
  551. {
  552. int unknown1 = readNormalNr(i,4); i+=4;
  553. totalInBlock = readNormalNr(i,4); i+=4;
  554. for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
  555. SEntries.push_back(SEntry());
  556. int unknown2 = readNormalNr(i,4); i+=4;
  557. int unknown3 = readNormalNr(i,4); i+=4;
  558. for (j=0; j<totalInBlock; j++)
  559. {
  560. for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
  561. i+=13;
  562. SEntries[totalEntries+j].name=Buffer;
  563. }
  564. for (j=0; j<totalInBlock; j++)
  565. {
  566. SEntries[totalEntries+j].offset = readNormalNr(i,4);
  567. int unknown4 = readNormalNr(i,4); i+=4;
  568. }
  569. //totalEntries+=totalInBlock;
  570. for(int hh=0; hh<totalInBlock; ++hh)
  571. {
  572. SEntries[totalEntries].group = z;
  573. ++totalEntries;
  574. }
  575. }
  576. for(j=0; j<SEntries.size(); ++j)
  577. {
  578. SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
  579. }
  580. //pictures don't have to be readed here
  581. //for(int i=0; i<SEntries.size(); ++i)
  582. //{
  583. // Cimage nimg;
  584. // nimg.bitmap = getSprite(i);
  585. // nimg.imName = SEntries[i].name;
  586. // nimg.groupNumber = SEntries[i].group;
  587. // ourImages.push_back(nimg);
  588. //}
  589. //delete FDef;
  590. //FDef = NULL;
  591. //init vars
  592. curFrame = 0;
  593. type = -1;
  594. frames = totalEntries;
  595. }
  596. int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str, bool cyclic)
  597. {
  598. int ret=0;
  599. int amp=1;
  600. if (str)
  601. {
  602. for (int i=0; i<bytCon; i++)
  603. {
  604. ret+=str[pos+i]*amp;
  605. amp*=256;
  606. }
  607. }
  608. else
  609. {
  610. for (int i=0; i<bytCon; i++)
  611. {
  612. ret+=FDef[pos+i]*amp;
  613. amp*=256;
  614. }
  615. }
  616. if(cyclic && bytCon<4 && ret>=amp/2)
  617. {
  618. ret = ret-amp;
  619. }
  620. return ret;
  621. }
  622. int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y)
  623. {
  624. if(dest->format->BytesPerPixel<3)
  625. return -1; //not enough depth
  626. int SIndex = curFrame++; //TODO: finish
  627. if(curFrame>=frames)
  628. curFrame = 0;
  629. long BaseOffset,
  630. SpriteWidth, SpriteHeight, //format sprite'a
  631. LeftMargin, RightMargin, TopMargin,BottomMargin,
  632. i, add, FullHeight,FullWidth,
  633. TotalRowLength, // dlugosc przeczytanego segmentu
  634. NextSpriteOffset, RowAdd;
  635. std::ifstream Fdef;
  636. unsigned char SegmentType, SegmentLength, BL, BR;
  637. unsigned char * TempDef; //memory
  638. std::string FTemp;
  639. i=BaseOffset=SEntries[SIndex].offset;
  640. int prSize=readNormalNr(i,4,FDef);i+=4;
  641. int defType2 = readNormalNr(i,4,FDef);i+=4;
  642. FullWidth = readNormalNr(i,4,FDef);i+=4;
  643. FullHeight = readNormalNr(i,4,FDef);i+=4;
  644. SpriteWidth = readNormalNr(i,4,FDef);i+=4;
  645. SpriteHeight = readNormalNr(i,4,FDef);i+=4;
  646. LeftMargin = readNormalNr(i,4,FDef);i+=4;
  647. TopMargin = readNormalNr(i,4,FDef);i+=4;
  648. RightMargin = FullWidth - SpriteWidth - LeftMargin;
  649. BottomMargin = FullHeight - SpriteHeight - TopMargin;
  650. BMPHeader tb;
  651. tb.x = FullWidth;
  652. tb.y = FullHeight;
  653. tb.dataSize2 = tb.dataSize1 = tb.x*tb.y;
  654. tb.fullSize = tb.dataSize1+436;
  655. tb._h3=tb.fullSize-36;
  656. //add = (int)(4*(((float)1) - ((int)(((int)((float)FullWidth/(float)4))-((float)FullWidth/(float)4)))));
  657. add = 4 - FullWidth%4;
  658. /*if (add==4)
  659. add=0;*/ //moved to defcompression dependent block
  660. //ret = SDL_CreateRGBSurface(SDL_SWSURFACE, FullWidth, FullHeight, 8, 0, 0, 0, 0);
  661. //int tempee2 = readNormalNr(0,4,((unsigned char *)tempee.c_str()));
  662. int BaseOffsetor = BaseOffset = i;
  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. }