Inquisitors go out of city centers when spaceship parts need to be added in

This commit is contained in:
Yair Morgenstern 2024-06-21 12:09:56 +03:00
parent c1d8402a48
commit 3558917dfc
2 changed files with 14 additions and 17 deletions

View File

@ -13,7 +13,7 @@ import com.unciv.ui.screens.worldscreen.unit.actions.UnitActions
object CivilianUnitAutomation { object CivilianUnitAutomation {
fun shouldClearTileForAddInCapitalUnits(unit: MapUnit, tile: Tile) = fun shouldClearTileForAddInCapitalUnits(unit: MapUnit, tile: Tile) =
tile.getCity()?.isCapital() == true tile.isCityCenter() && tile.getCity()!!.isCapital()
&& !unit.hasUnique(UniqueType.AddInCapital) && !unit.hasUnique(UniqueType.AddInCapital)
&& unit.civ.units.getCivUnits().any { unit.hasUnique(UniqueType.AddInCapital) } && unit.civ.units.getCivUnits().any { unit.hasUnique(UniqueType.AddInCapital) }

View File

@ -3,7 +3,6 @@ package com.unciv.logic.automation.unit
import com.unciv.Constants import com.unciv.Constants
import com.unciv.logic.city.City import com.unciv.logic.city.City
import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.logic.map.tile.Tile
import com.unciv.models.UnitActionType import com.unciv.models.UnitActionType
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.ui.screens.worldscreen.unit.actions.UnitActions import com.unciv.ui.screens.worldscreen.unit.actions.UnitActions
@ -60,41 +59,39 @@ object ReligiousUnitAutomation {
// cities with most populations will be prioritized by the AI // cities with most populations will be prioritized by the AI
val cityToProtect = citiesToProtect.maxByOrNull { it.population.population } val cityToProtect = citiesToProtect.maxByOrNull { it.population.population }
var destination: Tile? val destinationCity: City? = when {
destination = when {
cityToConvert != null cityToConvert != null
&& (cityToConvert == holyCity && (cityToConvert == holyCity
|| pressureDeficit > Constants.aiPreferInquisitorOverMissionaryPressureDifference || pressureDeficit > Constants.aiPreferInquisitorOverMissionaryPressureDifference
|| cityToConvert.religion.isBlockedHolyCity && cityToConvert.religion.religionThisIsTheHolyCityOf == civReligion?.name || cityToConvert.religion.isBlockedHolyCity && cityToConvert.religion.religionThisIsTheHolyCityOf == civReligion?.name
) && unit.hasUnique(UniqueType.CanRemoveHeresy) -> { ) && unit.hasUnique(UniqueType.CanRemoveHeresy) -> {
cityToConvert.getCenterTile() cityToConvert
} }
cityToProtect != null && unit.hasUnique(UniqueType.PreventSpreadingReligion) -> { cityToProtect != null && unit.hasUnique(UniqueType.PreventSpreadingReligion) -> {
if (holyCity != null && !holyCity.religion.isProtectedByInquisitor()) if (holyCity != null && !holyCity.religion.isProtectedByInquisitor())
holyCity.getCenterTile() holyCity
else cityToProtect.getCenterTile() else cityToProtect
} }
cityToConvert != null -> cityToConvert.getCenterTile() cityToConvert != null -> cityToConvert
else -> null else -> null
} }
if (destination == null) return if (destinationCity == null) return
var destinationTile = destinationCity.getCenterTile()
if (!unit.movement.canReach(destination)) { if (!unit.movement.canReach(destinationTile)
destination = destination.neighbors // Wait for the addInCapital units to go to the city!
|| CivilianUnitAutomation.shouldClearTileForAddInCapitalUnits(unit, destinationTile)) {
destinationTile = destinationTile.neighbors
.filter { unit.movement.canMoveTo(it) || it == unit.getTile() } .filter { unit.movement.canMoveTo(it) || it == unit.getTile() }
.sortedBy { it.aerialDistanceTo(unit.currentTile) } .sortedBy { it.aerialDistanceTo(unit.currentTile) }
.firstOrNull { unit.movement.canReach(it) } .firstOrNull { unit.movement.canReach(it) }
?: return ?: return
} }
if (CivilianUnitAutomation.shouldClearTileForAddInCapitalUnits(unit, destination)) unit.movement.headTowards(destinationTile)
return // Wait for the addInCapital units to go to the city!
unit.movement.headTowards(destination) if (cityToConvert != null && unit.getTile().getCity() == destinationCity) {
if (cityToConvert != null && unit.getTile().getCity() == destination.getCity()) {
UnitActions.invokeUnitAction(unit, UnitActionType.RemoveHeresy) UnitActions.invokeUnitAction(unit, UnitActionType.RemoveHeresy)
} }
} }