From 4bf319b36a29eb84c27d5cdfcb436efbce0d2ff9 Mon Sep 17 00:00:00 2001 From: SomeTroglodyte <63000004+SomeTroglodyte@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:18:15 +0200 Subject: [PATCH] Improve connected to / disconnected from Capital handling (#9545) * Improve connected to / disconnected from Capital handling * Improve connected to / disconnected from Capital handling - typo --- core/src/com/unciv/logic/city/City.kt | 8 ++++ .../transients/CivInfoTransientCache.kt | 39 ++++++++++++------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/core/src/com/unciv/logic/city/City.kt b/core/src/com/unciv/logic/city/City.kt index 096d1379a6..49b4f070e5 100644 --- a/core/src/com/unciv/logic/city/City.kt +++ b/core/src/com/unciv/logic/city/City.kt @@ -101,6 +101,13 @@ class City : IsPartOfGameInfoSerialization { internal var flagsCountdown = HashMap() + /** Persisted connected-to-capital (by any medium) to allow "disconnected" notifications after loading */ + // Unknown only exists to support older saves, so those do not generate spurious connected/disconnected messages. + // The other names are chosen so serialization is compatible with a Boolean to allow easy replacement in the future. + @Suppress("EnumEntryName") + enum class ConnectedToCapitalStatus { Unknown, `false`, `true` } + var connectedToCapitalStatus = ConnectedToCapitalStatus.Unknown + fun hasDiplomaticMarriage(): Boolean = foundingCiv == "" //region pure functions @@ -129,6 +136,7 @@ class City : IsPartOfGameInfoSerialization { toReturn.cityAIFocus = cityAIFocus toReturn.avoidGrowth = avoidGrowth toReturn.manualSpecialists = manualSpecialists + toReturn.connectedToCapitalStatus = connectedToCapitalStatus return toReturn } diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index 202196b0ca..d11a0400ad 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -253,24 +253,33 @@ class CivInfoTransientCache(val civInfo: Civilization) { fun updateCitiesConnectedToCapital(initialSetup: Boolean = false) { if (civInfo.cities.isEmpty() || civInfo.getCapital() == null) return // eg barbarians - val citiesReachedToMediums = CapitalConnectionsFinder(civInfo).find() + val oldConnectedCities = if (initialSetup) + civInfo.cities.filter { it.connectedToCapitalStatus == City.ConnectedToCapitalStatus.`true` } + else citiesConnectedToCapitalToMediums.keys + val oldMaybeConnectedCities = if (initialSetup) + civInfo.cities.filter { it.connectedToCapitalStatus != City.ConnectedToCapitalStatus.`false` } + else citiesConnectedToCapitalToMediums.keys - if (!initialSetup) { // In the initial setup we're loading an old game state, so it doesn't really count - for (city in citiesReachedToMediums.keys) - if (city !in citiesConnectedToCapitalToMediums && city.civ == civInfo && city != civInfo.getCapital()!!) - civInfo.addNotification("[${city.name}] has been connected to your capital!", - city.location, NotificationCategory.Cities, NotificationIcon.Gold - ) + citiesConnectedToCapitalToMediums = CapitalConnectionsFinder(civInfo).find() - // This may still contain cities that have just been destroyed by razing - thus the population test - for (city in citiesConnectedToCapitalToMediums.keys) - if (!citiesReachedToMediums.containsKey(city) && city.civ == civInfo && city.population.population > 0) - civInfo.addNotification("[${city.name}] has been disconnected from your capital!", - city.location, NotificationCategory.Cities, NotificationIcon.Gold - ) - } + val newConnectedCities = citiesConnectedToCapitalToMediums.keys - citiesConnectedToCapitalToMediums = citiesReachedToMediums + for (city in newConnectedCities) + 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 + ) + + // This may still contain cities that have just been destroyed by razing - thus the population test + for (city in oldConnectedCities) + if (city !in newConnectedCities && city.civ == civInfo && city.population.population > 0) + civInfo.addNotification("[${city.name}] has been disconnected from your capital!", + city.location, NotificationCategory.Cities, NotificationIcon.Gold + ) + + for (city in civInfo.cities) + city.connectedToCapitalStatus = if (city in newConnectedCities) + City.ConnectedToCapitalStatus.`true` else City.ConnectedToCapitalStatus.`false` } fun updateCivResources() {