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

Fix broken bonuses due to calling PutArtifact before NewArtifact

This commit is contained in:
Ivan Savenko 2023-05-09 16:48:52 +03:00
parent cb8201876b
commit 79982c4ad4
2 changed files with 22 additions and 9 deletions

View File

@ -1793,6 +1793,9 @@ void BulkSmartRebalanceStacks::applyGs(CGameState * gs)
void PutArtifact::applyGs(CGameState *gs)
{
assert(art->canBePutAt(al));
// Ensure that artifact has been correctly added via NewArtifact pack
assert(vstd::contains(gs->map->artInstances, art));
assert(!art->getParentNodes().empty());
art->putAt(al);
//al.hero->putArtifact(al.slot, art);
}

View File

@ -6793,8 +6793,21 @@ void CGameHandler::putArtifact(const ArtifactLocation &al, const CArtifactInstan
bool CGameHandler::giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos)
{
assert(artType);
if(pos != ArtifactPosition::FIRST_AVAILABLE && !ArtifactUtils::isSlotBackpack(pos))
if(pos == ArtifactPosition::FIRST_AVAILABLE)
{
if(!artType->canBePutAt(h, ArtifactUtils::getArtAnyPosition(h, artType->getId())))
COMPLAIN_RET("Cannot put artifact in that slot!");
}
else if(ArtifactUtils::isSlotBackpack(pos))
{
if(!artType->canBePutAt(h, ArtifactUtils::getArtBackpackPosition(h, artType->getId())))
COMPLAIN_RET("Cannot put artifact in that slot!");
}
else
{
COMPLAIN_RET_FALSE_IF(!artType->canBePutAt(h, pos, false), "Cannot put artifact in that slot!");
}
CArtifactInstance * newArtInst = nullptr;
if(artType->canBeDisassembled())
@ -6803,18 +6816,15 @@ bool CGameHandler::giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact
newArtInst = new CArtifactInstance();
newArtInst->artType = artType; // *NOT* via settype -> all bonus-related stuff must be done by NewArtifact apply
NewArtifact na;
na.art = newArtInst;
sendAndApply(&na); // -> updates a!!!, will create a on other machines
if(giveHeroArtifact(h, newArtInst, pos))
{
NewArtifact na;
na.art = newArtInst;
sendAndApply(&na); // -> updates a!!!, will create a on other machines
return true;
}
else
{
delete newArtInst;
return false;
}
}
void CGameHandler::setBattleResult(BattleResult::EResult resultType, int victoriusSide)