From 396bf60e25174aec3cae390d9284488a5aac43ca Mon Sep 17 00:00:00 2001 From: yairm210 Date: Mon, 2 Sep 2024 18:13:33 +0300 Subject: [PATCH] Resolved #12180 - only trigger population reassignment on new buildings when it really changes something --- .../com/unciv/logic/city/CityConstructions.kt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 14a73fc682..a87b61c4d6 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -543,13 +543,16 @@ class CityConstructions : IsPartOfGameInfoSerialization { && city.isCapital()) civ.tech.addScience(civ.tech.scienceOfLast8Turns.sum() / 8) - // Happiness is global, so it could affect all cities - if (building.isStatRelated(Stat.Happiness, city)) { - for (city in civ.cities) { - city.reassignPopulationDeferred() - } - } - else city.reassignPopulationDeferred() + val previousHappiness = civ.getHappiness() + // can cause civ happiness update: reassignPopulationDeferred -> reassignPopulation -> cityStats.update -> civ.updateHappiness + city.reassignPopulationDeferred() + val newHappiness = civ.getHappiness() + + /** Same check as [com.unciv.logic.civilization.Civilization.updateStatsForNextTurn] - + * but that triggers *stat calculation* whereas this is for *population assignment* */ + if (previousHappiness != newHappiness && city.civ.gameInfo.ruleset.allHappinessLevelsThatAffectUniques + .any { newHappiness < it != previousHappiness < it}) + city.civ.cities.filter { it != city }.forEach { it.reassignPopulationDeferred() } if (tryAddFreeBuildings) city.civ.civConstructions.tryAddFreeBuildings()