Resolved #7115 - incorrect tile yields due to caching conditional uniques

This commit is contained in:
Yair Morgenstern 2022-10-21 16:10:17 +03:00
parent b0de127a07
commit 69d7f48893
2 changed files with 11 additions and 6 deletions

View File

@ -373,15 +373,18 @@ class CityStats(val cityInfo: CityInfo) {
fun updateTileStats() {
val stats = Stats()
val localUniqueCache = LocalUniqueCache()
for (cell in cityInfo.tilesInRange
val workedTiles = cityInfo.tilesInRange
.filter {
cityInfo.location == it.position
|| cityInfo.isWorked(it)
|| it.owningCity == cityInfo && (it.getTileImprovement()
?.hasUnique(UniqueType.TileProvidesYieldWithoutPopulation) == true
|| it.terrainHasUnique(UniqueType.TileProvidesYieldWithoutPopulation))
})
stats.add(cell.getTileStats(cityInfo, cityInfo.civInfo, localUniqueCache))
}
for (cell in workedTiles) {
val cellStats = cell.getTileStats(cityInfo, cityInfo.civInfo, localUniqueCache)
stats.add(cellStats)
}
statsFromTiles = stats
}

View File

@ -328,19 +328,21 @@ open class TileInfo : IsPartOfGameInfoSerialization {
}
if (city != null) {
var tileUniques = city.getMatchingUniques(UniqueType.StatsFromTiles, stateForConditionals)
var tileUniques = city.getMatchingUniques(UniqueType.StatsFromTiles, StateForConditionals.IgnoreConditionals)
.filter { city.matchesFilter(it.params[2]) }
tileUniques += city.getMatchingUniques(UniqueType.StatsFromObject, stateForConditionals)
tileUniques += city.getMatchingUniques(UniqueType.StatsFromObject, StateForConditionals.IgnoreConditionals)
for (unique in localUniqueCache.get("StatsFromTilesAndObjects", tileUniques)) {
if (!unique.conditionalsApply(stateForConditionals)) continue
val tileType = unique.params[1]
if (!matchesTerrainFilter(tileType, observingCiv)) continue
stats.add(unique.stats)
}
for (unique in localUniqueCache.get("StatsFromTilesWithout",
city.getMatchingUniques(UniqueType.StatsFromTilesWithout, stateForConditionals))
city.getMatchingUniques(UniqueType.StatsFromTilesWithout, StateForConditionals.IgnoreConditionals))
) {
if (
unique.conditionalsApply(stateForConditionals) &&
matchesTerrainFilter(unique.params[1]) &&
!matchesTerrainFilter(unique.params[2]) &&
city.matchesFilter(unique.params[3])