From f0feeeac6e45b40939b849d4157fbf499037de42 Mon Sep 17 00:00:00 2001 From: SoundSSGood <87084363+SoundSSGood@users.noreply.github.com> Date: Wed, 17 May 2023 17:01:22 +0300 Subject: [PATCH] putArtifact, removeArtifact --- lib/CArtHandler.cpp | 171 ++++++++++++++------------------------------ lib/CArtHandler.h | 7 +- lib/NetPacksLib.cpp | 4 +- 3 files changed, 58 insertions(+), 124 deletions(-) diff --git a/lib/CArtHandler.cpp b/lib/CArtHandler.cpp index 4a25cb63e..d5e9699d8 100644 --- a/lib/CArtHandler.cpp +++ b/lib/CArtHandler.cpp @@ -858,7 +858,7 @@ void CArtifactInstance::putAt(ArtifactLocation al) { assert(canBePutAt(al)); - al.getHolderArtSet()->setNewArtSlot(al.slot, this, false); + al.getHolderArtSet()->CArtifactSet::putArtifact(al.slot, this); if(ArtifactUtils::isSlotEquipment(al.slot)) al.getHolderNode()->attachTo(*this); } @@ -866,7 +866,8 @@ void CArtifactInstance::putAt(ArtifactLocation al) void CArtifactInstance::removeFrom(ArtifactLocation al) { assert(al.getHolderArtSet()->getArt(al.slot) == this); - al.getHolderArtSet()->eraseArtSlot(al.slot); + + al.getHolderArtSet()->removeArtifact(al.slot); if(ArtifactUtils::isSlotEquipment(al.slot)) al.getHolderNode()->detachFrom(*this); } @@ -929,88 +930,14 @@ void CCombinedArtifactInstance::addAsConstituent(CArtifactInstance * art, const attachTo(*art); } -void CCombinedArtifactInstance::putAt(ArtifactLocation al) -{ - if(al.slot == ArtifactPosition::TRANSITION_POS) - { - CArtifactInstance::putAt(al); - } - else if(ArtifactUtils::isSlotBackpack(al.slot)) - { - CArtifactInstance::putAt(al); - for(ConstituentInfo &ci : constituentsInfo) - ci.slot = ArtifactPosition::PRE_FIRST; - } - else - { - CArtifactInstance *mainConstituent = figureMainConstituent(al); //it'll be replaced with combined artifact, not a lock - CArtifactInstance::putAt(al); //puts combined art (this) - - for(ConstituentInfo & ci : constituentsInfo) - { - if(ci.art != mainConstituent) - { - const ArtifactLocation suggestedPos(al.artHolder, ci.slot); - const bool inActiveSlot = vstd::isbetween(ci.slot, 0, GameConstants::BACKPACK_START); - const bool suggestedPosValid = ci.art->canBePutAt(suggestedPos); - - if(!(inActiveSlot && suggestedPosValid)) //there is a valid suggestion where to place lock - ci.slot = ArtifactUtils::getArtAnyPosition(al.getHolderArtSet(), ci.art->getTypeId()); - - assert(ArtifactUtils::isSlotEquipment(ci.slot)); - al.getHolderArtSet()->setNewArtSlot(ci.slot, ci.art, true); //sets as lock - } - else - { - ci.slot = ArtifactPosition::PRE_FIRST; - } - } - } -} - void CCombinedArtifactInstance::removeFrom(ArtifactLocation al) { - if(ArtifactUtils::isSlotBackpack(al.slot) || al.slot == ArtifactPosition::TRANSITION_POS) + CArtifactInstance::removeFrom(al); + for(auto & part : constituentsInfo) { - CArtifactInstance::removeFrom(al); + if(part.slot != ArtifactPosition::PRE_FIRST) + part.slot = ArtifactPosition::PRE_FIRST; } - else - { - for(ConstituentInfo &ci : constituentsInfo) - { - if(ci.slot >= 0) - { - al.getHolderArtSet()->eraseArtSlot(ci.slot); - ci.slot = ArtifactPosition::PRE_FIRST; - } - else - { - //main constituent - CArtifactInstance::removeFrom(al); - } - } - } -} - -CArtifactInstance * CCombinedArtifactInstance::figureMainConstituent(const ArtifactLocation & al) -{ - CArtifactInstance *mainConstituent = nullptr; //it'll be replaced with combined artifact, not a lock - for(ConstituentInfo &ci : constituentsInfo) - if(ci.slot == al.slot) - mainConstituent = ci.art; - - if(!mainConstituent) - { - for(ConstituentInfo &ci : constituentsInfo) - { - if(vstd::contains(ci.art->artType->possibleSlots[al.getHolderArtSet()->bearerType()], al.slot)) - { - mainConstituent = ci.art; - } - } - } - - return mainConstituent; } void CCombinedArtifactInstance::deserializationFix() @@ -1173,6 +1100,52 @@ unsigned CArtifactSet::getArtPosCount(const ArtifactID & aid, bool onlyWorn, boo return 0; } +void CArtifactSet::putArtifact(ArtifactPosition slot, CArtifactInstance * art) +{ + setNewArtSlot(slot, art, false); + if(art->artType->canBeDisassembled() && ArtifactUtils::isSlotEquipment(slot)) + { + const CArtifactInstance * mainPart = nullptr; + auto & parts = dynamic_cast(art)->constituentsInfo; + for(const auto & part : parts) + if(vstd::contains(part.art->artType->possibleSlots.at(bearerType()), slot)) + { + mainPart = part.art; + break; + } + + for(auto & part : parts) + { + if(part.art != mainPart) + { + if(!part.art->artType->canBePutAt(this, part.slot)) + part.slot = ArtifactUtils::getArtAnyPosition(this, part.art->getTypeId()); + + assert(ArtifactUtils::isSlotEquipment(part.slot)); + setNewArtSlot(part.slot, art, true); + } + } + } +} + +void CArtifactSet::removeArtifact(ArtifactPosition slot) +{ + auto art = getArt(slot, false); + if(art) + { + if(art->canBeDisassembled()) + { + auto combinedArt = dynamic_cast(art); + for(auto & part : combinedArt->constituentsInfo) + { + if(getArt(part.slot, false)) + eraseArtSlot(part.slot); + } + } + eraseArtSlot(slot); + } +} + std::pair CArtifactSet::searchForConstituent(const ArtifactID & aid) const { for(const auto & slot : artifactsInBackpack) @@ -1399,44 +1372,6 @@ CArtifactFittingSet::CArtifactFittingSet(ArtBearer::ArtBearer Bearer): { } -void CArtifactFittingSet::putArtifact(ArtifactPosition pos, CArtifactInstance * art) -{ - if(art && art->canBeDisassembled() && ArtifactUtils::isSlotEquipment(pos)) - { - for(auto & part : dynamic_cast(art)->constituentsInfo) - { - const auto slot = ArtifactUtils::getArtAnyPosition(this, part.art->getTypeId()); - assert(slot != ArtifactPosition::PRE_FIRST); - // For the ArtFittingSet is no needed to do figureMainConstituent, just lock slots - this->setNewArtSlot(slot, part.art, true); - } - } - else - { - this->setNewArtSlot(pos, art, false); - } -} - -void CArtifactFittingSet::removeArtifact(ArtifactPosition pos) -{ - // Removes the art from the CartifactSet, but does not remove it from art->constituentsInfo. - // removeArtifact is for CArtifactFittingSet only. Do not move it to the parent class. - - auto art = getArt(pos); - if(art == nullptr) - return; - if(art->canBeDisassembled()) - { - auto combinedArt = dynamic_cast(art); - for(const auto & part : combinedArt->constituentsInfo) - { - if(ArtifactUtils::isSlotEquipment(part.slot)) - eraseArtSlot(part.slot); - } - } - eraseArtSlot(pos); -} - ArtBearer::ArtBearer CArtifactFittingSet::bearerType() const { return this->Bearer; diff --git a/lib/CArtHandler.h b/lib/CArtHandler.h index a0b356a20..265027a46 100644 --- a/lib/CArtHandler.h +++ b/lib/CArtHandler.h @@ -195,13 +195,11 @@ public: std::vector constituentsInfo; - void putAt(ArtifactLocation al) override; void removeFrom(ArtifactLocation al) override; bool isPart(const CArtifactInstance *supposedPart) const override; void createConstituents(); void addAsConstituent(CArtifactInstance * art, const ArtifactPosition & slot); - CArtifactInstance * figureMainConstituent(const ArtifactLocation & al); //main constituent is replaced with us (combined art), not lock CCombinedArtifactInstance() = default; @@ -325,7 +323,8 @@ public: unsigned getArtPosCount(const ArtifactID & aid, bool onlyWorn = true, bool searchBackpackAssemblies = true, bool allowLocked = true) const; virtual ArtBearer::ArtBearer bearerType() const = 0; - virtual void putArtifact(ArtifactPosition pos, CArtifactInstance * art) = 0; + virtual void putArtifact(ArtifactPosition slot, CArtifactInstance * art); + void removeArtifact(ArtifactPosition slot); virtual ~CArtifactSet(); template void serialize(Handler &h, const int version) @@ -353,8 +352,6 @@ class DLL_LINKAGE CArtifactFittingSet : public CArtifactSet { public: CArtifactFittingSet(ArtBearer::ArtBearer Bearer); - void putArtifact(ArtifactPosition pos, CArtifactInstance * art) override; - void removeArtifact(ArtifactPosition pos); ArtBearer::ArtBearer bearerType() const override; protected: diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index 950fa6ef4..8c9a0650f 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -1936,7 +1936,6 @@ void AssembledArtifact::applyGs(CGameState *gs) //move constituent from hero to be part of new, combined artifact constituentInstance->removeFrom(ArtifactLocation(al.artHolder, pos)); - combinedArt->addAsConstituent(constituentInstance, pos); if(combineEquipped) { if(!vstd::contains(combinedArt->artType->possibleSlots[artSet->bearerType()], al.slot) @@ -1947,6 +1946,9 @@ void AssembledArtifact::applyGs(CGameState *gs) { al.slot = std::min(al.slot, pos); } + if(al.slot == pos) + pos = ArtifactPosition::PRE_FIRST; + combinedArt->addAsConstituent(constituentInstance, pos); } //put new combined artifacts