CCastleInterface.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "stdafx.h"
  2. #include "CCastleInterface.h"
  3. #include "hch/CObjectHandler.h"
  4. #include "CGameInfo.h"
  5. #include "hch/CLodHandler.h"
  6. #include "SDL_Extensions.h"
  7. #include "CAdvmapInterface.h"
  8. #include "hch/CTownHandler.h"
  9. #include "AdventureMapButton.h"
  10. #include <sstream>
  11. std::string getBgName(int type) //TODO - co z tym zrobiæ?
  12. {
  13. switch (type)
  14. {
  15. case 0:
  16. return "TBCSBACK.bmp";
  17. case 1:
  18. return "TBRMBACK.bmp";
  19. case 2:
  20. return "TBTWBACK.bmp";
  21. case 3:
  22. return "TBINBACK.bmp";
  23. case 4:
  24. return "TBNCBACK.bmp";
  25. case 5:
  26. return "TBDNBACK.bmp";
  27. case 6:
  28. return "TBSTBACK.bmp";
  29. case 7:
  30. return "TBFRBACK.bmp";
  31. case 8:
  32. return "TBELBACK.bmp";
  33. default:
  34. throw new std::exception("std::string getBgName(int type): invalid type");
  35. }
  36. }
  37. class SORTHELP
  38. {
  39. public:
  40. bool operator ()
  41. (const boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *a ,
  42. const boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *b)
  43. {
  44. return (a->get<0>())<(b->get<0>());
  45. }
  46. } srthlp ;
  47. CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
  48. {
  49. town = Town;
  50. townInt = CGI->bitmaph->loadBitmap("TOWNSCRN.bmp");
  51. cityBg = CGI->bitmaph->loadBitmap(getBgName(town->subID));
  52. hall = CGI->spriteh->giveDef("ITMTL.DEF");
  53. fort = CGI->spriteh->giveDef("ITMCL.DEF");
  54. bigTownPic = CGI->spriteh->giveDef("ITPT.DEF");
  55. flag = CGI->spriteh->giveDef("CREST58.DEF");
  56. CSDL_Ext::blueToPlayersAdv(townInt,LOCPLINT->playerID);
  57. exit = new AdventureMapButton<CCastleInterface>(CGI->townh->tcommands[8],"",&CCastleInterface::close,744,544,"TSBTNS.DEF",this,Activate);
  58. exit->bitmapOffset = 4;
  59. for (std::set<int>::const_iterator i=town->builtBuildings.begin();i!=town->builtBuildings.end();i++)
  60. {
  61. if(CGI->townh->structures.find(town->subID) != CGI->townh->structures.end())
  62. {
  63. if(CGI->townh->structures[town->subID].find(*i)!=CGI->townh->structures[town->subID].end())
  64. {
  65. CDefHandler *b = CGI->spriteh->giveDef(CGI->townh->structures[town->subID][*i]->defName);
  66. boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *t
  67. = new boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*>
  68. (*i,b,CGI->townh->structures[town->subID][*i],NULL,NULL);
  69. //TODO: obwódki i pola
  70. buildings.push_back(t);
  71. }
  72. else continue;
  73. }
  74. else
  75. break;
  76. }
  77. std::sort(buildings.begin(),buildings.end(),srthlp);
  78. if(Activate)
  79. {
  80. activate();
  81. show();
  82. }
  83. }
  84. CCastleInterface::~CCastleInterface()
  85. {
  86. SDL_FreeSurface(townInt);
  87. SDL_FreeSurface(cityBg);
  88. delete exit;
  89. delete hall;
  90. delete fort;
  91. delete bigTownPic;
  92. delete flag;
  93. for(int i=0;i<buildings.size();i++)
  94. {
  95. if (buildings[i]->get<1>())
  96. delete (buildings[i]->get<1>());
  97. //if (buildings[i]->get<2>())
  98. // delete (buildings[i]->get<2>());
  99. if (buildings[i]->get<3>())
  100. SDL_FreeSurface(buildings[i]->get<3>());
  101. if (buildings[i]->get<4>())
  102. SDL_FreeSurface(buildings[i]->get<4>());
  103. delete buildings[i];
  104. }
  105. }
  106. void CCastleInterface::close()
  107. {
  108. deactivate();
  109. LOCPLINT->castleInt = NULL;
  110. LOCPLINT->adventureInt->show();
  111. delete this;
  112. }
  113. void CCastleInterface::show()
  114. {
  115. blitAt(cityBg,0,0);
  116. blitAt(townInt,0,374);
  117. LOCPLINT->adventureInt->resdatabar.draw();
  118. int pom;
  119. //draw fort icon
  120. if(town->builtBuildings.find(9)!=town->builtBuildings.end())
  121. pom = 2;
  122. else if(town->builtBuildings.find(8)!=town->builtBuildings.end())
  123. pom = 1;
  124. else if(town->builtBuildings.find(7)!=town->builtBuildings.end())
  125. pom = 0;
  126. else pom = 3;
  127. blitAt(fort->ourImages[pom].bitmap,122,413);
  128. //draw ((village/town/city) hall)/capitol icon
  129. if(town->builtBuildings.find(13)!=town->builtBuildings.end())
  130. pom = 3;
  131. else if(town->builtBuildings.find(12)!=town->builtBuildings.end())
  132. pom = 2;
  133. else if(town->builtBuildings.find(11)!=town->builtBuildings.end())
  134. pom = 1;
  135. else pom = 0;
  136. blitAt(hall->ourImages[pom].bitmap,80,413);
  137. //draw creatures icons and their growths
  138. for(int i=0;i<CREATURES_PER_TOWN;i++)
  139. {
  140. int cid = -1;
  141. if (town->builtBuildings.find(30+i)!=town->builtBuildings.end())
  142. {
  143. cid = (14*town->subID)+(i*2);
  144. if (town->builtBuildings.find(30+CREATURES_PER_TOWN+i)!=town->builtBuildings.end())
  145. {
  146. cid++;
  147. }
  148. }
  149. if (cid>=0)
  150. {
  151. int pomx, pomy;
  152. pomx = 22 + (55*((i>3)?(i-4):i));
  153. pomy = (i>3)?(507):(459);
  154. blitAt(CGI->creh->smallImgs[cid],pomx,pomy);
  155. std::ostringstream oss;
  156. oss << '+' << town->creatureIncome[i];
  157. CSDL_Ext::printAtMiddle(oss.str(),pomx+16,pomy+37,GEOR13,zwykly);
  158. }
  159. }
  160. //print name and income
  161. CSDL_Ext::printAt(town->name,85,389,GEOR13,zwykly);
  162. char temp[10];
  163. itoa(town->income,temp,10);
  164. CSDL_Ext::printAtMiddle(temp,195,442,GEOR13,zwykly);
  165. //blit town icon
  166. pom = town->subID*2;
  167. if (!town->hasFort())
  168. pom += F_NUMBER*2;
  169. if(town->builded >= MAX_BUILDING_PER_TURN)
  170. pom++;
  171. blitAt(bigTownPic->ourImages[pom].bitmap,15,387);
  172. //flag
  173. blitAt(flag->ourImages[town->getOwner()].bitmap,241,387);
  174. //print garrison
  175. for(std::map<int,std::pair<CCreature*,int> >::const_iterator i=town->garrison.slots.begin();i!=town->garrison.slots.end();i++)
  176. {
  177. blitAt(CGI->creh->bigImgs[i->second.first->idNumber],305+(62*(i->first)),387);
  178. itoa(i->second.second,temp,10);
  179. CSDL_Ext::printTo(temp,305+(62*(i->first))+57,387+61,GEOR13,zwykly);
  180. }
  181. //blit buildings
  182. for(int i=0;i<buildings.size();i++)
  183. {
  184. blitAt(buildings[i]->get<1>()->ourImages[0].bitmap,buildings[i]->get<2>()->x,buildings[i]->get<2>()->y);
  185. }
  186. }
  187. void CCastleInterface::activate()
  188. {
  189. }
  190. void CCastleInterface::deactivate()
  191. {
  192. exit->deactivate();
  193. }