浏览代码

Fix crash on AI evaluating hero pool after retreating from combat

Ivan Savenko 5 月之前
父节点
当前提交
eaae6270b2
共有 2 个文件被更改,包括 16 次插入14 次删除
  1. 4 2
      lib/gameState/TavernHeroesPool.cpp
  2. 12 12
      server/battles/BattleResultProcessor.cpp

+ 4 - 2
lib/gameState/TavernHeroesPool.cpp

@@ -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));
 	}

+ 12 - 12
server/battles/BattleResultProcessor.cpp

@@ -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);
 }