Fixed crash due to ranged unit trying to capture civilian but being unable to reach the tile

Resolves #11062
Resolves #11044
Resolves #11040
@tuvus
This commit is contained in:
Yair Morgenstern 2024-02-01 23:21:29 +02:00
parent 875da6cd48
commit 67a7fb7d22

View File

@ -5,8 +5,8 @@ import com.unciv.logic.battle.Battle
import com.unciv.logic.battle.BattleDamage
import com.unciv.logic.battle.CityCombatant
import com.unciv.logic.battle.MapUnitCombatant
import com.unciv.logic.city.City
import com.unciv.logic.battle.TargetHelper
import com.unciv.logic.city.City
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.models.ruleset.unique.UniqueType
@ -14,6 +14,7 @@ object BattleHelper {
fun tryAttackNearbyEnemy(unit: MapUnit, stayOnTile: Boolean = false): Boolean {
if (unit.hasUnique(UniqueType.CannotAttack)) return false
val distanceToTiles = unit.movement.getDistanceToTiles()
val attackableEnemies = TargetHelper.getAttackableEnemies(unit, unit.movement.getDistanceToTiles(), stayOnTile=stayOnTile)
// Only take enemies we can fight without dying or are made to die
.filter {unit.hasUnique(UniqueType.SelfDestructs) ||
@ -27,7 +28,8 @@ object BattleHelper {
if (enemyTileToAttack != null) {
if (enemyTileToAttack.tileToAttack.militaryUnit == null && unit.baseUnit.isRanged()
&& unit.movement.canMoveTo(enemyTileToAttack.tileToAttack)) {
&& unit.movement.canMoveTo(enemyTileToAttack.tileToAttack)
&& distanceToTiles.containsKey(enemyTileToAttack.tileToAttack)) { // Since the 'getAttackableEnemies' could return a tile we attack at range but cannot reach
// Ranged units should move to caputre a civilian unit instead of attacking it
unit.movement.moveToTile(enemyTileToAttack.tileToAttack)
} else {