diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index fc11e37b94..90835c1ab4 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -135,6 +135,8 @@ object UnitAutomation { // if there is an attackable unit in the vicinity, attack! if (BattleHelper.tryAttackNearbyEnemy(unit)) return + if(tryTakeBackCapturedCity(unit)) return + if (tryGarrisoningUnit(unit)) return if (unit.health < 80 && tryHealUnit(unit)) return @@ -384,6 +386,30 @@ object UnitAutomation { return targets.minBy { it.getHealth() } } + private fun tryTakeBackCapturedCity(unit: MapUnit): Boolean { + var capturedCities = unit.civInfo.getKnownCivs().asSequence() + .flatMap { it.cities.asSequence() } + .filter { unit.civInfo.isAtWarWith(it.civInfo) && + unit.civInfo.civName == it.foundingCiv && + it.isInResistance() && + it.health < it.getMaxHealth()} //Most likely just been captured + + + if (unit.type.isRanged()) // ranged units don't harm capturable cities, waste of a turn + capturedCities = capturedCities.filterNot { it.health == 1 } + + val closestReachableCapturedCity = capturedCities + .map { it.getCenterTile() } + .sortedBy { it.aerialDistanceTo(unit.getTile()) } + .firstOrNull { unit.movement.canReach(it) } + + if (closestReachableCapturedCity != null) { + return headTowardsEnemyCity(unit, closestReachableCapturedCity) + } + return false + + } + private fun tryGarrisoningUnit(unit: MapUnit): Boolean { if (unit.type.isMelee() || unit.type.isWaterUnit()) return false // don't garrison melee units, they're not that good at it val citiesWithoutGarrison = unit.civInfo.cities.filter {