From f6e22f60bfda3f10ae7c47803eacaef71ff2af63 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Tue, 1 Feb 2022 09:42:52 +0200 Subject: [PATCH] Replace old uniques with *parameter-filled* new uniques! (#6077) * Since we have the old unique typed, and the new replacement unique typed, we can show modders EXACTLY the new unique they'll need to have! The final step of this process is having a 'replace old uniques' button which will automagically replace old uniques in a mod with the new versions. This will of course require some manual intervention since it's possible we added some parameters that didn't exist in the old one, but should work well for 95%+ of uniques. * Also allow "[-amount]" replacements Better replacements - "[+amount]" etc - where relevant * Fixed misadded + in unique --- core/src/com/unciv/models/ruleset/Ruleset.kt | 19 ++++++++++- .../unciv/models/ruleset/unique/UniqueType.kt | 28 ++++++++-------- docs/uniques.md | 32 +++++++++---------- 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 968550b4d6..e548e56542 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -24,6 +24,7 @@ import com.unciv.models.stats.INamed import com.unciv.models.stats.NamedStats import com.unciv.models.stats.Stats import com.unciv.models.translations.fillPlaceholders +import com.unciv.models.translations.getPlaceholderParameters import com.unciv.models.translations.tr import com.unciv.ui.utils.colorFromRGB import com.unciv.ui.utils.getRelativeTextDistance @@ -373,9 +374,25 @@ class Ruleset { val deprecationAnnotation = unique.type.declaringClass.getField(unique.type.name) .getAnnotation(Deprecated::class.java) if (deprecationAnnotation != null) { + var replacementUniqueText = deprecationAnnotation.replaceWith.expression + val deprecatedUniquePlaceholders = unique.type.text.getPlaceholderParameters() + + // Here, for once, we DO want the conditional placeholder parameters together with the regular ones, + // so we cheat the conditional detector by removing the '<' + for (parameter in replacementUniqueText.replace('<',' ').getPlaceholderParameters()) { + val parameterNumberInDeprecatedUnique = + deprecatedUniquePlaceholders.indexOf(parameter.removePrefix("+").removePrefix("-")) + if (parameterNumberInDeprecatedUnique == -1) continue + var replacementText = unique.params[parameterNumberInDeprecatedUnique] + if (parameter.startsWith('+')) replacementText = "+$replacementText" + else if(parameter.startsWith('-')) replacementText = "-$replacementText" + replacementUniqueText = + replacementUniqueText.replace("[$parameter]", "[$replacementText]") + } + val deprecationText = "$name's unique \"${unique.text}\" is deprecated ${deprecationAnnotation.message}," + - if (deprecationAnnotation.replaceWith.expression != "") " replace with \"${deprecationAnnotation.replaceWith.expression}\"" else "" + if (deprecationAnnotation.replaceWith.expression != "") " replace with \"${replacementUniqueText}\"" else "" val severity = if (deprecationAnnotation.level == DeprecationLevel.WARNING) RulesetErrorSeverity.WarningOptionsOnly // Not user-visible else RulesetErrorSeverity.Warning // User visible diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index e912715b3f..d3ffdaeec2 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -93,7 +93,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: StatPercentBonus("[amount]% [stat]", UniqueTarget.Global, UniqueTarget.FollowerBelief), StatPercentBonusCities("[amount]% [stat] [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), StatPercentFromObject("[amount]% [stat] from every [tileFilter/specialist/buildingName]", UniqueTarget.Global, UniqueTarget.FollowerBelief), - @Deprecated("As of 3.18.17", ReplaceWith("[amount]% [stat] from every [tileFilter/specialist/buildingName]")) + @Deprecated("As of 3.18.17", ReplaceWith("[+amount]% [stat] from every [tileFilter/specialist/buildingName]")) StatPercentSignedFromObject("+[amount]% [stat] from every [tileFilter/specialist/buildingName]", UniqueTarget.Global, UniqueTarget.FollowerBelief), AllStatsPercentFromObject("[amount]% Yield from every [tileFilter]", UniqueTarget.FollowerBelief, UniqueTarget.Global), @Deprecated("As of 3.18.17", ReplaceWith("[+amount]% Yield from every [tileFilter]")) @@ -108,7 +108,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: PercentProductionBuildings("[amount]% Production when constructing [buildingFilter] buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), PercentProductionUnits("[amount]% Production when constructing [baseUnitFilter] units [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), PercentProductionBuildingsInCapital("[amount]% Production towards any buildings that already exist in the Capital", UniqueTarget.Global, UniqueTarget.FollowerBelief), - @Deprecated("As of 3.19.3", ReplaceWith("[amount]% Production towards any buildings that already exist in the Capital")) + @Deprecated("As of 3.19.3", ReplaceWith("[+25]% Production towards any buildings that already exist in the Capital")) PercentProductionBuildingsInCapitalDeprecated("+25% Production towards any buildings that already exist in the Capital", UniqueTarget.Global, UniqueTarget.FollowerBelief), //endregion Stat providing uniques @@ -218,7 +218,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: DecreasedRoadMaintenanceDeprecated("Maintenance on roads & railroads reduced by [amount]%", UniqueTarget.Global), BuildingMaintenance("[amount]% maintenance cost for buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), - @Deprecated("As of 3.18.17", ReplaceWith("[-amount]% maintenace cost for buildings [cityFilter]")) + @Deprecated("As of 3.18.17", ReplaceWith("[-amount]% maintenance cost for buildings [cityFilter]")) DecreasedBuildingMaintenanceDeprecated("-[amount]% maintenance cost for buildings [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), // This should probably support conditionals, e.g. @@ -231,7 +231,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: BonusHappinessFromLuxuryDeprecated("+[amount] happiness from each type of luxury resource", UniqueTarget.Global), LessPolicyCostFromCities("Each city founded increases culture cost of policies [amount]% less than normal", UniqueTarget.Global), LessPolicyCost("[amount]% Culture cost of adopting new Policies", UniqueTarget.Global), - @Deprecated("As of 3.18.17", ReplaceWith("[amount]% Culture cost of adopting new Policies")) + @Deprecated("As of 3.18.17", ReplaceWith("[-amount]% Culture cost of adopting new Policies")) LessPolicyCostDeprecated("Culture cost of adopting new Policies reduced by [amount]%", UniqueTarget.Global), @Deprecated("As of 3.19.1", ReplaceWith("[amount]% Culture cost of adopting new Policies")) LessPolicyCostDeprecated2("[amount]% Culture cost of adopting new policies", UniqueTarget.Global), @@ -266,9 +266,9 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: StrengthForCities("[amount]% Strength for cities", UniqueTarget.Global, UniqueTarget.FollowerBelief), @Deprecated("As of 3.18.17", ReplaceWith("[+amount]% Strength for cities ")) StrengthForCitiesDefending("+[amount]% Defensive Strength for cities", UniqueTarget.Global), - @Deprecated("As of 3.18.17", ReplaceWith("[amount]% Strength for cities ")) + @Deprecated("As of 3.18.17", ReplaceWith("[+amount]% Strength for cities ")) StrengthForCitiesAttacking("[amount]% Attacking Strength for cities", UniqueTarget.Global), - @Deprecated("As of 3.19.1", ReplaceWith("[amount]% Strength for cities ")) + @Deprecated("As of 3.19.1", ReplaceWith("[+amount]% Strength for cities ")) StrengthForGarrisonedCitiesAttacking("+[amount]% attacking strength for cities with garrisoned units", UniqueTarget.Global), UnitStartingExperience("New [baseUnitFilter] units start with [amount] Experience [cityFilter]", UniqueTarget.Global, UniqueTarget.FollowerBelief), @@ -525,7 +525,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: DefensiveBonus("Gives a defensive bonus of [amount]%", UniqueTarget.Improvement), ImprovementMaintenance("Costs [amount] gold per turn when in your territory", UniqueTarget.Improvement), // Unused DamagesAdjacentEnemyUnits("Adjacent enemy units ending their turn take [amount] damage", UniqueTarget.Improvement), - @Deprecated("As of 3.18.17", ReplaceWith("Adjacent enemy units ending their turn take [30] damage"), DeprecationLevel.WARNING) + @Deprecated("As of 3.18.17", ReplaceWith("Adjacent enemy units ending their turn take [amount] damage"), DeprecationLevel.WARNING) DamagesAdjacentEnemyUnitsOld("Deal [amount] damage to adjacent enemy units", UniqueTarget.Improvement), GreatImprovement("Great Improvement", UniqueTarget.Improvement), @@ -671,13 +671,13 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: - @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount]% Strength "), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[+amount]% Strength "), DeprecationLevel.ERROR) StrengthAttacking("+[amount]% Strength when attacking", UniqueTarget.Unit), - @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount]% Strength "), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[+amount]% Strength "), DeprecationLevel.ERROR) StrengthDefending("+[amount]% Strength when defending", UniqueTarget.Unit), @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount]% Strength "), DeprecationLevel.ERROR) StrengthDefendingUnitFilter("[amount]% Strength when defending vs [mapUnitFilter] units", UniqueTarget.Unit), - @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount]% Strength "), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[+amount]% Strength "), DeprecationLevel.ERROR) DamageForUnits("[mapUnitFilter] units deal +[amount]% damage", UniqueTarget.Global), @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[+10]% Strength "), DeprecationLevel.ERROR) StrengthGoldenAge("+10% Strength for all units during Golden Age", UniqueTarget.Global), @@ -691,9 +691,9 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: StrengthVsCities("+15% Combat Strength for all units when attacking Cities", UniqueTarget.Global), - @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount] Movement "), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[+amount] Movement "), DeprecationLevel.ERROR) MovementUnits("+[amount] Movement for all [mapUnitFilter] units", UniqueTarget.Global), - @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount] Movement "), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[+1] Movement "), DeprecationLevel.ERROR) MovementGoldenAge("+1 Movement for all units during Golden Age", UniqueTarget.Global), @Deprecated("As of 3.17.5 - removed 3.18.5", ReplaceWith("[amount] Sight "), DeprecationLevel.ERROR) @@ -709,9 +709,9 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: @Deprecated("As of 3.17.10 - removed 3.18.5", ReplaceWith("[+amount]% Production when constructing [baseUnitFilter] units [cityFilter]"), DeprecationLevel.ERROR) PercentProductionUnitsDeprecated("+[amount]% Production when constructing [baseUnitFilter] units [cityFilter]", UniqueTarget.Global), - @Deprecated("As of 3.17.10 - removed 3.18.5", ReplaceWith("[amount]% Production when constructing [buildingFilter] buildings [cityFilter]"), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.10 - removed 3.18.5", ReplaceWith("[+amount]% Production when constructing [buildingFilter] buildings [cityFilter]"), DeprecationLevel.ERROR) PercentProductionStatBuildings("+[amount]% Production when constructing [stat] buildings", UniqueTarget.Global), - @Deprecated("As of 3.17.10 - removed 3.18.5", ReplaceWith("[amount]% Production when constructing [buildingFilter] buildings [cityFilter]"), DeprecationLevel.ERROR) + @Deprecated("As of 3.17.10 - removed 3.18.5", ReplaceWith("[+amount]% Production when constructing [buildingFilter] buildings [cityFilter]"), DeprecationLevel.ERROR) PercentProductionConstructions("+[amount]% Production when constructing [constructionFilter]", UniqueTarget.Global), @Deprecated("As of 3.17.10 - removed 3.18.5", ReplaceWith("[amount]% Production when constructing [buildingFilter] buildings [cityFilter]"), DeprecationLevel.ERROR) PercentProductionBuildingName("+[amount]% Production when constructing a [buildingName]", UniqueTarget.Global), diff --git a/docs/uniques.md b/docs/uniques.md index f2d89cf9e8..49acd13f64 100644 --- a/docs/uniques.md +++ b/docs/uniques.md @@ -347,8 +347,8 @@ Example: "Retain [20]% of the happiness from a luxury after the last copy has be Applicable to: Global -#### [amount] Happiness from each type of luxury resource -Example: "[20] Happiness from each type of luxury resource" +#### [+amount] Happiness from each type of luxury resource +Example: "[+amount] Happiness from each type of luxury resource" Applicable to: Global @@ -1420,9 +1420,9 @@ Applicable to: Conditional - "[stats] per turn from cities before [tech/policy]" - Deprecated As of 3.18.14, replace with "[stats] [in all cities] OR [stats] [in all cities] " - "[stats] from every Wonder" - Deprecated As of 3.19.1, replace with "[stats] from every [Wonder]" - "[stats] from every [buildingFilter] in cities where this religion has at least [amount] followers" - Deprecated As of 3.19.3, replace with "[stats] from every [buildingFilter] " - - "+[amount]% [stat] from every [tileFilter/specialist/buildingName]" - Deprecated As of 3.18.17, replace with "[amount]% [stat] from every [tileFilter/specialist/buildingName]" + - "+[amount]% [stat] from every [tileFilter/specialist/buildingName]" - Deprecated As of 3.18.17, replace with "[+amount]% [stat] from every [tileFilter/specialist/buildingName]" - "+[amount]% yield from every [tileFilter]" - Deprecated As of 3.18.17, replace with "[+amount]% Yield from every [tileFilter]" - - "+25% Production towards any buildings that already exist in the Capital" - Deprecated As of 3.19.3, replace with "[amount]% Production towards any buildings that already exist in the Capital" + - "+25% Production towards any buildings that already exist in the Capital" - Deprecated As of 3.19.3, replace with "[+25]% Production towards any buildings that already exist in the Capital" - "City-State Influence degrades [amount]% slower" - Deprecated As of 3.18.17, replace with "[-amount]% City-State Influence degradation" - "Quantity of Resources gifted by City-States increased by [amount]%" - Deprecated As of 3.18.17, replace with "[+amount]% resources gifted by City-States" - "Happiness from Luxury Resources gifted by City-States increased by [amount]%" - Deprecated As of 3.18.17, replace with "[+amount]% Happiness from luxury resources gifted by City-States" @@ -1435,9 +1435,9 @@ Applicable to: Conditional - "[amount]% cost of natural border growth" - Deprecated As of 3.19.1, replace with "[amount]% Culture cost of natural border growth [cityFilter]" - "-[amount]% Gold cost of acquiring tiles [cityFilter]" - Deprecated As of 3.19.1, replace with "[-amount]% Gold cost of acquiring tiles [cityFilter]" - "Maintenance on roads & railroads reduced by [amount]%" - Deprecated As of 3.18.17, replace with "[-amount]% maintenance on road & railroads" - - "-[amount]% maintenance cost for buildings [cityFilter]" - Deprecated As of 3.18.17, replace with "[-amount]% maintenace cost for buildings [cityFilter]" + - "-[amount]% maintenance cost for buildings [cityFilter]" - Deprecated As of 3.18.17, replace with "[-amount]% maintenance cost for buildings [cityFilter]" - "+[amount] happiness from each type of luxury resource" - Deprecated As of 3.18.17, replace with "[+amount] Happiness from each type of luxury resource" - - "Culture cost of adopting new Policies reduced by [amount]%" - Deprecated As of 3.18.17, replace with "[amount]% Culture cost of adopting new Policies" + - "Culture cost of adopting new Policies reduced by [amount]%" - Deprecated As of 3.18.17, replace with "[-amount]% Culture cost of adopting new Policies" - "[amount]% Culture cost of adopting new policies" - Deprecated As of 3.19.1, replace with "[amount]% Culture cost of adopting new Policies" - "Defensive buildings in all cities are 25% more effective" - Deprecated As of 3.18.17, replace with "[+25]% City Strength from defensive buildings" - "[amount]% Strength for [mapUnitFilter] units which have another [mapUnitFilter] unit in an adjacent tile" - Deprecated As of 3.18.17, replace with "[amount]% Strength " @@ -1445,8 +1445,8 @@ Applicable to: Conditional - "Double gold from Great Merchant trade missions" - Deprecated As of 3.18.17, replace with "[+100]% Gold from Great Merchant trade missions" - "Golden Age length increased by [amount]%" - Deprecated As of 3.18.17, replace with "[+amount]% Golden Age length" - "+[amount]% Defensive Strength for cities" - Deprecated As of 3.18.17, replace with "[+amount]% Strength for cities " - - "[amount]% Attacking Strength for cities" - Deprecated As of 3.18.17, replace with "[amount]% Strength for cities " - - "+[amount]% attacking strength for cities with garrisoned units" - Deprecated As of 3.19.1, replace with "[amount]% Strength for cities " + - "[amount]% Attacking Strength for cities" - Deprecated As of 3.18.17, replace with "[+amount]% Strength for cities " + - "+[amount]% attacking strength for cities with garrisoned units" - Deprecated As of 3.19.1, replace with "[+amount]% Strength for cities " - "Population loss from nuclear attacks -[amount]%" - Deprecated As of 3.19.2, replace with "Population loss from nuclear attacks [-amount]% [in this city]" - "[amount]% Natural religion spread [cityFilter] with [tech/policy]" - Deprecated As of 3.19.3, replace with "[amount]% Natural religion spread [cityFilter] OR [amount]% natural religion spread [cityFilter] " - "Melee units pay no movement cost to pillage" - Deprecated As of 3.18.17, replace with "No movement cost to pillage " @@ -1459,31 +1459,31 @@ Applicable to: Conditional - "[amount]% [stat] while the empire is happy" - Deprecated As of 3.17.1 - removed 3.18.18, replace with "[amount]% [stat] [in all cities] " - "Immediately creates the cheapest available cultural building in each of your first [amount] cities for free" - Deprecated As of 3.16.15 - removed 3.18.4, replace with "Provides the cheapest [stat] building in your first [amount] cities for free" - "Immediately creates a [buildingName] in each of your first [amount] cities for free" - Deprecated As of 3.16.15 - removed 3.18.4, replace with "Provides a [buildingName] in your first [amount] cities for free" - - "[mapUnitFilter] units deal +[amount]% damage" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " + - "[mapUnitFilter] units deal +[amount]% damage" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+amount]% Strength " - "+10% Strength for all units during Golden Age" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+10]% Strength " - "[amount]% Strength for [mapUnitFilter] units in [tileFilter]" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " - "+15% Combat Strength for all units when attacking Cities" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+15]% Strength " - - "+[amount] Movement for all [mapUnitFilter] units" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount] Movement " - - "+1 Movement for all units during Golden Age" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount] Movement " + - "+[amount] Movement for all [mapUnitFilter] units" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+amount] Movement " + - "+1 Movement for all units during Golden Age" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+1] Movement " - "[amount] Sight for all [mapUnitFilter] units" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount] Sight " - "[amount]% Spread Religion Strength for [mapUnitFilter] units" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Spread Religion Strength " - "+[amount]% Production when constructing [baseUnitFilter] units [cityFilter]" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[+amount]% Production when constructing [baseUnitFilter] units [cityFilter]" - - "+[amount]% Production when constructing [stat] buildings" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[amount]% Production when constructing [buildingFilter] buildings [cityFilter]" - - "+[amount]% Production when constructing [constructionFilter]" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[amount]% Production when constructing [buildingFilter] buildings [cityFilter]" + - "+[amount]% Production when constructing [stat] buildings" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[+amount]% Production when constructing [buildingFilter] buildings [cityFilter]" + - "+[amount]% Production when constructing [constructionFilter]" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[+amount]% Production when constructing [buildingFilter] buildings [cityFilter]" - "+[amount]% Production when constructing a [buildingName]" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[amount]% Production when constructing [buildingFilter] buildings [cityFilter]" - "+[amount]% Production when constructing [constructionFilter] [cityFilter]" - Deprecated As of 3.17.10 - removed 3.18.5, replace with "[amount]% Production when constructing [buildingFilter] buildings [cityFilter]" - "Not displayed as an available construction unless [buildingName] is built" - Deprecated As of 3.16.11, replace with "Not displayed as an available construction without [buildingName]" - "[stats] once [tech] is discovered" - Deprecated As of 3.17.10 - removed 3.18.19, replace with "[stats] " - "Cannot enter ocean tiles until Astronomy" - Deprecated As of 3.18.6, replace with "Cannot enter ocean tiles " - "[amount]% Bonus XP gain" - Deprecated As of 3.18.12, replace with "[amount]% XP gained from combat" - - "+[amount]% Strength when attacking" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " - - "+[amount]% Strength when defending" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " + - "+[amount]% Strength when attacking" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+amount]% Strength " + - "+[amount]% Strength when defending" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[+amount]% Strength " - "[amount]% Strength when defending vs [mapUnitFilter] units" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " - "+[amount]% defence in [tileFilter] tiles" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " - "+[amount]% Strength in [tileFilter]" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount]% Strength " - "[amount] Visibility Range" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount] Sight" - "Limited Visibility" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[-1] Sight" - "Cannot be built on [tileFilter] tiles until [tech] is discovered" - Deprecated As of 3.18.5, replace with "Cannot be built on [tileFilter] tiles " - - "Deal [amount] damage to adjacent enemy units" - Deprecated As of 3.18.17, replace with "Adjacent enemy units ending their turn take [30] damage" + - "Deal [amount] damage to adjacent enemy units" - Deprecated As of 3.18.17, replace with "Adjacent enemy units ending their turn take [amount] damage" - "[stats] on [tileFilter] tiles once [tech] is discovered" - Deprecated As of 3.17.10 - removed 3.18.19, replace with "[stats] from [tileFilter] tiles " - "Deal 30 damage to adjacent enemy units" - Deprecated As of 3.17.10 - removed 3.18.19, replace with "Adjacent enemy units ending their turn take [30] damage" \ No newline at end of file