1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-23 12:08:45 +02:00

using deque for hero's backpack storage

This commit is contained in:
SoundSSGood 2024-03-05 17:59:56 +02:00
parent bea80a60fb
commit d143f53d7e
9 changed files with 54 additions and 53 deletions

View File

@ -25,7 +25,7 @@ CArtifactsOfHeroAltar::CArtifactsOfHeroAltar(const Point & position)
std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2), std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2),
std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2), std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2),
position, position,
std::bind(&CArtifactsOfHeroAltar::scrollBackpack, this, _1)); std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, _1));
// The backpack is in the altar window above and to the right // The backpack is in the altar window above and to the right
for(auto & slot : backpack) for(auto & slot : backpack)

View File

@ -26,6 +26,7 @@
CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(size_t slotsColumnsMax, size_t slotsRowsMax) CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(size_t slotsColumnsMax, size_t slotsRowsMax)
: slotsColumnsMax(slotsColumnsMax) : slotsColumnsMax(slotsColumnsMax)
, slotsRowsMax(slotsRowsMax) , slotsRowsMax(slotsRowsMax)
, backpackPos(0)
{ {
setRedrawParent(true); setRedrawParent(true);
} }

View File

@ -36,6 +36,7 @@ protected:
size_t slotsRowsMax; size_t slotsRowsMax;
const int slotSizeWithMargin = 46; const int slotSizeWithMargin = 46;
const int sliderPosOffsetX = 5; const int sliderPosOffsetX = 5;
int backpackPos; // Position to display artifacts in heroes backpack
void initAOHbackpack(size_t slots, bool slider); void initAOHbackpack(size_t slots, bool slider);
size_t calcRows(size_t slots); size_t calcRows(size_t slots);

View File

@ -25,8 +25,7 @@
#include "../../lib/networkPacks/ArtifactLocation.h" #include "../../lib/networkPacks/ArtifactLocation.h"
CArtifactsOfHeroBase::CArtifactsOfHeroBase() CArtifactsOfHeroBase::CArtifactsOfHeroBase()
: backpackPos(0), : curHero(nullptr),
curHero(nullptr),
putBackPickedArtCallback(nullptr) putBackPickedArtCallback(nullptr)
{ {
} }
@ -56,10 +55,10 @@ void CArtifactsOfHeroBase::setPutBackPickedArtifactCallback(PutBackPickedArtCall
} }
void CArtifactsOfHeroBase::init( void CArtifactsOfHeroBase::init(
CArtPlace::ClickFunctor lClickCallback, const CArtPlace::ClickFunctor & lClickCallback,
CArtPlace::ClickFunctor showPopupCallback, const CArtPlace::ClickFunctor & showPopupCallback,
const Point & position, const Point & position,
BpackScrollFunctor scrollCallback) const BpackScrollFunctor & scrollCallback)
{ {
// CArtifactsOfHeroBase::init may be transform to CArtifactsOfHeroBase::CArtifactsOfHeroBase if OBJECT_CONSTRUCTION_CAPTURING is removed // CArtifactsOfHeroBase::init may be transform to CArtifactsOfHeroBase::CArtifactsOfHeroBase if OBJECT_CONSTRUCTION_CAPTURING is removed
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
@ -87,8 +86,10 @@ void CArtifactsOfHeroBase::init(
artPlace->setClickPressedCallback(lClickCallback); artPlace->setClickPressedCallback(lClickCallback);
artPlace->setShowPopupCallback(showPopupCallback); artPlace->setShowPopupCallback(showPopupCallback);
} }
leftBackpackRoll = std::make_shared<CButton>(Point(379, 364), AnimationPath::builtin("hsbtns3.def"), CButton::tooltip(), [scrollCallback]() {scrollCallback(-1);}, EShortcut::MOVE_LEFT); leftBackpackRoll = std::make_shared<CButton>(Point(379, 364), AnimationPath::builtin("hsbtns3.def"), CButton::tooltip(),
rightBackpackRoll = std::make_shared<CButton>(Point(632, 364), AnimationPath::builtin("hsbtns5.def"), CButton::tooltip(), [scrollCallback]() {scrollCallback(+1);}, EShortcut::MOVE_RIGHT); [scrollCallback](){scrollCallback(-1);}, EShortcut::MOVE_LEFT);
rightBackpackRoll = std::make_shared<CButton>(Point(632, 364), AnimationPath::builtin("hsbtns5.def"), CButton::tooltip(),
[scrollCallback](){scrollCallback(+1);}, EShortcut::MOVE_RIGHT);
leftBackpackRoll->block(true); leftBackpackRoll->block(true);
rightBackpackRoll->block(true); rightBackpackRoll->block(true);
@ -116,16 +117,12 @@ void CArtifactsOfHeroBase::gestureArtPlace(CArtPlace & artPlace, const Point & c
void CArtifactsOfHeroBase::setHero(const CGHeroInstance * hero) void CArtifactsOfHeroBase::setHero(const CGHeroInstance * hero)
{ {
curHero = hero; curHero = hero;
if(curHero->artifactsInBackpack.size() > 0)
backpackPos %= curHero->artifactsInBackpack.size();
else
backpackPos = 0;
for(auto slot : artWorn) for(auto slot : artWorn)
{ {
setSlotData(slot.second, slot.first); setSlotData(slot.second, slot.first);
} }
scrollBackpack(0); updateBackpackSlots();
} }
const CGHeroInstance * CArtifactsOfHeroBase::getHero() const const CGHeroInstance * CArtifactsOfHeroBase::getHero() const
@ -135,46 +132,28 @@ const CGHeroInstance * CArtifactsOfHeroBase::getHero() const
void CArtifactsOfHeroBase::scrollBackpack(int offset) void CArtifactsOfHeroBase::scrollBackpack(int offset)
{ {
// offset==-1 => to left; offset==1 => to right const ArtifactLocation beginLoc = ArtifactLocation(curHero->id, ArtifactPosition::BACKPACK_START);
using slotInc = std::function<ArtifactPosition(ArtifactPosition&)>; const ArtifactLocation endLoc = ArtifactLocation(curHero->id, ArtifactPosition(ArtifactPosition::BACKPACK_START + curHero->artifactsInBackpack.size() - 1));
auto artsInBackpack = static_cast<int>(curHero->artifactsInBackpack.size()); // To right by default
auto scrollingPossible = artsInBackpack > backpack.size(); ArtifactLocation const * srcLoc = &beginLoc;
ArtifactLocation const * dstLoc = &endLoc;
slotInc inc_straight = [](ArtifactPosition & slot) -> ArtifactPosition if(offset < 0)
{ {
return slot + 1; // To left
}; srcLoc = &endLoc;
slotInc inc_ring = [artsInBackpack](ArtifactPosition & slot) -> ArtifactPosition dstLoc = &beginLoc;
{ offset = -offset;
return ArtifactPosition::BACKPACK_START + (slot - ArtifactPosition::BACKPACK_START + 1) % artsInBackpack; }
};
slotInc inc;
if(scrollingPossible)
inc = inc_ring;
else
inc = inc_straight;
backpackPos += offset; for(auto step = 0; step < offset; step++)
if(backpackPos < 0) LOCPLINT->cb->swapArtifacts(*srcLoc, *dstLoc);
backpackPos += artsInBackpack;
if(artsInBackpack) ArtifactPosition slot = ArtifactPosition::BACKPACK_START;
backpackPos %= artsInBackpack;
auto slot = ArtifactPosition(ArtifactPosition::BACKPACK_START + backpackPos);
for(auto artPlace : backpack) for(auto artPlace : backpack)
{ {
setSlotData(artPlace, slot); setSlotData(artPlace, slot);
slot = inc(slot); slot = slot + 1;
} }
// Blocking scrolling if there is not enough artifacts to scroll
if(leftBackpackRoll)
leftBackpackRoll->block(!scrollingPossible);
if(rightBackpackRoll)
rightBackpackRoll->block(!scrollingPossible);
redraw();
} }
void CArtifactsOfHeroBase::markPossibleSlots(const CArtifactInstance * art, bool assumeDestRemoved) void CArtifactsOfHeroBase::markPossibleSlots(const CArtifactInstance * art, bool assumeDestRemoved)
@ -224,9 +203,13 @@ void CArtifactsOfHeroBase::updateWornSlots()
void CArtifactsOfHeroBase::updateBackpackSlots() void CArtifactsOfHeroBase::updateBackpackSlots()
{ {
if(curHero->artifactsInBackpack.size() <= backpack.size() && backpackPos != 0)
backpackPos = 0;
scrollBackpack(0); scrollBackpack(0);
auto scrollingPossible = static_cast<int>(curHero->artifactsInBackpack.size()) > backpack.size();
// Blocking scrolling if there is not enough artifacts to scroll
if(leftBackpackRoll)
leftBackpackRoll->block(!scrollingPossible);
if(rightBackpackRoll)
rightBackpackRoll->block(!scrollingPossible);
} }
void CArtifactsOfHeroBase::updateSlot(const ArtifactPosition & slot) void CArtifactsOfHeroBase::updateSlot(const ArtifactPosition & slot)

View File

@ -52,7 +52,6 @@ protected:
std::vector<ArtPlacePtr> backpack; std::vector<ArtPlacePtr> backpack;
std::shared_ptr<CButton> leftBackpackRoll; std::shared_ptr<CButton> leftBackpackRoll;
std::shared_ptr<CButton> rightBackpackRoll; std::shared_ptr<CButton> rightBackpackRoll;
int backpackPos; // Position to display artifacts in heroes backpack
PutBackPickedArtCallback putBackPickedArtCallback; PutBackPickedArtCallback putBackPickedArtCallback;
const std::vector<Point> slotPos = const std::vector<Point> slotPos =
@ -66,8 +65,8 @@ protected:
Point(381,295) //18 Point(381,295) //18
}; };
virtual void init(CHeroArtPlace::ClickFunctor lClickCallback, CHeroArtPlace::ClickFunctor showPopupCallback, virtual void init(const CHeroArtPlace::ClickFunctor & lClickCallback, const CHeroArtPlace::ClickFunctor & showPopupCallback,
const Point & position, BpackScrollFunctor scrollCallback); const Point & position, const BpackScrollFunctor & scrollCallback);
// Assigns an artifacts to an artifact place depending on it's new slot ID // Assigns an artifacts to an artifact place depending on it's new slot ID
virtual void setSlotData(ArtPlacePtr artPlace, const ArtifactPosition & slot); virtual void setSlotData(ArtPlacePtr artPlace, const ArtifactPosition & slot);
}; };

View File

@ -18,7 +18,7 @@ CArtifactsOfHeroMarket::CArtifactsOfHeroMarket(const Point & position)
std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2), std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2),
std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2), std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2),
position, position,
std::bind(&CArtifactsOfHeroMarket::scrollBackpack, this, _1)); std::bind(&CArtifactsOfHeroBase::scrollBackpack, this, _1));
for(const auto & [slot, artPlace] : artWorn) for(const auto & [slot, artPlace] : artWorn)
artPlace->setSelectionWidth(2); artPlace->setSelectionWidth(2);

View File

@ -192,7 +192,7 @@ class DLL_LINKAGE CArtifactSet
public: public:
using ArtPlacementMap = std::map<CArtifactInstance*, ArtifactPosition>; using ArtPlacementMap = std::map<CArtifactInstance*, ArtifactPosition>;
std::vector<ArtSlotInfo> artifactsInBackpack; //hero's artifacts from bag std::deque<ArtSlotInfo> artifactsInBackpack; //hero's artifacts from bag
std::map<ArtifactPosition, ArtSlotInfo> artifactsWorn; //map<position,artifact_id>; positions: 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5 std::map<ArtifactPosition, ArtSlotInfo> artifactsWorn; //map<position,artifact_id>; positions: 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5
std::vector<ArtSlotInfo> artifactsTransitionPos; // Used as transition position for dragAndDrop artifact exchange std::vector<ArtSlotInfo> artifactsTransitionPos; // Used as transition position for dragAndDrop artifact exchange

View File

@ -218,6 +218,15 @@ public:
load( data[i]); load( data[i]);
} }
template <typename T, typename std::enable_if_t < !std::is_same_v<T, bool >, int > = 0>
void load(std::deque<T> & data)
{
ui32 length = readAndCheckLength();
data.resize(length);
for(ui32 i = 0; i < length; i++)
load(data[i]);
}
template < typename T, typename std::enable_if_t < std::is_pointer_v<T>, int > = 0 > template < typename T, typename std::enable_if_t < std::is_pointer_v<T>, int > = 0 >
void load(T &data) void load(T &data)
{ {

View File

@ -276,6 +276,14 @@ public:
for(ui32 i=0;i<length;i++) for(ui32 i=0;i<length;i++)
save(data[i]); save(data[i]);
} }
template <typename T, typename std::enable_if_t < !std::is_same_v<T, bool >, int > = 0>
void save(const std::deque<T> & data)
{
ui32 length = (ui32)data.size();
*this & length;
for(ui32 i = 0; i < length; i++)
save(data[i]);
}
template <typename T, size_t N> template <typename T, size_t N>
void save(const std::array<T, N> &data) void save(const std::array<T, N> &data)
{ {