CArtifactsOfHeroAltar.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * CArtifactsOfHeroAltar.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 "CArtifactsOfHeroAltar.h"
  12. #include "Buttons.h"
  13. #include "../CPlayerInterface.h"
  14. #include "../../CCallback.h"
  15. #include "../../lib/ArtifactUtils.h"
  16. #include "../../lib/mapObjects/CGHeroInstance.h"
  17. #include "../../lib/networkPacks/ArtifactLocation.h"
  18. CArtifactsOfHeroAltar::CArtifactsOfHeroAltar(const Point & position)
  19. : visibleArtSet(ArtBearer::ArtBearer::HERO)
  20. {
  21. init(
  22. std::bind(&CArtifactsOfHeroBase::leftClickArtPlace, this, _1, _2),
  23. std::bind(&CArtifactsOfHeroBase::rightClickArtPlace, this, _1, _2),
  24. position,
  25. std::bind(&CArtifactsOfHeroAltar::scrollBackpack, this, _1));
  26. pickedArtFromSlot = ArtifactPosition::PRE_FIRST;
  27. // The backpack is in the altar window above and to the right
  28. for(auto & slot : backpack)
  29. slot->moveBy(Point(2, -1));
  30. leftBackpackRoll->moveBy(Point(2, -1));
  31. rightBackpackRoll->moveBy(Point(2, -1));
  32. };
  33. CArtifactsOfHeroAltar::~CArtifactsOfHeroAltar()
  34. {
  35. putBackPickedArtifact();
  36. }
  37. void CArtifactsOfHeroAltar::setHero(const CGHeroInstance * hero)
  38. {
  39. if(hero)
  40. {
  41. visibleArtSet.artifactsWorn = hero->artifactsWorn;
  42. visibleArtSet.artifactsInBackpack = hero->artifactsInBackpack;
  43. CArtifactsOfHeroBase::setHero(hero);
  44. }
  45. }
  46. void CArtifactsOfHeroAltar::updateWornSlots()
  47. {
  48. for(auto place : artWorn)
  49. setSlotData(getArtPlace(place.first), place.first, visibleArtSet);
  50. }
  51. void CArtifactsOfHeroAltar::updateBackpackSlots()
  52. {
  53. for(auto artPlace : backpack)
  54. setSlotData(getArtPlace(artPlace->slot), artPlace->slot, visibleArtSet);
  55. }
  56. void CArtifactsOfHeroAltar::scrollBackpack(int offset)
  57. {
  58. CArtifactsOfHeroBase::scrollBackpackForArtSet(offset, visibleArtSet);
  59. redraw();
  60. }
  61. void CArtifactsOfHeroAltar::pickUpArtifact(CArtPlace & artPlace)
  62. {
  63. if(const auto art = artPlace.getArt())
  64. {
  65. pickedArtFromSlot = artPlace.slot;
  66. artPlace.setArtifact(nullptr);
  67. deleteFromVisible(art);
  68. if(ArtifactUtils::isSlotBackpack(pickedArtFromSlot))
  69. pickedArtFromSlot = curHero->getSlotByInstance(art);
  70. assert(pickedArtFromSlot != ArtifactPosition::PRE_FIRST);
  71. LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, pickedArtFromSlot), ArtifactLocation(curHero->id, ArtifactPosition::TRANSITION_POS));
  72. }
  73. }
  74. void CArtifactsOfHeroAltar::swapArtifacts(const ArtifactLocation & srcLoc, const ArtifactLocation & dstLoc)
  75. {
  76. LOCPLINT->cb->swapArtifacts(srcLoc, dstLoc);
  77. const auto pickedArtInst = curHero->getArt(ArtifactPosition::TRANSITION_POS);
  78. assert(pickedArtInst);
  79. visibleArtSet.putArtifact(dstLoc.slot, const_cast<CArtifactInstance*>(pickedArtInst));
  80. }
  81. void CArtifactsOfHeroAltar::pickedArtMoveToAltar(const ArtifactPosition & slot)
  82. {
  83. if(ArtifactUtils::isSlotBackpack(slot) || ArtifactUtils::isSlotEquipment(slot) || slot == ArtifactPosition::TRANSITION_POS)
  84. {
  85. assert(curHero->getSlot(slot)->getArt());
  86. LOCPLINT->cb->swapArtifacts(ArtifactLocation(curHero->id, slot), ArtifactLocation(curHero->id, pickedArtFromSlot));
  87. pickedArtFromSlot = ArtifactPosition::PRE_FIRST;
  88. }
  89. }
  90. void CArtifactsOfHeroAltar::deleteFromVisible(const CArtifactInstance * artInst)
  91. {
  92. const auto slot = visibleArtSet.getSlotByInstance(artInst);
  93. visibleArtSet.removeArtifact(slot);
  94. if(ArtifactUtils::isSlotBackpack(slot))
  95. {
  96. scrollBackpackForArtSet(0, visibleArtSet);
  97. }
  98. else
  99. {
  100. for(const auto & part : artInst->getPartsInfo())
  101. {
  102. if(part.slot != ArtifactPosition::PRE_FIRST)
  103. getArtPlace(part.slot)->setArtifact(nullptr);
  104. }
  105. }
  106. }