CTradeWindow.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * CTradeWindow.h, 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. #pragma once
  11. #include "../widgets/CArtifactHolder.h"
  12. #include "CWindowObject.h"
  13. #include "../../lib/FunctionList.h"
  14. class IMarket;
  15. class CSlider;
  16. class CTextBox;
  17. class CGStatusBar;
  18. class CTradeWindow : public CWindowObject, public CWindowWithArtifacts //base for markets and altar of sacrifice
  19. {
  20. public:
  21. enum EType
  22. {
  23. RESOURCE, PLAYER, ARTIFACT_TYPE, CREATURE, CREATURE_PLACEHOLDER, ARTIFACT_PLACEHOLDER, ARTIFACT_INSTANCE
  24. };
  25. class CTradeableItem : public CIntObject, public std::enable_shared_from_this<CTradeableItem>
  26. {
  27. std::shared_ptr<CAnimImage> image;
  28. std::string getFilename();
  29. int getIndex();
  30. public:
  31. const CArtifactInstance * hlp; //holds ptr to artifact instance id type artifact
  32. EType type;
  33. int id;
  34. const int serial;
  35. const bool left;
  36. std::string subtitle; //empty if default
  37. void setType(EType newType);
  38. void setID(int newID);
  39. const CArtifactInstance * getArtInstance() const;
  40. void setArtInstance(const CArtifactInstance * art);
  41. CFunctionList<void()> callback;
  42. bool downSelection;
  43. void showAllAt(const Point & dstPos, const std::string & customSub, SDL_Surface * to);
  44. void clickRight(tribool down, bool previousState) override;
  45. void hover(bool on) override;
  46. void showAll(SDL_Surface * to) override;
  47. void clickLeft(tribool down, bool previousState) override;
  48. std::string getName(int number = -1) const;
  49. CTradeableItem(Point pos, EType Type, int ID, bool Left, int Serial);
  50. };
  51. const IMarket * market;
  52. const CGHeroInstance * hero;
  53. std::shared_ptr<CArtifactsOfHero> arts;
  54. //all indexes: 1 = left, 0 = right
  55. std::array<std::vector<std::shared_ptr<CTradeableItem>>, 2> items;
  56. //highlighted items (nullptr if no highlight)
  57. std::shared_ptr<CTradeableItem> hLeft;
  58. std::shared_ptr<CTradeableItem> hRight;
  59. EType itemsType[2];
  60. EMarketMode::EMarketMode mode;
  61. std::shared_ptr<CButton> ok;
  62. std::shared_ptr<CButton> max;
  63. std::shared_ptr<CButton> deal;
  64. std::shared_ptr<CSlider> slider; //for choosing amount to be exchanged
  65. bool readyToTrade;
  66. CTradeWindow(std::string bgName, const IMarket * Market, const CGHeroInstance * Hero, EMarketMode::EMarketMode Mode); //c
  67. void showAll(SDL_Surface * to) override;
  68. void initSubs(bool Left);
  69. void initTypes();
  70. void initItems(bool Left);
  71. std::vector<int> *getItemsIds(bool Left); //nullptr if default
  72. void getPositionsFor(std::vector<Rect> &poss, bool Left, EType type) const;
  73. void removeItems(const std::set<std::shared_ptr<CTradeableItem>> & toRemove);
  74. void removeItem(std::shared_ptr<CTradeableItem> item);
  75. void getEmptySlots(std::set<std::shared_ptr<CTradeableItem>> & toRemove);
  76. void setMode(EMarketMode::EMarketMode Mode); //mode setter
  77. void artifactSelected(CHeroArtPlace *slot); //used when selling artifacts -> called when user clicked on artifact slot
  78. virtual void getBaseForPositions(EType type, int &dx, int &dy, int &x, int &y, int &h, int &w, bool Right, int &leftToRightOffset) const = 0;
  79. virtual void selectionChanged(bool side) = 0; //true == left
  80. virtual Point selectionOffset(bool Left) const = 0;
  81. virtual std::string selectionSubtitle(bool Left) const = 0;
  82. virtual void garrisonChanged() = 0;
  83. virtual void artifactsChanged(bool left) = 0;
  84. protected:
  85. std::shared_ptr<CGStatusBar> statusBar;
  86. std::vector<std::shared_ptr<CLabel>> labels;
  87. std::vector<std::shared_ptr<CButton>> buttons;
  88. std::vector<std::shared_ptr<CTextBox>> texts;
  89. };
  90. class CMarketplaceWindow : public CTradeWindow
  91. {
  92. std::shared_ptr<CLabel> titleLabel;
  93. bool printButtonFor(EMarketMode::EMarketMode M) const;
  94. std::string getBackgroundForMode(EMarketMode::EMarketMode mode);
  95. public:
  96. int r1, r2; //suggested amounts of traded resources
  97. bool madeTransaction; //if player made at least one transaction
  98. std::shared_ptr<CTextBox> traderText;
  99. void setMax();
  100. void sliderMoved(int to);
  101. void makeDeal();
  102. void selectionChanged(bool side) override; //true == left
  103. CMarketplaceWindow(const IMarket * Market, const CGHeroInstance * Hero = nullptr, EMarketMode::EMarketMode Mode = EMarketMode::RESOURCE_RESOURCE);
  104. ~CMarketplaceWindow();
  105. Point selectionOffset(bool Left) const override;
  106. std::string selectionSubtitle(bool Left) const override;
  107. void garrisonChanged() override; //removes creatures with count 0 from the list (apparently whole stack has been sold)
  108. void artifactsChanged(bool left) override;
  109. void resourceChanged();
  110. void getBaseForPositions(EType type, int &dx, int &dy, int &x, int &y, int &h, int &w, bool Right, int &leftToRightOffset) const override;
  111. void updateTraderText();
  112. };
  113. class CAltarWindow : public CTradeWindow
  114. {
  115. std::shared_ptr<CAnimImage> artIcon;
  116. public:
  117. std::vector<int> sacrificedUnits; //[slot_nr] -> how many creatures from that slot will be sacrificed
  118. std::vector<int> expPerUnit;
  119. std::shared_ptr<CButton> sacrificeAll;
  120. std::shared_ptr<CButton> sacrificeBackpack;
  121. std::shared_ptr<CLabel> expToLevel;
  122. std::shared_ptr<CLabel> expOnAltar;
  123. CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero, EMarketMode::EMarketMode Mode);
  124. ~CAltarWindow();
  125. void getExpValues();
  126. void selectionChanged(bool side) override; //true == left
  127. void selectOppositeItem(bool side);
  128. void SacrificeAll();
  129. void SacrificeBackpack();
  130. void putOnAltar(int backpackIndex);
  131. bool putOnAltar(std::shared_ptr<CTradeableItem> altarSlot, const CArtifactInstance * art);
  132. void makeDeal();
  133. void showAll(SDL_Surface * to) override;
  134. void blockTrade();
  135. void sliderMoved(int to);
  136. void getBaseForPositions(EType type, int &dx, int &dy, int &x, int &y, int &h, int &w, bool Right, int &leftToRightOffset) const override;
  137. void mimicCres();
  138. Point selectionOffset(bool Left) const override;
  139. std::string selectionSubtitle(bool Left) const override;
  140. void garrisonChanged() override;
  141. void artifactsChanged(bool left) override;
  142. void calcTotalExp();
  143. void setExpToLevel();
  144. void updateRight(std::shared_ptr<CTradeableItem> toUpdate);
  145. void artifactPicked();
  146. int firstFreeSlot();
  147. void moveFromSlotToAltar(ArtifactPosition slotID, std::shared_ptr<CTradeableItem>, const CArtifactInstance * art);
  148. };