CArtifactsOfHeroBackpack.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * CArtifactsOfHeroBackpack.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 "CArtifactsOfHeroBackpack.h"
  12. #include "../gui/CGuiHandler.h"
  13. #include "../gui/Shortcut.h"
  14. #include "Buttons.h"
  15. #include "Images.h"
  16. #include "GameSettings.h"
  17. #include "IHandlerBase.h"
  18. #include "ObjectLists.h"
  19. #include "../CPlayerInterface.h"
  20. #include "../../lib/mapObjects/CGHeroInstance.h"
  21. #include "../../CCallback.h"
  22. CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position)
  23. {
  24. OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
  25. pos += position;
  26. setRedrawParent(true);
  27. const auto backpackCap = VLC->settings()->getInteger(EGameSettings::HEROES_BACKPACK_CAP);
  28. auto visibleCapacityMax = HERO_BACKPACK_WINDOW_SLOT_ROWS * HERO_BACKPACK_WINDOW_SLOT_COLUMNS;
  29. if(backpackCap >= 0)
  30. visibleCapacityMax = visibleCapacityMax > backpackCap ? backpackCap : visibleCapacityMax;
  31. backpack.resize(visibleCapacityMax);
  32. size_t artPlaceIdx = 0;
  33. const int slotSizeWithMargin = 46;
  34. for(int i = 0; i < visibleCapacityMax; i++)
  35. {
  36. auto artifactSlotBackground = std::make_shared<CPicture>("heroWindow/artifactSlotEmpty",
  37. Point(slotSizeWithMargin * (i % HERO_BACKPACK_WINDOW_SLOT_COLUMNS), slotSizeWithMargin * (i / HERO_BACKPACK_WINDOW_SLOT_COLUMNS)));
  38. backpackSlotsBackgrounds.emplace_back(artifactSlotBackground);
  39. }
  40. for(auto & artPlace : backpack)
  41. {
  42. artPlace = std::make_shared<CHeroArtPlace>(
  43. Point(slotSizeWithMargin * (artPlaceIdx % HERO_BACKPACK_WINDOW_SLOT_COLUMNS), slotSizeWithMargin * (artPlaceIdx / HERO_BACKPACK_WINDOW_SLOT_COLUMNS)));
  44. artPlace->setArtifact(nullptr);
  45. artPlace->leftClickCallback = std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1);
  46. artPlace->rightClickCallback = std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1);
  47. artPlaceIdx++;
  48. }
  49. if(backpackCap < 0 || visibleCapacityMax < backpackCap)
  50. {
  51. auto onCreate = [](size_t index) -> std::shared_ptr<CIntObject>
  52. {
  53. return std::make_shared<CIntObject>();
  54. };
  55. CListBoxWithCallback::MovedPosCallback posMoved = [this](size_t pos) -> void
  56. {
  57. scrollBackpack(static_cast<int>(pos) * HERO_BACKPACK_WINDOW_SLOT_COLUMNS - backpackPos);
  58. };
  59. backpackListBox = std::make_shared<CListBoxWithCallback>(
  60. posMoved, onCreate, Point(0, 0), Point(0, 0), HERO_BACKPACK_WINDOW_SLOT_ROWS, 0, 0, 1,
  61. Rect(HERO_BACKPACK_WINDOW_SLOT_COLUMNS * slotSizeWithMargin + 10, 0, HERO_BACKPACK_WINDOW_SLOT_ROWS * slotSizeWithMargin - 5, 0));
  62. }
  63. }
  64. void CArtifactsOfHeroBackpack::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc)
  65. {
  66. LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
  67. }
  68. void CArtifactsOfHeroBackpack::pickUpArtifact(CHeroArtPlace & artPlace)
  69. {
  70. LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero, artPlace.slot),
  71. ArtifactLocation(curHero, ArtifactPosition::TRANSITION_POS));
  72. }
  73. void CArtifactsOfHeroBackpack::scrollBackpack(int offset)
  74. {
  75. if(backpackListBox)
  76. backpackListBox->resize(getActiveSlotLinesNum());
  77. backpackPos += offset;
  78. auto slot = ArtifactPosition(GameConstants::BACKPACK_START + backpackPos);
  79. for(auto artPlace : backpack)
  80. {
  81. setSlotData(artPlace, slot, *curHero);
  82. slot = slot + 1;
  83. }
  84. redraw();
  85. }
  86. void CArtifactsOfHeroBackpack::updateBackpackSlots()
  87. {
  88. if(backpackListBox)
  89. backpackListBox->resize(getActiveSlotLinesNum());
  90. CArtifactsOfHeroBase::updateBackpackSlots();
  91. }
  92. size_t CArtifactsOfHeroBackpack::getActiveSlotLinesNum()
  93. {
  94. return (curHero->artifactsInBackpack.size() + HERO_BACKPACK_WINDOW_SLOT_COLUMNS - 1) / HERO_BACKPACK_WINDOW_SLOT_COLUMNS;
  95. }