CArtifactHolder.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * CArtifactHolder.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 "MiscWidgets.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. struct ArtifactLocation;
  14. class CArtifactSet;
  15. class CArtifactFittingSet;
  16. VCMI_LIB_NAMESPACE_END
  17. class CArtifactsOfHeroBase;
  18. class CAnimImage;
  19. class CButton;
  20. class CArtifactHolder
  21. {
  22. public:
  23. virtual void artifactRemoved(const ArtifactLocation & artLoc)=0;
  24. virtual void artifactMoved(const ArtifactLocation & artLoc, const ArtifactLocation & destLoc, bool withRedraw)=0;
  25. virtual void artifactDisassembled(const ArtifactLocation & artLoc)=0;
  26. virtual void artifactAssembled(const ArtifactLocation & artLoc)=0;
  27. };
  28. class CArtPlace : public LRClickableAreaWTextComp
  29. {
  30. protected:
  31. std::shared_ptr<CAnimImage> image;
  32. const CArtifactInstance * ourArt;
  33. void setInternals(const CArtifactInstance * artInst);
  34. virtual void createImage()=0;
  35. public:
  36. CArtPlace(Point position, const CArtifactInstance * Art = nullptr);
  37. void clickLeft(tribool down, bool previousState) override;
  38. void clickRight(tribool down, bool previousState) override;
  39. const CArtifactInstance * getArt();
  40. virtual void setArtifact(const CArtifactInstance * art)=0;
  41. };
  42. class CCommanderArtPlace : public CArtPlace
  43. {
  44. protected:
  45. const CGHeroInstance * commanderOwner;
  46. ArtifactPosition commanderSlotID;
  47. void createImage() override;
  48. void returnArtToHeroCallback();
  49. public:
  50. CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot, const CArtifactInstance * Art = nullptr);
  51. void clickLeft(tribool down, bool previousState) override;
  52. void clickRight(tribool down, bool previousState) override;
  53. void setArtifact(const CArtifactInstance * art) override;
  54. };
  55. class CHeroArtPlace: public CArtPlace
  56. {
  57. public:
  58. using ClickHandler = std::function<void(CHeroArtPlace&)>;
  59. ArtifactPosition slot;
  60. ClickHandler leftClickCallback;
  61. ClickHandler rightClickCallback;
  62. CHeroArtPlace(Point position, const CArtifactInstance * Art = nullptr);
  63. void lockSlot(bool on);
  64. bool isLocked();
  65. void selectSlot(bool on);
  66. bool isMarked() const;
  67. void clickLeft(tribool down, bool previousState) override;
  68. void clickRight(tribool down, bool previousState) override;
  69. void showAll(SDL_Surface * to) override;
  70. void setArtifact(const CArtifactInstance * art) override;
  71. void addCombinedArtInfo(std::map<const CArtifact*, int> & arts);
  72. protected:
  73. std::shared_ptr<CAnimImage> selection;
  74. bool locked;
  75. bool marked;
  76. void createImage() override;
  77. };
  78. class CArtifactsOfHeroBase : public CIntObject
  79. {
  80. protected:
  81. using ArtPlacePtr = std::shared_ptr<CHeroArtPlace>;
  82. using BpackScrollHandler = std::function<void(int)>;
  83. public:
  84. using ArtPlaceMap = std::map<ArtifactPosition, ArtPlacePtr>;
  85. using ClickHandler = std::function<void(CArtifactsOfHeroBase&, CHeroArtPlace&)>;
  86. const CGHeroInstance * curHero;
  87. ClickHandler leftClickCallback;
  88. ClickHandler rightClickCallback;
  89. CArtifactsOfHeroBase();
  90. virtual ~CArtifactsOfHeroBase();
  91. virtual void leftClickArtPlace(CHeroArtPlace & artPlace);
  92. virtual void rightClickArtPlace(CHeroArtPlace & artPlace);
  93. virtual void setHero(const CGHeroInstance * hero);
  94. virtual const CGHeroInstance * getHero() const;
  95. virtual void scrollBackpack(int offset);
  96. virtual void safeRedraw();
  97. virtual void markPossibleSlots(const CArtifactInstance * art, bool assumeDestRemoved = true);
  98. virtual void unmarkSlots();
  99. virtual ArtPlacePtr getArtPlace(const ArtifactPosition & slot);
  100. virtual void updateWornSlots();
  101. virtual void updateBackpackSlots();
  102. virtual void updateSlot(const ArtifactPosition & slot);
  103. virtual const CArtifactInstance * getPickedArtifact();
  104. protected:
  105. ArtPlaceMap artWorn;
  106. std::vector<ArtPlacePtr> backpack;
  107. std::shared_ptr<CButton> leftBackpackRoll;
  108. std::shared_ptr<CButton> rightBackpackRoll;
  109. int backpackPos; // Position to display artifacts in heroes backpack
  110. const std::vector<Point> slotPos =
  111. {
  112. Point(509,30), Point(567,240), Point(509,80), //0-2
  113. Point(383,68), Point(564,183), Point(509,130), //3-5
  114. Point(431,68), Point(610,183), Point(515,295), //6-8
  115. Point(383,143), Point(399,194), Point(415,245), //9-11
  116. Point(431,296), Point(564,30), Point(610,30), //12-14
  117. Point(610,76), Point(610,122), Point(610,310), //15-17
  118. Point(381,296) //18
  119. };
  120. virtual void init(CHeroArtPlace::ClickHandler lClickCallback, CHeroArtPlace::ClickHandler rClickCallback,
  121. const Point & position, BpackScrollHandler scrollHandler);
  122. // Assigns an artifacts to an artifact place depending on it's new slot ID
  123. virtual void setSlotData(ArtPlacePtr artPlace, const ArtifactPosition & slot, const CArtifactSet & artSet);
  124. virtual void scrollBackpackForArtSet(int offset, const CArtifactSet & artSet);
  125. };
  126. class CArtifactsOfHeroMain : public CArtifactsOfHeroBase
  127. {
  128. public:
  129. CArtifactsOfHeroMain(const Point & position);
  130. void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
  131. void pickUpArtifact(CHeroArtPlace & artPlace);
  132. };
  133. class CArtifactsOfHeroKingdom : public CArtifactsOfHeroBase
  134. {
  135. public:
  136. CArtifactsOfHeroKingdom(ArtPlaceMap ArtWorn, std::vector<ArtPlacePtr> Backpack,
  137. std::shared_ptr<CButton> leftScroll, std::shared_ptr<CButton> rightScroll);
  138. void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
  139. void pickUpArtifact(CHeroArtPlace & artPlace);
  140. };
  141. class CArtifactsOfHeroAltar : public CArtifactsOfHeroBase
  142. {
  143. public:
  144. std::set<const CArtifactInstance*> artifactsOnAltar;
  145. ArtifactPosition pickedArtFromSlot;
  146. std::shared_ptr<CArtifactFittingSet> visibleArtSet;
  147. CArtifactsOfHeroAltar(const Point & position);
  148. void setHero(const CGHeroInstance * hero) override;
  149. void updateWornSlots() override;
  150. void updateBackpackSlots() override;
  151. void scrollBackpack(int offset) override;
  152. void pickUpArtifact(CHeroArtPlace & artPlace);
  153. void swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc);
  154. void pickedArtMoveToAltar(const ArtifactPosition & slot);
  155. void deleteFromVisible(const CArtifactInstance * artInst);
  156. };
  157. class CArtifactsOfHeroMarket : public CArtifactsOfHeroBase
  158. {
  159. public:
  160. std::function<void(CHeroArtPlace*)> selectArtCallback;
  161. CArtifactsOfHeroMarket(const Point & position);
  162. void scrollBackpack(int offset) override;
  163. };
  164. class CWindowWithArtifacts : public CArtifactHolder
  165. {
  166. public:
  167. using CArtifactsOfHeroPtr = std::variant<
  168. std::weak_ptr<CArtifactsOfHeroMarket>,
  169. std::weak_ptr<CArtifactsOfHeroAltar>,
  170. std::weak_ptr<CArtifactsOfHeroKingdom>,
  171. std::weak_ptr<CArtifactsOfHeroMain>>;
  172. void addSet(CArtifactsOfHeroPtr artSet);
  173. const CGHeroInstance * getHeroPickedArtifact();
  174. const CArtifactInstance * getPickedArtifact();
  175. void leftClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace);
  176. void rightClickArtPlaceHero(CArtifactsOfHeroBase & artsInst, CHeroArtPlace & artPlace);
  177. void artifactRemoved(const ArtifactLocation & artLoc) override;
  178. void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
  179. void artifactDisassembled(const ArtifactLocation & artLoc) override;
  180. void artifactAssembled(const ArtifactLocation & artLoc) override;
  181. private:
  182. std::vector<CArtifactsOfHeroPtr> artSets;
  183. void updateSlots(const ArtifactPosition & slot);
  184. std::optional<std::tuple<const CGHeroInstance*, const CArtifactInstance*>> getState();
  185. std::optional<CArtifactsOfHeroPtr> findAOHbyRef(CArtifactsOfHeroBase & artsInst);
  186. };
  187. namespace ArtifactUtils
  188. {
  189. bool askToAssemble(const CGHeroInstance* hero, const ArtifactPosition& slot);
  190. bool askToDisassemble(const CGHeroInstance* hero, const ArtifactPosition& slot);
  191. }