1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-22 22:13:35 +02:00

ask assemble artifact dialog fix

This commit is contained in:
SoundSSGood 2024-11-10 14:37:28 +02:00
parent a40292e783
commit ef46a87e69
3 changed files with 31 additions and 32 deletions

View File

@ -26,6 +26,7 @@
ArtifactsUIController::ArtifactsUIController()
{
numOfMovedArts = 0;
numOfArtsAskAssembleSession = 0;
}
bool ArtifactsUIController::askToAssemble(const ArtifactLocation & al, const bool onlyEquipped, const bool checkIgnored)

View File

@ -1802,61 +1802,59 @@ void BulkMoveArtifacts::applyGs(CGameState *gs)
void AssembledArtifact::applyGs(CGameState *gs)
{
auto hero = gs->getHero(al.artHolder);
assert(hero);
const auto transformedArt = hero->getArt(al.slot);
auto artSet = gs->getArtSet(al.artHolder);
assert(artSet);
const auto transformedArt = artSet->getArt(al.slot);
assert(transformedArt);
const auto builtArt = artId.toArtifact();
assert(vstd::contains_if(ArtifactUtils::assemblyPossibilities(hero, transformedArt->getTypeId()), [=](const CArtifact * art)->bool
assert(vstd::contains_if(ArtifactUtils::assemblyPossibilities(artSet, transformedArt->getTypeId()), [=](const CArtifact * art)->bool
{
return art->getId() == builtArt->getId();
}));
const auto transformedArtSlot = hero->getArtPos(transformedArt);
auto * combinedArt = new CArtifactInstance(builtArt);
gs->map->addNewArtifactInstance(combinedArt);
// Find slots for all involved artifacts
std::vector<ArtifactPosition> slotsInvolved;
CArtifactFittingSet artSet(*hero);
for(const auto constituent : builtArt->getConstituents())
std::set<ArtifactPosition, std::greater<>> slotsInvolved = { al.slot };
CArtifactFittingSet fittingSet(*artSet);
auto parts = builtArt->getConstituents();
parts.erase(std::find(parts.begin(), parts.end(), transformedArt->getType()));
for(const auto constituent : parts)
{
const auto slot = artSet.getArtPos(constituent->getId(), false, false);
artSet.lockSlot(slot);
const auto slot = fittingSet.getArtPos(constituent->getId(), false, false);
fittingSet.lockSlot(slot);
assert(slot != ArtifactPosition::PRE_FIRST);
slotsInvolved.emplace_back(slot);
slotsInvolved.insert(slot);
}
std::sort(slotsInvolved.begin(), slotsInvolved.end(), std::greater<>());
// Find a slot for combined artifact
al.slot = transformedArtSlot;
for(const auto & slot : slotsInvolved)
if(ArtifactUtils::isSlotEquipment(al.slot) && ArtifactUtils::isSlotBackpack(*slotsInvolved.begin()))
{
if(ArtifactUtils::isSlotEquipment(transformedArtSlot))
{
al.slot = ArtifactPosition::BACKPACK_START;
}
else if(ArtifactUtils::isSlotBackpack(al.slot))
{
for(const auto & slot : slotsInvolved)
if(ArtifactUtils::isSlotBackpack(slot))
al.slot = slot;
}
else
{
for(const auto & slot : slotsInvolved)
if(!vstd::contains(builtArt->getPossibleSlots().at(artSet->bearerType()), al.slot)
&& vstd::contains(builtArt->getPossibleSlots().at(artSet->bearerType()), slot))
{
al.slot = ArtifactPosition::BACKPACK_START;
al.slot = slot;
break;
}
if(!vstd::contains(combinedArt->getType()->getPossibleSlots().at(hero->bearerType()), al.slot)
&& vstd::contains(combinedArt->getType()->getPossibleSlots().at(hero->bearerType()), slot))
al.slot = slot;
}
else
{
if(ArtifactUtils::isSlotBackpack(slot))
al.slot = std::min(al.slot, slot);
}
}
// Delete parts from hero
for(const auto & slot : slotsInvolved)
{
const auto constituentInstance = hero->getArt(slot);
gs->map->removeArtifactInstance(*hero, slot);
const auto constituentInstance = artSet->getArt(slot);
gs->map->removeArtifactInstance(*artSet, slot);
if(!combinedArt->getType()->isFused())
{
@ -1868,7 +1866,7 @@ void AssembledArtifact::applyGs(CGameState *gs)
}
// Put new combined artifacts
gs->map->putArtifactInstance(*hero, combinedArt, al.slot);
gs->map->putArtifactInstance(*artSet, combinedArt, al.slot);
}
void DisassembledArtifact::applyGs(CGameState *gs)

View File

@ -2629,7 +2629,7 @@ bool CGameHandler::moveArtifact(const PlayerColor & player, const ArtifactLocati
giveHeroNewArtifact(hero, ArtifactID::SPELLBOOK, ArtifactPosition::SPELLBOOK);
ma.artsPack0.push_back(BulkMoveArtifacts::LinkedSlots(src.slot, dstSlot));
if(src.artHolder != dst.artHolder)
if(src.artHolder != dst.artHolder && !isDstSlotBackpack)
ma.artsPack0.back().askAssemble = true;
sendAndApply(ma);
return true;