From 573bb6abc68e51c185aaab1c90f1f474602d27a2 Mon Sep 17 00:00:00 2001 From: SoundSSGood <87084363+SoundSSGood@users.noreply.github.com> Date: Sat, 19 Oct 2024 16:25:26 +0300 Subject: [PATCH] CArtPlace now works with artifact ID --- client/widgets/CArtPlace.cpp | 120 +++++++++----------- client/widgets/CArtPlace.h | 18 +-- client/widgets/CArtifactsOfHeroBackpack.cpp | 2 +- client/widgets/CArtifactsOfHeroBase.cpp | 8 +- client/widgets/CArtifactsOfHeroKingdom.cpp | 4 +- client/windows/CCreatureWindow.cpp | 17 +-- client/windows/CCreatureWindow.h | 4 +- lib/CArtifactInstance.cpp | 8 -- lib/CArtifactInstance.h | 1 - 9 files changed, 83 insertions(+), 99 deletions(-) diff --git a/client/widgets/CArtPlace.cpp b/client/widgets/CArtPlace.cpp index 954366315..0444ef77d 100644 --- a/client/widgets/CArtPlace.cpp +++ b/client/widgets/CArtPlace.cpp @@ -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(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(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(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; diff --git a/client/widgets/CArtPlace.h b/client/widgets/CArtPlace.h index 95ff02b7e..645a57e5a 100644 --- a/client/widgets/CArtPlace.h +++ b/client/widgets/CArtPlace.h @@ -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> & arts); private: - const CArtifactInstance * ourArt; + ArtifactID artId; + SpellID spellId; bool locked; - int imageIndex; + int32_t imageIndex; std::shared_ptr 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; }; diff --git a/client/widgets/CArtifactsOfHeroBackpack.cpp b/client/widgets/CArtifactsOfHeroBackpack.cpp index 6e77636a3..8ecc5b9f3 100644 --- a/client/widgets/CArtifactsOfHeroBackpack.cpp +++ b/client/widgets/CArtifactsOfHeroBackpack.cpp @@ -83,7 +83,7 @@ void CArtifactsOfHeroBackpack::initAOHbackpack(size_t slots, bool slider) slotSizeWithMargin * (artPlaceIdx / slotsColumnsMax)); backpackSlotsBackgrounds.emplace_back(std::make_shared(ImagePath::builtin("heroWindow/artifactSlotEmpty"), pos)); artPlace = std::make_shared(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++; diff --git a/client/widgets/CArtifactsOfHeroBase.cpp b/client/widgets/CArtifactsOfHeroBase.cpp index 6d857b010..9ccd9248e 100644 --- a/client/widgets/CArtifactsOfHeroBase.cpp +++ b/client/widgets/CArtifactsOfHeroBase.cpp @@ -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)); } } diff --git a/client/widgets/CArtifactsOfHeroKingdom.cpp b/client/widgets/CArtifactsOfHeroKingdom.cpp index e65bd8bfb..7bc0853ce 100644 --- a/client/widgets/CArtifactsOfHeroKingdom.cpp +++ b/client/widgets/CArtifactsOfHeroKingdom.cpp @@ -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)); } diff --git a/client/windows/CCreatureWindow.cpp b/client/windows/CCreatureWindow.cpp index 293324c3e..28f0b7b92 100644 --- a/client/windows/CCreatureWindow.cpp +++ b/client/windows/CCreatureWindow.cpp @@ -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(artPos, parent->info->owner, equippedArtifact.first, equippedArtifact.second.artifact); + const auto commanderArt = equippedArtifact.second.artifact; + assert(commanderArt); + auto artPlace = std::make_shared(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(AnimationPath::builtin("ARTIFACT"), art->artType->getIconIndex(), 0, pos.x, pos.y); - parent->stackArtifactHelp = std::make_shared(Rect(pos, Point(44, 44)), ComponentType::ARTIFACT); - parent->stackArtifactHelp->component.subType = art->artType->getId(); - parent->stackArtifactHelp->text = art->getDescription(); - + parent->stackArtifact = std::make_shared(pos, art->getTypeId()); + parent->stackArtifact->setShowPopupCallback([](CArtPlace & artPlace, const Point & cursorPosition) + { + artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition); + }); if(parent->info->owner) { parent->stackArtifactButton = std::make_shared( @@ -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(); } } diff --git a/client/windows/CCreatureWindow.h b/client/windows/CCreatureWindow.h index 4728b3b1f..df1391be4 100644 --- a/client/windows/CCreatureWindow.h +++ b/client/windows/CCreatureWindow.h @@ -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 stackArtifactIcon; - std::shared_ptr stackArtifactHelp; + std::shared_ptr stackArtifact; std::shared_ptr stackArtifactButton; diff --git a/lib/CArtifactInstance.cpp b/lib/CArtifactInstance.cpp index f65e6d95b..cf01339db 100644 --- a/lib/CArtifactInstance.cpp +++ b/lib/CArtifactInstance.cpp @@ -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(); diff --git a/lib/CArtifactInstance.h b/lib/CArtifactInstance.h index 6ff0bdbe0..e1c621c0e 100644 --- a/lib/CArtifactInstance.h +++ b/lib/CArtifactInstance.h @@ -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);