Resolved #4963 - stat updates propagate where they didn't before

This commit is contained in:
Yair Morgenstern 2023-03-19 23:37:29 +02:00
parent b51374859b
commit 61f7b14f04
9 changed files with 22 additions and 7 deletions

View File

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

View File

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

View File

@ -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
}

View File

@ -253,6 +253,7 @@ class CityPopulationManager : IsPartOfGameInfoSerialization {
}
}
city.cityStats.update()
}
fun getMaxSpecialists(): Counter<String> {

View File

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

View File

@ -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 }
}

View File

@ -45,6 +45,7 @@ class GoldenAgeManager : IsPartOfGameInfoSerialization {
for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponEnteringGoldenAge))
UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo)
civInfo.updateStatsForNextTurn()
}
fun endTurn(happiness: Int) {

View File

@ -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,

View File

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