From 8ee2a34a4dfd65a36f348586bf99971fed923a3e Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 10 Feb 2022 14:42:52 +0200 Subject: [PATCH] chooseMilitaryUnit optimized! --- .../com/unciv/logic/automation/Automation.kt | 20 ++++++++++--------- .../com/unciv/models/ruleset/unit/BaseUnit.kt | 8 +++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index 9d779686d4..004d5b385b 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -81,12 +81,12 @@ object Automation { } fun chooseMilitaryUnit(city: CityInfo): String? { - var militaryUnits = - city.cityConstructions.getConstructableUnits().filter { !it.isCivilian() } - .filter { allowSpendingResource(city.civInfo, it) } - if (militaryUnits.map { it.name } - .contains(city.cityConstructions.currentConstructionFromQueue)) - return city.cityConstructions.currentConstructionFromQueue + val currentChoice = city.cityConstructions.getCurrentConstruction() + if (currentChoice is BaseUnit && !currentChoice.isCivilian()) return city.cityConstructions.currentConstructionFromQueue + + var militaryUnits = city.getRuleset().units.values.asSequence() + .filter { !it.isCivilian() } + .filter { allowSpendingResource(city.civInfo, it) } val findWaterConnectedCitiesAndEnemies = BFS(city.getCenterTile()) { it.isWater || it.isCityCenter() } @@ -105,6 +105,9 @@ object Automation { if (providesUnneededCarryingSlots(unit, city.civInfo)) militaryUnits = militaryUnits.filterNot { it == unit } + // Only now do we filter out the constructable units because that's a heavier check + militaryUnits = militaryUnits.filter { it.isBuildable(city.cityConstructions) }.toList().asSequence() // gather once because we have a .any afterwards + val chosenUnit: BaseUnit if (!city.civInfo.isAtWar() && city.civInfo.cities.any { it.getCenterTile().militaryUnit == null } @@ -117,14 +120,13 @@ object Automation { val availableTypes = militaryUnits .map { it.unitType } .distinct() - .toList() - if (availableTypes.isEmpty()) return null + if (availableTypes.none()) return null val bestUnitsForType = availableTypes.map { type -> militaryUnits .filter { unit -> unit.unitType == type } .maxByOrNull { unit -> unit.cost }!! } // Check the maximum force evaluation for the shortlist so we can prune useless ones (ie scouts) val bestForce = bestUnitsForType.maxOf { it.getForceEvaluation() } - chosenUnit = bestUnitsForType.filter { it.uniqueTo != null || it.getForceEvaluation() > bestForce / 3 }.random() + chosenUnit = bestUnitsForType.filter { it.uniqueTo != null || it.getForceEvaluation() > bestForce / 3 }.toList().random() } return chosenUnit.name } diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 2b824a5fda..8cea9c8032 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -351,7 +351,7 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { if (isWaterUnit() && !cityConstructions.cityInfo.isCoastal()) rejectionReasons.add(RejectionReason.WaterUnitsInCoastalCities) val civInfo = cityConstructions.cityInfo.civInfo - for (unique in uniqueObjects.filter { it.type == UniqueType.NotDisplayedWithout }) { + for (unique in getMatchingUniques(UniqueType.NotDisplayedWithout)) { val filter = unique.params[0] if (filter in civInfo.gameInfo.ruleSet.tileResources && !civInfo.hasResource(filter) || filter in civInfo.gameInfo.ruleSet.buildings && !cityConstructions.containsBuildingOrEquivalent(filter)) @@ -387,8 +387,7 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { if (!civInfo.gameInfo.gameParameters.nuclearWeaponsEnabled && isNuclearWeapon()) rejectionReasons.add(RejectionReason.DisabledBySetting) - for (unique in uniqueObjects) { - if (unique.placeholderText != "Unlocked with []" && unique.placeholderText != "Requires []") continue + for (unique in getMatchingUniques("Unlocked with []") + getMatchingUniques("Requires []")) { val filter = unique.params[0] when { ruleSet.technologies.contains(filter) -> @@ -415,8 +414,7 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { } } - if (hasUnique(UniqueType.FoundCity) && - (civInfo.isCityState() || civInfo.isOneCityChallenger()) + if ((civInfo.isCityState() || civInfo.isOneCityChallenger()) && hasUnique(UniqueType.FoundCity) ) { rejectionReasons.add(RejectionReason.NoSettlerForOneCityPlayers) }