diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 8d2739801e..37703da9df 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -54,14 +54,6 @@ object BattleDamage { if (greatGeneralBonus != 0) modifiers[greatGeneralName] = greatGeneralBonus - for (unique in combatant.unit.getMatchingUniques(UniqueType.StrengthWhenStacked)) { - var stackedUnitsBonus = 0 - if (combatant.unit.getTile().getUnits().any { it.matchesFilter(unique.params[1]) }) - stackedUnitsBonus += unique.params[0].toInt() - - if (stackedUnitsBonus > 0) - modifiers["Stacked with [${unique.params[1]}]"] = stackedUnitsBonus - } } else if (combatant is CityCombatant) { for (unique in combatant.city.getMatchingUniques(UniqueType.StrengthForCities, conditionalState)) { modifiers.add(getModifierStringFromUnique(unique), unique.params[0].toInt()) diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 6d2b41e67f..8d15d439dc 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -141,11 +141,6 @@ class CityConstructions : IsPartOfGameInfoSerialization { maintenanceCost += maintenanceForThisBuilding } - for (unique in city.getMatchingUniques(UniqueType.BuildingMaintenanceOld)) { - maintenanceCost = (maintenanceCost * unique.params[0].toPercent()) - } - - return maintenanceCost } diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index f7ccb54a2a..6c44ab227b 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -174,8 +174,7 @@ class CityStats(val city: City) { @Readonly fun hasExtraAnnexUnhappiness(): Boolean { if (city.civ.civName == city.foundingCiv || city.isPuppet) return false - return !city.containsBuildingUnique(UniqueType.RemoveAnnexUnhappiness) - && !city.containsBuildingUnique(UniqueType.RemovesAnnexUnhappiness) + return !city.containsBuildingUnique(UniqueType.RemovesAnnexUnhappiness) } @Readonly diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index 01b45075e5..dc17b213fd 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -42,7 +42,6 @@ import com.unciv.models.ruleset.nation.Nation import com.unciv.models.ruleset.nation.Personality import com.unciv.models.ruleset.tech.Era import com.unciv.models.ruleset.tile.ResourceSupplyList -import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.tile.TileResource import com.unciv.models.ruleset.unique.* @@ -509,15 +508,9 @@ class Civilization : IsPartOfGameInfoSerialization { fun getResourceModifier(resource: TileResource): Float { var finalModifier = 1f - if (resource.resourceType == ResourceType.Strategic) - for (unique in getMatchingUniques(UniqueType.StrategicResourcesIncrease)) - finalModifier += unique.params[0].toFloat() / 100f for (unique in getMatchingUniques(UniqueType.PercentResourceProduction)) if (resource.matchesFilter(unique.params[1])) finalModifier += unique.params[0].toFloat() / 100f - for (unique in getMatchingUniques(UniqueType.DoubleResourceProduced)) - if (unique.params[0] == resource.name) - finalModifier += 1f return finalModifier } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index b6a429f256..63ccd31a49 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -522,9 +522,7 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { } if (getMatchingUniques(UniqueType.StatsFromTiles).any { it.stats[stat] > 0 }) return true if (getMatchingUniques(UniqueType.StatsPerPopulation).any { it.stats[stat] > 0 }) return true - if (stat == Stat.Happiness && - (hasUnique(UniqueType.RemoveAnnexUnhappiness) || hasUnique(UniqueType.RemovesAnnexUnhappiness)) - ) return true + if (stat == Stat.Happiness && hasUnique(UniqueType.RemovesAnnexUnhappiness)) return true return false } diff --git a/core/src/com/unciv/models/ruleset/GlobalUniques.kt b/core/src/com/unciv/models/ruleset/GlobalUniques.kt index 569bfd56d2..0006aa6515 100644 --- a/core/src/com/unciv/models/ruleset/GlobalUniques.kt +++ b/core/src/com/unciv/models/ruleset/GlobalUniques.kt @@ -22,7 +22,6 @@ class GlobalUniques: RulesetObject() { return when (unique.modifiers.first().type) { UniqueType.ConditionalGoldenAge -> "Golden Age" UniqueType.ConditionalHappy -> "Happiness" - UniqueType.ConditionalBetweenHappiness, UniqueType.ConditionalBelowHappiness -> "Unhappiness" UniqueType.ConditionalWLTKD -> "We Love The King Day" else -> "Global Effect" } diff --git a/core/src/com/unciv/models/ruleset/IConstruction.kt b/core/src/com/unciv/models/ruleset/IConstruction.kt index d480508be2..4b4b6ea0fc 100644 --- a/core/src/com/unciv/models/ruleset/IConstruction.kt +++ b/core/src/com/unciv/models/ruleset/IConstruction.kt @@ -197,7 +197,6 @@ class RejectionReason(val type: RejectionReasonType, RejectionReasonType.RequiresBuildingInSomeCity, RejectionReasonType.RequiresBuildingInSomeCities, RejectionReasonType.CanOnlyBeBuiltInSpecificCities, - RejectionReasonType.CannotBeBuiltUnhappiness, RejectionReasonType.PopulationRequirement, RejectionReasonType.ConsumesResources, RejectionReasonType.CanOnlyBePurchased, @@ -207,7 +206,6 @@ class RejectionReason(val type: RejectionReasonType, // Exceptions. Used for units spawned/upgrade path, not built private val constructionRejectionReasonType = listOf( RejectionReasonType.Unbuildable, - RejectionReasonType.CannotBeBuiltUnhappiness, RejectionReasonType.CannotBeBuilt, RejectionReasonType.CanOnlyBeBuiltInSpecificCities, ) @@ -249,12 +247,10 @@ enum class RejectionReasonType(val shouldShow: Boolean, val errorMessage: String UniqueToOtherNation(false, "Unique to another nation"), ReplacedByOurUnique(false, "Our unique replaces this"), CannotBeBuilt(false, "Cannot be built by this nation"), - CannotBeBuiltUnhappiness(true, "Unhappiness"), Obsoleted(false, "Obsolete"), RequiresTech(false, "Required tech not researched"), RequiresPolicy(false, "Requires a specific policy!"), - UnlockedWithEra(false, "Unlocked when reaching a specific era"), MorePolicyBranches(false, "Hidden until more policy branches are fully adopted"), RequiresNearbyResource(false, "Requires a certain resource being exploited nearby"), diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 5b7ede0fa5..56615078b7 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -137,8 +137,12 @@ class Ruleset { sequence { for (unique in this@Ruleset.allUniques()) for (conditional in unique.modifiers){ - if (conditional.type == UniqueType.ConditionalBelowHappiness) yield(conditional.params[0].toInt()) - if (conditional.type == UniqueType.ConditionalBetweenHappiness){ + if (conditional.type == UniqueType.ConditionalWhenBelowAmountStatResource + && conditional.params[1] == "Happiness") yield(conditional.params[0].toInt()) + if (conditional.type == UniqueType.ConditionalWhenAboveAmountStatResource + && conditional.params[1] == "Happiness") yield(conditional.params[0].toInt()) + if (conditional.type == UniqueType.ConditionalWhenBetweenStatResource + && conditional.params[2] == "Happiness"){ yield(conditional.params[0].toInt()) yield(conditional.params[1].toInt() + 1) } diff --git a/core/src/com/unciv/models/ruleset/unique/Conditionals.kt b/core/src/com/unciv/models/ruleset/unique/Conditionals.kt index c3ec8df501..2068316bda 100644 --- a/core/src/com/unciv/models/ruleset/unique/Conditionals.kt +++ b/core/src/com/unciv/models/ruleset/unique/Conditionals.kt @@ -136,10 +136,6 @@ object Conditionals { { current, lowerLimit, upperLimit -> current >= lowerLimit && current <= upperLimit } UniqueType.ConditionalHappy -> checkOnCiv { stats.happiness >= 0 } - UniqueType.ConditionalBetweenHappiness -> - checkOnCiv { stats.happiness in conditional.params[0].toInt() .. conditional.params[1].toInt() } - UniqueType.ConditionalAboveHappiness -> checkOnCiv { stats.happiness > conditional.params[0].toInt() } - UniqueType.ConditionalBelowHappiness -> checkOnCiv { stats.happiness < conditional.params[0].toInt() } UniqueType.ConditionalGoldenAge -> checkOnCiv { goldenAges.isGoldenAge() } UniqueType.ConditionalNotGoldenAge -> checkOnCiv { !goldenAges.isGoldenAge() } diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt index 4d3a4f83b3..025ae7544c 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt @@ -502,19 +502,6 @@ object UniqueTriggerActivation { } } - UniqueType.StrategicResourcesIncrease -> { - return { - civInfo.cache.updateCivResources() - if (notification != null) - civInfo.addNotification( - notification, - NotificationCategory.General, - NotificationIcon.Construction - ) - true - } - } - UniqueType.OneTimeProvideResources -> { val resourceName = unique.params[1] val resource = ruleset.tileResources[resourceName] ?: return null diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 9decd43270..600e957430 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -7,7 +7,6 @@ import com.unciv.models.ruleset.validation.RulesetValidator import com.unciv.models.ruleset.validation.Suppression import com.unciv.models.translations.getPlaceholderParameters import com.unciv.models.translations.getPlaceholderText -import yairm210.purity.annotations.LocalState import yairm210.purity.annotations.Readonly // I didn't put this in a companion object because APPARENTLY doing that means you can't use it in the init function. @@ -144,8 +143,6 @@ enum class UniqueType( GainFreeBuildings("Gain a free [buildingName] [cityFilter]", UniqueTarget.Global, UniqueTarget.Triggerable, docDescription = "Free buildings CANNOT be self-removing - this leads to an endless loop of trying to add the building"), BuildingMaintenance("[relativeAmount]% maintenance cost for [buildingFilter] buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), - @Deprecated(message = "as of 4.16.13", ReplaceWith("[relativeAmount]% maintenance cost for [all] buildings [cityFilter]"), level = DeprecationLevel.WARNING) - BuildingMaintenanceOld("[relativeAmount]% maintenance cost for buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), RemoveBuilding("Remove [buildingFilter] [cityFilter]", UniqueTarget.Global, UniqueTarget.Triggerable), OneTimeSellBuilding("Sell [buildingFilter] buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.Triggerable), @@ -212,10 +209,6 @@ enum class UniqueType( flags = setOf(UniqueFlag.AcceptsSpeedModifier)), PercentResourceProduction("[relativeAmount]% [resourceFilter] resource production", UniqueTarget.Global), - @Deprecated("As of 4.16.18", ReplaceWith("[relativeAmount]% [Strategic] resource production")) - StrategicResourcesIncrease("Quantity of strategic resources produced by the empire +[relativeAmount]%", UniqueTarget.Global), // used by Policies - @Deprecated("As of 4.16.18", ReplaceWith("[+100]% [resource] resource production")) - DoubleResourceProduced("Double quantity of [resource] produced", UniqueTarget.Global), /// Diplomacy EnablesEmbassies("Enables establishment of embassies", UniqueTarget.Tech), @@ -352,8 +345,6 @@ enum class UniqueType( DoublesGoldFromCapturingCity("Doubles Gold given to enemy if city is captured", UniqueTarget.Building), - @Deprecated("As of 4.16.14", ReplaceWith("Removes extra unhappiness from annexed cities")) - RemoveAnnexUnhappiness("Remove extra unhappiness from annexed cities", UniqueTarget.Building), RemovesAnnexUnhappiness("Removes extra unhappiness from annexed cities", UniqueTarget.Building), ConnectTradeRoutes("Connects trade routes over water", UniqueTarget.Building), GainBuildingWhereBuildable("Automatically built in all cities where it is buildable", UniqueTarget.Building), @@ -404,8 +395,6 @@ enum class UniqueType( StrengthNearCapital("[relativeAmount]% Strength decreasing with distance from the capital", UniqueTarget.Unit, UniqueTarget.Global), FlankAttackBonus("[relativeAmount]% to Flank Attack bonuses", UniqueTarget.Unit, UniqueTarget.Global), StrengthForAdjacentEnemies("[relativeAmount]% Strength for enemy [mapUnitFilter] units in adjacent [tileFilter] tiles", UniqueTarget.Unit), - @Deprecated("As of 4.16.14", ReplaceWith("[relativeAmount]% Strength "), DeprecationLevel.WARNING) - StrengthWhenStacked("[relativeAmount]% Strength when stacked with [mapUnitFilter]", UniqueTarget.Unit), // candidate for conditional! StrengthBonusInRadius("[relativeAmount]% Strength bonus for [mapUnitFilter] units within [amount] tiles", UniqueTarget.Unit), // Stat bonuses @@ -716,14 +705,7 @@ enum class UniqueType( ConditionalWLTKD("during We Love The King Day", UniqueTarget.Conditional), ConditionalHappy("while the empire is happy", UniqueTarget.Conditional), - @Deprecated("As of 4.16.18", ReplaceWith("when between [amount] and [amount] [Happiness]"), DeprecationLevel.WARNING) - ConditionalBetweenHappiness("when between [amount] and [amount] Happiness", UniqueTarget.Conditional, - docDescription = " 'Between' is inclusive - so 'between 1 and 5' includes 1 and 5."), - @Deprecated("As of 4.16.18", ReplaceWith("when above [amount] [Happiness]"), DeprecationLevel.WARNING) - ConditionalAboveHappiness("when above [amount] Happiness", UniqueTarget.Conditional), - @Deprecated("As of 4.16.18", ReplaceWith("when below [amount] [Happiness]"), DeprecationLevel.WARNING) - ConditionalBelowHappiness("when below [amount] Happiness", UniqueTarget.Conditional), - + ConditionalDuringEra("during the [era]", UniqueTarget.Conditional), ConditionalBeforeEra("before the [era]", UniqueTarget.Conditional), ConditionalStartingFromEra("starting from the [era]", UniqueTarget.Conditional), @@ -1034,6 +1016,23 @@ enum class UniqueType( // endregion ///////////////////////////////////////////// region 99 DEPRECATED AND REMOVED ///////////////////////////////////////////// + @Deprecated("As of 4.16.18", ReplaceWith("[relativeAmount]% [Strategic] resource production")) + StrategicResourcesIncrease("Quantity of strategic resources produced by the empire +[relativeAmount]%", UniqueTarget.Global), // used by Policies + @Deprecated("As of 4.16.18", ReplaceWith("[+100]% [resource] resource production")) + DoubleResourceProduced("Double quantity of [resource] produced", UniqueTarget.Global), + @Deprecated(message = "as of 4.16.13", ReplaceWith("[relativeAmount]% maintenance cost for [all] buildings [cityFilter]"), level = DeprecationLevel.WARNING) + BuildingMaintenanceOld("[relativeAmount]% maintenance cost for buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), + @Deprecated("As of 4.16.14", ReplaceWith("Removes extra unhappiness from annexed cities"), DeprecationLevel.ERROR) + RemoveAnnexUnhappiness("Remove extra unhappiness from annexed cities", UniqueTarget.Building), + @Deprecated("As of 4.16.14", ReplaceWith("[relativeAmount]% Strength "), DeprecationLevel.ERROR) + StrengthWhenStacked("[relativeAmount]% Strength when stacked with [mapUnitFilter]", UniqueTarget.Unit), // candidate for conditional! + @Deprecated("As of 4.16.18", ReplaceWith("when between [amount] and [amount] [Happiness]"), DeprecationLevel.ERROR) + ConditionalBetweenHappiness("when between [amount] and [amount] Happiness", UniqueTarget.Conditional, + docDescription = " 'Between' is inclusive - so 'between 1 and 5' includes 1 and 5."), + @Deprecated("As of 4.16.18", ReplaceWith("when above [amount] [Happiness]"), DeprecationLevel.ERROR) + ConditionalAboveHappiness("when above [amount] Happiness", UniqueTarget.Conditional), + @Deprecated("As of 4.16.18", ReplaceWith("when below [amount] [Happiness]"), DeprecationLevel.ERROR) + ConditionalBelowHappiness("when below [amount] Happiness", UniqueTarget.Conditional), @Deprecated("As of 4.16.0", ReplaceWith("Unavailable "), DeprecationLevel.ERROR) HiddenBeforeAmountPolicies("Hidden until [amount] social policy branches have been completed", UniqueTarget.Building, UniqueTarget.Unit), @Deprecated("As of 4.15.11", ReplaceWith("New [baseUnitFilter] units start with [amount] XP [cityFilter]"), DeprecationLevel.ERROR) diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 0aee14d2a1..f1dbe25b15 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -286,11 +286,7 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { for (unique in civ.getMatchingUniques(UniqueType.CannotBuildUnits, stateForConditionals)) if (this@BaseUnit.matchesFilter(unique.params[0], stateForConditionals)) { - val hasHappinessCondition = unique.hasModifier(UniqueType.ConditionalBelowHappiness) - || unique.hasModifier(UniqueType.ConditionalBetweenHappiness) - if (hasHappinessCondition) - yield(RejectionReasonType.CannotBeBuiltUnhappiness.toInstance(unique.getDisplayText())) - else yield(RejectionReasonType.CannotBeBuilt.toInstance()) + yield(RejectionReasonType.CannotBeBuilt.toInstance()) } if (city != null && isAirUnit() && !canUnitEnterTile(city)) { diff --git a/core/src/com/unciv/models/ruleset/validation/UniqueValidator.kt b/core/src/com/unciv/models/ruleset/validation/UniqueValidator.kt index dcdd5fd25f..406cf529f4 100644 --- a/core/src/com/unciv/models/ruleset/validation/UniqueValidator.kt +++ b/core/src/com/unciv/models/ruleset/validation/UniqueValidator.kt @@ -183,7 +183,7 @@ class UniqueValidator(val ruleset: Ruleset) { } private val resourceUniques = setOf(UniqueType.ProvidesResources, UniqueType.ConsumesResources, - UniqueType.DoubleResourceProduced, UniqueType.StrategicResourcesIncrease, UniqueType.PercentResourceProduction) + UniqueType.PercentResourceProduction) private val resourceConditionals = setOf( UniqueType.ConditionalWithResource, UniqueType.ConditionalWithoutResource, diff --git a/core/src/com/unciv/ui/screens/overviewscreen/StatsOverviewTab.kt b/core/src/com/unciv/ui/screens/overviewscreen/StatsOverviewTab.kt index a254391381..fe859efd03 100644 --- a/core/src/com/unciv/ui/screens/overviewscreen/StatsOverviewTab.kt +++ b/core/src/com/unciv/ui/screens/overviewscreen/StatsOverviewTab.kt @@ -135,10 +135,12 @@ class StatsOverviewTab( init { defaults().pad(5f) uniques = sequenceOf( - UniqueType.ConditionalBetweenHappiness, - UniqueType.ConditionalBelowHappiness + UniqueType.ConditionalWhenAboveAmountStatResource, + UniqueType.ConditionalWhenBetweenStatResource, + UniqueType.ConditionalWhenBelowAmountStatResource, ).flatMap { conditionalType -> - viewingPlayer.getTriggeredUniques(conditionalType) + viewingPlayer.getMatchingUniques(conditionalType) + .filter { it.params.last() == "Happiness" } .sortedBy { it.type } // otherwise order might change as a HashMap is involved }.filterNot { it.isHiddenToUsers() } .toSet() diff --git a/tests/src/com/unciv/uniques/ResourceTests.kt b/tests/src/com/unciv/uniques/ResourceTests.kt index 48a0352f31..f16c998049 100644 --- a/tests/src/com/unciv/uniques/ResourceTests.kt +++ b/tests/src/com/unciv/uniques/ResourceTests.kt @@ -3,8 +3,6 @@ package com.unciv.uniques import com.badlogic.gdx.math.Vector2 import com.unciv.logic.civilization.PlayerType import com.unciv.models.ruleset.BeliefType -import com.unciv.models.ruleset.unique.Unique -import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.unique.UniqueType import com.unciv.testing.GdxTestRunner import com.unciv.testing.TestGame @@ -51,24 +49,16 @@ class ResourceTests { fun testResourceProductionAndConsumptionModifierDoesNotAffectConsumption() { val consumesCoal = game.createBuilding("Consumes [1] [Coal]") val providesCoal = game.createBuilding("Provides [1] [Coal]") - val doubleCoal = game.createBuilding("Double quantity of [Coal] produced") - val doubleStrategic = game.createBuilding("Quantity of strategic resources produced by the empire +[100]%") val doubleStrategicProduction = game.createBuilding("[+100]% [Strategic] resource production") city.cityConstructions.addBuilding(providesCoal) Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 1) - - city.cityConstructions.addBuilding(doubleCoal) + + city.cityConstructions.addBuilding(doubleStrategicProduction) Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 2) - city.cityConstructions.addBuilding(doubleStrategic) - Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 3) - - city.cityConstructions.addBuilding(doubleStrategicProduction) - Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 4) - city.cityConstructions.addBuilding(consumesCoal) - Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 3) // Produce 4 (1 + 1 + 1 + 1), consume 1 + Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 1) // Produce 2, consume 1 } @Test @@ -128,11 +118,11 @@ class ResourceTests { tile.setImprovement(improvement.name, civInfo) Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 1) - val doubleCoal = game.createBuilding("Double quantity of [Coal] produced") + val doubleCoal = game.createBuilding("[+100]% [Coal] resource production") city.cityConstructions.addBuilding(doubleCoal) Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 2) - val doubleStrategic = game.createBuilding("Quantity of strategic resources produced by the empire +[100]%") + val doubleStrategic = game.createBuilding("[+100]% [Strategic] resource production") city.cityConstructions.addBuilding(doubleStrategic) Assert.assertTrue(civInfo.getCivResourcesByName()["Coal"] == 3)