diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index 224f889d1f..fd7cdfe795 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -56,7 +56,7 @@ object Automation { yieldStats.food -= (unique.params[0].toFloat() / 100f) * 2f // base 2 food per Pop // Specialist Happiness Percentage Change 0f-1f for (unique in localUniqueCache.forCityGetMatchingUniques(city, UniqueType.UnhappinessFromPopulationTypePercentageChange)) - if (city.matchesFilter(unique.params[2]) && unique.params[1] == "Specialists") + if (unique.params[1] == "Specialists" && city.matchesFilter(unique.params[2])) yieldStats.happiness -= (unique.params[0].toFloat() / 100f) // relative val is negative, make positive } diff --git a/core/src/com/unciv/logic/city/CityFocus.kt b/core/src/com/unciv/logic/city/CityFocus.kt index a75e9905b9..3524035461 100644 --- a/core/src/com/unciv/logic/city/CityFocus.kt +++ b/core/src/com/unciv/logic/city/CityFocus.kt @@ -69,7 +69,10 @@ enum class CityFocus( fun applyWeightTo(stats: Stats) { for (stat in Stat.values()) { val currentStat = stats[stat] - if (currentStat != 0f) stats[stat] *= getStatMultiplier(stat) + if (currentStat == 0f) continue + val statMultiplier = getStatMultiplier(stat) + if (statMultiplier == 1f) continue + stats[stat] = currentStat * statMultiplier } } diff --git a/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt b/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt index 40862be196..fe59aba706 100644 --- a/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt @@ -191,7 +191,7 @@ class CityPopulationManager : IsPartOfGameInfoSerialization { if (valueBestTile > valueBestSpecialist) { if (bestTile != null) { city.workedTiles = city.workedTiles.withItem(bestTile.position) - cityStats.food += bestTile.stats.getTileStats(city, city.civ, localUniqueCache).food + cityStats.food += tileStats[bestTile]!!.food } } else if (bestJob != null) { specialistAllocations.add(bestJob, 1) diff --git a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt index bb57e978f0..3996d70895 100644 --- a/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt +++ b/core/src/com/unciv/models/ruleset/tile/TileImprovement.kt @@ -67,10 +67,12 @@ class TileImprovement : RulesetStatsObject() { fun isAllowedOnFeature(terrain: Terrain) = canBeBuiltOn(terrain) || getMatchingUniques(UniqueType.NoFeatureRemovalNeeded).any { terrain.matchesFilter(it.params[0]) } + + private val cachedMatchesFilterResult = HashMap() + /** Implements [UniqueParameterType.ImprovementFilter][com.unciv.models.ruleset.unique.UniqueParameterType.ImprovementFilter] */ - fun matchesFilter(filter: String): Boolean { - return MultiFilter.multiFilter(filter, ::matchesSingleFilter) - } + fun matchesFilter(filter: String): Boolean = + cachedMatchesFilterResult.getOrPut(filter) { MultiFilter.multiFilter(filter, ::matchesSingleFilter ) } private fun matchesSingleFilter(filter: String): Boolean { return when (filter) {