From 71828349dfe508072a24317596ff6a57bbb1347d Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 12 Jun 2023 11:27:27 +0300 Subject: [PATCH] AI only constructs Settler if it already has worker / improvements --- .../civilization/NextTurnAutomation.kt | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt index a94ebfef2c..1c720006fe 100644 --- a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt @@ -8,8 +8,6 @@ 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.models.ruleset.INonPerpetualConstruction -import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.NotificationCategory @@ -33,8 +31,10 @@ import com.unciv.models.Counter import com.unciv.models.ruleset.Belief import com.unciv.models.ruleset.BeliefType import com.unciv.models.ruleset.Building +import com.unciv.models.ruleset.INonPerpetualConstruction import com.unciv.models.ruleset.MilestoneType import com.unciv.models.ruleset.ModOptionsConstants +import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.models.ruleset.Policy import com.unciv.models.ruleset.PolicyBranch import com.unciv.models.ruleset.Victory @@ -1042,16 +1042,32 @@ object NextTurnAutomation { val settlerUnits = civInfo.gameInfo.ruleset.units.values .filter { it.hasUnique(UniqueType.FoundCity) && it.isBuildable(civInfo) } if (settlerUnits.isEmpty()) return - if (civInfo.units.getCivUnits().none { it.hasUnique(UniqueType.FoundCity) } - && civInfo.cities.none { - val currentConstruction = it.cityConstructions.getCurrentConstruction() - currentConstruction is BaseUnit && currentConstruction.hasUnique(UniqueType.FoundCity) - }) { + if (!civInfo.units.getCivUnits().none { it.hasUnique(UniqueType.FoundCity) }) return - val bestCity = civInfo.cities.filterNot { it.isPuppet }.maxByOrNull { it.cityStats.currentCityStats.production }!! - if (bestCity.cityConstructions.builtBuildings.size > 1) // 2 buildings or more, otherwise focus on self first - bestCity.cityConstructions.currentConstructionFromQueue = settlerUnits.minByOrNull { it.cost }!!.name + if (civInfo.cities.any { + val currentConstruction = it.cityConstructions.getCurrentConstruction() + currentConstruction is BaseUnit && currentConstruction.hasUnique(UniqueType.FoundCity) + }) return + + if (civInfo.units.getCivUnits().none { it.isMilitary() }) return // We need someone to defend him first + + val workersBuildableForThisCiv = civInfo.gameInfo.ruleset.units.values.any { + it.hasUnique(UniqueType.BuildImprovements) + && it.isBuildable(civInfo) } + + val bestCity = civInfo.cities.filterNot { it.isPuppet } + // If we can build workers, then we want AT LEAST 2 improvements, OR a worker nearby. + // Otherwise, AI tries to produce settlers when it can hardly sustain itself + .filter { + !workersBuildableForThisCiv + || it.getCenterTile().getTilesInDistance(2).count { it.improvement!=null } > 1 + || it.getCenterTile().getTilesInDistance(3).any { it.civilianUnit?.hasUnique(UniqueType.BuildImprovements)==true } + } + .maxByOrNull { it.cityStats.currentCityStats.production } + ?: return + if (bestCity.cityConstructions.builtBuildings.size > 1) // 2 buildings or more, otherwise focus on self first + bestCity.cityConstructions.currentConstructionFromQueue = settlerUnits.minByOrNull { it.cost }!!.name } // Technically, this function should also check for civs that have liberated one or more cities