Can now use [stats] unique for e.g. techs, policies, etc, to add gold/faith/culture/science to the global pool

This commit is contained in:
Yair Morgenstern
2022-11-21 11:21:42 +02:00
parent 3dfdcd1cbf
commit 0cf5c33475
5 changed files with 20 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View File

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