From 61f7b14f04424e3aa66d0dbe710236b06cca6244 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 19 Mar 2023 23:37:29 +0200 Subject: [PATCH] Resolved #4963 - stat updates propagate where they didn't before --- core/src/com/unciv/logic/city/CityConstructions.kt | 5 +++-- core/src/com/unciv/logic/city/CityStats.kt | 6 +++--- core/src/com/unciv/logic/city/managers/CityFounder.kt | 2 ++ .../com/unciv/logic/city/managers/CityPopulationManager.kt | 1 + .../com/unciv/logic/city/managers/CityReligionManager.kt | 5 +++++ core/src/com/unciv/logic/civilization/Civilization.kt | 3 +++ .../unciv/logic/civilization/managers/GoldenAgeManager.kt | 1 + .../com/unciv/logic/civilization/managers/TechManager.kt | 5 +++-- .../ui/screens/worldscreen/unit/actions/UnitActions.kt | 1 + 9 files changed, 22 insertions(+), 7 deletions(-) diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index a75b8f5ac7..877370b569 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -22,11 +22,11 @@ import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.stats.Stat import com.unciv.models.stats.Stats import com.unciv.models.translations.tr -import com.unciv.ui.screens.civilopediascreen.CivilopediaCategories -import com.unciv.ui.screens.civilopediascreen.FormattedLine import com.unciv.ui.components.Fonts import com.unciv.ui.components.extensions.withItem import com.unciv.ui.components.extensions.withoutItem +import com.unciv.ui.screens.civilopediascreen.CivilopediaCategories +import com.unciv.ui.screens.civilopediascreen.FormattedLine import com.unciv.ui.screens.worldscreen.unit.actions.UnitActions import kotlin.math.ceil import kotlin.math.roundToInt @@ -462,6 +462,7 @@ class CityConstructions : IsPartOfGameInfoSerialization { builtBuildingUniqueMap.clear() for (building in getBuiltBuildings()) builtBuildingUniqueMap.addUniques(building.uniqueObjects) + city.cityStats.update() } fun addFreeBuildings() { diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 26ff970941..401f401a5d 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -1,7 +1,6 @@ package com.unciv.logic.city import com.unciv.Constants -import com.unciv.UncivGame import com.unciv.logic.map.tile.RoadStatus import com.unciv.models.Counter import com.unciv.models.ruleset.Building @@ -475,7 +474,8 @@ class CityStats(val city: City) { } fun update(currentConstruction: IConstruction = city.cityConstructions.getCurrentConstruction(), - updateTileStats:Boolean = true) { + updateTileStats:Boolean = true, + updateCivStats:Boolean = true) { if (updateTileStats) updateTileStats() // We need to compute Tile yields before happiness @@ -491,7 +491,7 @@ class CityStats(val city: City) { for (stat in finalStatList.values) newCurrentCityStats.add(stat) currentCityStats = newCurrentCityStats - city.civ.updateStatsForNextTurn() + if (updateCivStats) city.civ.updateStatsForNextTurn() } private fun updateFinalStatList(currentConstruction: IConstruction) { diff --git a/core/src/com/unciv/logic/city/managers/CityFounder.kt b/core/src/com/unciv/logic/city/managers/CityFounder.kt index 6c0e1f41f4..809184084f 100644 --- a/core/src/com/unciv/logic/city/managers/CityFounder.kt +++ b/core/src/com/unciv/logic/city/managers/CityFounder.kt @@ -43,6 +43,7 @@ class CityFounder { city.expansion.reset() city.tryUpdateRoadStatus() + civInfo.cache.updateCitiesConnectedToCapital() // Carthage cities can connect immediately val tile = city.getCenterTile() for (terrainFeature in tile.terrainFeatures.filter { @@ -90,6 +91,7 @@ class CityFounder { )) UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo, city, triggerNotificationText = "due to founding a city") + return city } diff --git a/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt b/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt index 02a2c4c1fc..5acf88c2ba 100644 --- a/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt @@ -253,6 +253,7 @@ class CityPopulationManager : IsPartOfGameInfoSerialization { } } + city.cityStats.update() } fun getMaxSpecialists(): Counter { diff --git a/core/src/com/unciv/logic/city/managers/CityReligionManager.kt b/core/src/com/unciv/logic/city/managers/CityReligionManager.kt index 2d01ffba37..3cf7807f79 100644 --- a/core/src/com/unciv/logic/city/managers/CityReligionManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityReligionManager.kt @@ -146,7 +146,9 @@ class CityReligionManager : IsPartOfGameInfoSerialization { if (checkForReligionAdoption) getMajorityReligionName() else null + val previousFollowers = followers.clone() followers.clear() + if (city.population.population <= 0) return val remainders = HashMap() @@ -175,6 +177,9 @@ class CityReligionManager : IsPartOfGameInfoSerialization { followers.remove(Constants.noReligionName) + if (followers != previousFollowers) + city.cityStats.update() + if (checkForReligionAdoption) { val newMajorityReligion = getMajorityReligionName() if (oldMajorityReligion != newMajorityReligion && newMajorityReligion != null) { diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index 969ea38cb7..78c17553a5 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -364,7 +364,10 @@ class Civilization : IsPartOfGameInfoSerialization { val cache = CivInfoTransientCache(this) fun updateStatsForNextTurn() { + val previousHappiness = stats.happiness stats.happiness = stats.getHappinessBreakdown().values.sum().roundToInt() + if (stats.happiness != previousHappiness) + for (city in cities) city.cityStats.update(updateCivStats = false) stats.statsForNextTurn = stats.getStatMapForNextTurn().values.reduce { a, b -> a + b } } diff --git a/core/src/com/unciv/logic/civilization/managers/GoldenAgeManager.kt b/core/src/com/unciv/logic/civilization/managers/GoldenAgeManager.kt index 7be640dd30..29cc4f0609 100644 --- a/core/src/com/unciv/logic/civilization/managers/GoldenAgeManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/GoldenAgeManager.kt @@ -45,6 +45,7 @@ class GoldenAgeManager : IsPartOfGameInfoSerialization { for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponEnteringGoldenAge)) UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo) + civInfo.updateStatsForNextTurn() } fun endTurn(happiness: Int) { diff --git a/core/src/com/unciv/logic/civilization/managers/TechManager.kt b/core/src/com/unciv/logic/civilization/managers/TechManager.kt index 159b4d236a..66341c998d 100644 --- a/core/src/com/unciv/logic/civilization/managers/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TechManager.kt @@ -271,10 +271,11 @@ class TechManager : IsPartOfGameInfoSerialization { updateTransientBooleans() for (city in civInfo.cities) { + city.cityStats.update() city.updateCitizens = true } - if(!civInfo.isSpectator()) + if (!civInfo.isSpectator()) civInfo.addNotification("Research of [$techName] has completed!", TechAction(techName), NotificationCategory.General, NotificationIcon.Science, techName) @@ -392,7 +393,7 @@ class TechManager : IsPartOfGameInfoSerialization { for (policyBranch in getRuleset().policyBranches.values.filter { it.era == currentEra.name && civInfo.policies.isAdoptable(it) }) { - if(!civInfo.isSpectator()) + if (!civInfo.isSpectator()) civInfo.addNotification( "[${policyBranch.name}] policy branch unlocked!", NotificationCategory.General, diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt index 554c77567c..80850a127f 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt @@ -133,6 +133,7 @@ object UnitActions { else "Do you really want to disband this unit?".tr() ConfirmPopup(worldScreen, disbandText, "Disband unit") { unit.disband() + unit.civ.updateStatsForNextTurn() // less upkeep! GUI.setUpdateWorldOnNextRender() if (GUI.getSettings().autoUnitCycle) worldScreen.switchToNextUnit()