1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-10 22:31:40 +02:00

Fix crash on AI evaluating hero pool after retreating from combat

This commit is contained in:
Ivan Savenko
2025-04-28 19:36:14 +03:00
parent 71d742ab19
commit eaae6270b2
2 changed files with 16 additions and 14 deletions

View File

@@ -59,11 +59,12 @@ void TavernHeroesPool::setHeroForPlayer(PlayerColor player, TavernHeroSlot slot,
return;
auto h = owner->getMap().tryGetFromHeroPool(hero);
assert(h != nullptr);
if (h && army)
if (army)
h->setToArmy(army);
if (h && replenishPoints)
if (replenishPoints)
{
h->setMovementPoints(h->movementPointsLimit(true));
h->mana = h->manaLimit();
@@ -100,6 +101,7 @@ std::vector<const CGHeroInstance *> TavernHeroesPool::getHeroesFor(PlayerColor c
for(const auto & slot : currentTavern)
{
assert(slot.hero != nullptr);
if (slot.player == color)
result.push_back(owner->getMap().tryGetFromHeroPool(slot.hero));
}

View File

@@ -497,18 +497,6 @@ void BattleResultProcessor::battleFinalize(const BattleID & battleID, const Batt
//handle victory/loss of engaged players
gameHandler->checkVictoryLossConditions({finishingBattle->loser, finishingBattle->victor});
if (result.result == EBattleResult::SURRENDER)
{
gameHandler->gameState().statistic.accumulatedValues[finishingBattle->loser].numHeroSurrendered++;
gameHandler->heroPool->onHeroSurrendered(finishingBattle->loser, loserHero);
}
if (result.result == EBattleResult::ESCAPE)
{
gameHandler->gameState().statistic.accumulatedValues[finishingBattle->loser].numHeroEscaped++;
gameHandler->heroPool->onHeroEscaped(finishingBattle->loser, loserHero);
}
// Remove beaten hero
if(loserHero)
{
@@ -524,6 +512,18 @@ void BattleResultProcessor::battleFinalize(const BattleID & battleID, const Batt
gameHandler->heroPool->onHeroEscaped(finishingBattle->victor, winnerHero);
}
if (result.result == EBattleResult::SURRENDER)
{
gameHandler->gameState().statistic.accumulatedValues[finishingBattle->loser].numHeroSurrendered++;
gameHandler->heroPool->onHeroSurrendered(finishingBattle->loser, loserHero);
}
if (result.result == EBattleResult::ESCAPE)
{
gameHandler->gameState().statistic.accumulatedValues[finishingBattle->loser].numHeroEscaped++;
gameHandler->heroPool->onHeroEscaped(finishingBattle->loser, loserHero);
}
finishingBattles.erase(battleID);
battleResults.erase(battleID);
}