mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-15 20:03:15 +02:00
Artifacts trade panel
This commit is contained in:
@@ -258,8 +258,32 @@ void CTradeableItem::setArtInstance(const CArtifactInstance * art)
|
|||||||
setID(-1);
|
setID(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SResourcesPanel::SResourcesPanel(CTradeableItem::ClickPressedFunctor clickPressedCallback, updatePanelFunctor updateSubtitles)
|
void STradePanel::updateSlots()
|
||||||
: updateSubtitles(updateSubtitles)
|
{
|
||||||
|
if(updateSlotsCallback)
|
||||||
|
updateSlotsCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
void STradePanel::deselect()
|
||||||
|
{
|
||||||
|
for(auto & slot : slots)
|
||||||
|
slot->selection->selectSlot(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void STradePanel::clearSubtitles()
|
||||||
|
{
|
||||||
|
for(auto & slot : slots)
|
||||||
|
slot->subtitle.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void STradePanel::updateOffer(int slotIdx, int cost, int qty)
|
||||||
|
{
|
||||||
|
slots[slotIdx]->subtitle = std::to_string(qty);
|
||||||
|
if(cost != 1)
|
||||||
|
slots[slotIdx]->subtitle += "/" + std::to_string(cost);
|
||||||
|
}
|
||||||
|
|
||||||
|
SResourcesPanel::SResourcesPanel(CTradeableItem::ClickPressedFunctor clickPressedCallback, updateSlotsFunctor updateSubtitles)
|
||||||
{
|
{
|
||||||
assert(resourcesForTrade.size() == slotsPos.size());
|
assert(resourcesForTrade.size() == slotsPos.size());
|
||||||
OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
|
OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
|
||||||
@@ -271,18 +295,26 @@ SResourcesPanel::SResourcesPanel(CTradeableItem::ClickPressedFunctor clickPresse
|
|||||||
slots.back()->pos.w = 69; slots.back()->pos.h = 66;
|
slots.back()->pos.w = 69; slots.back()->pos.h = 66;
|
||||||
slots.back()->selection = std::make_unique<SelectableSlot>(Rect(slotsPos[res.num], slots.back()->pos.dimensions()));
|
slots.back()->selection = std::make_unique<SelectableSlot>(Rect(slotsPos[res.num], slots.back()->pos.dimensions()));
|
||||||
}
|
}
|
||||||
|
updateSlotsCallback = updateSubtitles;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SResourcesPanel::updateSlots()
|
SArtifactsPanel::SArtifactsPanel(CTradeableItem::ClickPressedFunctor clickPressedCallback, updateSlotsFunctor updateSubtitles,
|
||||||
|
std::vector<TradeItemBuy> & arts)
|
||||||
{
|
{
|
||||||
if(updateSubtitles)
|
assert(artifactsForTrade == slotsPos.size());
|
||||||
updateSubtitles();
|
assert(artifactsForTrade == arts.size());
|
||||||
}
|
OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255 - DISPOSE);
|
||||||
|
|
||||||
void SResourcesPanel::deselect()
|
slots.resize(artifactsForTrade);
|
||||||
{
|
int slotNum = 0;
|
||||||
for(auto & slot : slots)
|
for(auto & slot : slots)
|
||||||
slot->selection->selectSlot(false);
|
{
|
||||||
|
slot = std::make_shared<CTradeableItem>(slotsPos[slotNum], EType::ARTIFACT_TYPE, arts[slotNum].getNum(), false, slotNum);
|
||||||
|
slot->clickPressedCallback = clickPressedCallback;
|
||||||
|
slot->pos.w = slot->pos.h = 44;
|
||||||
|
slot->selection = std::make_unique<SelectableSlot>(Rect(slotsPos[slotNum++], slot->pos.dimensions()));
|
||||||
|
}
|
||||||
|
updateSlotsCallback = updateSubtitles;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTradeBase::CTradeBase(const IMarket * market, const CGHeroInstance * hero)
|
CTradeBase::CTradeBase(const IMarket * market, const CGHeroInstance * hero)
|
||||||
|
@@ -11,7 +11,8 @@
|
|||||||
|
|
||||||
#include "Images.h"
|
#include "Images.h"
|
||||||
|
|
||||||
#include "../../lib/FunctionList.h"
|
#include "../lib/FunctionList.h"
|
||||||
|
#include "../lib/networkPacks/TradeItem.h"
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_BEGIN
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@@ -64,10 +65,22 @@ public:
|
|||||||
CTradeableItem(Point pos, EType Type, int ID, bool Left, int Serial);
|
CTradeableItem(Point pos, EType Type, int ID, bool Left, int Serial);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SResourcesPanel : public CIntObject
|
struct STradePanel : public CIntObject
|
||||||
{
|
{
|
||||||
using updatePanelFunctor = std::function<void()>;
|
using updateSlotsFunctor = std::function<void()>;
|
||||||
|
|
||||||
|
std::vector<std::shared_ptr<CTradeableItem>> slots;
|
||||||
|
std::function<void()> updateSlotsCallback;
|
||||||
|
std::shared_ptr<CTradeableItem> selected;
|
||||||
|
|
||||||
|
virtual void updateSlots();
|
||||||
|
virtual void deselect();
|
||||||
|
virtual void clearSubtitles();
|
||||||
|
void updateOffer(int slotIdx, int, int);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SResourcesPanel : public STradePanel
|
||||||
|
{
|
||||||
const std::vector<GameResID> resourcesForTrade =
|
const std::vector<GameResID> resourcesForTrade =
|
||||||
{
|
{
|
||||||
GameResID::WOOD, GameResID::MERCURY, GameResID::ORE,
|
GameResID::WOOD, GameResID::MERCURY, GameResID::ORE,
|
||||||
@@ -80,12 +93,22 @@ struct SResourcesPanel : public CIntObject
|
|||||||
Point(0, 79), Point(83, 79), Point(166, 79),
|
Point(0, 79), Point(83, 79), Point(166, 79),
|
||||||
Point(83, 158)
|
Point(83, 158)
|
||||||
};
|
};
|
||||||
std::vector<std::shared_ptr<CTradeableItem>> slots;
|
|
||||||
std::function<void()> updateSubtitles;
|
|
||||||
|
|
||||||
SResourcesPanel(CTradeableItem::ClickPressedFunctor clickPressedCallback, updatePanelFunctor updateSubtitles);
|
SResourcesPanel(CTradeableItem::ClickPressedFunctor clickPressedCallback, updateSlotsFunctor updateSubtitles);
|
||||||
void updateSlots();
|
};
|
||||||
void deselect();
|
|
||||||
|
struct SArtifactsPanel : public STradePanel
|
||||||
|
{
|
||||||
|
const std::vector<Point> slotsPos =
|
||||||
|
{
|
||||||
|
Point(0, 0), Point(83, 0), Point(166, 0),
|
||||||
|
Point(0, 79), Point(83, 79), Point(166, 79),
|
||||||
|
Point(83, 158)
|
||||||
|
};
|
||||||
|
const size_t artifactsForTrade = 7;
|
||||||
|
|
||||||
|
SArtifactsPanel(CTradeableItem::ClickPressedFunctor clickPressedCallback, updateSlotsFunctor updateSubtitles,
|
||||||
|
std::vector<TradeItemBuy> & arts);
|
||||||
};
|
};
|
||||||
|
|
||||||
class CTradeBase
|
class CTradeBase
|
||||||
@@ -96,8 +119,7 @@ public:
|
|||||||
|
|
||||||
//all indexes: 1 = left, 0 = right
|
//all indexes: 1 = left, 0 = right
|
||||||
std::array<std::vector<std::shared_ptr<CTradeableItem>>, 2> items;
|
std::array<std::vector<std::shared_ptr<CTradeableItem>>, 2> items;
|
||||||
std::shared_ptr<SResourcesPanel> resoursesPanelPlayer;
|
std::vector<std::shared_ptr<STradePanel>> tradePanels;
|
||||||
std::shared_ptr<SResourcesPanel> resoursesPanelMarket;
|
|
||||||
|
|
||||||
//highlighted items (nullptr if no highlight)
|
//highlighted items (nullptr if no highlight)
|
||||||
std::shared_ptr<CTradeableItem> hLeft;
|
std::shared_ptr<CTradeableItem> hLeft;
|
||||||
|
@@ -86,7 +86,7 @@ void CTradeWindow::initItems(bool Left)
|
|||||||
{
|
{
|
||||||
if(Left && itemsType[1] == RESOURCE)
|
if(Left && itemsType[1] == RESOURCE)
|
||||||
{
|
{
|
||||||
resoursesPanelPlayer = std::make_shared<SResourcesPanel>(
|
tradePanels.emplace_back(std::make_shared<SResourcesPanel>(
|
||||||
[this](std::shared_ptr<CTradeableItem> marketSlot) -> void
|
[this](std::shared_ptr<CTradeableItem> marketSlot) -> void
|
||||||
{
|
{
|
||||||
if(hLeft != marketSlot)
|
if(hLeft != marketSlot)
|
||||||
@@ -100,16 +100,16 @@ void CTradeWindow::initItems(bool Left)
|
|||||||
},
|
},
|
||||||
[this]() -> void
|
[this]() -> void
|
||||||
{
|
{
|
||||||
for(auto & slot : resoursesPanelPlayer->slots)
|
for(auto & slot : tradePanels[1]->slots)
|
||||||
slot->subtitle = std::to_string(LOCPLINT->cb->getResourceAmount(static_cast<EGameResID>(slot->serial)));
|
slot->subtitle = std::to_string(LOCPLINT->cb->getResourceAmount(static_cast<EGameResID>(slot->serial)));
|
||||||
});
|
}));
|
||||||
resoursesPanelPlayer->moveBy(Point(39, 182));
|
tradePanels.back()->moveBy(Point(39, 182));
|
||||||
resoursesPanelPlayer->updateSlots();
|
tradePanels.back()->updateSlots();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(!Left && itemsType[0] == RESOURCE)
|
if(!Left && itemsType[0] == RESOURCE)
|
||||||
{
|
{
|
||||||
resoursesPanelMarket = std::make_shared<SResourcesPanel>(
|
tradePanels.emplace_back(std::make_shared<SResourcesPanel>(
|
||||||
[this](std::shared_ptr<CTradeableItem> marketSlot) -> void
|
[this](std::shared_ptr<CTradeableItem> marketSlot) -> void
|
||||||
{
|
{
|
||||||
if(hRight != marketSlot)
|
if(hRight != marketSlot)
|
||||||
@@ -124,31 +124,53 @@ void CTradeWindow::initItems(bool Left)
|
|||||||
},
|
},
|
||||||
[this]() -> void
|
[this]() -> void
|
||||||
{
|
{
|
||||||
for(auto & slot : resoursesPanelMarket->slots)
|
if(hLeft)
|
||||||
{
|
for(auto & slot : tradePanels[0]->slots)
|
||||||
if(hLeft) //artifact, creature
|
|
||||||
{
|
{
|
||||||
int h1, h2; //hlp variables for getting offer
|
int h1, h2; //hlp variables for getting offer
|
||||||
market->getOffer(hLeft->id, slot->id, h1, h2, mode);
|
market->getOffer(hLeft->id, slot->id, h1, h2, EMarketMode::RESOURCE_RESOURCE);
|
||||||
if(slot->id != hLeft->id || mode != EMarketMode::RESOURCE_RESOURCE) //don't allow exchanging same resources
|
|
||||||
{
|
if(slot->id != hLeft->id)
|
||||||
std::ostringstream oss;
|
tradePanels[0]->updateOffer(slot->serial, h1, h2);
|
||||||
oss << h2;
|
|
||||||
if(h1 != 1)
|
|
||||||
oss << "/" << h1;
|
|
||||||
slot->subtitle = oss.str();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
slot->subtitle = CGI->generaltexth->allTexts[164]; // n/a
|
slot->subtitle = CGI->generaltexth->allTexts[164]; // n/a
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
slot->subtitle = "";
|
tradePanels[0]->clearSubtitles();
|
||||||
}
|
}));
|
||||||
});
|
tradePanels.back()->moveBy(Point(327, 182));
|
||||||
resoursesPanelMarket->moveBy(Point(327, 182));
|
return;
|
||||||
|
}
|
||||||
|
if(!Left && itemsType[0] == ARTIFACT_TYPE)
|
||||||
|
{
|
||||||
|
tradePanels.emplace_back(std::make_shared<SArtifactsPanel>(
|
||||||
|
[this](std::shared_ptr<CTradeableItem> marketSlot) -> void
|
||||||
|
{
|
||||||
|
if(hRight != marketSlot)
|
||||||
|
{
|
||||||
|
if(hRight)
|
||||||
|
hRight->selection->selectSlot(false);
|
||||||
|
hRight = marketSlot;
|
||||||
|
hRight->selection->selectSlot(true);
|
||||||
|
selectionChanged(false);
|
||||||
|
initSubs(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[this]() -> void
|
||||||
|
{
|
||||||
|
if(hLeft)
|
||||||
|
for(auto & slot : tradePanels[0]->slots)
|
||||||
|
{
|
||||||
|
int h1, h2; //hlp variables for getting offer
|
||||||
|
market->getOffer(hLeft->id, slot->id, h1, h2, EMarketMode::RESOURCE_ARTIFACT);
|
||||||
|
tradePanels[0]->updateOffer(slot->serial, h1, h2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tradePanels[0]->clearSubtitles();
|
||||||
|
}, market->availableItemsIds(mode)));
|
||||||
|
tradePanels.back()->moveBy(Point(340, 182));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<int> *ids = getItemsIds(Left);
|
std::vector<int> *ids = getItemsIds(Left);
|
||||||
std::vector<Rect> pos;
|
std::vector<Rect> pos;
|
||||||
@@ -229,12 +251,6 @@ std::vector<int> *CTradeWindow::getItemsIds(bool Left)
|
|||||||
if(PlayerColor(i) != LOCPLINT->playerID && LOCPLINT->cb->getPlayerStatus(PlayerColor(i)) == EPlayerStatus::INGAME)
|
if(PlayerColor(i) != LOCPLINT->playerID && LOCPLINT->cb->getPlayerStatus(PlayerColor(i)) == EPlayerStatus::INGAME)
|
||||||
ids->push_back(i);
|
ids->push_back(i);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ARTIFACT_TYPE:
|
|
||||||
ids = new std::vector<int>;
|
|
||||||
for (auto const & item : market->availableItemsIds(mode))
|
|
||||||
ids->push_back(item.getNum());
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,14 +285,6 @@ void CTradeWindow::getPositionsFor(std::vector<Rect> &poss, bool Left, EType typ
|
|||||||
dy = 98;
|
dy = 98;
|
||||||
assert(Left);
|
assert(Left);
|
||||||
break;
|
break;
|
||||||
case ARTIFACT_TYPE://45,123
|
|
||||||
x = 340 - 289;
|
|
||||||
y = 180;
|
|
||||||
w = 44;
|
|
||||||
h = 44;
|
|
||||||
dx = 83;
|
|
||||||
dy = 79;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
int leftToRightOffset = 289;
|
int leftToRightOffset = 289;
|
||||||
|
|
||||||
@@ -302,12 +310,12 @@ void CTradeWindow::getPositionsFor(std::vector<Rect> &poss, bool Left, EType typ
|
|||||||
|
|
||||||
void CTradeWindow::initSubs(bool Left)
|
void CTradeWindow::initSubs(bool Left)
|
||||||
{
|
{
|
||||||
if(itemsType[Left] == RESOURCE)
|
if(itemsType[Left] == RESOURCE || itemsType[Left] == ARTIFACT_TYPE)
|
||||||
{
|
{
|
||||||
if(Left)
|
if(Left)
|
||||||
resoursesPanelPlayer->updateSlots();
|
tradePanels[1]->updateSlots();
|
||||||
else
|
else
|
||||||
resoursesPanelMarket->updateSlots();
|
tradePanels[0]->updateSlots();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -590,10 +598,8 @@ void CMarketplaceWindow::makeDeal()
|
|||||||
madeTransaction = true;
|
madeTransaction = true;
|
||||||
hLeft = nullptr;
|
hLeft = nullptr;
|
||||||
hRight = nullptr;
|
hRight = nullptr;
|
||||||
if(resoursesPanelPlayer)
|
for(auto & panel : tradePanels)
|
||||||
resoursesPanelPlayer->deselect();
|
panel->deselect();
|
||||||
if(resoursesPanelMarket)
|
|
||||||
resoursesPanelMarket->deselect();
|
|
||||||
selectionChanged(true);
|
selectionChanged(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user