CHeroWindow.cpp 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124
  1. #include "stdafx.h"
  2. #include "global.h"
  3. #include "CHeroWindow.h"
  4. #include "CGameInfo.h"
  5. #include "hch\CHeroHandler.h"
  6. #include "hch\CGeneralTextHandler.h"
  7. #include "SDL.h"
  8. #include "SDL_Extensions.h"
  9. #include "CAdvmapInterface.h"
  10. #include "hch\CLodHandler.h"
  11. #include "AdventureMapButton.h"
  12. #include "CMessage.h"
  13. #include <sstream>
  14. extern SDL_Surface * screen;
  15. extern TTF_Font * GEOR16;
  16. CHeroWindow::CHeroWindow(int playerColor):
  17. backpackPos(0), player(playerColor)
  18. {
  19. artWorn.resize(19);
  20. background = CGI->bitmaph->loadBitmap("HEROSCR4.bmp");
  21. CSDL_Ext::blueToPlayersAdv(background, playerColor);
  22. pos.x = 65;
  23. pos.y = 8;
  24. pos.h = background->h;
  25. pos.w = background->w;
  26. curBack = NULL;
  27. curHero = NULL;
  28. activeArtPlace = NULL;
  29. garInt = NULL;
  30. ourBar = new CStatusBar(72, 567, "ADROLLVR.bmp", 660);
  31. quitButton = new AdventureMapButton<CHeroWindow>(CGI->generaltexth->heroscrn[17], std::string(), &CHeroWindow::quit, 674, 524, "hsbtns.def", this, false, NULL, false);
  32. dismissButton = new AdventureMapButton<CHeroWindow>(std::string(), CGI->generaltexth->heroscrn[28], &CHeroWindow::dismissCurrent, 519, 437, "hsbtns2.def", this, false, NULL, false);
  33. questlogButton = new AdventureMapButton<CHeroWindow>(CGI->generaltexth->heroscrn[0], std::string(), &CHeroWindow::questlog, 379, 437, "hsbtns4.def", this, false, NULL, false);
  34. gar1button = new AdventureMapButton<CHeroWindow>(CGI->generaltexth->heroscrn[23], CGI->generaltexth->heroscrn[29], &CHeroWindow::gar1, 546, 491, "hsbtns6.def", this, false, NULL, false);
  35. gar2button = new AdventureMapButton<CHeroWindow>(std::string(), std::string(), &CHeroWindow::gar2, 604, 491, "hsbtns8.def", this, false, NULL, false);
  36. gar3button = new AdventureMapButton<CHeroWindow>(CGI->generaltexth->heroscrn[24], CGI->generaltexth->heroscrn[30], &CHeroWindow::gar3, 546, 527, "hsbtns7.def", this, false, NULL, false);
  37. gar4button = new AdventureMapButton<CHeroWindow>(std::string(), CGI->generaltexth->heroscrn[32], &CHeroWindow::gar4, 604, 527, "hsbtns9.def", this, false, NULL, false);
  38. leftArtRoll = new AdventureMapButton<CHeroWindow>(std::string(), std::string(), &CHeroWindow::leftArtRoller, 379, 364, "hsbtns3.def", this, false, NULL, false);
  39. rightArtRoll = new AdventureMapButton<CHeroWindow>(std::string(), std::string(), &CHeroWindow::rightArtRoller, 632, 364, "hsbtns5.def", this, false, NULL, false);
  40. for(int g=0; g<8; ++g)
  41. {
  42. //heroList.push_back(new AdventureMapButton<CHeroWindow>(std::string(), std::string(), &CHeroWindow::switchHero, 677, 95+g*54, "hsbtns5.def", this));
  43. heroListMi.push_back(new LClickableAreaHero());
  44. heroListMi[g]->pos.x = 677;
  45. heroListMi[g]->pos.y = 95+g*54;
  46. heroListMi[g]->pos.h = 32;
  47. heroListMi[g]->pos.w = 48;
  48. heroListMi[g]->owner = this;
  49. heroListMi[g]->id = g;
  50. }
  51. skillpics = CGI->spriteh->giveDef("pskil42.def");
  52. flags = CGI->spriteh->giveDef("CREST58.DEF");
  53. //areas
  54. portraitArea = new LRClickableAreaWText();
  55. portraitArea->pos.x = 83;
  56. portraitArea->pos.y = 26;
  57. portraitArea->pos.w = 58;
  58. portraitArea->pos.h = 64;
  59. for(int v=0; v<4; ++v)
  60. {
  61. primSkillAreas.push_back(new LRClickableAreaWTextComp());
  62. primSkillAreas[v]->pos.x = 95 + 70*v;
  63. primSkillAreas[v]->pos.y = 111;
  64. primSkillAreas[v]->pos.w = 42;
  65. primSkillAreas[v]->pos.h = 42;
  66. primSkillAreas[v]->text = CGI->generaltexth->arraytxt[2+v].substr(1, CGI->generaltexth->arraytxt[2+v].size()-2);
  67. primSkillAreas[v]->type = v;
  68. primSkillAreas[v]->bonus = -1; // to be initilized when hero is being set
  69. primSkillAreas[v]->baseType = 0;
  70. }
  71. expArea = new LRClickableAreaWText();
  72. expArea->pos.x = 83;
  73. expArea->pos.y = 236;
  74. expArea->pos.w = 136;
  75. expArea->pos.h = 42;
  76. expArea->hoverText = CGI->generaltexth->heroscrn[9];
  77. spellPointsArea = new LRClickableAreaWText();
  78. spellPointsArea->pos.x = 227;
  79. spellPointsArea->pos.y = 236;
  80. spellPointsArea->pos.w = 136;
  81. spellPointsArea->pos.h = 42;
  82. spellPointsArea->hoverText = CGI->generaltexth->heroscrn[22];
  83. for(int i=0; i<8; ++i)
  84. {
  85. secSkillAreas.push_back(new LRClickableAreaWTextComp());
  86. secSkillAreas[i]->pos.x = (i%2==0) ? (83) : (227);
  87. secSkillAreas[i]->pos.y = 284 + 48 * (i/2);
  88. secSkillAreas[i]->pos.w = 136;
  89. secSkillAreas[i]->pos.h = 42;
  90. secSkillAreas[i]->baseType = 1;
  91. }
  92. }
  93. CHeroWindow::~CHeroWindow()
  94. {
  95. SDL_FreeSurface(background);
  96. delete quitButton;
  97. delete dismissButton;
  98. delete questlogButton;
  99. delete gar1button;
  100. delete gar2button;
  101. delete gar3button;
  102. delete gar4button;
  103. delete leftArtRoll;
  104. delete rightArtRoll;
  105. for(int g=0; g<heroListMi.size(); ++g)
  106. delete heroListMi[g];
  107. if(curBack)
  108. SDL_FreeSurface(curBack);
  109. delete skillpics;
  110. delete flags;
  111. delete garInt;
  112. delete ourBar;
  113. for(int g=0; g<artWorn.size(); ++g)
  114. {
  115. delete artWorn[g];
  116. }
  117. artWorn.clear();
  118. for(int g=0; g<backpack.size(); ++g)
  119. {
  120. delete backpack[g];
  121. }
  122. backpack.clear();
  123. delete portraitArea;
  124. delete expArea;
  125. delete spellPointsArea;
  126. for(int v=0; v<primSkillAreas.size(); ++v)
  127. {
  128. delete primSkillAreas[v];
  129. }
  130. for(int v=0; v<secSkillAreas.size(); ++v)
  131. {
  132. delete secSkillAreas[v];
  133. }
  134. }
  135. void CHeroWindow::show(SDL_Surface *to)
  136. {
  137. if(!to)
  138. to=ekran;
  139. if(curBack)
  140. blitAt(curBack,pos.x,pos.y,to);
  141. quitButton->show();
  142. dismissButton->show();
  143. questlogButton->show();
  144. gar1button->show();
  145. gar2button->show();
  146. gar3button->show();
  147. gar4button->show();
  148. leftArtRoll->show();
  149. rightArtRoll->show();
  150. garInt->show();
  151. ourBar->show();
  152. for(int d=0; d<artWorn.size(); ++d)
  153. {
  154. artWorn[d]->show(to);
  155. }
  156. for(int d=0; d<backpack.size(); ++d)
  157. {
  158. backpack[d]->show(to);
  159. }
  160. }
  161. void CHeroWindow::setHero(const CGHeroInstance *hero)
  162. {
  163. if(!hero) //something strange... no hero? it shouldn't happen
  164. {
  165. return;
  166. }
  167. curHero = hero;
  168. char * prhlp = new char[200];
  169. sprintf(prhlp, CGI->generaltexth->heroscrn[16].c_str(), curHero->name.c_str(), curHero->type->heroClass->name.c_str());
  170. dismissButton->name = std::string(prhlp);
  171. delete [] prhlp;
  172. prhlp = new char[200];
  173. sprintf(prhlp, CGI->generaltexth->allTexts[15].c_str(), curHero->name.c_str(), curHero->type->heroClass->name.c_str());
  174. portraitArea->hoverText = std::string(prhlp);
  175. delete [] prhlp;
  176. portraitArea->text = hero->biography;
  177. delete garInt;
  178. garInt = new CGarrisonInt(80, 493, 8, 0, curBack, 13, 482, curHero);
  179. garInt->update = false;
  180. for(int g=0; g<primSkillAreas.size(); ++g)
  181. {
  182. primSkillAreas[g]->bonus = hero->primSkills[g];
  183. }
  184. for(int g=0; g<hero->secSkills.size(); ++g)
  185. {
  186. secSkillAreas[g]->type = hero->secSkills[g].first;
  187. secSkillAreas[g]->bonus = hero->secSkills[g].second;
  188. std::string hlp;
  189. switch(hero->secSkills[g].second)
  190. {
  191. case 0: //basic level
  192. hlp = CGI->abilh->abilities[ hero->secSkills[g].first ]->basicText;
  193. secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
  194. break;
  195. case 1: //adv level
  196. hlp = CGI->abilh->abilities[ hero->secSkills[g].first ]->advText;
  197. secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
  198. break;
  199. case 2: //expert level
  200. hlp = CGI->abilh->abilities[ hero->secSkills[g].first ]->expText;
  201. secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
  202. break;
  203. }
  204. char * hlpp = new char[200];
  205. sprintf(hlpp, CGI->generaltexth->heroscrn[21].c_str(), CGI->abilh->levels[hero->secSkills[g].second].c_str(), CGI->abilh->abilities[hero->secSkills[g].first]->name.c_str());
  206. secSkillAreas[g]->hoverText = std::string(hlpp);
  207. delete [] hlpp;
  208. }
  209. char * th = new char[200];
  210. sprintf(th, CGI->generaltexth->allTexts[2].substr(1, CGI->generaltexth->allTexts[2].size()-2).c_str(), hero->level, CGI->heroh->reqExp(hero->level+1), hero->exp);
  211. expArea->text = std::string(th);
  212. delete [] th;
  213. th = new char[400];
  214. sprintf(th, CGI->generaltexth->allTexts[205].substr(1, CGI->generaltexth->allTexts[205].size()-2).c_str(), hero->name.c_str(), hero->mana, hero->primSkills[3]*10);
  215. spellPointsArea->text = std::string(th);
  216. delete [] th;
  217. for(int g=0; g<artWorn.size(); ++g)
  218. {
  219. delete artWorn[g];
  220. }
  221. for(int g=0; g<backpack.size(); ++g)
  222. {
  223. delete backpack[g];
  224. }
  225. backpack.clear();
  226. artWorn[8] = new CArtPlace(hero->artifWorn[8]);
  227. artWorn[8]->pos.x = 515;
  228. artWorn[8]->pos.y = 295;
  229. artWorn[8]->pos.h = artWorn[8]->pos.w = 44;
  230. if(hero->artifWorn[8])
  231. artWorn[8]->text = hero->artifWorn[8]->description;
  232. else
  233. artWorn[8]->text = std::string();
  234. artWorn[8]->ourWindow = this;
  235. artWorn[8]->feet = true;
  236. artWorn[0] = new CArtPlace(hero->artifWorn[0]);
  237. artWorn[0]->pos.x = 509;
  238. artWorn[0]->pos.y = 30;
  239. artWorn[0]->pos.h = artWorn[0]->pos.w = 44;
  240. if(hero->artifWorn[0])
  241. artWorn[0]->text = hero->artifWorn[0]->description;
  242. else
  243. artWorn[0]->text = std::string();
  244. artWorn[0]->ourWindow = this;
  245. artWorn[0]->head = true;
  246. artWorn[4] = new CArtPlace(hero->artifWorn[4]);
  247. artWorn[4]->pos.x = 564;
  248. artWorn[4]->pos.y = 183;
  249. artWorn[4]->pos.h = artWorn[4]->pos.w = 44;
  250. if(hero->artifWorn[4])
  251. artWorn[4]->text = hero->artifWorn[4]->description;
  252. else
  253. artWorn[4]->text = std::string();
  254. artWorn[4]->ourWindow = this;
  255. artWorn[4]->lHand = true;
  256. artWorn[7] = new CArtPlace(hero->artifWorn[7]);
  257. artWorn[7]->pos.x = 610;
  258. artWorn[7]->pos.y = 183;
  259. artWorn[7]->pos.h = artWorn[7]->pos.w = 44;
  260. if(hero->artifWorn[7])
  261. artWorn[7]->text = hero->artifWorn[7]->description;
  262. else
  263. artWorn[7]->text = std::string();
  264. artWorn[7]->ourWindow = this;
  265. artWorn[7]->lRing = true;
  266. artWorn[13] = new CArtPlace(hero->artifWorn[13]);
  267. artWorn[13]->pos.x = 564;
  268. artWorn[13]->pos.y = 30;
  269. artWorn[13]->pos.h = artWorn[13]->pos.w = 44;
  270. if(hero->artifWorn[13])
  271. artWorn[13]->text = hero->artifWorn[13]->description;
  272. else
  273. artWorn[13]->text = std::string();
  274. artWorn[13]->ourWindow = this;
  275. artWorn[13]->warMachine1 = true;
  276. artWorn[14] = new CArtPlace(hero->artifWorn[14]);
  277. artWorn[14]->pos.x = 610;
  278. artWorn[14]->pos.y = 30;
  279. artWorn[14]->pos.h = artWorn[14]->pos.w = 44;
  280. if(hero->artifWorn[14])
  281. artWorn[14]->text = hero->artifWorn[14]->description;
  282. else
  283. artWorn[14]->text = std::string();
  284. artWorn[14]->ourWindow = this;
  285. artWorn[14]->warMachine2 = true;
  286. artWorn[15] = new CArtPlace(hero->artifWorn[15]);
  287. artWorn[15]->pos.x = 610;
  288. artWorn[15]->pos.y = 76;
  289. artWorn[15]->pos.h = artWorn[15]->pos.w = 44;
  290. if(hero->artifWorn[15])
  291. artWorn[15]->text = hero->artifWorn[15]->description;
  292. else
  293. artWorn[15]->text = std::string();
  294. artWorn[15]->ourWindow = this;
  295. artWorn[15]->warMachine3 = true;
  296. artWorn[16] = new CArtPlace(hero->artifWorn[16]);
  297. artWorn[16]->pos.x = 610;
  298. artWorn[16]->pos.y = 122;
  299. artWorn[16]->pos.h = artWorn[16]->pos.w = 44;
  300. if(hero->artifWorn[16])
  301. artWorn[16]->text = hero->artifWorn[16]->description;
  302. else
  303. artWorn[16]->text = std::string();
  304. artWorn[16]->ourWindow = this;
  305. artWorn[16]->warMachine4 = true;
  306. artWorn[9] = new CArtPlace(hero->artifWorn[9]);
  307. artWorn[9]->pos.x = 383;
  308. artWorn[9]->pos.y = 143;
  309. artWorn[9]->pos.h = artWorn[9]->pos.w = 44;
  310. if(hero->artifWorn[9])
  311. artWorn[9]->text = hero->artifWorn[9]->description;
  312. else
  313. artWorn[9]->text = std::string();
  314. artWorn[9]->ourWindow = this;
  315. artWorn[9]->misc1 = true;
  316. artWorn[10] = new CArtPlace(hero->artifWorn[10]);
  317. artWorn[10]->pos.x = 399;
  318. artWorn[10]->pos.y = 194;
  319. artWorn[10]->pos.h = artWorn[10]->pos.w = 44;
  320. if(hero->artifWorn[10])
  321. artWorn[10]->text = hero->artifWorn[10]->description;
  322. else
  323. artWorn[10]->text = std::string();
  324. artWorn[10]->ourWindow = this;
  325. artWorn[10]->misc1 = true;
  326. artWorn[11] = new CArtPlace(hero->artifWorn[11]);
  327. artWorn[11]->pos.x = 415;
  328. artWorn[11]->pos.y = 245;
  329. artWorn[11]->pos.h = artWorn[11]->pos.w = 44;
  330. if(hero->artifWorn[11])
  331. artWorn[11]->text = hero->artifWorn[11]->description;
  332. else
  333. artWorn[11]->text = std::string();
  334. artWorn[11]->ourWindow = this;
  335. artWorn[11]->misc3 = true;
  336. artWorn[12] = new CArtPlace(hero->artifWorn[12]);
  337. artWorn[12]->pos.x = 431;
  338. artWorn[12]->pos.y = 296;
  339. artWorn[12]->pos.h = artWorn[12]->pos.w = 44;
  340. if(hero->artifWorn[12])
  341. artWorn[12]->text = hero->artifWorn[12]->description;
  342. else
  343. artWorn[12]->text = std::string();
  344. artWorn[12]->ourWindow = this;
  345. artWorn[12]->misc4 = true;
  346. artWorn[18] = new CArtPlace(hero->artifWorn[18]);
  347. artWorn[18]->pos.x = 381;
  348. artWorn[18]->pos.y = 296;
  349. artWorn[18]->pos.h = artWorn[18]->pos.w = 44;
  350. if(hero->artifWorn[18])
  351. artWorn[18]->text = hero->artifWorn[18]->description;
  352. else
  353. artWorn[18]->text = std::string();
  354. artWorn[18]->ourWindow = this;
  355. artWorn[18]->misc5 = true;
  356. artWorn[2] = new CArtPlace(hero->artifWorn[2]);
  357. artWorn[2]->pos.x = 508;
  358. artWorn[2]->pos.y = 79;
  359. artWorn[2]->pos.h = artWorn[2]->pos.w = 44;
  360. if(hero->artifWorn[2])
  361. artWorn[2]->text = hero->artifWorn[2]->description;
  362. else
  363. artWorn[2]->text = std::string();
  364. artWorn[2]->ourWindow = this;
  365. artWorn[2]->neck = true;
  366. artWorn[3] = new CArtPlace(hero->artifWorn[3]);
  367. artWorn[3]->pos.x = 383;
  368. artWorn[3]->pos.y = 68;
  369. artWorn[3]->pos.h = artWorn[3]->pos.w = 44;
  370. if(hero->artifWorn[3])
  371. artWorn[3]->text = hero->artifWorn[3]->description;
  372. else
  373. artWorn[3]->text = std::string();
  374. artWorn[3]->ourWindow = this;
  375. artWorn[3]->rHand = true;
  376. artWorn[6] = new CArtPlace(hero->artifWorn[6]);
  377. artWorn[6]->pos.x = 431;
  378. artWorn[6]->pos.y = 68;
  379. artWorn[6]->pos.h = artWorn[6]->pos.w = 44;
  380. if(hero->artifWorn[6])
  381. artWorn[6]->text = hero->artifWorn[6]->description;
  382. else
  383. artWorn[6]->text = std::string();
  384. artWorn[6]->ourWindow = this;
  385. artWorn[6]->rRing = true;
  386. artWorn[1] = new CArtPlace(hero->artifWorn[1]);
  387. artWorn[1]->pos.x = 567;
  388. artWorn[1]->pos.y = 240;
  389. artWorn[1]->pos.h = artWorn[1]->pos.w = 44;
  390. if(hero->artifWorn[1])
  391. artWorn[1]->text = hero->artifWorn[1]->description;
  392. else
  393. artWorn[1]->text = std::string();
  394. artWorn[1]->ourWindow = this;
  395. artWorn[1]->shoulders = true;
  396. artWorn[17] = new CArtPlace(hero->artifWorn[17]);
  397. artWorn[17]->pos.x = 610;
  398. artWorn[17]->pos.y = 310;
  399. artWorn[17]->pos.h = artWorn[17]->pos.w = 44;
  400. if(hero->artifWorn[17])
  401. artWorn[17]->text = hero->artifWorn[17]->description;
  402. else
  403. artWorn[17]->text = std::string();
  404. artWorn[17]->ourWindow = this;
  405. artWorn[17]->spellBook = true;
  406. artWorn[5] = new CArtPlace(hero->artifWorn[5]);
  407. artWorn[5]->pos.x = 509;
  408. artWorn[5]->pos.y = 130;
  409. artWorn[5]->pos.h = artWorn[5]->pos.w = 44;
  410. if(hero->artifWorn[5])
  411. artWorn[5]->text = hero->artifWorn[5]->description;
  412. else
  413. artWorn[5]->text = std::string();
  414. artWorn[5]->ourWindow = this;
  415. artWorn[5]->torso = true;
  416. for(int g=0; g<artWorn.size(); ++g)
  417. {
  418. artWorn[g]->myNumber = g;
  419. artWorn[g]->backNumber = -1;
  420. char * hll = new char[200];
  421. sprintf(hll, CGI->generaltexth->heroscrn[1].c_str(), (artWorn[g]->ourArt ? artWorn[g]->ourArt->name.c_str() : ""));
  422. artWorn[g]->hoverText = std::string(hll);
  423. delete [] hll;
  424. }
  425. for(int s=0; s<5; ++s)
  426. {
  427. CArtPlace * add;
  428. if( s < curHero->artifacts.size() )
  429. add = new CArtPlace(curHero->artifacts[(s+backpackPos) % curHero->artifacts.size() ]);
  430. else
  431. add = new CArtPlace(NULL);
  432. add->pos.x = 403 + 46*s;
  433. add->pos.y = 365;
  434. add->pos.h = add->pos.w = 44;
  435. if(s<hero->artifacts.size() && hero->artifacts[s])
  436. add->text = hero->artifacts[s]->description;
  437. else
  438. add->text = std::string();
  439. add->ourWindow = this;
  440. add->spellBook = true;
  441. add->warMachine1 = true;
  442. add->warMachine2 = true;
  443. add->warMachine3 = true;
  444. add->warMachine4 = true;
  445. add->misc1 = true;
  446. add->misc2 = true;
  447. add->misc3 = true;
  448. add->misc4 = true;
  449. add->misc5 = true;
  450. add->feet = true;
  451. add->lRing = true;
  452. add->rRing = true;
  453. add->torso = true;
  454. add->lHand = true;
  455. add->rHand = true;
  456. add->neck = true;
  457. add->shoulders = true;
  458. add->head = true;
  459. add->myNumber = -1;
  460. add->backNumber = s;
  461. backpack.push_back(add);
  462. }
  463. activeArtPlace = NULL;
  464. redrawCurBack();
  465. }
  466. void CHeroWindow::quit()
  467. {
  468. for(int i=0; i<LOCPLINT->objsToBlit.size(); ++i)
  469. {
  470. if( dynamic_cast<CHeroWindow*>( LOCPLINT->objsToBlit[i] ) )
  471. {
  472. LOCPLINT->objsToBlit.erase(LOCPLINT->objsToBlit.begin()+i);
  473. }
  474. }
  475. deactivate();
  476. LOCPLINT->adventureInt->activate();
  477. SDL_FreeSurface(curBack);
  478. curBack = NULL;
  479. /*for(int v=0; v<LOCPLINT->lclickable.size(); ++v)
  480. {
  481. if(dynamic_cast<CArtPlace*>(LOCPLINT->lclickable[v]))
  482. LOCPLINT->lclickable.erase(LOCPLINT->lclickable.begin()+v);
  483. }*/
  484. for(int g=0; g<artWorn.size(); ++g)
  485. {
  486. delete artWorn[g];
  487. artWorn[g] = NULL;
  488. }
  489. for(int g=0; g<backpack.size(); ++g)
  490. {
  491. delete backpack[g];
  492. backpack[g] = NULL;
  493. }
  494. backpack.clear();
  495. activeArtPlace = NULL;
  496. }
  497. void CHeroWindow::activate()
  498. {
  499. LOCPLINT->curint = this;
  500. quitButton->activate();
  501. dismissButton->activate();
  502. questlogButton->activate();
  503. gar1button->activate();
  504. gar2button->activate();
  505. gar3button->activate();
  506. gar4button->activate();
  507. leftArtRoll->activate();
  508. rightArtRoll->activate();
  509. portraitArea->activate();
  510. expArea->activate();
  511. spellPointsArea->activate();
  512. garInt->activate();
  513. LOCPLINT->statusbar = ourBar;
  514. for(int v=0; v<primSkillAreas.size(); ++v)
  515. {
  516. primSkillAreas[v]->activate();
  517. }
  518. for(int v=0; v<curHero->secSkills.size(); ++v)
  519. {
  520. secSkillAreas[v]->activate();
  521. }
  522. redrawCurBack();
  523. for(int f=0; f<artWorn.size(); ++f)
  524. {
  525. if(artWorn[f])
  526. artWorn[f]->activate();
  527. }
  528. for(int f=0; f<backpack.size(); ++f)
  529. {
  530. if(backpack[f])
  531. backpack[f]->activate();
  532. }
  533. for(int e=0; e<heroListMi.size(); ++e)
  534. {
  535. heroListMi[e]->activate();
  536. }
  537. //LOCPLINT->lclickable.push_back(artFeet);
  538. }
  539. void CHeroWindow::deactivate()
  540. {
  541. quitButton->deactivate();
  542. dismissButton->deactivate();
  543. questlogButton->deactivate();
  544. gar1button->deactivate();
  545. gar2button->deactivate();
  546. gar3button->deactivate();
  547. gar4button->deactivate();
  548. leftArtRoll->deactivate();
  549. rightArtRoll->deactivate();
  550. portraitArea->deactivate();
  551. expArea->deactivate();
  552. spellPointsArea->deactivate();
  553. garInt->deactivate();
  554. for(int v=0; v<primSkillAreas.size(); ++v)
  555. {
  556. primSkillAreas[v]->deactivate();
  557. }
  558. for(int v=0; v<curHero->secSkills.size(); ++v)
  559. {
  560. secSkillAreas[v]->deactivate();
  561. }
  562. for(int f=0; f<artWorn.size(); ++f)
  563. {
  564. if(artWorn[f])
  565. artWorn[f]->deactivate();
  566. }
  567. for(int f=0; f<backpack.size(); ++f)
  568. {
  569. if(backpack[f])
  570. backpack[f]->deactivate();
  571. }
  572. for(int e=0; e<heroListMi.size(); ++e)
  573. {
  574. heroListMi[e]->deactivate();
  575. }
  576. }
  577. void CHeroWindow::dismissCurrent()
  578. {
  579. const CGHeroInstance * ch = curHero;
  580. quit();
  581. LOCPLINT->cb->dismissHero(ch);
  582. }
  583. void CHeroWindow::questlog()
  584. {
  585. }
  586. void CHeroWindow::gar1()
  587. {
  588. }
  589. void CHeroWindow::gar2()
  590. {
  591. }
  592. void CHeroWindow::gar3()
  593. {
  594. }
  595. void CHeroWindow::gar4()
  596. {
  597. }
  598. void CHeroWindow::leftArtRoller()
  599. {
  600. if(curHero->artifacts.size()>5) //if it is <=5, we have nothing to scroll
  601. {
  602. backpackPos+=curHero->artifacts.size()-1; //set new offset
  603. for(int s=0; s<5 && s<curHero->artifacts.size(); ++s) //set new data
  604. {
  605. backpack[s]->ourArt = curHero->artifacts[(s+backpackPos) % curHero->artifacts.size() ];
  606. if(backpack[s]->ourArt)
  607. backpack[s]->text = backpack[s]->ourArt->description;
  608. else
  609. backpack[s]->text = std::string();
  610. }
  611. }
  612. }
  613. void CHeroWindow::rightArtRoller()
  614. {
  615. if(curHero->artifacts.size()>5) //if it is <=5, we have nothing to scroll
  616. {
  617. backpackPos+=1; //set new offset
  618. for(int s=0; s<5 && s<curHero->artifacts.size(); ++s) //set new data
  619. {
  620. backpack[s]->ourArt = curHero->artifacts[(s+backpackPos) % curHero->artifacts.size() ];
  621. if(backpack[s]->ourArt)
  622. backpack[s]->text = backpack[s]->ourArt->description;
  623. else
  624. backpack[s]->text = std::string();
  625. }
  626. }
  627. }
  628. void CHeroWindow::switchHero()
  629. {
  630. //int y;
  631. //SDL_GetMouseState(NULL, &y);
  632. //for(int g=0; g<heroListMi.size(); ++g)
  633. //{
  634. // if(y>=94+54*g)
  635. // {
  636. // //quit();
  637. // setHero(LOCPLINT->cb->getHeroInfo(player, g, false));
  638. // //LOCPLINT->openHeroWindow(curHero);
  639. // redrawCurBack();
  640. // }
  641. //}
  642. }
  643. void CHeroWindow::redrawCurBack()
  644. {
  645. if(curBack)
  646. SDL_FreeSurface(curBack);
  647. curBack = SDL_DisplayFormat(background);
  648. blitAt(skillpics->ourImages[0].bitmap, 32, 111, curBack);
  649. blitAt(skillpics->ourImages[1].bitmap, 102, 111, curBack);
  650. blitAt(skillpics->ourImages[2].bitmap, 172, 111, curBack);
  651. blitAt(skillpics->ourImages[5].bitmap, 242, 111, curBack);
  652. blitAt(skillpics->ourImages[4].bitmap, 20, 230, curBack);
  653. blitAt(skillpics->ourImages[3].bitmap, 162, 230, curBack);
  654. blitAt(curHero->type->portraitLarge, 19, 19, curBack);
  655. CSDL_Ext::printAtMiddle(curHero->name, 190, 40, GEORXX, tytulowy, curBack);
  656. std::stringstream secondLine;
  657. secondLine<<"Level "<<curHero->level<<" "<<curHero->type->heroClass->name;
  658. CSDL_Ext::printAtMiddle(secondLine.str(), 190, 66, TNRB16, zwykly, curBack);
  659. //primary skliis names
  660. CSDL_Ext::printAtMiddle(CGI->generaltexth->jktexts[1], 53, 98, GEOR13, tytulowy, curBack);
  661. CSDL_Ext::printAtMiddle(CGI->generaltexth->jktexts[2], 123, 98, GEOR13, tytulowy, curBack);
  662. CSDL_Ext::printAtMiddle(CGI->generaltexth->jktexts[3], 193, 98, GEOR13, tytulowy, curBack);
  663. CSDL_Ext::printAtMiddle(CGI->generaltexth->jktexts[4], 263, 98, GEOR13, tytulowy, curBack);
  664. //dismiss / quest log
  665. std::vector<std::string> * toPrin = CMessage::breakText(CGI->generaltexth->jktexts[8].substr(1, CGI->generaltexth->jktexts[8].size()-2));
  666. if(toPrin->size()==1)
  667. {
  668. CSDL_Ext::printAt((*toPrin)[0], 372, 440, GEOR13, zwykly, curBack);
  669. }
  670. else
  671. {
  672. CSDL_Ext::printAt((*toPrin)[0], 372, 431, GEOR13, zwykly, curBack);
  673. CSDL_Ext::printAt((*toPrin)[1], 372, 447, GEOR13, zwykly, curBack);
  674. }
  675. delete toPrin;
  676. toPrin = CMessage::breakText(CGI->generaltexth->jktexts[9].substr(1, CGI->generaltexth->jktexts[9].size()-2));
  677. if(toPrin->size()==1)
  678. {
  679. CSDL_Ext::printAt((*toPrin)[0], 512, 440, GEOR13, zwykly, curBack);
  680. }
  681. else
  682. {
  683. CSDL_Ext::printAt((*toPrin)[0], 512, 431, GEOR13, zwykly, curBack);
  684. CSDL_Ext::printAt((*toPrin)[1], 512, 447, GEOR13, zwykly, curBack);
  685. }
  686. delete toPrin;
  687. //printing primary skills' amounts
  688. std::stringstream primarySkill1;
  689. primarySkill1<<curHero->primSkills[0];
  690. CSDL_Ext::printAtMiddle(primarySkill1.str(), 53, 165, TNRB16, zwykly, curBack);
  691. std::stringstream primarySkill2;
  692. primarySkill2<<curHero->primSkills[1];
  693. CSDL_Ext::printAtMiddle(primarySkill2.str(), 123, 165, TNRB16, zwykly, curBack);
  694. std::stringstream primarySkill3;
  695. primarySkill3<<curHero->primSkills[2];
  696. CSDL_Ext::printAtMiddle(primarySkill3.str(), 193, 165, TNRB16, zwykly, curBack);
  697. std::stringstream primarySkill4;
  698. primarySkill4<<curHero->primSkills[3];
  699. CSDL_Ext::printAtMiddle(primarySkill4.str(), 263, 165, TNRB16, zwykly, curBack);
  700. blitAt(LOCPLINT->luck42->ourImages[curHero->getCurrentLuck()+3].bitmap, 239, 182, curBack);
  701. blitAt(LOCPLINT->morale42->ourImages[curHero->getCurrentMorale()+3].bitmap, 181, 182, curBack);
  702. blitAt(flags->ourImages[player].bitmap, 606, 8, curBack);
  703. //hero list blitting
  704. for(int g=0; g<LOCPLINT->cb->howManyHeroes(); ++g)
  705. {
  706. const CGHeroInstance * cur = LOCPLINT->cb->getHeroInfo(player, g, false);
  707. blitAt(cur->type->portraitSmall, 611, 87+g*54, curBack);
  708. //printing yellow border
  709. if(cur->name == curHero->name)
  710. {
  711. for(int f=0; f<cur->type->portraitSmall->w; ++f)
  712. {
  713. for(int h=0; h<cur->type->portraitSmall->h; ++h)
  714. if(f==0 || h==0 || f==cur->type->portraitSmall->w-1 || h==cur->type->portraitSmall->h-1)
  715. {
  716. CSDL_Ext::SDL_PutPixel(curBack, 611+f, 87+g*54+h, 240, 220, 120);
  717. }
  718. }
  719. }
  720. }
  721. //secondary skills
  722. if(curHero->secSkills.size()>=1)
  723. {
  724. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[0].first*3+3+curHero->secSkills[0].second].bitmap, 18, 276, curBack);
  725. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[0].second], 69, 279, GEOR13, zwykly, curBack);
  726. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[0].first]->name, 69, 299, GEOR13, zwykly, curBack);
  727. }
  728. if(curHero->secSkills.size()>=2)
  729. {
  730. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[1].first*3+3+curHero->secSkills[1].second].bitmap, 161, 276, curBack);
  731. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[1].second], 213, 279, GEOR13, zwykly, curBack);
  732. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[1].first]->name, 213, 299, GEOR13, zwykly, curBack);
  733. }
  734. if(curHero->secSkills.size()>=3)
  735. {
  736. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[2].first*3+3+curHero->secSkills[2].second].bitmap, 18, 324, curBack);
  737. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[2].second], 69, 327, GEOR13, zwykly, curBack);
  738. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[2].first]->name, 69, 347, GEOR13, zwykly, curBack);
  739. }
  740. if(curHero->secSkills.size()>=4)
  741. {
  742. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[3].first*3+3+curHero->secSkills[3].second].bitmap, 161, 324, curBack);
  743. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[3].second], 213, 327, GEOR13, zwykly, curBack);
  744. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[3].first]->name, 213, 347, GEOR13, zwykly, curBack);
  745. }
  746. if(curHero->secSkills.size()>=5)
  747. {
  748. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[4].first*3+3+curHero->secSkills[4].second].bitmap, 18, 372, curBack);
  749. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[4].second], 69, 375, GEOR13, zwykly, curBack);
  750. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[4].first]->name, 69, 395, GEOR13, zwykly, curBack);
  751. }
  752. if(curHero->secSkills.size()>=6)
  753. {
  754. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[5].first*3+3+curHero->secSkills[5].second].bitmap, 161, 372, curBack);
  755. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[5].second], 213, 375, GEOR13, zwykly, curBack);
  756. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[5].first]->name, 213, 395, GEOR13, zwykly, curBack);
  757. }
  758. if(curHero->secSkills.size()>=7)
  759. {
  760. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[6].first*3+3+curHero->secSkills[6].second].bitmap, 18, 420, curBack);
  761. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[6].second], 69, 423, GEOR13, zwykly, curBack);
  762. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[6].first]->name, 69, 443, GEOR13, zwykly, curBack);
  763. }
  764. if(curHero->secSkills.size()>=8)
  765. {
  766. blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[7].first*3+3+curHero->secSkills[7].second].bitmap, 161, 420, curBack);
  767. CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[7].second], 213, 423, GEOR13, zwykly, curBack);
  768. CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[7].first]->name, 213, 443, GEOR13, zwykly, curBack);
  769. }
  770. //printing special ability
  771. blitAt(CGI->heroh->un44->ourImages[curHero->subID].bitmap, 18, 180, curBack);
  772. //printing necessery texts
  773. CSDL_Ext::printAt(CGI->generaltexth->jktexts[6].substr(1, CGI->generaltexth->jktexts[6].size()-2), 69, 231, GEOR13, tytulowy, curBack);
  774. std::stringstream expstr;
  775. expstr<<curHero->exp;
  776. CSDL_Ext::printAt(expstr.str(), 69, 247, GEOR16, zwykly, curBack);
  777. CSDL_Ext::printAt(CGI->generaltexth->jktexts[7].substr(1, CGI->generaltexth->jktexts[7].size()-2), 212, 231, GEOR13, tytulowy, curBack);
  778. std::stringstream manastr;
  779. manastr<<curHero->mana<<'/'<<curHero->primSkills[3]*10;
  780. CSDL_Ext::printAt(manastr.str(), 212, 247, GEOR16, zwykly, curBack);
  781. }
  782. CArtPlace::CArtPlace(const CArtifact * const & art): ourArt(art), active(false), clicked(false),
  783. spellBook(false), warMachine1(false), warMachine2(false), warMachine3(false),
  784. warMachine4(false),misc1(false), misc2(false), misc3(false), misc4(false),
  785. misc5(false), feet(false), lRing(false), rRing(false), torso(false),
  786. lHand(false), rHand(false), neck(false), shoulders(false), head(false) {}
  787. void CArtPlace::activate()
  788. {
  789. if(!active)
  790. {
  791. //ClickableL::activate();
  792. LRClickableAreaWTextComp::activate();
  793. active = true;
  794. }
  795. }
  796. void CArtPlace::clickLeft(boost::logic::tribool down)
  797. {
  798. //LRClickableAreaWTextComp::clickLeft(down);
  799. if(!down && !clicked) //not clicked before
  800. {
  801. if(!ourWindow->activeArtPlace) //nothing has benn clicked
  802. {
  803. if(ourArt) //to prevent selecting empty slots (bugfix to what GrayFace reported)
  804. {
  805. clicked = true;
  806. ourWindow->activeArtPlace = this;
  807. }
  808. }
  809. else //perform artifact substitution
  810. {
  811. //chceck if swap is possible
  812. if(this->fitsHere(ourWindow->activeArtPlace->ourArt) && ourWindow->activeArtPlace->fitsHere(this->ourArt))
  813. {
  814. //swap artifacts
  815. LOCPLINT->cb->swapArifacts(
  816. ourWindow->curHero,
  817. this->myNumber>=0,
  818. this->myNumber>=0 ? this->myNumber : (this->backNumber + ourWindow->backpackPos)%ourWindow->curHero->artifacts.size(),
  819. ourWindow->curHero,
  820. ourWindow->activeArtPlace->myNumber>=0,
  821. ourWindow->activeArtPlace->myNumber>=0 ? ourWindow->activeArtPlace->myNumber : (ourWindow->activeArtPlace->backNumber + ourWindow->backpackPos)%ourWindow->curHero->artifacts.size());
  822. const CArtifact * pmh = ourArt;
  823. ourArt = ourWindow->activeArtPlace->ourArt;
  824. ourWindow->activeArtPlace->ourArt = pmh;
  825. //set texts
  826. if(pmh)
  827. ourWindow->activeArtPlace->text = pmh->description;
  828. else
  829. ourWindow->activeArtPlace->text = std::string();
  830. if(ourArt)
  831. text = ourArt->description;
  832. else
  833. text = std::string();
  834. ourWindow->activeArtPlace->clicked = false;
  835. ourWindow->activeArtPlace = NULL;
  836. }
  837. else
  838. {
  839. int backID = -1;
  840. for(int g=0; g<ourWindow->backpack.size(); ++g)
  841. {
  842. if(ourWindow->backpack[g]==this) //if user wants to put something to backpack
  843. {
  844. backID = g;
  845. break;
  846. }
  847. }
  848. if(backID>=0) //put to backpack
  849. {
  850. /*ourWindow->activeArtPlace->ourArt = NULL;
  851. ourWindow->activeArtPlace->clicked = false;
  852. ourWindow->activeArtPlace = NULL;*/
  853. }
  854. }
  855. }
  856. }
  857. else if(!down && clicked)
  858. {
  859. clicked = false;
  860. ourWindow->activeArtPlace = NULL;
  861. }
  862. }
  863. void CArtPlace::clickRight(boost::logic::tribool down)
  864. {
  865. if(text.size()) //if there is no description, do nothing ;]
  866. LRClickableAreaWTextComp::clickRight(down);
  867. }
  868. void CArtPlace::deactivate()
  869. {
  870. if(active)
  871. {
  872. active = false;
  873. //ClickableL::deactivate();
  874. LRClickableAreaWTextComp::deactivate();
  875. }
  876. }
  877. void CArtPlace::show(SDL_Surface *to)
  878. {
  879. if(ourArt)
  880. {
  881. blitAt(CGI->arth->artDefs->ourImages[ourArt->id].bitmap, pos.x, pos.y, to);
  882. }
  883. if(clicked && active)
  884. {
  885. for(int i=0; i<pos.h; ++i)
  886. {
  887. for(int j=0; j<pos.w; ++j)
  888. {
  889. if(i==0 || j==0 || i==pos.h-1 || j==pos.w-1)
  890. {
  891. CSDL_Ext::SDL_PutPixel(to, pos.x+j, pos.y+i, 240, 220, 120);
  892. }
  893. }
  894. }
  895. }
  896. }
  897. bool CArtPlace::fitsHere(const CArtifact * art)
  898. {
  899. if(!art)
  900. return true; //you can have no artifact somewhere
  901. if( this->spellBook && art->spellBook || this->warMachine1 && art->warMachine1 ||
  902. this->warMachine2 && art->warMachine2 || this->warMachine3 && art->warMachine3 ||
  903. this->warMachine4 && art->warMachine4 || this->misc1 && art->misc1 ||
  904. this->misc2 && art->misc2 || this->misc3 && art->misc3 ||
  905. this->misc4 && art->misc4 || this->misc5 && art->misc5 ||
  906. this->feet && art->feet || this->lRing && art->lRing ||
  907. this->rRing && art->rRing || this->torso && art->torso ||
  908. this->lHand && art->lHand || this->rHand && art->rHand ||
  909. this->neck && art->neck || this->shoulders && art->shoulders ||
  910. this->head && art->head )
  911. {
  912. return true;
  913. }
  914. return false;
  915. }
  916. CArtPlace::~CArtPlace()
  917. {
  918. deactivate();
  919. }
  920. void LClickableArea::activate()
  921. {
  922. ClickableL::activate();
  923. }
  924. void LClickableArea::deactivate()
  925. {
  926. ClickableL::deactivate();
  927. }
  928. void LClickableArea::clickLeft(boost::logic::tribool down)
  929. {
  930. if(!down)
  931. {
  932. LOCPLINT->showInfoDialog("TEST TEST AAA", std::vector<SComponent*>());
  933. }
  934. }
  935. void RClickableArea::activate()
  936. {
  937. ClickableR::activate();
  938. }
  939. void RClickableArea::deactivate()
  940. {
  941. ClickableR::deactivate();
  942. }
  943. void RClickableArea::clickRight(boost::logic::tribool down)
  944. {
  945. if(!down)
  946. {
  947. LOCPLINT->showInfoDialog("TEST TEST AAA", std::vector<SComponent*>());
  948. }
  949. }
  950. void LRClickableAreaWText::clickLeft(boost::logic::tribool down)
  951. {
  952. if(!down)
  953. {
  954. LOCPLINT->showInfoDialog(text, std::vector<SComponent*>());
  955. }
  956. }
  957. void LRClickableAreaWText::clickRight(boost::logic::tribool down)
  958. {
  959. LOCPLINT->adventureInt->handleRightClick(text, down, this);
  960. }
  961. void LRClickableAreaWText::activate()
  962. {
  963. LClickableArea::activate();
  964. RClickableArea::activate();
  965. Hoverable::activate();
  966. }
  967. void LRClickableAreaWText::deactivate()
  968. {
  969. LClickableArea::deactivate();
  970. RClickableArea::deactivate();
  971. Hoverable::deactivate();
  972. }
  973. void LRClickableAreaWText::hover(bool on)
  974. {
  975. Hoverable::hover(on);
  976. if (on)
  977. LOCPLINT->statusbar->print(hoverText);
  978. else if (LOCPLINT->statusbar->getCurrent()==hoverText)
  979. LOCPLINT->statusbar->clear();
  980. }
  981. void LClickableAreaHero::clickLeft(boost::logic::tribool down)
  982. {
  983. if(!down)
  984. {
  985. owner->deactivate();
  986. const CGHeroInstance * buf = LOCPLINT->cb->getHeroInfo(owner->player, id, false);
  987. owner->setHero(buf);
  988. owner->redrawCurBack();
  989. owner->activate();
  990. }
  991. }
  992. void LRClickableAreaWTextComp::clickLeft(boost::logic::tribool down)
  993. {
  994. if((!down) && pressedL)
  995. {
  996. LOCPLINT->showInfoDialog(text, std::vector<SComponent*>(1, new SComponent(SComponent::Etype(baseType), type, bonus)));
  997. }
  998. ClickableL::clickLeft(down);
  999. }
  1000. void LRClickableAreaWTextComp::clickRight(boost::logic::tribool down)
  1001. {
  1002. LOCPLINT->adventureInt->handleRightClick(text, down, this);
  1003. }
  1004. void LRClickableAreaWTextComp::activate()
  1005. {
  1006. LClickableArea::activate();
  1007. RClickableArea::activate();
  1008. Hoverable::activate();
  1009. }
  1010. void LRClickableAreaWTextComp::deactivate()
  1011. {
  1012. LClickableArea::deactivate();
  1013. RClickableArea::deactivate();
  1014. Hoverable::deactivate();
  1015. }
  1016. void LRClickableAreaWTextComp::hover(bool on)
  1017. {
  1018. Hoverable::hover(on);
  1019. if (on)
  1020. LOCPLINT->statusbar->print(hoverText);
  1021. else if (LOCPLINT->statusbar->getCurrent()==hoverText)
  1022. LOCPLINT->statusbar->clear();
  1023. }