diff --git a/core/src/com/unciv/logic/automation/unit/BattleHelper.kt b/core/src/com/unciv/logic/automation/unit/BattleHelper.kt index 632b98a093..dc6aa3be3c 100644 --- a/core/src/com/unciv/logic/automation/unit/BattleHelper.kt +++ b/core/src/com/unciv/logic/automation/unit/BattleHelper.kt @@ -70,6 +70,9 @@ object BattleHelper { else reachableTile.tileMap.getViewableTiles(reachableTile.position, rangeOfAttack, true).asSequence() for (tile in tilesInAttackRange) { + // Since military units can technically enter tiles with enemy civilians, + // some try to move to to the tile and then attack the unit it contains, which is silly + if (tile == reachableTile) continue if (tile in tilesWithEnemies) attackableTiles += AttackableTile( reachableTile, tile, @@ -197,8 +200,9 @@ object BattleHelper { ).toFloat().coerceAtLeast(1f) } // kill a unit if possible, prioritizing by attack strength - val canKill = attacksToKill.filter { it.value <= 1 } - .maxByOrNull { MapUnitCombatant(it.key.tileToAttack.militaryUnit!!).getAttackingStrength() }?.key + val canKill = attacksToKill.filter { it.value <= 1 }.keys + .sortedByDescending { it.movementLeftAfterMovingToAttackTile } // Among equal kills, prioritize the closest unit + .maxByOrNull { MapUnitCombatant(it.tileToAttack.militaryUnit!!).getAttackingStrength() } if (canKill != null) return canKill // otherwise pick the unit we can kill the fastest @@ -216,7 +220,7 @@ object BattleHelper { return unitsToConsider.maxByOrNull { it.movementLeftAfterMovingToAttackTile }!! } - // We're ranged, prioritize what we can kill + // We're ranged, prioritize that we can kill return unitsToConsider.minByOrNull { Battle.getMapCombatantOfTile(it.tileToAttack)!!.getHealth() }!!