CMarketWindow.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*
  2. * CMarketWindow.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "CMarketWindow.h"
  12. #include "../gui/CGuiHandler.h"
  13. #include "../gui/Shortcut.h"
  14. #include "../widgets/Buttons.h"
  15. #include "../widgets/TextControls.h"
  16. #include "../widgets/markets/CFreelancerGuild.h"
  17. #include "../widgets/markets/CMarketResources.h"
  18. #include "../CGameInfo.h"
  19. #include "../CPlayerInterface.h"
  20. #include "../../lib/CGeneralTextHandler.h"
  21. #include "../../lib/mapObjects/CGTownInstance.h"
  22. #include "../../lib/mapObjects/CGMarket.h"
  23. #include "../../lib/mapObjects/CGHeroInstance.h"
  24. CMarketWindow::CMarketWindow(const IMarket * market, const CGHeroInstance * hero, const std::function<void()> & onWindowClosed, EMarketMode mode)
  25. : CStatusbarWindow(PLAYER_COLORED)
  26. , hero(hero)
  27. , windowClosedCallback(onWindowClosed)
  28. {
  29. assert(mode == EMarketMode::RESOURCE_RESOURCE || mode == EMarketMode::RESOURCE_PLAYER || mode == EMarketMode::CREATURE_RESOURCE ||
  30. mode == EMarketMode::RESOURCE_ARTIFACT || mode == EMarketMode::ARTIFACT_RESOURCE || mode == EMarketMode::ARTIFACT_EXP ||
  31. mode == EMarketMode::CREATURE_EXP);
  32. if(mode == EMarketMode::RESOURCE_RESOURCE)
  33. createMarketResources(market, hero);
  34. else if(mode == EMarketMode::RESOURCE_PLAYER)
  35. createTransferResources(market, hero);
  36. else if(mode == EMarketMode::CREATURE_RESOURCE)
  37. createFreelancersGuild(market, hero);
  38. else if(mode == EMarketMode::RESOURCE_ARTIFACT)
  39. createArtifactsBuying(market, hero);
  40. else if(mode == EMarketMode::ARTIFACT_RESOURCE)
  41. createArtifactsSelling(market, hero);
  42. else if(mode == EMarketMode::ARTIFACT_EXP)
  43. createAltarArtifacts(market, hero);
  44. else if(mode == EMarketMode::CREATURE_EXP)
  45. createAltarCreatures(market, hero);
  46. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  47. statusbar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
  48. }
  49. void CMarketWindow::artifactsChanged()
  50. {
  51. market->artifactsChanged(false);
  52. }
  53. void CMarketWindow::updateGarrisons()
  54. {
  55. CAltarWindow::updateGarrisons();
  56. if(guild)
  57. guild->updateSlots();
  58. }
  59. void CMarketWindow::resourceChanged()
  60. {
  61. if(resRes)
  62. resRes->updateSlots();
  63. }
  64. void CMarketWindow::close()
  65. {
  66. if(windowClosedCallback)
  67. windowClosedCallback();
  68. CWindowObject::close();
  69. }
  70. const CGHeroInstance * CMarketWindow::getHero() const
  71. {
  72. return hero;
  73. }
  74. void CMarketWindow::createChangeModeButtons(EMarketMode currentMode, const IMarket * market, const CGHeroInstance * hero)
  75. {
  76. auto isButton = [this, currentMode, market, hero](EMarketMode modeButton) -> bool
  77. {
  78. if(currentMode == modeButton)
  79. return false;
  80. if(!market->allowsTrade(modeButton))
  81. return false;
  82. if(modeButton == EMarketMode::RESOURCE_RESOURCE || modeButton == EMarketMode::RESOURCE_PLAYER)
  83. {
  84. if(const auto town = dynamic_cast<const CGTownInstance*>(market))
  85. return town->getOwner() == LOCPLINT->playerID;
  86. else
  87. return true;
  88. }
  89. else
  90. {
  91. return hero != nullptr;
  92. }
  93. };
  94. auto buttonPosY = 520;
  95. changeModeButtons.clear();
  96. if(isButton(EMarketMode::RESOURCE_PLAYER))
  97. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(18, buttonPosY), AnimationPath::builtin("TPMRKBU1.DEF"),
  98. CGI->generaltexth->zelp[612], std::bind(&CMarketWindow::createTransferResources, this, market, hero)));
  99. buttonPosY -= buttonHeightWithMargin;
  100. if(isButton(EMarketMode::ARTIFACT_RESOURCE))
  101. {
  102. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(18, buttonPosY), AnimationPath::builtin("TPMRKBU3.DEF"),
  103. CGI->generaltexth->zelp[613], std::bind(&CMarketWindow::createArtifactsSelling, this, market, hero)));
  104. buttonPosY -= buttonHeightWithMargin;
  105. }
  106. if(isButton(EMarketMode::CREATURE_RESOURCE))
  107. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(516, buttonPosY), AnimationPath::builtin("TPMRKBU4.DEF"),
  108. CGI->generaltexth->zelp[599], std::bind(&CMarketWindow::createFreelancersGuild, this, market, hero)));
  109. if(isButton(EMarketMode::RESOURCE_RESOURCE))
  110. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(516, buttonPosY), AnimationPath::builtin("TPMRKBU5.DEF"),
  111. CGI->generaltexth->zelp[605], std::bind(&CMarketWindow::createMarketResources, this, market, hero)));
  112. if(isButton(EMarketMode::RESOURCE_ARTIFACT))
  113. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(18, buttonPosY), AnimationPath::builtin("TPMRKBU2.DEF"),
  114. CGI->generaltexth->zelp[598], std::bind(&CMarketWindow::createArtifactsBuying, this, market, hero)));
  115. if(isButton(EMarketMode::CREATURE_EXP))
  116. {
  117. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(516, 421), AnimationPath::builtin("ALTSACC.DEF"),
  118. CGI->generaltexth->zelp[572], std::bind(&CMarketWindow::createAltarCreatures, this, market, hero)));
  119. if(altar->hero->getAlignment() == EAlignment::GOOD)
  120. changeModeButtons.back()->block(true);
  121. }
  122. if(isButton(EMarketMode::ARTIFACT_EXP))
  123. {
  124. changeModeButtons.emplace_back(std::make_shared<CButton>(Point(516, 421), AnimationPath::builtin("ALTART.DEF"),
  125. CGI->generaltexth->zelp[580], std::bind(&CMarketWindow::createAltarArtifacts, this, market, hero)));
  126. if(altar->hero->getAlignment() == EAlignment::EVIL)
  127. changeModeButtons.back()->block(true);
  128. }
  129. }
  130. void CMarketWindow::createInternals(EMarketMode mode, const IMarket * market, const CGHeroInstance * hero)
  131. {
  132. background->center();
  133. pos = background->pos;
  134. this->market->setRedrawParent(true);
  135. createChangeModeButtons(mode, market, hero);
  136. quitButton = std::make_shared<CButton>(quitButtonPos, AnimationPath::builtin("IOK6432.DEF"),
  137. CGI->generaltexth->zelp[600], [this]() {close(); }, EShortcut::GLOBAL_RETURN);
  138. redraw();
  139. }
  140. void CMarketWindow::createArtifactsBuying(const IMarket * market, const CGHeroInstance * hero)
  141. {
  142. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  143. background = createBg(ImagePath::builtin("TPMRKABS.bmp"), PLAYER_COLORED);
  144. this->market = std::make_shared<CMarketplaceWindow>(market, hero, []() {}, EMarketMode::RESOURCE_ARTIFACT);
  145. createInternals(EMarketMode::RESOURCE_ARTIFACT, market, hero);
  146. }
  147. void CMarketWindow::createArtifactsSelling(const IMarket * market, const CGHeroInstance * hero)
  148. {
  149. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  150. background = createBg(ImagePath::builtin("TPMRKASS.bmp"), PLAYER_COLORED);
  151. this->market = std::make_shared<CMarketplaceWindow>(market, hero, []() {}, EMarketMode::ARTIFACT_RESOURCE);
  152. createInternals(EMarketMode::ARTIFACT_RESOURCE, market, hero);
  153. }
  154. void CMarketWindow::createMarketResources(const IMarket * market, const CGHeroInstance * hero)
  155. {
  156. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  157. background = createBg(ImagePath::builtin("TPMRKRES.bmp"), PLAYER_COLORED);
  158. resRes = std::make_shared<CMarketResources>(market, hero);
  159. background->center();
  160. pos = background->pos;
  161. resRes->setRedrawParent(true);
  162. resRes->moveTo(pos.topLeft());
  163. createChangeModeButtons(EMarketMode::RESOURCE_RESOURCE, market, hero);
  164. quitButton = std::make_shared<CButton>(quitButtonPos, AnimationPath::builtin("IOK6432.DEF"),
  165. CGI->generaltexth->zelp[600], [this]() {close(); }, EShortcut::GLOBAL_RETURN);
  166. redraw();
  167. }
  168. void CMarketWindow::createFreelancersGuild(const IMarket * market, const CGHeroInstance * hero)
  169. {
  170. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  171. background = createBg(ImagePath::builtin("TPMRKCRS.bmp"), PLAYER_COLORED);
  172. guild = std::make_shared<CFreelancerGuild>(market, hero);
  173. background->center();
  174. pos = background->pos;
  175. guild->setRedrawParent(true);
  176. guild->moveTo(pos.topLeft());
  177. createChangeModeButtons(EMarketMode::CREATURE_RESOURCE, market, hero);
  178. quitButton = std::make_shared<CButton>(quitButtonPos, AnimationPath::builtin("IOK6432.DEF"),
  179. CGI->generaltexth->zelp[600], [this]() {close(); }, EShortcut::GLOBAL_RETURN);
  180. redraw();
  181. }
  182. void CMarketWindow::createTransferResources(const IMarket * market, const CGHeroInstance * hero)
  183. {
  184. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  185. background = createBg(ImagePath::builtin("TPMRKPTS.bmp"), PLAYER_COLORED);
  186. this->market = std::make_shared<CMarketplaceWindow>(market, hero, []() {}, EMarketMode::RESOURCE_PLAYER);
  187. createInternals(EMarketMode::RESOURCE_PLAYER, market, hero);
  188. }
  189. void CMarketWindow::createAltarArtifacts(const IMarket * market, const CGHeroInstance * hero)
  190. {
  191. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  192. background = createBg(ImagePath::builtin("ALTRART2.bmp"), PLAYER_COLORED);
  193. auto altarArtifacts = std::make_shared<CAltarArtifacts>(market, hero);
  194. altar = altarArtifacts;
  195. artSets.clear();
  196. addSetAndCallbacks(altarArtifacts->getAOHset()); altarArtifacts->putBackArtifacts();
  197. background->center();
  198. pos = background->pos;
  199. altar->setRedrawParent(true);
  200. createChangeModeButtons(EMarketMode::ARTIFACT_EXP, market, hero);
  201. altar->moveTo(pos.topLeft());
  202. quitButton = std::make_shared<CButton>(quitButtonPos, AnimationPath::builtin("IOK6432.DEF"),
  203. CGI->generaltexth->zelp[568], [this, altarArtifacts]()
  204. {
  205. altarArtifacts->putBackArtifacts();
  206. CMarketWindow::close();
  207. }, EShortcut::GLOBAL_RETURN);
  208. updateExpToLevel();
  209. redraw();
  210. }
  211. void CMarketWindow::createAltarCreatures(const IMarket * market, const CGHeroInstance * hero)
  212. {
  213. OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
  214. background = createBg(ImagePath::builtin("ALTARMON.bmp"), PLAYER_COLORED);
  215. altar = std::make_shared<CAltarCreatures>(market, hero);
  216. background->center();
  217. pos = background->pos;
  218. altar->setRedrawParent(true);
  219. createChangeModeButtons(EMarketMode::CREATURE_EXP, market, hero);
  220. altar->moveTo(pos.topLeft());
  221. quitButton = std::make_shared<CButton>(quitButtonPos, AnimationPath::builtin("IOK6432.DEF"),
  222. CGI->generaltexth->zelp[568], std::bind(&CMarketWindow::close, this), EShortcut::GLOBAL_RETURN);
  223. updateExpToLevel();
  224. redraw();
  225. }