chooseMilitaryUnit optimized!

This commit is contained in:
Yair Morgenstern
2022-02-10 14:42:52 +02:00
parent 86450c54eb
commit 8ee2a34a4d
2 changed files with 14 additions and 14 deletions

View File

@ -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
}

View File

@ -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)
}