diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index 7c2df3a059..656e2f3809 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -213,7 +213,7 @@ object Automation { // If we have vision of our entire starting continent (ish) we are not afraid civInfo.gameInfo.tileMap.assignContinents(TileMap.AssignContinentsMode.Ensure) - val startingContinent = civInfo.getCapital()!!.getCenterTile().getContinent() + val startingContinent = civInfo.getCapital(true)!!.getCenterTile().getContinent() val startingContinentSize = civInfo.gameInfo.tileMap.continentSizes[startingContinent] if (startingContinentSize != null && startingContinentSize < civInfo.viewableTiles.size * multiplier) return false diff --git a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt index 210bb12e6c..0172ddaccd 100644 --- a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt @@ -838,8 +838,10 @@ object NextTurnAutomation { val closestCities = getClosestCities(civInfo, otherCiv) ?: return 0 val baseForce = 30f - val ourCombatStrength = civInfo.getStatForRanking(RankingType.Force).toFloat() + baseForce + CityCombatant(civInfo.getCapital()!!).getCityStrength() - var theirCombatStrength = otherCiv.getStatForRanking(RankingType.Force).toFloat() + baseForce + CityCombatant(otherCiv.getCapital()!!).getCityStrength() + var ourCombatStrength = civInfo.getStatForRanking(RankingType.Force).toFloat() + baseForce + if (civInfo.getCapital()!= null) ourCombatStrength += CityCombatant(civInfo.getCapital()!!).getCityStrength() + var theirCombatStrength = otherCiv.getStatForRanking(RankingType.Force).toFloat() + baseForce + if(otherCiv.getCapital() != null) theirCombatStrength += CityCombatant(otherCiv.getCapital()!!).getCityStrength() //for city-states, also consider their protectors if (otherCiv.isCityState() and otherCiv.cityStateFunctions.getProtectorCivs().isNotEmpty()) { @@ -942,7 +944,7 @@ object NextTurnAutomation { return motivationSoFar } - val reachableEnemyCitiesBfs = BFS(civInfo.getCapital()!!.getCenterTile()) { isTileCanMoveThrough(it) } + val reachableEnemyCitiesBfs = BFS(civInfo.getCapital(true)!!.getCenterTile()) { isTileCanMoveThrough(it) } reachableEnemyCitiesBfs.stepToEnd() val reachableEnemyCities = otherCiv.cities.filter { reachableEnemyCitiesBfs.hasReachedTile(it.getCenterTile()) } if (reachableEnemyCities.isEmpty()) return 0 // Can't even reach the enemy city, no point in war. diff --git a/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt b/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt index 732f7b13ea..53d8454f62 100644 --- a/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt +++ b/core/src/com/unciv/logic/automation/unit/WorkerAutomation.kt @@ -58,7 +58,8 @@ class WorkerAutomation( private val citiesThatNeedConnecting: List by lazy { val result = civInfo.cities.asSequence() .filter { - it.population.population > 3 + civInfo.getCapital() != null + && it.population.population > 3 && !it.isCapital() && !it.isBeingRazed // Cities being razed should not be connected. && !it.cityStats.isConnectedToCapital(bestRoadAvailable) }.sortedBy { diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index 552f43f82d..8e7c1d221e 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -320,7 +320,8 @@ class Civilization : IsPartOfGameInfoSerialization { fun knows(otherCivName: String) = diplomacy.containsKey(otherCivName) fun knows(otherCiv: Civilization) = knows(otherCiv.civName) - fun getCapital() = cities.firstOrNull { it.isCapital() } + fun getCapital(firstCityIfNoCapital: Boolean = false) = cities.firstOrNull { it.isCapital() } ?: + if (firstCityIfNoCapital) cities.firstOrNull() else null fun isHuman() = playerType == PlayerType.Human fun isAI() = playerType == PlayerType.AI fun isOneCityChallenger() = playerType == PlayerType.Human && gameInfo.gameParameters.oneCityChallenge diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 3a9827bf4d..96ec229f07 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -521,7 +521,7 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization { } if (!civInfo.isDefeated()) { // don't display city state relationship notifications when the city state is currently defeated - val civCapitalLocation = if (civInfo.cities.isNotEmpty() || civInfo.getCapital() != null) civInfo.getCapital()!!.location else null + val civCapitalLocation = if (civInfo.cities.any() && civInfo.getCapital() != null) civInfo.getCapital()!!.location else null if (getTurnsToRelationshipChange() == 1) { val text = "Your relationship with [${civInfo.civName}] is about to degrade" if (civCapitalLocation != null) otherCiv().addNotification(text, diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index 5645ea6d96..ac66c9a6af 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -248,7 +248,7 @@ class CivInfoTransientCache(val civInfo: Civilization) { } fun updateCitiesConnectedToCapital(initialSetup: Boolean = false) { - if (civInfo.cities.isEmpty() || civInfo.getCapital() == null) return // eg barbarians + if (civInfo.cities.isEmpty()) return // No cities to connect val oldConnectedCities = if (initialSetup) civInfo.cities.filter { it.connectedToCapitalStatus == City.ConnectedToCapitalStatus.`true` } @@ -257,12 +257,13 @@ class CivInfoTransientCache(val civInfo: Civilization) { civInfo.cities.filter { it.connectedToCapitalStatus != City.ConnectedToCapitalStatus.`false` } else citiesConnectedToCapitalToMediums.keys - citiesConnectedToCapitalToMediums = CapitalConnectionsFinder(civInfo).find() + citiesConnectedToCapitalToMediums = if(civInfo.getCapital() == null) mapOf() + else CapitalConnectionsFinder(civInfo).find() val newConnectedCities = citiesConnectedToCapitalToMediums.keys for (city in newConnectedCities) - if (city !in oldMaybeConnectedCities && city.civ == civInfo && city != civInfo.getCapital()!!) + if (city !in oldMaybeConnectedCities && city.civ == civInfo && city != civInfo.getCapital()) civInfo.addNotification("[${city.name}] has been connected to your capital!", city.location, NotificationCategory.Cities, NotificationIcon.Gold ) @@ -379,7 +380,7 @@ class CivInfoTransientCache(val civInfo: Civilization) { // Check if different continents (unless already max distance, or water map) if (connections > 0 && proximity != Proximity.Distant && !civInfo.gameInfo.tileMap.isWaterMap() - && civInfo.getCapital()!!.getCenterTile().getContinent() != otherCiv.getCapital()!!.getCenterTile().getContinent() + && civInfo.getCapital(true)!!.getCenterTile().getContinent() != otherCiv.getCapital(true)!!.getCenterTile().getContinent() ) { // Different continents - increase separation by one step proximity = when (proximity) {