Improve connected to / disconnected from Capital handling (#9545)

* Improve connected to / disconnected from Capital handling

* Improve connected to / disconnected from Capital handling - typo
This commit is contained in:
SomeTroglodyte 2023-06-12 06:18:15 +02:00 committed by GitHub
parent ae74dca074
commit 4bf319b36a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 15 deletions

View File

@ -101,6 +101,13 @@ class City : IsPartOfGameInfoSerialization {
internal var flagsCountdown = HashMap<String, Int>()
/** 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
}

View File

@ -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() {