diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 0efce3e84c..8d1998a056 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -220,9 +220,6 @@ class CityStats(val cityInfo: CityInfo) { sourceToStats.addStats(unique.stats, getSourceNameForUnique(unique), unique.sourceObjectName ?: "") } - for (unique in cityInfo.getMatchingUniques(UniqueType.Stats)) - addUniqueStats(unique) - for (unique in cityInfo.getMatchingUniques(UniqueType.StatsPerCity)) if (cityInfo.matchesFilter(unique.params[1])) addUniqueStats(unique) diff --git a/core/src/com/unciv/logic/civilization/CivInfoStats.kt b/core/src/com/unciv/logic/civilization/CivInfoStats.kt index 9cad407f36..956fedb279 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoStats.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoStats.kt @@ -7,6 +7,7 @@ import com.unciv.models.ruleset.BeliefType import com.unciv.models.ruleset.Policy import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.unique.StateForConditionals +import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.Stat import com.unciv.models.stats.StatMap @@ -139,6 +140,10 @@ class CivInfoStats(val civInfo: CivilizationInfo) { statMap.add(entry.key, entry.value) } + for (unique in civInfo.getMatchingUniques(UniqueType.Stats)) + if (unique.sourceObjectType != UniqueTarget.Building && unique.sourceObjectType != UniqueTarget.Wonder) + statMap.add(unique.sourceObjectName!!, unique.stats) + //City-States bonuses for (otherCiv in civInfo.getKnownCivs()) { val relationshipLevel = otherCiv.getDiplomacyManager(civInfo.civName).relationshipLevel() diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 8195c98fba..7d756262cb 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -188,6 +188,9 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { stats.add(unique.stats) } + for (unique in getMatchingUniques(UniqueType.Stats, StateForConditionals(city.civInfo, city))) + stats.add(unique.stats) + if (!isWonder) for (unique in localUniqueCache.get("StatsFromBuildings", city.getMatchingUniques(UniqueType.StatsFromBuildings))) { if (matchesFilter(unique.params[1])) diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 959a31e611..851db95bb2 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -73,7 +73,9 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: // region Stat providing uniques + // Used for *global* bonuses and improvement/terrain bonuses Stats("[stats]", UniqueTarget.Global, UniqueTarget.FollowerBelief, UniqueTarget.Improvement, UniqueTarget.Terrain), + // Used for city-wide bonuses StatsPerCity("[stats] [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), StatsFromSpecialist("[stats] from every specialist [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), diff --git a/tests/src/com/unciv/uniques/GlobalUniquesTests.kt b/tests/src/com/unciv/uniques/GlobalUniquesTests.kt index ad6a9c5061..aae614df03 100644 --- a/tests/src/com/unciv/uniques/GlobalUniquesTests.kt +++ b/tests/src/com/unciv/uniques/GlobalUniquesTests.kt @@ -27,7 +27,7 @@ class GlobalUniquesTests { // region base stat bonus providing uniques @Test - fun stats() { + fun statsOnBuilding() { val civInfo = game.addCiv() val tile = game.setTileFeatures(Vector2(0f,0f), Constants.desert) val cityInfo = game.addCity(civInfo, tile, true) @@ -38,6 +38,15 @@ class GlobalUniquesTests { Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.equals(Stats(food=1f))) } + + @Test + fun statsNotOnBuilding() { + val civInfo = game.addCiv("[+2 Gold]") + civInfo.updateStatsForNextTurn() + Assert.assertTrue(civInfo.statsForNextTurn.equals(Stats(gold=2f))) + } + + @Test fun statsPerCity() { val civInfo = game.addCiv()