CDefHandler.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. #include "stdafx.h"
  2. #include "CDefHandler.h"
  3. #include "SDL_image.h"
  4. #include <sstream>
  5. long long pow(long long a, int b)
  6. {
  7. if (!b) return 1;
  8. long c = a;
  9. while (--b)
  10. a*=c;
  11. return a;
  12. }
  13. void BMPHeader::print(std::ostream & out)
  14. {
  15. CDefHandler::print(out,fullSize,4);
  16. CDefHandler::print(out,_h1,4);
  17. CDefHandler::print(out,_c1,4);
  18. CDefHandler::print(out,_c2,4);
  19. CDefHandler::print(out,x,4);
  20. CDefHandler::print(out,y,4);
  21. CDefHandler::print(out,_c3,2);
  22. CDefHandler::print(out,_c4,2);
  23. CDefHandler::print(out,_h2,4);
  24. CDefHandler::print(out,_h3,4);
  25. CDefHandler::print(out,dataSize1,4);
  26. CDefHandler::print(out,dataSize2,4);
  27. for (int i=0;i<8;i++)
  28. out << _c5[i];
  29. out.flush();
  30. }
  31. CDefHandler::~CDefHandler()
  32. {
  33. for (int i=0; i<ourImages.size(); i++)
  34. {
  35. if (ourImages[i].bitmap)
  36. {
  37. SDL_FreeSurface(ourImages[i].bitmap);
  38. ourImages[i].bitmap=NULL;
  39. }
  40. }
  41. }
  42. void CDefHandler::openDef(std::string name)
  43. {
  44. int i,j, totalInBlock;
  45. char Buffer[13];
  46. defName=name;
  47. int andame;
  48. std::ifstream * is = new std::ifstream();
  49. is -> open(name.c_str(),std::ios::binary);
  50. is->seekg(0,std::ios::end); // na koniec
  51. andame = is->tellg(); // read length
  52. is->seekg(0,std::ios::beg); // wracamy na poczatek
  53. FDef = new unsigned char[andame]; // allocate memory
  54. is->read((char*)FDef, andame); // read map file to buffer
  55. is->close();
  56. delete is;
  57. i = 0;
  58. DEFType = readNormalNr(i,4); i+=4;
  59. fullWidth = readNormalNr(i,4); i+=4;
  60. fullHeight = readNormalNr(i,4); i+=4;
  61. i=0xc;
  62. totalBlocks = readNormalNr(i,4); i+=4;
  63. i=0x10;
  64. for (int it=0;it<256;it++)
  65. {
  66. palette[it].R = FDef[i++];
  67. palette[it].G = FDef[i++];
  68. palette[it].B = FDef[i++];
  69. palette[it].F = 0;
  70. }
  71. i=0x310;
  72. totalEntries=0;
  73. for (int z=0; z<totalBlocks; z++)
  74. {
  75. i+=4;
  76. totalInBlock = readNormalNr(i,4); i+=4;
  77. for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
  78. SEntries.push_back(SEntry());
  79. i+=8;
  80. for (j=0; j<totalInBlock; j++)
  81. {
  82. for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
  83. i+=13;
  84. SEntries[totalEntries+j].name=Buffer;
  85. }
  86. for (j=0; j<totalInBlock; j++)
  87. {
  88. SEntries[totalEntries+j].offset = readNormalNr(i,4);
  89. i+=4;
  90. }
  91. //totalEntries+=totalInBlock;
  92. for(int hh=0; hh<totalInBlock; ++hh)
  93. {
  94. SEntries[totalEntries].group = z;
  95. ++totalEntries;
  96. }
  97. }
  98. for(j=0; j<SEntries.size(); ++j)
  99. {
  100. SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
  101. }
  102. for(int i=0; i<SEntries.size(); ++i)
  103. {
  104. Cimage nimg;
  105. nimg.bitmap = getSprite(i);
  106. nimg.imName = SEntries[i].name;
  107. nimg.groupNumber = SEntries[i].group;
  108. ourImages.push_back(nimg);
  109. }
  110. delete FDef;
  111. }
  112. void CDefHandler::openFromMemory(unsigned char *table, int size, std::string name)
  113. {
  114. int i,j, totalInBlock;
  115. char Buffer[13];
  116. defName=name;
  117. FDef = new unsigned char[size]; // allocate memory
  118. for (int i=0;i<size;i++)
  119. FDef[i]=table[i];
  120. int andame = size;
  121. i = 0;
  122. DEFType = readNormalNr(i,4); i+=4;
  123. fullWidth = readNormalNr(i,4); i+=4;
  124. fullHeight = readNormalNr(i,4); i+=4;
  125. i=0xc;
  126. totalBlocks = readNormalNr(i,4); i+=4;
  127. i=0x10;
  128. for (int it=0;it<256;it++)
  129. {
  130. palette[it].R = FDef[i++];
  131. palette[it].G = FDef[i++];
  132. palette[it].B = FDef[i++];
  133. palette[it].F = 0;
  134. }
  135. i=0x310;
  136. totalEntries=0;
  137. for (int z=0; z<totalBlocks; z++)
  138. {
  139. int unknown1 = readNormalNr(i,4); i+=4;
  140. totalInBlock = readNormalNr(i,4); i+=4;
  141. for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
  142. SEntries.push_back(SEntry());
  143. int unknown2 = readNormalNr(i,4); i+=4;
  144. int unknown3 = readNormalNr(i,4); i+=4;
  145. for (j=0; j<totalInBlock; j++)
  146. {
  147. for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
  148. i+=13;
  149. SEntries[totalEntries+j].name=Buffer;
  150. }
  151. for (j=0; j<totalInBlock; j++)
  152. {
  153. SEntries[totalEntries+j].offset = readNormalNr(i,4);
  154. int unknown4 = readNormalNr(i,4); i+=4;
  155. }
  156. //totalEntries+=totalInBlock;
  157. for(int hh=0; hh<totalInBlock; ++hh)
  158. {
  159. SEntries[totalEntries].group = z;
  160. ++totalEntries;
  161. }
  162. }
  163. for(j=0; j<SEntries.size(); ++j)
  164. {
  165. SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
  166. }
  167. for(int i=0; i<SEntries.size(); ++i)
  168. {
  169. Cimage nimg;
  170. nimg.bitmap = getSprite(i);
  171. nimg.imName = SEntries[i].name;
  172. nimg.groupNumber = SEntries[i].group;
  173. ourImages.push_back(nimg);
  174. }
  175. delete FDef;
  176. }
  177. unsigned char * CDefHandler::writeNormalNr (int nr, int bytCon)
  178. {
  179. //int tralalalatoniedziala = 2*9+100-4*bytCon;
  180. //unsigned char * ret = new unsigned char[bytCon];
  181. unsigned char * ret = NULL;
  182. for(int jj=0; jj<100; ++jj)
  183. {
  184. ret = (unsigned char*)calloc(1, bytCon);
  185. if(ret!=NULL)
  186. break;
  187. }
  188. long long amp = pow((float)256,bytCon-1);
  189. for (int i=bytCon-1; i>=0;i--)
  190. {
  191. int test2 = nr/(amp);
  192. ret[i]=test2;
  193. nr -= (nr/(amp))*amp;
  194. amp/=256;
  195. }
  196. return ret;
  197. }
  198. void CDefHandler::expand(unsigned char N,unsigned char & BL, unsigned char & BR)
  199. {
  200. BL = (N & 0xE0) >> 5;
  201. BR = N & 0x1F;
  202. }
  203. int CDefHandler::readNormalNr (int pos, int bytCon, unsigned char * str, bool cyclic)
  204. {
  205. int ret=0;
  206. int amp=1;
  207. if (str)
  208. {
  209. for (int i=0; i<bytCon; i++)
  210. {
  211. ret+=str[pos+i]*amp;
  212. amp*=256;
  213. }
  214. }
  215. else
  216. {
  217. for (int i=0; i<bytCon; i++)
  218. {
  219. ret+=FDef[pos+i]*amp;
  220. amp*=256;
  221. }
  222. }
  223. if(cyclic && bytCon<4 && ret>=amp/2)
  224. {
  225. ret = ret-amp;
  226. }
  227. return ret;
  228. }
  229. void CDefHandler::print (std::ostream & stream, int nr, int bytcon)
  230. {
  231. unsigned char * temp = writeNormalNr(nr,bytcon);
  232. for (int i=0;i<bytcon;i++)
  233. stream << char(temp[i]);
  234. free(temp);
  235. }
  236. SDL_Surface * CDefHandler::getSprite (int SIndex)
  237. {
  238. SDL_Surface * ret;
  239. long BaseOffset,
  240. SpriteWidth, SpriteHeight, //format sprite'a
  241. LeftMargin, RightMargin, TopMargin,BottomMargin,
  242. i, add, FullHeight,FullWidth,
  243. TotalRowLength, // dlugosc przeczytanego segmentu
  244. NextSpriteOffset, RowAdd;
  245. std::ifstream Fdef;
  246. unsigned char SegmentType, SegmentLength, BL, BR;
  247. unsigned char * TempDef; //memory
  248. std::string FTemp;
  249. i=BaseOffset=SEntries[SIndex].offset;
  250. int prSize=readNormalNr(i,4,FDef);i+=4;
  251. int defType2 = readNormalNr(i,4,FDef);i+=4;
  252. FullWidth = readNormalNr(i,4,FDef);i+=4;
  253. FullHeight = readNormalNr(i,4,FDef);i+=4;
  254. SpriteWidth = readNormalNr(i,4,FDef);i+=4;
  255. SpriteHeight = readNormalNr(i,4,FDef);i+=4;
  256. LeftMargin = readNormalNr(i,4,FDef);i+=4;
  257. TopMargin = readNormalNr(i,4,FDef);i+=4;
  258. RightMargin = FullWidth - SpriteWidth - LeftMargin;
  259. BottomMargin = FullHeight - SpriteHeight - TopMargin;
  260. BMPHeader tb;
  261. tb.x = FullWidth;
  262. tb.y = FullHeight;
  263. tb.dataSize2 = tb.dataSize1 = tb.x*tb.y;
  264. tb.fullSize = tb.dataSize1+436;
  265. tb._h3=tb.fullSize-36;
  266. //add = (int)(4*(((float)1) - ((int)(((int)((float)FullWidth/(float)4))-((float)FullWidth/(float)4)))));
  267. add = 4 - FullWidth%4;
  268. /*if (add==4)
  269. add=0;*/ //moved to defcompression dependent block
  270. #if SDL_BYTEORDER == SDL_BIG_ENDIAN
  271. int rmask = 0xff000000;
  272. int gmask = 0x00ff0000;
  273. int bmask = 0x0000ff00;
  274. int amask = 0x000000ff;
  275. #else
  276. int rmask = 0x000000ff;
  277. int gmask = 0x0000ff00;
  278. int bmask = 0x00ff0000;
  279. int amask = 0xff000000;
  280. #endif
  281. ret = SDL_CreateRGBSurface(SDL_SWSURFACE, FullWidth, FullHeight, 8, 0, 0, 0, 0);
  282. //int tempee2 = readNormalNr(0,4,((unsigned char *)tempee.c_str()));
  283. int BaseOffsetor = BaseOffset = i;
  284. for(int i=0; i<256; ++i)
  285. {
  286. SDL_Color pr;
  287. pr.r = palette[i].R;
  288. pr.g = palette[i].G;
  289. pr.b = palette[i].B;
  290. pr.unused = palette[i].F;
  291. (*(ret->format->palette->colors+i))=pr;
  292. }
  293. for (int i=0;i<800;i++)
  294. fbuffer[i]=0;
  295. if (defType2==0)
  296. {
  297. if (add==4)
  298. add=0;
  299. if (TopMargin>0)
  300. {
  301. for (int i=0;i<TopMargin;i++)
  302. {
  303. for (int j=0;j<FullWidth+add;j++)
  304. FTemp+=fbuffer[j];
  305. }
  306. }
  307. for (int i=0;i<SpriteHeight;i++)
  308. {
  309. if (LeftMargin>0)
  310. {
  311. for (int j=0;j<LeftMargin;j++)
  312. FTemp+=fbuffer[j];
  313. }
  314. for (int j=0; j<SpriteWidth;j++)
  315. FTemp+=FDef[BaseOffset++];
  316. if (RightMargin>0)
  317. {
  318. for (int j=0;j<add;j++)
  319. FTemp+=fbuffer[j];
  320. }
  321. }
  322. if (BottomMargin>0)
  323. {
  324. for (int i=0;i<BottomMargin;i++)
  325. {
  326. for (int j=0;j<FullWidth+add;j++)
  327. FTemp+=fbuffer[j];
  328. }
  329. }
  330. }
  331. if (defType2==1)
  332. {
  333. if (add==4)
  334. add=0; ////////was 3
  335. if (TopMargin>0)
  336. {
  337. for (int i=0;i<TopMargin;i++)
  338. {
  339. for (int j=0;j<FullWidth+add;j++)
  340. FTemp+=fbuffer[j];
  341. }
  342. }
  343. RLEntries = new int[SpriteHeight];
  344. for (int i=0;i<SpriteHeight;i++)
  345. {
  346. RLEntries[i]=readNormalNr(BaseOffset,4,FDef);BaseOffset+=4;
  347. }
  348. for (int i=0;i<SpriteHeight;i++)
  349. {
  350. BaseOffset=BaseOffsetor+RLEntries[i];
  351. if (LeftMargin>0)
  352. {
  353. for (int j=0;j<LeftMargin;j++)
  354. FTemp+=fbuffer[j];
  355. }
  356. TotalRowLength=0;
  357. do
  358. {
  359. SegmentType=FDef[BaseOffset++];
  360. SegmentLength=FDef[BaseOffset++];
  361. if (SegmentType==0xFF)
  362. {
  363. for (int k=0;k<=SegmentLength;k++)
  364. {
  365. FTemp+=FDef[BaseOffset+k];
  366. if ((TotalRowLength+k+1)>=SpriteWidth)
  367. break;
  368. }
  369. BaseOffset+=SegmentLength+1;////
  370. TotalRowLength+=SegmentLength+1;
  371. }
  372. else
  373. {
  374. for (int k=0;k<SegmentLength+1;k++)
  375. {
  376. FTemp+=fbuffer[k];//
  377. //FTemp+='\0';
  378. }
  379. TotalRowLength+=SegmentLength+1;
  380. }
  381. }while(TotalRowLength<SpriteWidth);
  382. RowAdd=SpriteWidth-TotalRowLength;
  383. if (RightMargin>0)
  384. {
  385. for (int j=0;j<RightMargin;j++)
  386. FTemp+=fbuffer[j];
  387. }
  388. if (add>0)
  389. {
  390. for (int j=0;j<add+RowAdd;j++)
  391. FTemp+=fbuffer[j];
  392. }
  393. }
  394. delete RLEntries;
  395. if (BottomMargin>0)
  396. {
  397. for (int i=0;i<BottomMargin;i++)
  398. {
  399. for (int j=0;j<FullWidth+add;j++)
  400. FTemp+=fbuffer[j];
  401. }
  402. }
  403. }
  404. if (defType2==2)
  405. {
  406. if (add==4)
  407. add=0;
  408. if (TopMargin>0)
  409. {
  410. for (int i=0;i<TopMargin;i++)
  411. {
  412. for (int j=0;j<FullWidth+add;j++)
  413. FTemp+=fbuffer[j];
  414. }
  415. }
  416. RWEntries = new unsigned int[SpriteHeight];
  417. for (int i=0;i<SpriteHeight;i++)
  418. {
  419. BaseOffset=BaseOffsetor+i*2*(SpriteWidth/32);
  420. RWEntries[i] = readNormalNr(BaseOffset,2,FDef);
  421. }
  422. BaseOffset = BaseOffsetor+RWEntries[0];
  423. for (int i=0;i<SpriteHeight;i++)
  424. {
  425. //BaseOffset = BaseOffsetor+RWEntries[i];
  426. if (LeftMargin>0)
  427. {
  428. for (int j=0;j<LeftMargin;j++)
  429. FTemp+=fbuffer[j];
  430. }
  431. TotalRowLength=0;
  432. do
  433. {
  434. SegmentType=FDef[BaseOffset++];
  435. unsigned char code = SegmentType / 32;
  436. unsigned char value = (SegmentType & 31) + 1;
  437. if(code==7)
  438. {
  439. for(int h=0; h<value; ++h)
  440. {
  441. FTemp+=FDef[BaseOffset++];
  442. }
  443. }
  444. else
  445. {
  446. for(int h=0; h<value; ++h)
  447. {
  448. FTemp+=code;
  449. }
  450. }
  451. TotalRowLength+=value;
  452. } while(TotalRowLength<SpriteWidth);
  453. if (RightMargin>0)
  454. {
  455. for (int j=0;j<RightMargin;j++)
  456. FTemp+=fbuffer[j];
  457. }
  458. if (add>0)
  459. {
  460. for (int j=0;j<add+RowAdd;j++)
  461. FTemp+=fbuffer[j];
  462. }
  463. }
  464. delete RWEntries;
  465. if (BottomMargin>0)
  466. {
  467. for (int i=0;i<BottomMargin;i++)
  468. {
  469. for (int j=0;j<FullWidth+add;j++)
  470. FTemp+=fbuffer[j];
  471. }
  472. }
  473. }
  474. if (defType2==3)
  475. {
  476. if (add==4)
  477. add=0;
  478. if (TopMargin>0)
  479. {
  480. for (int i=0;i<TopMargin;i++)
  481. {
  482. for (int j=0;j<FullWidth+add;j++)
  483. FTemp+=fbuffer[j];
  484. }
  485. }
  486. RWEntries = new unsigned int[SpriteHeight];
  487. for (int i=0;i<SpriteHeight;i++)
  488. {
  489. BaseOffset=BaseOffsetor+i*2*(SpriteWidth/32);
  490. RWEntries[i] = readNormalNr(BaseOffset,2,FDef);
  491. }
  492. for (int i=0;i<SpriteHeight;i++)
  493. {
  494. BaseOffset = BaseOffsetor+RWEntries[i];
  495. if (LeftMargin>0)
  496. {
  497. for (int j=0;j<LeftMargin;j++)
  498. FTemp+=fbuffer[j];
  499. }
  500. TotalRowLength=0;
  501. do
  502. {
  503. SegmentType=FDef[BaseOffset++];
  504. unsigned char code = SegmentType / 32;
  505. unsigned char value = (SegmentType & 31) + 1;
  506. if(code==7)
  507. {
  508. for(int h=0; h<value; ++h)
  509. {
  510. FTemp+=FDef[BaseOffset++];
  511. }
  512. }
  513. else
  514. {
  515. for(int h=0; h<value; ++h)
  516. {
  517. FTemp+=code;
  518. }
  519. }
  520. TotalRowLength+=value;
  521. }while(TotalRowLength<SpriteWidth);
  522. if (RightMargin>0)
  523. {
  524. for (int j=0;j<RightMargin;j++)
  525. FTemp+=fbuffer[j];
  526. }
  527. if (add>0)
  528. {
  529. for (int j=0;j<add+RowAdd;j++)
  530. FTemp+=fbuffer[j];
  531. }
  532. }
  533. delete RWEntries;
  534. if (BottomMargin>0)
  535. {
  536. for (int i=0;i<BottomMargin;i++)
  537. {
  538. for (int j=0;j<FullWidth+add;j++)
  539. FTemp+=fbuffer[j];
  540. }
  541. }
  542. }
  543. for (int i=0; i<FullHeight; ++i)
  544. {
  545. for (int j=0;j<FullWidth+add;j++)
  546. {
  547. *((char*)ret->pixels + ret->format->BytesPerPixel * (i*(fullWidth+add) + j)) = FTemp[i*(FullWidth+add)+j];
  548. }
  549. }
  550. SDL_Color ttcol = ret->format->palette->colors[0];
  551. Uint32 keycol = SDL_MapRGBA(ret->format, ttcol.r, ttcol.b, ttcol.g, ttcol.unused);
  552. SDL_SetColorKey(ret, SDL_SRCCOLORKEY, keycol);
  553. return ret;
  554. };
  555. CDefEssential * CDefHandler::essentialize()
  556. {
  557. CDefEssential * ret = new CDefEssential;
  558. ret->ourImages = ourImages;
  559. return ret;
  560. }