|
|
@@ -147,8 +147,66 @@ void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsI
|
|
|
if(checkSpecialArts(*art, hero, std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroAltar>> ? true : false))
|
|
|
{
|
|
|
assert(artSetPtr->getHero()->getSlotByInstance(art) != ArtifactPosition::PRE_FIRST);
|
|
|
- LOCPLINT->cb->swapArtifacts(ArtifactLocation(artSetPtr->getHero()->id, artSetPtr->getHero()->getSlotByInstance(art)),
|
|
|
- ArtifactLocation(artSetPtr->getHero()->id, ArtifactPosition::TRANSITION_POS));
|
|
|
+
|
|
|
+ if(GH.isKeyboardCtrlDown())
|
|
|
+ {
|
|
|
+ std::shared_ptr<CArtifactsOfHeroMain> anotherHeroEquipmentPointer = nullptr;
|
|
|
+
|
|
|
+ for(auto set : artSets)
|
|
|
+ {
|
|
|
+ if(std::holds_alternative<std::weak_ptr<CArtifactsOfHeroMain>>(set))
|
|
|
+ {
|
|
|
+ std::shared_ptr<CArtifactsOfHeroMain> heroEquipmentPointer = std::get<std::weak_ptr<CArtifactsOfHeroMain>>(set).lock();
|
|
|
+ if(heroEquipmentPointer->getHero()->id != artSetPtr->getHero()->id)
|
|
|
+ {
|
|
|
+ anotherHeroEquipmentPointer = heroEquipmentPointer;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(anotherHeroEquipmentPointer != nullptr)
|
|
|
+ {
|
|
|
+ ArtifactPosition availablePosition = ArtifactUtils::getArtAnyPosition(anotherHeroEquipmentPointer->getHero(), art->getTypeId());
|
|
|
+ if(availablePosition != ArtifactPosition::PRE_FIRST)
|
|
|
+ {
|
|
|
+ LOCPLINT->cb->swapArtifacts(ArtifactLocation(artSetPtr->getHero()->id, artSetPtr->getHero()->getSlotByInstance(art)),
|
|
|
+ ArtifactLocation(anotherHeroEquipmentPointer->getHero()->id, availablePosition));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(GH.isKeyboardAltDown())
|
|
|
+ {
|
|
|
+ ArtifactPosition destinationPosition = ArtifactPosition::PRE_FIRST;
|
|
|
+
|
|
|
+ if(ArtifactUtils::isSlotEquipment(artPlace.slot))
|
|
|
+ {
|
|
|
+ ArtifactPosition availablePosition = ArtifactUtils::getArtBackpackPosition(artSetPtr->getHero(), art->getTypeId());
|
|
|
+ if(availablePosition != ArtifactPosition::PRE_FIRST)
|
|
|
+ {
|
|
|
+ destinationPosition = availablePosition;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(ArtifactUtils::isSlotBackpack(artPlace.slot))
|
|
|
+ {
|
|
|
+ ArtifactPosition availablePosition = ArtifactUtils::getArtAnyPosition(artSetPtr->getHero(), art->getTypeId());
|
|
|
+ if(availablePosition != ArtifactPosition::PRE_FIRST && availablePosition != ArtifactPosition::BACKPACK_START)
|
|
|
+ {
|
|
|
+ destinationPosition = availablePosition;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(destinationPosition != ArtifactPosition::PRE_FIRST)
|
|
|
+ {
|
|
|
+ LOCPLINT->cb->swapArtifacts(ArtifactLocation(artSetPtr->getHero()->id, artPlace.slot),
|
|
|
+ ArtifactLocation(artSetPtr->getHero()->id, destinationPosition));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOCPLINT->cb->swapArtifacts(ArtifactLocation(artSetPtr->getHero()->id, artPlace.slot),
|
|
|
+ ArtifactLocation(artSetPtr->getHero()->id, ArtifactPosition::TRANSITION_POS));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|