mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
CArtPlace now works with artifact ID
This commit is contained in:
parent
6dc6cc4cbf
commit
573bb6abc6
@ -29,26 +29,44 @@
|
||||
#include "../../lib/networkPacks/ArtifactLocation.h"
|
||||
#include "../../lib/CConfigHandler.h"
|
||||
|
||||
void CArtPlace::setInternals(const CArtifactInstance * artInst)
|
||||
CArtPlace::CArtPlace(Point position, const ArtifactID & artId, const SpellID & spellId)
|
||||
: SelectableSlot(Rect(position, Point(44, 44)), Point(1, 1))
|
||||
, locked(false)
|
||||
, imageIndex(0)
|
||||
{
|
||||
ourArt = artInst;
|
||||
if(!artInst)
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
image = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), 0);
|
||||
setArtifact(artId, spellId);
|
||||
moveSelectionForeground();
|
||||
}
|
||||
|
||||
void CArtPlace::setArtifact(const SpellID & spellId)
|
||||
{
|
||||
setArtifact(ArtifactID::SPELL_SCROLL, spellId);
|
||||
}
|
||||
|
||||
void CArtPlace::setArtifact(const ArtifactID & artId, const SpellID & spellId)
|
||||
{
|
||||
this->artId = artId;
|
||||
if(artId == ArtifactID::NONE)
|
||||
{
|
||||
image->disable();
|
||||
text.clear();
|
||||
hoverText = CGI->generaltexth->allTexts[507];
|
||||
lockSlot(false);
|
||||
return;
|
||||
}
|
||||
|
||||
imageIndex = artInst->artType->getIconIndex();
|
||||
if(artInst->getTypeId() == ArtifactID::SPELL_SCROLL)
|
||||
const auto artType = artId.toArtifact();
|
||||
imageIndex = artType->getIconIndex();
|
||||
if(artId == ArtifactID::SPELL_SCROLL)
|
||||
{
|
||||
auto spellID = artInst->getScrollSpellID();
|
||||
assert(spellID.num >= 0);
|
||||
this->spellId = spellId;
|
||||
assert(spellId.num > 0);
|
||||
|
||||
if(settings["general"]["enableUiEnhancements"].Bool())
|
||||
{
|
||||
imageIndex = spellID.num;
|
||||
imageIndex = spellId.num;
|
||||
if(component.type != ComponentType::SPELL_SCROLL)
|
||||
{
|
||||
image->setScale(Point(pos.w, 34));
|
||||
@ -58,7 +76,7 @@ void CArtPlace::setInternals(const CArtifactInstance * artInst)
|
||||
}
|
||||
// Add spell component info (used to provide a pic in r-click popup)
|
||||
component.type = ComponentType::SPELL_SCROLL;
|
||||
component.subType = spellID;
|
||||
component.subType = spellId;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -69,47 +87,33 @@ void CArtPlace::setInternals(const CArtifactInstance * artInst)
|
||||
image->moveTo(Point(pos.x, pos.y));
|
||||
}
|
||||
component.type = ComponentType::ARTIFACT;
|
||||
component.subType = artInst->getTypeId();
|
||||
component.subType = artId;
|
||||
}
|
||||
image->enable();
|
||||
text = artInst->getDescription();
|
||||
lockSlot(locked);
|
||||
|
||||
text = artType->getDescriptionTranslated();
|
||||
if(artType->isScroll())
|
||||
ArtifactUtils::insertScrrollSpellName(text, spellId);
|
||||
}
|
||||
|
||||
CArtPlace::CArtPlace(Point position, const CArtifactInstance * art)
|
||||
: SelectableSlot(Rect(position, Point(44, 44)), Point(1, 1))
|
||||
, ourArt(art)
|
||||
, locked(false)
|
||||
ArtifactID CArtPlace::getArtifactId() const
|
||||
{
|
||||
OBJECT_CONSTRUCTION;
|
||||
|
||||
imageIndex = 0;
|
||||
if(locked)
|
||||
imageIndex = ArtifactID::ART_LOCK;
|
||||
else if(ourArt)
|
||||
imageIndex = ourArt->artType->getIconIndex();
|
||||
|
||||
image = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), imageIndex);
|
||||
image->disable();
|
||||
moveSelectionForeground();
|
||||
return artId;
|
||||
}
|
||||
|
||||
const CArtifactInstance * CArtPlace::getArt() const
|
||||
{
|
||||
return ourArt;
|
||||
}
|
||||
|
||||
CCommanderArtPlace::CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot, const CArtifactInstance * art)
|
||||
: CArtPlace(position, art),
|
||||
CCommanderArtPlace::CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot,
|
||||
const ArtifactID & artId, const SpellID & spellId)
|
||||
: CArtPlace(position, artId, spellId),
|
||||
commanderOwner(commanderOwner),
|
||||
commanderSlotID(artSlot.num)
|
||||
{
|
||||
setArtifact(art);
|
||||
}
|
||||
|
||||
void CCommanderArtPlace::returnArtToHeroCallback()
|
||||
{
|
||||
ArtifactPosition artifactPos = commanderSlotID;
|
||||
ArtifactPosition freeSlot = ArtifactUtils::getArtBackpackPosition(commanderOwner, getArt()->getTypeId());
|
||||
ArtifactPosition freeSlot = ArtifactUtils::getArtBackpackPosition(commanderOwner, getArtifactId());
|
||||
if(freeSlot == ArtifactPosition::PRE_FIRST)
|
||||
{
|
||||
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("core.genrltxt.152"));
|
||||
@ -120,10 +124,10 @@ void CCommanderArtPlace::returnArtToHeroCallback()
|
||||
src.creature = SlotID::COMMANDER_SLOT_PLACEHOLDER;
|
||||
ArtifactLocation dst(commanderOwner->id, freeSlot);
|
||||
|
||||
if(getArt()->canBePutAt(commanderOwner, freeSlot, true))
|
||||
if(getArtifactId().toArtifact()->canBePutAt(commanderOwner, freeSlot, true))
|
||||
{
|
||||
LOCPLINT->cb->swapArtifacts(src, dst);
|
||||
setArtifact(nullptr);
|
||||
setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
parent->redraw();
|
||||
}
|
||||
}
|
||||
@ -131,29 +135,35 @@ void CCommanderArtPlace::returnArtToHeroCallback()
|
||||
|
||||
void CCommanderArtPlace::clickPressed(const Point & cursorPosition)
|
||||
{
|
||||
if(getArt() && text.size())
|
||||
if(getArtifactId() != ArtifactID::NONE && text.size())
|
||||
LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.commanderWindow.artifactMessage"), [this]() { returnArtToHeroCallback(); }, []() {});
|
||||
}
|
||||
|
||||
void CCommanderArtPlace::showPopupWindow(const Point & cursorPosition)
|
||||
{
|
||||
if(getArt() && text.size())
|
||||
if(getArtifactId() != ArtifactID::NONE && text.size())
|
||||
CArtPlace::showPopupWindow(cursorPosition);
|
||||
}
|
||||
|
||||
void CArtPlace::lockSlot(bool on)
|
||||
{
|
||||
if(locked == on)
|
||||
return;
|
||||
|
||||
locked = on;
|
||||
|
||||
if(on)
|
||||
{
|
||||
image->setFrame(ArtifactID::ART_LOCK);
|
||||
else if(ourArt)
|
||||
hoverText = CGI->generaltexth->allTexts[507];
|
||||
}
|
||||
else if(artId != ArtifactID::NONE)
|
||||
{
|
||||
image->setFrame(imageIndex);
|
||||
auto hoverText = MetaString::createFromRawString(CGI->generaltexth->heroscrn[1]);
|
||||
hoverText.replaceName(artId);
|
||||
this->hoverText = hoverText.toString();
|
||||
}
|
||||
else
|
||||
image->setFrame(0);
|
||||
{
|
||||
hoverText = CGI->generaltexth->allTexts[507];
|
||||
}
|
||||
}
|
||||
|
||||
bool CArtPlace::isLocked() const
|
||||
@ -182,24 +192,6 @@ void CArtPlace::gesture(bool on, const Point & initialPosition, const Point & fi
|
||||
gestureCallback(*this, initialPosition);
|
||||
}
|
||||
|
||||
void CArtPlace::setArtifact(const CArtifactInstance * art)
|
||||
{
|
||||
setInternals(art);
|
||||
if(art)
|
||||
{
|
||||
image->setFrame(locked ? static_cast<int>(ArtifactID::ART_LOCK) : imageIndex);
|
||||
|
||||
if(locked) // Locks should appear as empty.
|
||||
hoverText = CGI->generaltexth->allTexts[507];
|
||||
else
|
||||
hoverText = boost::str(boost::format(CGI->generaltexth->heroscrn[1]) % ourArt->artType->getNameTranslated());
|
||||
}
|
||||
else
|
||||
{
|
||||
lockSlot(false);
|
||||
}
|
||||
}
|
||||
|
||||
void CArtPlace::setClickPressedCallback(const ClickFunctor & callback)
|
||||
{
|
||||
clickPressedCallback = callback;
|
||||
|
@ -20,11 +20,12 @@ public:
|
||||
|
||||
ArtifactPosition slot;
|
||||
|
||||
CArtPlace(Point position, const CArtifactInstance * art = nullptr);
|
||||
const CArtifactInstance * getArt() const;
|
||||
CArtPlace(Point position, const ArtifactID & artId = ArtifactID::NONE, const SpellID & spellId = SpellID::NONE);
|
||||
void setArtifact(const SpellID & spellId);
|
||||
void setArtifact(const ArtifactID & artId, const SpellID & spellId = SpellID::NONE);
|
||||
ArtifactID getArtifactId() const;
|
||||
void lockSlot(bool on);
|
||||
bool isLocked() const;
|
||||
void setArtifact(const CArtifactInstance * art);
|
||||
void setClickPressedCallback(const ClickFunctor & callback);
|
||||
void setShowPopupCallback(const ClickFunctor & callback);
|
||||
void setGestureCallback(const ClickFunctor & callback);
|
||||
@ -34,16 +35,14 @@ public:
|
||||
void addCombinedArtInfo(const std::map<const ArtifactID, std::vector<ArtifactID>> & arts);
|
||||
|
||||
private:
|
||||
const CArtifactInstance * ourArt;
|
||||
ArtifactID artId;
|
||||
SpellID spellId;
|
||||
bool locked;
|
||||
int imageIndex;
|
||||
int32_t imageIndex;
|
||||
std::shared_ptr<CAnimImage> image;
|
||||
ClickFunctor clickPressedCallback;
|
||||
ClickFunctor showPopupCallback;
|
||||
ClickFunctor gestureCallback;
|
||||
|
||||
protected:
|
||||
void setInternals(const CArtifactInstance * artInst);
|
||||
};
|
||||
|
||||
class CCommanderArtPlace : public CArtPlace
|
||||
@ -55,7 +54,8 @@ private:
|
||||
void returnArtToHeroCallback();
|
||||
|
||||
public:
|
||||
CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot, const CArtifactInstance * art = nullptr);
|
||||
CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot,
|
||||
const ArtifactID & artId = ArtifactID::NONE, const SpellID & spellId = SpellID::NONE);
|
||||
void clickPressed(const Point & cursorPosition) override;
|
||||
void showPopupWindow(const Point & cursorPosition) override;
|
||||
};
|
||||
|
@ -83,7 +83,7 @@ void CArtifactsOfHeroBackpack::initAOHbackpack(size_t slots, bool slider)
|
||||
slotSizeWithMargin * (artPlaceIdx / slotsColumnsMax));
|
||||
backpackSlotsBackgrounds.emplace_back(std::make_shared<CPicture>(ImagePath::builtin("heroWindow/artifactSlotEmpty"), pos));
|
||||
artPlace = std::make_shared<CArtPlace>(pos);
|
||||
artPlace->setArtifact(nullptr);
|
||||
artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||
artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||
artPlaceIdx++;
|
||||
|
@ -66,13 +66,13 @@ void CArtifactsOfHeroBase::init(
|
||||
for(auto artPlace : artWorn)
|
||||
{
|
||||
artPlace.second->slot = artPlace.first;
|
||||
artPlace.second->setArtifact(nullptr);
|
||||
artPlace.second->setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
artPlace.second->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||
artPlace.second->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||
}
|
||||
for(auto artPlace : backpack)
|
||||
{
|
||||
artPlace->setArtifact(nullptr);
|
||||
artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||
artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||
}
|
||||
@ -260,7 +260,7 @@ void CArtifactsOfHeroBase::setSlotData(ArtPlacePtr artPlace, const ArtifactPosit
|
||||
if(auto slotInfo = curHero->getSlot(slot))
|
||||
{
|
||||
artPlace->lockSlot(slotInfo->locked);
|
||||
artPlace->setArtifact(slotInfo->artifact);
|
||||
artPlace->setArtifact(slotInfo->artifact->getTypeId(), slotInfo->artifact->getScrollSpellID());
|
||||
if(slotInfo->locked || slotInfo->artifact->isCombined())
|
||||
return;
|
||||
|
||||
@ -285,7 +285,7 @@ void CArtifactsOfHeroBase::setSlotData(ArtPlacePtr artPlace, const ArtifactPosit
|
||||
}
|
||||
else
|
||||
{
|
||||
artPlace->setArtifact(nullptr);
|
||||
artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,14 +29,14 @@ CArtifactsOfHeroKingdom::CArtifactsOfHeroKingdom(ArtPlaceMap ArtWorn, std::vecto
|
||||
for(auto artPlace : artWorn)
|
||||
{
|
||||
artPlace.second->slot = artPlace.first;
|
||||
artPlace.second->setArtifact(nullptr);
|
||||
artPlace.second->setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
artPlace.second->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||
artPlace.second->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||
}
|
||||
enableGesture();
|
||||
for(auto artPlace : backpack)
|
||||
{
|
||||
artPlace->setArtifact(nullptr);
|
||||
artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
|
||||
artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
|
||||
artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
|
||||
}
|
||||
|
@ -432,7 +432,9 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
|
||||
for(auto equippedArtifact : parent->info->commander->artifactsWorn)
|
||||
{
|
||||
Point artPos = getArtifactPos(equippedArtifact.first);
|
||||
auto artPlace = std::make_shared<CCommanderArtPlace>(artPos, parent->info->owner, equippedArtifact.first, equippedArtifact.second.artifact);
|
||||
const auto commanderArt = equippedArtifact.second.artifact;
|
||||
assert(commanderArt);
|
||||
auto artPlace = std::make_shared<CCommanderArtPlace>(artPos, parent->info->owner, equippedArtifact.first, commanderArt->getTypeId());
|
||||
artifacts.push_back(artPlace);
|
||||
}
|
||||
|
||||
@ -616,11 +618,11 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
|
||||
auto art = parent->info->stackNode->getArt(ArtifactPosition::CREATURE_SLOT);
|
||||
if(art)
|
||||
{
|
||||
parent->stackArtifactIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("ARTIFACT"), art->artType->getIconIndex(), 0, pos.x, pos.y);
|
||||
parent->stackArtifactHelp = std::make_shared<LRClickableAreaWTextComp>(Rect(pos, Point(44, 44)), ComponentType::ARTIFACT);
|
||||
parent->stackArtifactHelp->component.subType = art->artType->getId();
|
||||
parent->stackArtifactHelp->text = art->getDescription();
|
||||
|
||||
parent->stackArtifact = std::make_shared<CArtPlace>(pos, art->getTypeId());
|
||||
parent->stackArtifact->setShowPopupCallback([](CArtPlace & artPlace, const Point & cursorPosition)
|
||||
{
|
||||
artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition);
|
||||
});
|
||||
if(parent->info->owner)
|
||||
{
|
||||
parent->stackArtifactButton = std::make_shared<CButton>(
|
||||
@ -987,8 +989,7 @@ void CStackWindow::removeStackArtifact(ArtifactPosition pos)
|
||||
artLoc.creature = info->stackNode->armyObj->findStack(info->stackNode);
|
||||
LOCPLINT->cb->swapArtifacts(artLoc, ArtifactLocation(info->owner->id, slot));
|
||||
stackArtifactButton.reset();
|
||||
stackArtifactHelp.reset();
|
||||
stackArtifactIcon.reset();
|
||||
stackArtifact.reset();
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ class CTabbedInt;
|
||||
class CButton;
|
||||
class CMultiLineLabel;
|
||||
class CListBox;
|
||||
class CArtPlace;
|
||||
class CCommanderArtPlace;
|
||||
class LRClickableArea;
|
||||
|
||||
@ -156,8 +157,7 @@ class CStackWindow : public CWindowObject
|
||||
MainSection(CStackWindow * owner, int yOffset, bool showExp, bool showArt);
|
||||
};
|
||||
|
||||
std::shared_ptr<CAnimImage> stackArtifactIcon;
|
||||
std::shared_ptr<LRClickableAreaWTextComp> stackArtifactHelp;
|
||||
std::shared_ptr<CArtPlace> stackArtifact;
|
||||
std::shared_ptr<CButton> stackArtifactButton;
|
||||
|
||||
|
||||
|
@ -134,14 +134,6 @@ std::string CArtifactInstance::nodeName() const
|
||||
return "Artifact instance of " + (artType ? artType->getJsonKey() : std::string("uninitialized")) + " type";
|
||||
}
|
||||
|
||||
std::string CArtifactInstance::getDescription() const
|
||||
{
|
||||
std::string text = artType->getDescriptionTranslated();
|
||||
if(artType->isScroll())
|
||||
ArtifactUtils::insertScrrollSpellName(text, getScrollSpellID());
|
||||
return text;
|
||||
}
|
||||
|
||||
ArtifactID CArtifactInstance::getTypeId() const
|
||||
{
|
||||
return artType->getId();
|
||||
|
@ -80,7 +80,6 @@ public:
|
||||
CArtifactInstance();
|
||||
void setType(const CArtifact * art);
|
||||
std::string nodeName() const override;
|
||||
std::string getDescription() const;
|
||||
ArtifactID getTypeId() const;
|
||||
ArtifactInstanceID getId() const;
|
||||
void setId(ArtifactInstanceID id);
|
||||
|
Loading…
Reference in New Issue
Block a user