From 2224e65707b6b32e25d40f73a3ee6a482e0a6b18 Mon Sep 17 00:00:00 2001 From: alexban011 Date: Mon, 20 Jun 2022 09:50:03 +0300 Subject: [PATCH] fixed crash in NextTurnAutomation (#7227) * fixed crash * redone * reviews * reviews 2 --- .../unciv/logic/automation/ConstructionAutomation.kt | 6 ++++-- .../com/unciv/logic/automation/NextTurnAutomation.kt | 10 ++++++---- core/src/com/unciv/logic/automation/UnitAutomation.kt | 1 + .../com/unciv/logic/civilization/CityStateFunctions.kt | 5 +++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/core/src/com/unciv/logic/automation/ConstructionAutomation.kt b/core/src/com/unciv/logic/automation/ConstructionAutomation.kt index a1b23090b9..8fb761bd5a 100644 --- a/core/src/com/unciv/logic/automation/ConstructionAutomation.kt +++ b/core/src/com/unciv/logic/automation/ConstructionAutomation.kt @@ -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) diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 4893ec5c31..243a4118b0 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -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() for (civ1city in civ1.cities) for (civ2city in civ2.cities) diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index 298821cadb..29fcbb706a 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -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 diff --git a/core/src/com/unciv/logic/civilization/CityStateFunctions.kt b/core/src/com/unciv/logic/civilization/CityStateFunctions.kt index ed80c7c8c3..5d0d878d5a 100644 --- a/core/src/com/unciv/logic/civilization/CityStateFunctions.kt +++ b/core/src/com/unciv/logic/civilization/CityStateFunctions.kt @@ -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? {