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

#4142 - sometimes Battle AI wants to attack unit which is behind a lot of obstackles and other units

This commit is contained in:
Andrii Danylchenko 2024-06-18 20:03:07 +03:00
parent cd4aaf93ee
commit fc32078a3a

View File

@ -259,27 +259,46 @@ BattleAction BattleEvaluator::goTowardsNearest(const CStack * stack, std::vector
return BattleAction::makeDefend(stack);
}
std::sort(hexes.begin(), hexes.end(), [&](BattleHex h1, BattleHex h2) -> bool
{
return reachability.distances[h1] < reachability.distances[h2];
});
std::vector<BattleHex> targetHexes = hexes;
for(auto hex : hexes)
for(int i = 0; i < 5; i++)
{
if(vstd::contains(avHexes, hex))
std::sort(targetHexes.begin(), targetHexes.end(), [&](BattleHex h1, BattleHex h2) -> bool
{
return reachability.distances[h1] < reachability.distances[h2];
});
for(auto hex : targetHexes)
{
return BattleAction::makeMove(stack, hex);
if(vstd::contains(avHexes, hex))
{
return BattleAction::makeMove(stack, hex);
}
if(stack->coversPos(hex))
{
logAi->warn("Warning: already standing on neighbouring tile!");
//We shouldn't even be here...
return BattleAction::makeDefend(stack);
}
}
if(stack->coversPos(hex))
if(reachability.distances[targetHexes.front()] <= GameConstants::BFIELD_SIZE)
{
logAi->warn("Warning: already standing on neighbouring tile!");
//We shouldn't even be here...
return BattleAction::makeDefend(stack);
break;
}
std::vector<BattleHex> copy = targetHexes;
for(auto hex : copy)
{
vstd::concatenate(targetHexes, hex.allNeighbouringTiles());
}
vstd::removeDuplicates(targetHexes);
}
BattleHex bestNeighbor = hexes.front();
BattleHex bestNeighbor = targetHexes.front();
if(reachability.distances[bestNeighbor] > GameConstants::BFIELD_SIZE)
{