Graphics.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. #include "../stdafx.h"
  2. #include "Graphics.h"
  3. #include "../hch/CDefHandler.h"
  4. #include "../hch/CObjectHandler.h"
  5. //#include "../hch/CHeroHandler.h"
  6. #include "../SDL_Extensions.h"
  7. #include <boost/assign/std/vector.hpp>
  8. #include <sstream>
  9. #include <iomanip>
  10. #include <boost/thread.hpp>
  11. #include <boost/bind.hpp>
  12. using namespace CSDL_Ext;
  13. Graphics * graphics = NULL;
  14. SDL_Surface * Graphics::drawPrimarySkill(const CGHeroInstance *curh, SDL_Surface *ret, int from, int to)
  15. {
  16. char * buf = new char[10];
  17. for (int i=from;i<to;i++)
  18. {
  19. itoa(curh->primSkills[i],buf,10);
  20. printAtMiddle(buf,84+28*i,68,GEOR13,zwykly,ret);
  21. }
  22. delete[] buf;
  23. return ret;
  24. }
  25. SDL_Surface * Graphics::drawHeroInfoWin(const CGHeroInstance * curh)
  26. {
  27. char * buf = new char[10];
  28. SDL_Surface * ret = SDL_DisplayFormat(hInfo);
  29. blueToPlayersAdv(hInfo,curh->tempOwner,1);
  30. SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255));
  31. printAt(curh->name,75,15,GEOR13,zwykly,ret);
  32. drawPrimarySkill(curh, ret);
  33. for (std::map<int,std::pair<CCreature*,int> >::const_iterator i=curh->army.slots.begin(); i!=curh->army.slots.end();i++)
  34. {
  35. blitAt(graphics->smallImgs[(*i).second.first->idNumber],slotsPos[(*i).first].first+1,slotsPos[(*i).first].second+1,ret);
  36. itoa((*i).second.second,buf,10);
  37. printAtMiddle(buf,slotsPos[(*i).first].first+17,slotsPos[(*i).first].second+39,GEORM,zwykly,ret);
  38. }
  39. blitAt(graphics->portraitLarge[curh->subID],11,12,ret);
  40. itoa(curh->mana,buf,10);
  41. printAtMiddle(buf,166,109,GEORM,zwykly,ret); //mana points
  42. delete[] buf;
  43. blitAt(morale22->ourImages[curh->getCurrentMorale()+3].bitmap,14,84,ret);
  44. blitAt(luck22->ourImages[curh->getCurrentLuck()+3].bitmap,14,101,ret);
  45. //SDL_SaveBMP(ret,"inf1.bmp");
  46. return ret;
  47. }
  48. SDL_Surface * Graphics::drawTownInfoWin(const CGTownInstance * curh)
  49. {
  50. char * buf = new char[10];
  51. blueToPlayersAdv(tInfo,curh->tempOwner,1);
  52. SDL_Surface * ret = SDL_DisplayFormat(tInfo);
  53. SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255));
  54. printAt(curh->name,75,15,GEOR13,zwykly,ret);
  55. int pom = curh->fortLevel() - 1; if(pom<0) pom = 3;
  56. blitAt(forts->ourImages[pom].bitmap,115,42,ret);
  57. if((pom=curh->hallLevel())>=0)
  58. blitAt(halls->ourImages[pom].bitmap,77,42,ret);
  59. itoa(curh->dailyIncome(),buf,10);
  60. printAtMiddle(buf,167,70,GEORM,zwykly,ret);
  61. for (std::map<int,std::pair<CCreature*,int> >::const_iterator i=curh->army.slots.begin(); i!=curh->army.slots.end();i++)
  62. {
  63. if(!i->second.first)
  64. continue;
  65. blitAt(graphics->smallImgs[(*i).second.first->idNumber],slotsPos[(*i).first].first+1,slotsPos[(*i).first].second+1,ret);
  66. itoa((*i).second.second,buf,10);
  67. printAtMiddle(buf,slotsPos[(*i).first].first+17,slotsPos[(*i).first].second+39,GEORM,zwykly,ret);
  68. }
  69. //blit town icon
  70. pom = curh->subID*2;
  71. if (!curh->hasFort())
  72. pom += F_NUMBER*2;
  73. if(curh->builded >= MAX_BUILDING_PER_TURN)
  74. pom++;
  75. blitAt(bigTownPic->ourImages[pom].bitmap,13,13,ret);
  76. delete[] buf;
  77. return ret;
  78. }
  79. Graphics::Graphics()
  80. {
  81. artDefs = CDefHandler::giveDef("ARTIFACT.DEF");
  82. hInfo = BitmapHandler::loadBitmap("HEROQVBK.bmp");
  83. SDL_SetColorKey(hInfo,SDL_SRCCOLORKEY,SDL_MapRGB(hInfo->format,0,255,255));
  84. tInfo = BitmapHandler::loadBitmap("TOWNQVBK.bmp");
  85. SDL_SetColorKey(tInfo,SDL_SRCCOLORKEY,SDL_MapRGB(tInfo->format,0,255,255));
  86. slotsPos.push_back(std::pair<int,int>(44,82));
  87. slotsPos.push_back(std::pair<int,int>(80,82));
  88. slotsPos.push_back(std::pair<int,int>(116,82));
  89. slotsPos.push_back(std::pair<int,int>(26,131));
  90. slotsPos.push_back(std::pair<int,int>(62,131));
  91. slotsPos.push_back(std::pair<int,int>(98,131));
  92. slotsPos.push_back(std::pair<int,int>(134,131));
  93. luck22 = CDefHandler::giveDefEss("ILCK22.DEF");
  94. luck30 = CDefHandler::giveDefEss("ILCK30.DEF");
  95. luck42 = CDefHandler::giveDefEss("ILCK42.DEF");
  96. luck82 = CDefHandler::giveDefEss("ILCK82.DEF");
  97. morale22 = CDefHandler::giveDefEss("IMRL22.DEF");
  98. morale30 = CDefHandler::giveDefEss("IMRL30.DEF");
  99. morale42 = CDefHandler::giveDefEss("IMRL42.DEF");
  100. morale82 = CDefHandler::giveDefEss("IMRL82.DEF");
  101. halls = CDefHandler::giveDefEss("ITMTLS.DEF");
  102. forts = CDefHandler::giveDefEss("ITMCLS.DEF");
  103. bigTownPic = CDefHandler::giveDefEss("ITPT.DEF");
  104. std::ifstream ifs;
  105. ifs.open("config/cr_bgs.txt");
  106. while(!ifs.eof())
  107. {
  108. int id;
  109. std::string name;
  110. ifs >> id >> name;
  111. backgrounds[id]=BitmapHandler::loadBitmap(name);
  112. }
  113. ifs.close();
  114. ifs.clear();
  115. //loading 32x32px imgs
  116. CDefHandler *smi = CDefHandler::giveDef("CPRSMALL.DEF");
  117. smi->notFreeImgs = true;
  118. for (int i=0; i<smi->ourImages.size(); i++)
  119. {
  120. smallImgs[i-2] = smi->ourImages[i].bitmap;
  121. }
  122. delete smi;
  123. smi = CDefHandler::giveDef("TWCRPORT.DEF");
  124. smi->notFreeImgs = true;
  125. for (int i=0; i<smi->ourImages.size(); i++)
  126. {
  127. bigImgs[i-2] = smi->ourImages[i].bitmap;
  128. }
  129. delete smi;
  130. std::ifstream of("config/portrety.txt");
  131. for (int j=0;j<HEROES_QUANTITY;j++)
  132. {
  133. int ID;
  134. of>>ID;
  135. std::string path;
  136. of>>path;
  137. portraitSmall.push_back(BitmapHandler::loadBitmap(path));
  138. //if (!heroes[ID]->portraitSmall)
  139. // std::cout<<"Can't read small portrait for "<<ID<<" ("<<path<<")\n";
  140. for(int ff=0; ff<path.size(); ++ff) //size letter is usually third one, but there are exceptions an it should fix the problem
  141. {
  142. if(path[ff]=='S')
  143. {
  144. path[ff]='L';
  145. break;
  146. }
  147. }
  148. portraitLarge.push_back(BitmapHandler::loadBitmap(path));
  149. //if (!heroes[ID]->portraitLarge)
  150. // std::cout<<"Can't read large portrait for "<<ID<<" ("<<path<<")\n";
  151. SDL_SetColorKey(portraitLarge[portraitLarge.size()-1],SDL_SRCCOLORKEY,SDL_MapRGB(portraitLarge[portraitLarge.size()-1]->format,0,255,255));
  152. }
  153. of.close();
  154. pskillsb = CDefHandler::giveDef("PSKILL.DEF");
  155. resources = CDefHandler::giveDef("RESOUR82.DEF");
  156. un44 = CDefHandler::giveDef("UN44.DEF");
  157. smallIcons = CDefHandler::giveDef("ITPA.DEF");
  158. resources32 = CDefHandler::giveDef("RESOURCE.DEF");
  159. loadHeroFlags();
  160. }
  161. void Graphics::loadHeroAnim(std::vector<CDefHandler **> & anims)
  162. {
  163. for(int i=0; i<anims.size();i++)
  164. {
  165. std::stringstream nm;
  166. nm<<"AH";
  167. nm<<std::setw(2);
  168. nm<<std::setfill('0');
  169. nm<<i;
  170. nm<<"_.DEF";
  171. std::string name = nm.str();
  172. (*anims[i]) = CDefHandler::giveDef(name);
  173. //(CDefHandler*)(((void*)hc)+((void*)moveAnim)) = CDefHandler::giveDef(name);
  174. for(int o=0; o<(*anims[i])->ourImages.size(); ++o)
  175. {
  176. if((*anims[i])->ourImages[o].groupNumber==6)
  177. {
  178. for(int e=0; e<8; ++e)
  179. {
  180. Cimage nci;
  181. nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o+e].bitmap);
  182. nci.groupNumber = 10;
  183. nci.imName = std::string();
  184. (*anims[i])->ourImages.push_back(nci);
  185. }
  186. o+=8;
  187. }
  188. if((*anims[i])->ourImages[o].groupNumber==7)
  189. {
  190. for(int e=0; e<8; ++e)
  191. {
  192. Cimage nci;
  193. nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o+e].bitmap);
  194. nci.groupNumber = 11;
  195. nci.imName = std::string();
  196. (*anims[i])->ourImages.push_back(nci);
  197. }
  198. o+=8;
  199. }
  200. if((*anims[i])->ourImages[o].groupNumber==8)
  201. {
  202. for(int e=0; e<8; ++e)
  203. {
  204. Cimage nci;
  205. nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o+e].bitmap);
  206. nci.groupNumber = 12;
  207. nci.imName = std::string();
  208. (*anims[i])->ourImages.push_back(nci);
  209. }
  210. o+=8;
  211. }
  212. }
  213. for(int o=0; o<(*anims[i])->ourImages.size(); ++o)
  214. {
  215. if((*anims[i])->ourImages[o].groupNumber==1)
  216. {
  217. Cimage nci;
  218. nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o].bitmap);
  219. nci.groupNumber = 13;
  220. nci.imName = std::string();
  221. (*anims[i])->ourImages.push_back(nci);
  222. //o+=1;
  223. }
  224. if((*anims[i])->ourImages[o].groupNumber==2)
  225. {
  226. Cimage nci;
  227. nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o].bitmap);
  228. nci.groupNumber = 14;
  229. nci.imName = std::string();
  230. (*anims[i])->ourImages.push_back(nci);
  231. //o+=1;
  232. }
  233. if((*anims[i])->ourImages[o].groupNumber==3)
  234. {
  235. Cimage nci;
  236. nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o].bitmap);
  237. nci.groupNumber = 15;
  238. nci.imName = std::string();
  239. (*anims[i])->ourImages.push_back(nci);
  240. //o+=1;
  241. }
  242. }
  243. for(int ff=0; ff<(*anims[i])->ourImages.size(); ++ff)
  244. {
  245. CSDL_Ext::alphaTransform((*anims[i])->ourImages[ff].bitmap);
  246. }
  247. (*anims[i])->alphaTransformed = true;
  248. }
  249. }
  250. void Graphics::loadHeroFlags(std::pair<std::vector<CDefHandler *> Graphics::*, std::vector<const char *> > &pr, bool mode)
  251. {
  252. for(int i=0;i<8;i++)
  253. (this->*pr.first).push_back(CDefHandler::giveDef(pr.second[i]));
  254. for(int q=0; q<8; ++q)
  255. {
  256. for(int o=0; o<(this->*pr.first)[q]->ourImages.size(); ++o)
  257. {
  258. if((this->*pr.first)[q]->ourImages[o].groupNumber==6)
  259. {
  260. for(int e=0; e<8; ++e)
  261. {
  262. Cimage nci;
  263. nci.bitmap = CSDL_Ext::rotate01((this->*pr.first)[q]->ourImages[o+e].bitmap);
  264. nci.groupNumber = 10;
  265. nci.imName = std::string();
  266. (this->*pr.first)[q]->ourImages.push_back(nci);
  267. }
  268. o+=8;
  269. }
  270. if((this->*pr.first)[q]->ourImages[o].groupNumber==7)
  271. {
  272. for(int e=0; e<8; ++e)
  273. {
  274. Cimage nci;
  275. nci.bitmap = CSDL_Ext::rotate01((this->*pr.first)[q]->ourImages[o+e].bitmap);
  276. nci.groupNumber = 11;
  277. nci.imName = std::string();
  278. (this->*pr.first)[q]->ourImages.push_back(nci);
  279. }
  280. o+=8;
  281. }
  282. if((this->*pr.first)[q]->ourImages[o].groupNumber==8)
  283. {
  284. for(int e=0; e<8; ++e)
  285. {
  286. Cimage nci;
  287. nci.bitmap = CSDL_Ext::rotate01((this->*pr.first)[q]->ourImages[o+e].bitmap);
  288. nci.groupNumber = 12;
  289. nci.imName = std::string();
  290. (this->*pr.first)[q]->ourImages.push_back(nci);
  291. }
  292. o+=8;
  293. }
  294. }
  295. if (mode)
  296. {
  297. for(int o=0; o<flags4[q]->ourImages.size(); ++o)
  298. {
  299. if(flags4[q]->ourImages[o].groupNumber==1)
  300. {
  301. for(int e=0; e<8; ++e)
  302. {
  303. Cimage nci;
  304. nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
  305. nci.groupNumber = 13;
  306. nci.imName = std::string();
  307. flags4[q]->ourImages.push_back(nci);
  308. }
  309. o+=8;
  310. }
  311. if(flags4[q]->ourImages[o].groupNumber==2)
  312. {
  313. for(int e=0; e<8; ++e)
  314. {
  315. Cimage nci;
  316. nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
  317. nci.groupNumber = 14;
  318. nci.imName = std::string();
  319. flags4[q]->ourImages.push_back(nci);
  320. }
  321. o+=8;
  322. }
  323. if(flags4[q]->ourImages[o].groupNumber==3)
  324. {
  325. for(int e=0; e<8; ++e)
  326. {
  327. Cimage nci;
  328. nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
  329. nci.groupNumber = 15;
  330. nci.imName = std::string();
  331. flags4[q]->ourImages.push_back(nci);
  332. }
  333. o+=8;
  334. }
  335. }
  336. }
  337. for(int ff=0; ff<(this->*pr.first)[q]->ourImages.size(); ++ff)
  338. {
  339. SDL_SetColorKey((this->*pr.first)[q]->ourImages[ff].bitmap, SDL_SRCCOLORKEY,
  340. SDL_MapRGB((this->*pr.first)[q]->ourImages[ff].bitmap->format, 0, 255, 255)
  341. );
  342. }
  343. (this->*pr.first)[q]->alphaTransformed = true;
  344. }
  345. }
  346. void Graphics::loadHeroFlags()
  347. {
  348. using namespace boost::assign;
  349. timeHandler th;
  350. std::vector<CDefHandler *> Graphics::*point;
  351. std::pair<std::vector<CDefHandler *> Graphics::*, std::vector<const char *> > pr[4];
  352. pr[0].first = &Graphics::flags1;
  353. pr[0].second+=("ABF01L.DEF"),("ABF01G.DEF"),("ABF01R.DEF"),("ABF01D.DEF"),("ABF01B.DEF"),
  354. ("ABF01P.DEF"),("ABF01W.DEF"),("ABF01K.DEF");
  355. pr[1].first = &Graphics::flags2;
  356. pr[1].second+=("ABF02L.DEF"),("ABF02G.DEF"),("ABF02R.DEF"),("ABF02D.DEF"),("ABF02B.DEF"),
  357. ("ABF02P.DEF"),("ABF02W.DEF"),("ABF02K.DEF");
  358. pr[2].first = &Graphics::flags3;
  359. pr[2].second+=("ABF03L.DEF"),("ABF03G.DEF"),("ABF03R.DEF"),("ABF03D.DEF"),("ABF03B.DEF"),
  360. ("ABF03P.DEF"),("ABF03W.DEF"),("ABF03K.DEF");
  361. pr[3].first = &Graphics::flags4;
  362. pr[3].second+=("AF00.DEF"),("AF01.DEF"),("AF02.DEF"),("AF03.DEF"),("AF04.DEF"),
  363. ("AF05.DEF"),("AF06.DEF"),("AF07.DEF");
  364. boost::thread_group grupa;
  365. grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[3]),true));
  366. grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[2]),false));
  367. grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[1]),false));
  368. grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[0]),false));
  369. grupa.join_all();
  370. std::cout << "Flagi: "<<th.getDif()<<std::endl;
  371. }
  372. SDL_Surface * Graphics::getPic(int ID, bool fort, bool builded)
  373. {
  374. if (ID==-1)
  375. return smallIcons->ourImages[0].bitmap;
  376. else if (ID==-2)
  377. return smallIcons->ourImages[1].bitmap;
  378. else if (ID==-3)
  379. return smallIcons->ourImages[2+F_NUMBER*4].bitmap;
  380. else if (ID>F_NUMBER || ID<-3)
  381. throw new std::exception("Invalid ID");
  382. else
  383. {
  384. int pom = 3;
  385. if(!fort)
  386. pom+=F_NUMBER*2;
  387. pom += ID*2;
  388. if (!builded)
  389. pom--;
  390. return smallIcons->ourImages[pom].bitmap;
  391. }
  392. }