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:
parent
bea80a60fb
commit
d143f53d7e
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user