mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
fixed init CArtifactsOfHero
This commit is contained in:
@@ -185,20 +185,17 @@ bool CGarrisonSlot::highlightOrDropArtifact()
|
|||||||
bool artSelected = false;
|
bool artSelected = false;
|
||||||
if (CWindowWithArtifacts* chw = dynamic_cast<CWindowWithArtifacts*>(GH.topInt().get())) //dirty solution
|
if (CWindowWithArtifacts* chw = dynamic_cast<CWindowWithArtifacts*>(GH.topInt().get())) //dirty solution
|
||||||
{
|
{
|
||||||
std::shared_ptr<CArtifactsOfHero::SCommonPart> commonInfo = chw->getCommonPart();
|
const auto pickedArtInst = chw->getPickedArtifact();
|
||||||
const CArtifactInstance * art = nullptr;
|
|
||||||
if(commonInfo)
|
|
||||||
art = commonInfo->src.art;
|
|
||||||
|
|
||||||
if(art)
|
if(pickedArtInst)
|
||||||
{
|
{
|
||||||
const CGHeroInstance *srcHero = commonInfo->src.AOH->getHero();
|
const auto * srcHero = chw->getHeroPickedArtifact();
|
||||||
artSelected = true;
|
artSelected = true;
|
||||||
if (myStack) // try dropping the artifact only if the slot isn't empty
|
if (myStack) // try dropping the artifact only if the slot isn't empty
|
||||||
{
|
{
|
||||||
ArtifactLocation src(srcHero, commonInfo->src.slotID);
|
ArtifactLocation src(srcHero, ArtifactPosition::TRANSITION_POS);
|
||||||
ArtifactLocation dst(myStack, ArtifactPosition::CREATURE_SLOT);
|
ArtifactLocation dst(myStack, ArtifactPosition::CREATURE_SLOT);
|
||||||
if (art->canBePutAt(dst, true))
|
if(pickedArtInst->canBePutAt(dst, true))
|
||||||
{ //equip clicked stack
|
{ //equip clicked stack
|
||||||
if(dst.getArt())
|
if(dst.getArt())
|
||||||
{
|
{
|
||||||
|
@@ -42,9 +42,10 @@ TConstBonusListPtr CHeroWithMaybePickedArtifact::getAllBonuses(const CSelector &
|
|||||||
TConstBonusListPtr heroBonuses = hero->getAllBonuses(selector, limit, hero, cachingStr);
|
TConstBonusListPtr heroBonuses = hero->getAllBonuses(selector, limit, hero, cachingStr);
|
||||||
TConstBonusListPtr bonusesFromPickedUpArtifact;
|
TConstBonusListPtr bonusesFromPickedUpArtifact;
|
||||||
|
|
||||||
std::shared_ptr<CArtifactsOfHero::SCommonPart> cp = cww->getCommonPart();
|
const auto pickedArtInst = cww->getPickedArtifact();
|
||||||
if(cp && cp->src.art && cp->src.valid() && cp->src.AOH && cp->src.AOH->getHero() == hero)
|
|
||||||
bonusesFromPickedUpArtifact = cp->src.art->getAllBonuses(selector, limit, hero);
|
if(pickedArtInst)
|
||||||
|
bonusesFromPickedUpArtifact = pickedArtInst->getAllBonuses(selector, limit, hero);
|
||||||
else
|
else
|
||||||
bonusesFromPickedUpArtifact = TBonusListPtr(new BonusList());
|
bonusesFromPickedUpArtifact = TBonusListPtr(new BonusList());
|
||||||
|
|
||||||
@@ -244,7 +245,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
|
|||||||
}
|
}
|
||||||
if(!arts)
|
if(!arts)
|
||||||
{
|
{
|
||||||
arts = std::make_shared<CArtifactsOfHero>(Point(-65, -8), true);
|
arts = std::make_shared<CArtifactsOfHeroMain>(Point(-65, -8));
|
||||||
arts->setHero(curHero);
|
arts->setHero(curHero);
|
||||||
addSet(arts);
|
addSet(arts);
|
||||||
}
|
}
|
||||||
@@ -354,25 +355,23 @@ void CHeroWindow::dismissCurrent()
|
|||||||
|
|
||||||
void CHeroWindow::commanderWindow()
|
void CHeroWindow::commanderWindow()
|
||||||
{
|
{
|
||||||
//bool artSelected = false;
|
const auto pickedArtInst = getPickedArtifact();
|
||||||
std::shared_ptr<CArtifactsOfHero::SCommonPart> commonInfo = getCommonPart();
|
const auto hero = getHeroPickedArtifact();
|
||||||
|
|
||||||
if(const CArtifactInstance *art = commonInfo->src.art)
|
if(pickedArtInst)
|
||||||
{
|
{
|
||||||
const CGHeroInstance *srcHero = commonInfo->src.AOH->getHero();
|
const auto freeSlot = ArtifactUtils::getArtAnyPosition(curHero->commander, pickedArtInst->getTypeId());
|
||||||
//artSelected = true;
|
|
||||||
const auto freeSlot = ArtifactUtils::getArtAnyPosition(curHero->commander, art->artType->getId());
|
|
||||||
if(freeSlot < ArtifactPosition::COMMANDER_AFTER_LAST) //we don't want to put it in commander's backpack!
|
if(freeSlot < ArtifactPosition::COMMANDER_AFTER_LAST) //we don't want to put it in commander's backpack!
|
||||||
{
|
{
|
||||||
ArtifactLocation src(srcHero, commonInfo->src.slotID);
|
ArtifactLocation src(hero, ArtifactPosition::TRANSITION_POS);
|
||||||
ArtifactLocation dst(curHero->commander.get(), freeSlot);
|
ArtifactLocation dst(curHero->commander.get(), freeSlot);
|
||||||
|
|
||||||
if(art->canBePutAt(dst, true))
|
if(pickedArtInst->canBePutAt(dst, true))
|
||||||
{ //equip clicked stack
|
{ //equip clicked stack
|
||||||
if(dst.getArt())
|
if(dst.getArt())
|
||||||
{
|
{
|
||||||
LOCPLINT->cb->swapArtifacts (dst, ArtifactLocation(srcHero,
|
LOCPLINT->cb->swapArtifacts(dst, ArtifactLocation(hero,
|
||||||
ArtifactUtils::getArtBackpackPosition(srcHero, art->getTypeId())));
|
ArtifactUtils::getArtBackpackPosition(hero, pickedArtInst->getTypeId())));
|
||||||
}
|
}
|
||||||
LOCPLINT->cb->swapArtifacts(src, dst);
|
LOCPLINT->cb->swapArtifacts(src, dst);
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,7 @@ class CHeroWindow;
|
|||||||
class LClickableAreaHero;
|
class LClickableAreaHero;
|
||||||
class LRClickableAreaWText;
|
class LRClickableAreaWText;
|
||||||
class LRClickableAreaWTextComp;
|
class LRClickableAreaWTextComp;
|
||||||
class CArtifactsOfHero;
|
class CArtifactsOfHeroMain;
|
||||||
class MoraleLuckBox;
|
class MoraleLuckBox;
|
||||||
class CToggleButton;
|
class CToggleButton;
|
||||||
class CToggleGroup;
|
class CToggleGroup;
|
||||||
@@ -105,7 +105,7 @@ class CHeroWindow : public CStatusbarWindow, public CGarrisonHolder, public CWin
|
|||||||
std::shared_ptr<CToggleGroup> formations;
|
std::shared_ptr<CToggleGroup> formations;
|
||||||
|
|
||||||
std::shared_ptr<CGarrisonInt> garr;
|
std::shared_ptr<CGarrisonInt> garr;
|
||||||
std::shared_ptr<CArtifactsOfHero> arts;
|
std::shared_ptr<CArtifactsOfHeroMain> arts;
|
||||||
|
|
||||||
std::vector<std::shared_ptr<CLabel>> labels;
|
std::vector<std::shared_ptr<CLabel>> labels;
|
||||||
|
|
||||||
|
@@ -872,7 +872,7 @@ CHeroItem::CHeroItem(const CGHeroInstance * Hero)
|
|||||||
assert(arts1->arts.size() == 9);
|
assert(arts1->arts.size() == 9);
|
||||||
assert(arts2->arts.size() == 9);
|
assert(arts2->arts.size() == 9);
|
||||||
|
|
||||||
CArtifactsOfHero::ArtPlaceMap arts =
|
CArtifactsOfHeroMain::ArtPlaceMap arts =
|
||||||
{
|
{
|
||||||
{ArtifactPosition::HEAD, arts1->arts[0]},
|
{ArtifactPosition::HEAD, arts1->arts[0]},
|
||||||
{ArtifactPosition::SHOULDERS,arts1->arts[1]},
|
{ArtifactPosition::SHOULDERS,arts1->arts[1]},
|
||||||
@@ -896,7 +896,7 @@ CHeroItem::CHeroItem(const CGHeroInstance * Hero)
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
heroArts = std::make_shared<CArtifactsOfHero>(arts, backpack->arts, backpack->btnLeft, backpack->btnRight, true);
|
heroArts = std::make_shared<CArtifactsOfHeroKingdom>(arts, backpack->arts, backpack->btnLeft, backpack->btnRight);
|
||||||
heroArts->setHero(hero);
|
heroArts->setHero(hero);
|
||||||
|
|
||||||
artsTabs = std::make_shared<CTabbedInt>(std::bind(&CHeroItem::onTabSelected, this, _1));
|
artsTabs = std::make_shared<CTabbedInt>(std::bind(&CHeroItem::onTabSelected, this, _1));
|
||||||
|
@@ -309,7 +309,7 @@ class CHeroItem : public CIntObject, public CGarrisonHolder
|
|||||||
std::shared_ptr<CIntObject> onTabSelected(size_t index);
|
std::shared_ptr<CIntObject> onTabSelected(size_t index);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::shared_ptr<CArtifactsOfHero> heroArts;
|
std::shared_ptr<CArtifactsOfHeroKingdom> heroArts;
|
||||||
|
|
||||||
void updateGarrisons() override;
|
void updateGarrisons() override;
|
||||||
|
|
||||||
|
@@ -179,24 +179,26 @@ void CTradeWindow::CTradeableItem::clickLeft(tribool down, bool previousState)
|
|||||||
if(type == ARTIFACT_PLACEHOLDER)
|
if(type == ARTIFACT_PLACEHOLDER)
|
||||||
{
|
{
|
||||||
CAltarWindow *aw = static_cast<CAltarWindow *>(mw);
|
CAltarWindow *aw = static_cast<CAltarWindow *>(mw);
|
||||||
if(const CArtifactInstance *movedArt = aw->arts->commonInfo->src.art)
|
const auto pickedArtInst = aw->getPickedArtifact();
|
||||||
|
|
||||||
|
auto artifactsOfHero = std::dynamic_pointer_cast<CArtifactsOfHeroAltar>(aw->arts);
|
||||||
|
if(pickedArtInst)
|
||||||
{
|
{
|
||||||
aw->moveFromSlotToAltar(aw->arts->commonInfo->src.slotID, this->shared_from_this(), movedArt);
|
artifactsOfHero->pickedArtMoveToAltar(ArtifactPosition::TRANSITION_POS);
|
||||||
|
aw->moveArtToAltar(this->shared_from_this(), pickedArtInst);
|
||||||
}
|
}
|
||||||
else if(const CArtifactInstance *art = getArtInstance())
|
else if(const CArtifactInstance *art = getArtInstance())
|
||||||
{
|
{
|
||||||
aw->arts->commonInfo->src.AOH = aw->arts.get();
|
const auto hero = artifactsOfHero->getHero();
|
||||||
aw->arts->commonInfo->src.art = art;
|
const auto slot = hero->getSlotByInstance(art);
|
||||||
aw->arts->commonInfo->src.slotID = aw->hero->getArtPos(art);
|
assert(slot != ArtifactPosition::PRE_FIRST);
|
||||||
aw->arts->markPossibleSlots(art);
|
LOCPLINT->cb->swapArtifacts(ArtifactLocation(hero, slot),
|
||||||
|
ArtifactLocation(hero, ArtifactPosition::TRANSITION_POS));
|
||||||
//aw->arts->commonInfo->dst.AOH = aw->arts;
|
artifactsOfHero->pickedArtFromSlot = slot;
|
||||||
CCS->curh->dragAndDropCursor("artifact", art->artType->getIconIndex());
|
artifactsOfHero->artifactsOnAltar.erase(art);
|
||||||
|
|
||||||
aw->arts->artifactsOnAltar.erase(art);
|
|
||||||
setID(-1);
|
setID(-1);
|
||||||
subtitle.clear();
|
subtitle.clear();
|
||||||
aw->deal->block(!aw->arts->artifactsOnAltar.size());
|
aw->deal->block(!artifactsOfHero->artifactsOnAltar.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
aw->calcTotalExp();
|
aw->calcTotalExp();
|
||||||
@@ -391,14 +393,21 @@ void CTradeWindow::initItems(bool Left)
|
|||||||
yOffset = -12;
|
yOffset = -12;
|
||||||
}
|
}
|
||||||
|
|
||||||
arts = std::make_shared<CArtifactsOfHero>(Point(xOffset, yOffset), true);
|
|
||||||
arts->recActions = 255-DISPOSE;
|
|
||||||
arts->setHero(hero);
|
|
||||||
arts->allowedAssembling = false;
|
|
||||||
addSet(arts);
|
|
||||||
|
|
||||||
if(mode == EMarketMode::ARTIFACT_RESOURCE)
|
if(mode == EMarketMode::ARTIFACT_RESOURCE)
|
||||||
arts->highlightModeCallback = std::bind(&CTradeWindow::artifactSelected, this, _1);
|
{
|
||||||
|
auto artifactsOfHero = std::make_shared<CArtifactsOfHeroMarket>(Point(xOffset, yOffset));
|
||||||
|
artifactsOfHero->selectArtCallback = std::bind(&CTradeWindow::artifactSelected, this, _1);
|
||||||
|
artifactsOfHero->setHero(hero);
|
||||||
|
addSet(artifactsOfHero);
|
||||||
|
arts = artifactsOfHero;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto artifactsOfHero = std::make_shared<CArtifactsOfHeroAltar>(Point(xOffset, yOffset));
|
||||||
|
artifactsOfHero->setHero(hero);
|
||||||
|
addSet(artifactsOfHero);
|
||||||
|
arts = artifactsOfHero;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -630,8 +639,8 @@ void CTradeWindow::setMode(EMarketMode::EMarketMode Mode)
|
|||||||
void CTradeWindow::artifactSelected(CHeroArtPlace *slot)
|
void CTradeWindow::artifactSelected(CHeroArtPlace *slot)
|
||||||
{
|
{
|
||||||
assert(mode == EMarketMode::ARTIFACT_RESOURCE);
|
assert(mode == EMarketMode::ARTIFACT_RESOURCE);
|
||||||
items[1][0]->setArtInstance(slot->ourArt);
|
items[1][0]->setArtInstance(slot->getArt());
|
||||||
if(slot->ourArt && !slot->locked)
|
if(slot->getArt())
|
||||||
hLeft = items[1][0];
|
hLeft = items[1][0];
|
||||||
else
|
else
|
||||||
hLeft = nullptr;
|
hLeft = nullptr;
|
||||||
@@ -858,7 +867,7 @@ void CMarketplaceWindow::selectionChanged(bool side)
|
|||||||
readyToTrade = readyToTrade && (hLeft->id != hRight->id); //for resource trade, two DIFFERENT resources must be selected
|
readyToTrade = readyToTrade && (hLeft->id != hRight->id); //for resource trade, two DIFFERENT resources must be selected
|
||||||
|
|
||||||
if(mode == EMarketMode::ARTIFACT_RESOURCE && !hLeft)
|
if(mode == EMarketMode::ARTIFACT_RESOURCE && !hLeft)
|
||||||
arts->unmarkSlots(false);
|
arts->unmarkSlots();
|
||||||
|
|
||||||
if(readyToTrade)
|
if(readyToTrade)
|
||||||
{
|
{
|
||||||
@@ -1250,13 +1259,15 @@ void CAltarWindow::makeDeal()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<ui32> positions;
|
std::vector<ui32> positions;
|
||||||
for(const CArtifactInstance *art : arts->artifactsOnAltar) //sacrifice each artifact on the list
|
auto artifactsOfHero = std::dynamic_pointer_cast<CArtifactsOfHeroAltar>(arts);
|
||||||
|
for(const CArtifactInstance * art : artifactsOfHero->artifactsOnAltar)
|
||||||
{
|
{
|
||||||
positions.push_back(hero->getArtPos(art));
|
positions.push_back(hero->getSlotByInstance(art));
|
||||||
}
|
}
|
||||||
|
std::sort(positions.begin(), positions.end(), std::greater<>());
|
||||||
|
|
||||||
LOCPLINT->cb->trade(market->o, mode, positions, {}, {}, hero);
|
LOCPLINT->cb->trade(market->o, mode, positions, {}, {}, hero);
|
||||||
arts->artifactsOnAltar.clear();
|
artifactsOfHero->artifactsOnAltar.clear();
|
||||||
|
|
||||||
for(auto item : items[0])
|
for(auto item : items[0])
|
||||||
{
|
{
|
||||||
@@ -1264,7 +1275,6 @@ void CAltarWindow::makeDeal()
|
|||||||
item->subtitle = "";
|
item->subtitle = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
arts->commonInfo->reset();
|
|
||||||
//arts->scrollBackpack(0);
|
//arts->scrollBackpack(0);
|
||||||
deal->block(true);
|
deal->block(true);
|
||||||
}
|
}
|
||||||
@@ -1294,12 +1304,13 @@ void CAltarWindow::SacrificeAll()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(auto i = hero->artifactsWorn.cbegin(); i != hero->artifactsWorn.cend(); i++)
|
auto artifactsOfHero = std::dynamic_pointer_cast<CArtifactsOfHeroAltar>(arts);
|
||||||
|
for(const auto & aw : artifactsOfHero->visibleArtSet->artifactsWorn)
|
||||||
{
|
{
|
||||||
if(!i->second.locked) //ignore locks from assembled artifacts
|
if(!aw.second.locked)
|
||||||
moveFromSlotToAltar(i->first, nullptr, i->second.artifact);
|
moveArtToAltar(nullptr, aw.second.artifact);
|
||||||
}
|
}
|
||||||
|
artifactsOfHero->updateWornSlots();
|
||||||
SacrificeBackpack();
|
SacrificeBackpack();
|
||||||
}
|
}
|
||||||
redraw();
|
redraw();
|
||||||
@@ -1414,7 +1425,8 @@ void CAltarWindow::calcTotalExp()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(const CArtifactInstance *art : arts->artifactsOnAltar)
|
auto artifactsOfHero = std::dynamic_pointer_cast<CArtifactsOfHeroAltar>(arts);
|
||||||
|
for(const CArtifactInstance * art : artifactsOfHero->artifactsOnAltar)
|
||||||
{
|
{
|
||||||
int dmp, valOfArt;
|
int dmp, valOfArt;
|
||||||
market->getOffer(art->artType->getId(), 0, dmp, valOfArt, mode);
|
market->getOffer(art->artType->getId(), 0, dmp, valOfArt, mode);
|
||||||
@@ -1458,21 +1470,12 @@ int CAltarWindow::firstFreeSlot()
|
|||||||
|
|
||||||
void CAltarWindow::SacrificeBackpack()
|
void CAltarWindow::SacrificeBackpack()
|
||||||
{
|
{
|
||||||
std::multiset<const CArtifactInstance *> toOmmit = arts->artifactsOnAltar;
|
auto artsAltar = std::dynamic_pointer_cast<CArtifactsOfHeroAltar>(arts);
|
||||||
|
while(!artsAltar->visibleArtSet->artifactsInBackpack.empty())
|
||||||
for (auto & elem : hero->artifactsInBackpack)
|
|
||||||
{
|
{
|
||||||
|
if(!putOnAltar(nullptr, artsAltar->visibleArtSet->artifactsInBackpack[0].artifact))
|
||||||
if(vstd::contains(toOmmit, elem.artifact))
|
break;
|
||||||
{
|
};
|
||||||
toOmmit -= elem.artifact;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
putOnAltar(nullptr, elem.artifact);
|
|
||||||
}
|
|
||||||
|
|
||||||
arts->scrollBackpack(0);
|
|
||||||
calcTotalExp();
|
calcTotalExp();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1484,15 +1487,18 @@ void CAltarWindow::artifactPicked()
|
|||||||
void CAltarWindow::showAll(SDL_Surface * to)
|
void CAltarWindow::showAll(SDL_Surface * to)
|
||||||
{
|
{
|
||||||
CTradeWindow::showAll(to);
|
CTradeWindow::showAll(to);
|
||||||
if(mode == EMarketMode::ARTIFACT_EXP && arts && arts->commonInfo->src.art)
|
if(mode == EMarketMode::ARTIFACT_EXP && arts)
|
||||||
{
|
{
|
||||||
artIcon->setFrame(arts->commonInfo->src.art->artType->getIconIndex());
|
if(auto pickedArt = arts->getPickedArtifact())
|
||||||
artIcon->showAll(to);
|
{
|
||||||
|
artIcon->setFrame(pickedArt->artType->getIconIndex());
|
||||||
|
artIcon->showAll(to);
|
||||||
|
|
||||||
int dmp, val;
|
int dmp, val;
|
||||||
market->getOffer(arts->commonInfo->src.art->artType->getId(), 0, dmp, val, EMarketMode::ARTIFACT_EXP);
|
market->getOffer(pickedArt->getTypeId(), 0, dmp, val, EMarketMode::ARTIFACT_EXP);
|
||||||
val = static_cast<int>(hero->calculateXp(val));
|
val = static_cast<int>(hero->calculateXp(val));
|
||||||
printAtMiddleLoc(std::to_string(val), 304, 498, FONT_SMALL, Colors::WHITE, to);
|
printAtMiddleLoc(std::to_string(val), 304, 498, FONT_SMALL, Colors::WHITE, to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1519,7 +1525,9 @@ bool CAltarWindow::putOnAltar(std::shared_ptr<CTradeableItem> altarSlot, const C
|
|||||||
market->getOffer(art->artType->getId(), 0, dmp, val, EMarketMode::ARTIFACT_EXP);
|
market->getOffer(art->artType->getId(), 0, dmp, val, EMarketMode::ARTIFACT_EXP);
|
||||||
val = static_cast<int>(hero->calculateXp(val));
|
val = static_cast<int>(hero->calculateXp(val));
|
||||||
|
|
||||||
arts->artifactsOnAltar.insert(art);
|
auto artsAltar = std::dynamic_pointer_cast<CArtifactsOfHeroAltar>(arts);
|
||||||
|
artsAltar->artifactsOnAltar.insert(art);
|
||||||
|
artsAltar->deleteFromVisible(art);
|
||||||
altarSlot->setArtInstance(art);
|
altarSlot->setArtInstance(art);
|
||||||
altarSlot->subtitle = std::to_string(val);
|
altarSlot->subtitle = std::to_string(val);
|
||||||
|
|
||||||
@@ -1527,25 +1535,11 @@ bool CAltarWindow::putOnAltar(std::shared_ptr<CTradeableItem> altarSlot, const C
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAltarWindow::moveFromSlotToAltar(ArtifactPosition slotID, std::shared_ptr<CTradeableItem> altarSlot, const CArtifactInstance *art)
|
void CAltarWindow::moveArtToAltar(std::shared_ptr<CTradeableItem> altarSlot, const CArtifactInstance *art)
|
||||||
{
|
{
|
||||||
auto freeBackpackSlot = ArtifactPosition((si32)hero->artifactsInBackpack.size() + GameConstants::BACKPACK_START);
|
|
||||||
if(arts->commonInfo->src.art)
|
|
||||||
{
|
|
||||||
arts->commonInfo->dst.slotID = freeBackpackSlot;
|
|
||||||
arts->commonInfo->dst.AOH = arts.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(putOnAltar(altarSlot, art))
|
if(putOnAltar(altarSlot, art))
|
||||||
{
|
{
|
||||||
if(slotID < GameConstants::BACKPACK_START)
|
CCS->curh->dragAndDropCursor(nullptr);
|
||||||
LOCPLINT->cb->swapArtifacts(ArtifactLocation(hero, slotID), ArtifactLocation(hero, freeBackpackSlot));
|
arts->unmarkSlots();
|
||||||
else
|
|
||||||
{
|
|
||||||
arts->commonInfo->src.clear();
|
|
||||||
arts->commonInfo->dst.clear();
|
|
||||||
CCS->curh->dragAndDropCursor(nullptr);
|
|
||||||
arts->unmarkSlots(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -67,7 +67,7 @@ public:
|
|||||||
const IMarket * market;
|
const IMarket * market;
|
||||||
const CGHeroInstance * hero;
|
const CGHeroInstance * hero;
|
||||||
|
|
||||||
std::shared_ptr<CArtifactsOfHero> arts;
|
std::shared_ptr<CArtifactsOfHeroBase> arts;
|
||||||
//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;
|
||||||
|
|
||||||
@@ -186,5 +186,5 @@ public:
|
|||||||
|
|
||||||
void artifactPicked();
|
void artifactPicked();
|
||||||
int firstFreeSlot();
|
int firstFreeSlot();
|
||||||
void moveFromSlotToAltar(ArtifactPosition slotID, std::shared_ptr<CTradeableItem>, const CArtifactInstance * art);
|
void moveArtToAltar(std::shared_ptr<CTradeableItem>, const CArtifactInstance * art);
|
||||||
};
|
};
|
||||||
|
@@ -909,13 +909,9 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
|
|||||||
portraits[0] = std::make_shared<CAnimImage>("PortraitsLarge", heroInst[0]->portrait, 0, 257, 13);
|
portraits[0] = std::make_shared<CAnimImage>("PortraitsLarge", heroInst[0]->portrait, 0, 257, 13);
|
||||||
portraits[1] = std::make_shared<CAnimImage>("PortraitsLarge", heroInst[1]->portrait, 0, 485, 13);
|
portraits[1] = std::make_shared<CAnimImage>("PortraitsLarge", heroInst[1]->portrait, 0, 485, 13);
|
||||||
|
|
||||||
artifs[0] = std::make_shared<CArtifactsOfHero>(Point(-334, 150));
|
artifs[0] = std::make_shared<CArtifactsOfHeroMain>(Point(-334, 150));
|
||||||
artifs[0]->commonInfo = std::make_shared<CArtifactsOfHero::SCommonPart>();
|
|
||||||
artifs[0]->commonInfo->participants.insert(artifs[0].get());
|
|
||||||
artifs[0]->setHero(heroInst[0]);
|
artifs[0]->setHero(heroInst[0]);
|
||||||
artifs[1] = std::make_shared<CArtifactsOfHero>(Point(96, 150));
|
artifs[1] = std::make_shared<CArtifactsOfHeroMain>(Point(98, 150));
|
||||||
artifs[1]->commonInfo = artifs[0]->commonInfo;
|
|
||||||
artifs[1]->commonInfo->participants.insert(artifs[1].get());
|
|
||||||
artifs[1]->setHero(heroInst[1]);
|
artifs[1]->setHero(heroInst[1]);
|
||||||
|
|
||||||
addSet(artifs[0]);
|
addSet(artifs[0]);
|
||||||
|
@@ -327,7 +327,7 @@ class CExchangeWindow : public CStatusbarWindow, public CGarrisonHolder, public
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
std::array<const CGHeroInstance *, 2> heroInst;
|
std::array<const CGHeroInstance *, 2> heroInst;
|
||||||
std::array<std::shared_ptr<CArtifactsOfHero>, 2> artifs;
|
std::array<std::shared_ptr<CArtifactsOfHeroMain>, 2> artifs;
|
||||||
|
|
||||||
void updateGarrisons() override;
|
void updateGarrisons() override;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user