From fe65edd55dac03033010485efa757a401f707d0a Mon Sep 17 00:00:00 2001 From: Andrii Danylchenko Date: Wed, 10 May 2023 09:06:53 +0300 Subject: [PATCH] BattleAI: stacks should not measure damage against turret --- AI/BattleAI/AttackPossibility.cpp | 17 ++++++++++++++++- AI/BattleAI/BattleExchangeVariant.cpp | 7 +++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/AI/BattleAI/AttackPossibility.cpp b/AI/BattleAI/AttackPossibility.cpp index 68e5e3735..63cb7f209 100644 --- a/AI/BattleAI/AttackPossibility.cpp +++ b/AI/BattleAI/AttackPossibility.cpp @@ -50,7 +50,22 @@ int64_t AttackPossibility::calculateDamageReduce( vstd::amin(damageDealt, defender->getAvailableHealth()); // FIXME: provide distance info for Jousting bonus - auto enemyDamageBeforeAttack = cb.battleEstimateDamage(defender, attacker, 0); + auto attackerUnitForMeasurement = attacker; + + if(attackerUnitForMeasurement->isTurret()) + { + auto ourUnits = cb.battleGetUnitsIf([&](const battle::Unit * u) -> bool + { + return u->unitSide() == attacker->unitSide() && !u->isTurret(); + }); + + if(ourUnits.empty()) + attackerUnitForMeasurement = defender; + else + attackerUnitForMeasurement = ourUnits.front(); + } + + auto enemyDamageBeforeAttack = cb.battleEstimateDamage(defender, attackerUnitForMeasurement, 0); auto enemiesKilled = damageDealt / defender->getMaxHealth() + (damageDealt % defender->getMaxHealth() >= defender->getFirstHPleft() ? 1 : 0); auto enemyDamage = averageDmg(enemyDamageBeforeAttack.damage); auto damagePerEnemy = enemyDamage / (double)defender->getCount(); diff --git a/AI/BattleAI/BattleExchangeVariant.cpp b/AI/BattleAI/BattleExchangeVariant.cpp index 9fe8a562a..a1a4ddc24 100644 --- a/AI/BattleAI/BattleExchangeVariant.cpp +++ b/AI/BattleAI/BattleExchangeVariant.cpp @@ -386,9 +386,13 @@ int64_t BattleExchangeEvaluator::calculateExchange( for(auto unit : exchangeUnits) { + if(unit->isTurret()) + continue; + bool isOur = cb->battleMatchOwner(ap.attack.attacker, unit, true); auto & attackerQueue = isOur ? ourStacks : enemyStacks; + if(!vstd::contains(attackerQueue, unit)) { attackerQueue.push_back(unit); @@ -593,6 +597,9 @@ void BattleExchangeEvaluator::updateReachabilityMap(HypotheticBattle & hb) for(const battle::Unit * unit : turnQueue) { + if(unit->isTurret()) + continue; + if(turnBattle.battleCanShoot(unit)) { for(BattleHex hex = BattleHex::TOP_LEFT; hex.isValid(); hex = hex + 1)