AI: update getStatDifferenceFromBuilding (#13492)

* Update

* Update ConstructionAutomation.kt
This commit is contained in:
EmperorPinguin 2025-06-23 22:18:15 +02:00 committed by GitHub
parent 9cce7b21bd
commit 50de8e65c6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 6 deletions

View File

@ -370,11 +370,14 @@ class ConstructionAutomation(val cityConstructions: CityConstructions) {
private fun getStatDifferenceFromBuilding(building: String, localUniqueCache: LocalUniqueCache): Stats { private fun getStatDifferenceFromBuilding(building: String, localUniqueCache: LocalUniqueCache): Stats {
val newCity = city.clone() val newCity = city.clone()
newCity.setTransients(city.civ) // Will break the owned tiles. Needs to be reverted before leaving this function newCity.setTransients(city.civ) // Will break the owned tiles. Needs to be reverted before leaving this function
//todo: breaks city connection; trade route gold is currently not considered for markets etc.
newCity.cityStats.update(updateCivStats = false, localUniqueCache = localUniqueCache, calculateGrowthModifiers = false) // Don't consider growth penalties for food values (we can work more mines/specialists instead of farms)
val oldStats = newCity.cityStats.currentCityStats
newCity.cityConstructions.builtBuildings.add(building) newCity.cityConstructions.builtBuildings.add(building)
newCity.cityConstructions.setTransients() newCity.cityConstructions.setTransients()
newCity.cityStats.update(updateCivStats = false, localUniqueCache = localUniqueCache) newCity.cityStats.update(updateCivStats = false, localUniqueCache = LocalUniqueCache(), calculateGrowthModifiers = false) // Establish new localUniqueCache (for tile yield uniques)
city.expansion.setTransients() // Revert owned tiles to original city city.expansion.setTransients() // Revert owned tiles to original city
return newCity.cityStats.currentCityStats - city.cityStats.currentCityStats return newCity.cityStats.currentCityStats - oldStats
} }
private fun getBuildingStatsFromUniques(building: Building, buildingStats: Stats) { private fun getBuildingStatsFromUniques(building: Building, buildingStats: Stats) {

View File

@ -488,7 +488,8 @@ class CityStats(val city: City) {
fun update(currentConstruction: IConstruction = city.cityConstructions.getCurrentConstruction(), fun update(currentConstruction: IConstruction = city.cityConstructions.getCurrentConstruction(),
updateTileStats:Boolean = true, updateTileStats:Boolean = true,
updateCivStats:Boolean = true, updateCivStats:Boolean = true,
localUniqueCache:LocalUniqueCache = LocalUniqueCache()) { localUniqueCache:LocalUniqueCache = LocalUniqueCache(),
calculateGrowthModifiers:Boolean = true) {
if (updateTileStats) updateTileStats(localUniqueCache) if (updateTileStats) updateTileStats(localUniqueCache)
@ -499,7 +500,7 @@ class CityStats(val city: City) {
updateCityHappiness(statsFromBuildings) updateCityHappiness(statsFromBuildings)
updateStatPercentBonusList(currentConstruction) updateStatPercentBonusList(currentConstruction)
updateFinalStatList(currentConstruction) // again, we don't edit the existing currentCityStats directly, in order to avoid concurrency exceptions updateFinalStatList(currentConstruction, calculateGrowthModifiers) // again, we don't edit the existing currentCityStats directly, in order to avoid concurrency exceptions
val newCurrentCityStats = Stats() val newCurrentCityStats = Stats()
for (stat in finalStatList.values) newCurrentCityStats.add(stat) for (stat in finalStatList.values) newCurrentCityStats.add(stat)
@ -508,7 +509,7 @@ class CityStats(val city: City) {
if (updateCivStats) city.civ.updateStatsForNextTurn() if (updateCivStats) city.civ.updateStatsForNextTurn()
} }
private fun updateFinalStatList(currentConstruction: IConstruction) { private fun updateFinalStatList(currentConstruction: IConstruction, calculateGrowthModifiers: Boolean = true) {
val newFinalStatList = StatMap() // again, we don't edit the existing currentCityStats directly, in order to avoid concurrency exceptions val newFinalStatList = StatMap() // again, we don't edit the existing currentCityStats directly, in order to avoid concurrency exceptions
for ((key, value) in baseStatTree.children) for ((key, value) in baseStatTree.children)
@ -572,7 +573,7 @@ class CityStats(val city: City) {
var totalFood = newFinalStatList.values.map { it.food }.sum() var totalFood = newFinalStatList.values.map { it.food }.sum()
// Apply growth modifier only when positive food // Apply growth modifier only when positive food
if (totalFood > 0) { if (totalFood > 0 && calculateGrowthModifiers) {
// Since growth bonuses are special, (applied afterwards) they will be displayed separately in the user interface as well. // Since growth bonuses are special, (applied afterwards) they will be displayed separately in the user interface as well.
// All bonuses except We Love The King do apply even when unhappy // All bonuses except We Love The King do apply even when unhappy
val growthBonuses = getGrowthBonus(totalFood) val growthBonuses = getGrowthBonus(totalFood)