fixed crash in NextTurnAutomation (#7227)

* fixed crash

* redone

* reviews

* reviews 2
This commit is contained in:
alexban011
2022-06-20 09:50:03 +03:00
committed by GitHub
parent f10bf8bfbe
commit 2224e65707
4 changed files with 14 additions and 8 deletions

View File

@ -286,8 +286,10 @@ class ConstructionAutomation(val cityConstructions: CityConstructions){
if (isAtWar) modifier = 0.5f
// If this city is the closest city to another civ, that makes it a likely candidate for attack
if (civInfo.getKnownCivs().filter { it.cities.isNotEmpty() }
.any { NextTurnAutomation.getClosestCities(civInfo, it).city1 == cityInfo })
if (civInfo.getKnownCivs()
.map { NextTurnAutomation.getClosestCities(civInfo, it) }
.filterNotNull()
.any { it.city1 == cityInfo })
modifier *= 1.5f
addChoice(relativeCostEffectiveness, defensiveBuilding.name, modifier)

View File

@ -698,7 +698,7 @@ object NextTurnAutomation {
}
private fun motivationToAttack(civInfo: CivilizationInfo, otherCiv: CivilizationInfo): Int {
if(civInfo.cities.isEmpty() || otherCiv.cities.isEmpty()) return 0
val closestCities = getClosestCities(civInfo, otherCiv) ?: return 0
val baseForce = 30f
val ourCombatStrength = civInfo.getStatForRanking(RankingType.Force).toFloat() + baseForce
@ -711,7 +711,6 @@ object NextTurnAutomation {
if (theirCombatStrength > ourCombatStrength) return 0
val closestCities = getClosestCities(civInfo, otherCiv)
val ourCity = closestCities.city1
val theirCity = closestCities.city2
@ -969,12 +968,15 @@ object NextTurnAutomation {
}
fun getMinDistanceBetweenCities(civ1: CivilizationInfo, civ2: CivilizationInfo): Int {
return getClosestCities(civ1, civ2).aerialDistance
return getClosestCities(civ1, civ2)?.aerialDistance ?: Int.MAX_VALUE
}
data class CityDistance(val city1: CityInfo, val city2: CityInfo, val aerialDistance: Int)
fun getClosestCities(civ1: CivilizationInfo, civ2: CivilizationInfo): CityDistance {
fun getClosestCities(civ1: CivilizationInfo, civ2: CivilizationInfo): CityDistance? {
if (civ1.cities.isEmpty() || civ2.cities.isEmpty())
return null
val cityDistances = arrayListOf<CityDistance>()
for (civ1city in civ1.cities)
for (civ2city in civ2.cities)

View File

@ -435,6 +435,7 @@ object UnitAutomation {
val closestEnemyCity = enemies
.map { NextTurnAutomation.getClosestCities(unit.civInfo, it) }
.filterNotNull()
.minByOrNull { it.aerialDistance }?.city2
?: return false // no attackable cities found

View File

@ -79,7 +79,7 @@ class CityStateFunctions(val civInfo: CivilizationInfo) {
if (giftableUnits.isEmpty()) // For badly defined mods that don't have great people but do have the policy that makes city states grant them
return
val giftedUnit = giftableUnits.random()
val cities = NextTurnAutomation.getClosestCities(receivingCiv, civInfo)
val cities = NextTurnAutomation.getClosestCities(receivingCiv, civInfo) ?: return
val placedUnit = receivingCiv.placeUnitNearTile(cities.city1.location, giftedUnit.name)
?: return
val locations = LocationAction(placedUnit.getTile().position, cities.city2.location)
@ -87,7 +87,8 @@ class CityStateFunctions(val civInfo: CivilizationInfo) {
}
fun giveMilitaryUnitToPatron(receivingCiv: CivilizationInfo) {
val cities = NextTurnAutomation.getClosestCities(receivingCiv, civInfo)
val cities = NextTurnAutomation.getClosestCities(receivingCiv, civInfo) ?: return
val city = cities.city1
fun giftableUniqueUnit(): BaseUnit? {