From 234b1b17418eca97d1da56b5d15d43509c5175b3 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Fri, 3 Dec 2021 11:28:24 +0200 Subject: [PATCH] Removed many "proxy functions" from civInfo to cityStateFunctions --- core/src/com/unciv/logic/GameStarter.kt | 2 +- .../logic/automation/NextTurnAutomation.kt | 12 +-- core/src/com/unciv/logic/battle/Battle.kt | 4 +- .../logic/civilization/CivilizationInfo.kt | 84 +++++-------------- .../unciv/logic/civilization/QuestManager.kt | 2 +- .../diplomacy/DiplomacyManager.kt | 4 +- .../src/com/unciv/ui/trade/DiplomacyScreen.kt | 16 ++-- docs/uniques.md | 36 ++++---- 8 files changed, 57 insertions(+), 103 deletions(-) diff --git a/core/src/com/unciv/logic/GameStarter.kt b/core/src/com/unciv/logic/GameStarter.kt index 9668c67efe..856a28ecbc 100644 --- a/core/src/com/unciv/logic/GameStarter.kt +++ b/core/src/com/unciv/logic/GameStarter.kt @@ -235,7 +235,7 @@ object GameStarter { val cityStateName = availableCityStatesNames.pop() val civ = CivilizationInfo(cityStateName) - if (civ.initCityState(ruleset, newGameParameters.startingEra, availableCivNames)) { + if (civ.cityStateFunctions.initCityState(ruleset, newGameParameters.startingEra, availableCivNames)) { gameInfo.civilizations.add(civ) addedCityStates++ } diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 8992fd99fa..fe7afb2660 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -49,8 +49,8 @@ object NextTurnAutomation { adoptPolicy(civInfo) // todo can take a second - why? freeUpSpaceResources(civInfo) } else { - civInfo.getFreeTechForCityState() - civInfo.updateDiplomaticRelationshipForCityState() + civInfo.cityStateFunctions.getFreeTechForCityState() + civInfo.cityStateFunctions.updateDiplomaticRelationshipForCityState() } chooseTechToResearch(civInfo) @@ -237,8 +237,8 @@ object NextTurnAutomation { private fun useGold(civInfo: CivilizationInfo) { if (civInfo.getHappiness() > 0 && civInfo.hasUnique(UniqueType.CityStateCanBeBoughtForGold)) { for (cityState in civInfo.getKnownCivs().filter { it.isCityState() } ) { - if (cityState.canBeMarriedBy(civInfo)) - cityState.diplomaticMarriage(civInfo) + if (cityState.cityStateFunctions.canBeMarriedBy(civInfo)) + cityState.cityStateFunctions.diplomaticMarriage(civInfo) if (civInfo.getHappiness() <= 0) break // Stop marrying if happiness is getting too low } } @@ -344,9 +344,9 @@ object NextTurnAutomation { && valueCityStateAlliance(civInfo, state) <= 0 && state.getTributeWillingness(civInfo) >= 0) { if (state.getTributeWillingness(civInfo, demandingWorker = true) > 0) - state.tributeWorker(civInfo) + state.cityStateFunctions.tributeWorker(civInfo) else - state.tributeGold(civInfo) + state.cityStateFunctions.tributeGold(civInfo) } } } diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index d178b6207e..cca05a1a84 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -172,7 +172,7 @@ object Battle { if (defeatedUnit.matchesCategory("Barbarian") && defeatedUnit.matchesCategory("Military") && civUnit.getCivInfo().isMajorCiv()) { for (cityState in UncivGame.Current.gameInfo.getAliveCityStates()) { if (civUnit.getCivInfo().knows(cityState) && defeatedUnit.unit.threatensCiv(cityState)) { - cityState.threateningBarbarianKilledBy(civUnit.getCivInfo()) + cityState.cityStateFunctions.threateningBarbarianKilledBy(civUnit.getCivInfo()) } } } @@ -540,7 +540,7 @@ object Battle { fun destroyIfDefeated(attackedCiv: CivilizationInfo, attacker: CivilizationInfo) { if (attackedCiv.isDefeated()) { if (attackedCiv.isCityState()) - attackedCiv.cityStateDestroyed(attacker) + attackedCiv.cityStateFunctions.cityStateDestroyed(attacker) attackedCiv.destroy() attacker.popupAlerts.add(PopupAlert(AlertType.Defeated, attackedCiv.civName)) } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 90698a1e3b..986f2e5e1f 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -778,6 +778,8 @@ class CivilizationInfo { for (unit in getCivUnits()) unit.startTurn() hasMovedAutomatedUnits = false + updateDetailedCivResources() // If you offered a trade last turn, this turn it will have been accepted/declined + for (tradeRequest in tradeRequests.toList()) { // remove trade requests where one of the sides can no longer supply val offeringCiv = gameInfo.getCivilization(tradeRequest.requestingCiv) if (offeringCiv.isDefeated() || !TradeEvaluation().isTradeValid(tradeRequest.trade, this, offeringCiv)) { @@ -786,7 +788,6 @@ class CivilizationInfo { offeringCiv.addNotification("Our proposed trade is no longer relevant!", NotificationIcon.Trade) } } - updateDetailedCivResources() // If you offered a trade last turn, this turn it will have been accepted/declined } fun endTurn() { @@ -856,7 +857,7 @@ class CivilizationInfo { && cityStateAllies.any { it.cities.isNotEmpty() } ) { val givingCityState = getKnownCivs().filter { it.isCityState() && it.getAllyCiv() == civName && it.cities.isNotEmpty()}.random() - givingCityState.giveGreatPersonToPatron(this) + givingCityState.cityStateFunctions.giveGreatPersonToPatron(this) flagsCountdown[flag] = turnsForGreatPersonFromCityState() } @@ -1116,17 +1117,15 @@ class CivilizationInfo { } // Check if different continents (unless already max distance, or water map) - if (connections > 0 && proximity != Proximity.Distant - && !gameInfo.tileMap.isWaterMap()) { - - if (getCapital().getCenterTile().getContinent() != otherCiv.getCapital().getCenterTile().getContinent()) { - // Different continents - increase separation by one step - proximity = when (proximity) { - Proximity.Far -> Proximity.Distant - Proximity.Close -> Proximity.Far - Proximity.Neighbors -> Proximity.Close - else -> proximity - } + if (connections > 0 && proximity != Proximity.Distant && !gameInfo.tileMap.isWaterMap() + && getCapital().getCenterTile().getContinent() != otherCiv.getCapital().getCenterTile().getContinent() + ) { + // Different continents - increase separation by one step + proximity = when (proximity) { + Proximity.Far -> Proximity.Distant + Proximity.Close -> Proximity.Far + Proximity.Neighbors -> Proximity.Close + else -> proximity } } @@ -1144,71 +1143,26 @@ class CivilizationInfo { //////////////////////// City State wrapper functions //////////////////////// - fun initCityState(ruleset: Ruleset, startingEra: String, unusedMajorCivs: Collection) - = cityStateFunctions.initCityState(ruleset, startingEra, unusedMajorCivs) /** Gain a random great person from the city state */ - private fun giveGreatPersonToPatron(receivingCiv: CivilizationInfo) { - cityStateFunctions.giveGreatPersonToPatron(receivingCiv) - } - fun giveMilitaryUnitToPatron(receivingCiv: CivilizationInfo) { - cityStateFunctions.giveMilitaryUnitToPatron(receivingCiv) - } - fun influenceGainedByGift(donorCiv: CivilizationInfo, giftAmount: Int) - = cityStateFunctions.influenceGainedByGift(donorCiv, giftAmount) - fun receiveGoldGift(donorCiv: CivilizationInfo, giftAmount: Int) { + fun receiveGoldGift(donorCiv: CivilizationInfo, giftAmount: Int) = cityStateFunctions.receiveGoldGift(donorCiv, giftAmount) - } - fun turnsForGreatPersonFromCityState(): Int = ((37 + Random().nextInt(7)) * gameInfo.gameParameters.gameSpeed.modifier).toInt() + fun turnsForGreatPersonFromCityState(): Int = ((37 + Random().nextInt(7)) * gameInfo.gameParameters.gameSpeed.modifier).toInt() + fun getProtectorCivs() = cityStateFunctions.getProtectorCivs() - fun addProtectorCiv(otherCiv: CivilizationInfo) { - cityStateFunctions.addProtectorCiv(otherCiv) - } - fun removeProtectorCiv(otherCiv: CivilizationInfo, forced: Boolean = false) { + fun addProtectorCiv(otherCiv: CivilizationInfo) = cityStateFunctions.addProtectorCiv(otherCiv) + fun removeProtectorCiv(otherCiv: CivilizationInfo, forced: Boolean = false) = cityStateFunctions.removeProtectorCiv(otherCiv, forced) - } fun otherCivCanPledgeProtection(otherCiv: CivilizationInfo) = cityStateFunctions.otherCivCanPledgeProtection(otherCiv) fun otherCivCanWithdrawProtection(otherCiv: CivilizationInfo) = cityStateFunctions.otherCivCanWithdrawProtection(otherCiv) - fun updateAllyCivForCityState() { - cityStateFunctions.updateAllyCivForCityState() - } - fun getDiplomaticMarriageCost() = cityStateFunctions.getDiplomaticMarriageCost() - fun canBeMarriedBy(otherCiv: CivilizationInfo) = cityStateFunctions.canBeMarriedBy(otherCiv) - fun diplomaticMarriage(otherCiv: CivilizationInfo) { - cityStateFunctions.diplomaticMarriage(otherCiv) - } + + fun updateAllyCivForCityState() = cityStateFunctions.updateAllyCivForCityState() fun getTributeWillingness(demandingCiv: CivilizationInfo, demandingWorker: Boolean = false) = cityStateFunctions.getTributeWillingness(demandingCiv, demandingWorker) - fun getTributeModifiers(demandingCiv: CivilizationInfo, demandingWorker: Boolean = false, requireWholeList: Boolean = false) - = cityStateFunctions.getTributeModifiers(demandingCiv, demandingWorker, requireWholeList) - fun goldGainedByTribute() = cityStateFunctions.goldGainedByTribute() - fun tributeGold(demandingCiv: CivilizationInfo) { - cityStateFunctions.tributeGold(demandingCiv) - } - fun tributeWorker(demandingCiv: CivilizationInfo) { - cityStateFunctions.tributeWorker(demandingCiv) - } fun canGiveStat(statType: Stat) = cityStateFunctions.canGiveStat(statType) - fun updateDiplomaticRelationshipForCityState() { - cityStateFunctions.updateDiplomaticRelationshipForCityState() - } - fun getFreeTechForCityState() { - cityStateFunctions.getFreeTechForCityState() - } - fun getNumThreateningBarbarians() = cityStateFunctions.getNumThreateningBarbarians() - fun threateningBarbarianKilledBy(otherCiv: CivilizationInfo) { - cityStateFunctions.threateningBarbarianKilledBy(otherCiv) - } fun getAllyCiv() = allyCivName fun setAllyCiv(newAllyName: String?) { allyCivName = newAllyName } - fun cityStateAttacked(attacker: CivilizationInfo) { - cityStateFunctions.cityStateAttacked(attacker) - } - fun cityStateDestroyed(attacker: CivilizationInfo) { - cityStateFunctions.cityStateDestroyed(attacker) - } - //endregion fun asPreview() = CivilizationInfoPreview(this) diff --git a/core/src/com/unciv/logic/civilization/QuestManager.kt b/core/src/com/unciv/logic/civilization/QuestManager.kt index 6d996ff792..33dbd32c8c 100644 --- a/core/src/com/unciv/logic/civilization/QuestManager.kt +++ b/core/src/com/unciv/logic/civilization/QuestManager.kt @@ -218,7 +218,7 @@ class QuestManager { private fun tryBarbarianInvasion() { if ((civInfo.getTurnsTillCallForBarbHelp() == null || civInfo.getTurnsTillCallForBarbHelp() == 0) - && civInfo.getNumThreateningBarbarians() >= 2) { + && civInfo.cityStateFunctions.getNumThreateningBarbarians() >= 2) { for (otherCiv in civInfo.getKnownCivs().filter { it.isMajorCiv() diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 85fdd8e8b0..559b24bac3 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -524,7 +524,7 @@ class DiplomacyManager() { if (civInfo.cities.isEmpty() || otherCiv().cities.isEmpty()) continue@loop else - otherCiv().giveMilitaryUnitToPatron(civInfo) + otherCiv().cityStateFunctions.giveMilitaryUnitToPatron(civInfo) } DiplomacyFlags.AgreedToNotSettleNearUs.name -> { addModifier(DiplomaticModifiers.FulfilledPromiseToNotSettleCitiesNearUs, 10f) @@ -674,7 +674,7 @@ class DiplomacyManager() { if (otherCiv.isCityState()) { otherCivDiplomacy.setInfluence(-60f) civInfo.changeMinorCivsAttacked(1) - otherCiv.cityStateAttacked(civInfo) + otherCiv.cityStateFunctions.cityStateAttacked(civInfo) } for (thirdCiv in civInfo.getKnownCivs()) { diff --git a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt index d56fe406fc..a74d94a98b 100644 --- a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt +++ b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt @@ -418,15 +418,15 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): BaseScreen() { return null val diplomaticMarriageButton = - "Diplomatic Marriage ([${otherCiv.getDiplomaticMarriageCost()}] Gold)".toTextButton() + "Diplomatic Marriage ([${otherCiv.cityStateFunctions.getDiplomaticMarriageCost()}] Gold)".toTextButton() diplomaticMarriageButton.onClick { val newCities = otherCiv.cities - otherCiv.diplomaticMarriage(viewingCiv) + otherCiv.cityStateFunctions.diplomaticMarriage(viewingCiv) UncivGame.Current.setWorldScreen() // The other civ will no longer exist for (city in newCities) viewingCiv.popupAlerts.add(PopupAlert(AlertType.DiplomaticMarriage, city.id)) // Player gets to choose between annex and puppet } - if (isNotPlayersTurn() || !otherCiv.canBeMarriedBy(viewingCiv)) diplomaticMarriageButton.disable() + if (isNotPlayersTurn() || !otherCiv.cityStateFunctions.canBeMarriedBy(viewingCiv)) diplomaticMarriageButton.disable() return diplomaticMarriageButton } @@ -435,7 +435,7 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): BaseScreen() { diplomacyTable.addSeparator() for (giftAmount in listOf(250, 500, 1000)) { - val influenceAmount = otherCiv.influenceGainedByGift(viewingCiv, giftAmount) + val influenceAmount = otherCiv.cityStateFunctions.influenceGainedByGift(viewingCiv, giftAmount) val giftButton = "Gift [$giftAmount] gold (+[$influenceAmount] influence)".toTextButton() giftButton.onClick { @@ -505,7 +505,7 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): BaseScreen() { diplomacyTable.addSeparator() diplomacyTable.add("Tribute Willingness".toLabel()).row() val modifierTable = Table() - val tributeModifiers = otherCiv.getTributeModifiers(viewingCiv, requireWholeList = true) + val tributeModifiers = otherCiv.cityStateFunctions.getTributeModifiers(viewingCiv, requireWholeList = true) for (item in tributeModifiers) { val color = if (item.value >= 0) Color.GREEN else Color.RED modifierTable.add(item.key.toLabel(color)) @@ -517,9 +517,9 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): BaseScreen() { diplomacyTable.add("At least 0 to take gold, at least 30 and size 4 city for worker".toLabel()).row() diplomacyTable.addSeparator() - val demandGoldButton = "Take [${otherCiv.goldGainedByTribute()}] gold (-15 Influence)".toTextButton() + val demandGoldButton = "Take [${otherCiv.cityStateFunctions.goldGainedByTribute()}] gold (-15 Influence)".toTextButton() demandGoldButton.onClick { - otherCiv.tributeGold(viewingCiv) + otherCiv.cityStateFunctions.tributeGold(viewingCiv) rightSideTable.clear() rightSideTable.add(ScrollPane(getCityStateDiplomacyTable(otherCiv))) } @@ -528,7 +528,7 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): BaseScreen() { val demandWorkerButton = "Take worker (-50 Influence)".toTextButton() demandWorkerButton.onClick { - otherCiv.tributeWorker(viewingCiv) + otherCiv.cityStateFunctions.tributeWorker(viewingCiv) rightSideTable.clear() rightSideTable.add(ScrollPane(getCityStateDiplomacyTable(otherCiv))) } diff --git a/docs/uniques.md b/docs/uniques.md index 4b9c325a30..2496c2ab0a 100644 --- a/docs/uniques.md +++ b/docs/uniques.md @@ -963,26 +963,15 @@ Example: "Heal this unit by [20] HP" Applicable to: Promotion ## Deprecated uniques - - "[stats] if this city has at least [amount] specialists" - Deprecated As of 3.16.16 - removed 3.17.11, replace with "[stats] " - - "[stats] from every specialist" - Deprecated As of 3.16.16 - removed 3.17.11, replace with "[stats] from every specialist [in all cities]" - "+[amount]% [stat] [cityFilter]" - Deprecated As of 3.17.10, replace with "[+amount]% [stat] [cityFilter]" - "+[amount]% [stat] in all cities" - Deprecated As of 3.17.10, replace with "[+amount]% [stat] [in all cities]" - "[amount]% [stat] while the empire is happy" - Deprecated As of 3.17.1, replace with "[amount]% [stat] [in all cities] " - - "+[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]" - - "+[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]" - - "Unhappiness from population decreased by [amount]%" - Deprecated As of 3.16.11 - removed 3.17.11, replace with "[amount]% unhappiness from population [cityFilter]" - - "Unhappiness from population decreased by [amount]% [cityFilter]" - Deprecated As of 3.16.11 - removed 3.17.11, replace with "[amount]% unhappiness from population [cityFilter]" - - "-[amount]% [mapUnitFilter] unit maintenance costs" - Deprecated As of 3.16.16 - removed as of 3.17.11, replace with "[amount]% maintenance costs for [mapUnitFilter] units" - - "-[amount]% unit upkeep costs" - Deprecated As of 3.16.16 - removed 3.17.11, replace with "[amount]% maintenance costs for [mapUnitFilter] units" - - "+[amount]% growth [cityFilter]" - Deprecated As of 3.16.14 - removed 3.17.11, replace with "[amount]% growth [cityFilter]" - - "+[amount]% growth [cityFilter] when not at war" - Deprecated As of 3.16.14 - removed 3.17.11, replace with "[amount]% growth [cityFilter] " - "Provides a free [buildingName] [cityFilter]" - Deprecated As of 3.17.7, replace with "Gain a free [buildingName] [cityFilter]" - "-[amount]% food consumption by specialists [cityFilter]" - Deprecated As of 3.18.2, replace with "[-amount]% food consumption by specialists [cityFilter]" - "50% of excess happiness added to culture towards policies" - Deprecated As of 3.18.2, replace with "[50]% of excess happiness converted to [Culture]" - "May buy [baseUnitFilter] units for [amount] [stat] [cityFilter] starting from the [era] at an increasing price ([amount])" - Deprecated As of 3.17.9, replace with "May buy [baseUnitFilter] units for [amount] [stat] [cityFilter] at an increasing price ([amount]) " + - "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 " - "+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 " @@ -993,10 +982,24 @@ Applicable to: Promotion - "+1 Movement for all units during Golden Age" - Deprecated As of 3.17.5 - removed 3.18.5, replace with "[amount] 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 " - - "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" + - "Unhappiness from population decreased by [amount]%" - Deprecated As of 3.16.11 - removed 3.17.11, replace with "[amount]% unhappiness from population [cityFilter]" + - "Unhappiness from population decreased by [amount]% [cityFilter]" - Deprecated As of 3.16.11 - removed 3.17.11, replace with "[amount]% unhappiness from population [cityFilter]" + - "+[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]% growth [cityFilter]" - Deprecated As of 3.16.14 - removed 3.17.11, replace with "[amount]% growth [cityFilter]" + - "+[amount]% growth [cityFilter] when not at war" - Deprecated As of 3.16.14 - removed 3.17.11, replace with "[amount]% growth [cityFilter] " + - "-[amount]% [mapUnitFilter] unit maintenance costs" - Deprecated As of 3.16.16 - removed as of 3.17.11, replace with "[amount]% maintenance costs for [mapUnitFilter] units" + - "-[amount]% unit upkeep costs" - Deprecated As of 3.16.16 - removed 3.17.11, replace with "[amount]% maintenance costs for [mapUnitFilter] units" + - "+[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]" + - "[stats] from every specialist" - Deprecated As of 3.16.16 - removed 3.17.11, replace with "[stats] from every specialist [in all cities]" + - "[stats] if this city has at least [amount] specialists" - Deprecated As of 3.16.16 - removed 3.17.11, replace with "[stats] " - "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, replace with "[stats] " + - "Double movement in coast" - Deprecated As of 3.17.1 - removed 3.17.13, replace with "Double movement in [terrainFilter]" + - "Double movement rate through Forest and Jungle" - Deprecated As of 3.17.1 - removed 3.17.13, replace with "Double movement in [terrainFilter]" + - "Double movement in Snow, Tundra and Hills" - Deprecated As of 3.17.1 - removed 3.17.13, replace with "Double movement in [terrainFilter]" - "+[amount]% Strength" - Deprecated As of 3.17.3 - removed 3.17.13, replace with "[amount]% Strength" - "-[amount]% Strength" - Deprecated As of 3.17.3 - removed 3.17.13, replace with "[amount]% Strength" - "+[amount]% Strength vs [combatantFilter]" - Deprecated As of 3.17.3 - removed 3.17.13, replace with "[amount]% Strength /" @@ -1009,8 +1012,5 @@ Applicable to: Promotion - "+[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" - - "Double movement in coast" - Deprecated As of 3.17.1 - removed 3.17.13, replace with "Double movement in [terrainFilter]" - - "Double movement rate through Forest and Jungle" - Deprecated As of 3.17.1 - removed 3.17.13, replace with "Double movement in [terrainFilter]" - - "Double movement in Snow, Tundra and Hills" - Deprecated As of 3.17.1 - removed 3.17.13, replace with "Double movement in [terrainFilter]" - "[stats] on [tileFilter] tiles once [tech] is discovered" - Deprecated As of 3.17.10, replace with "[stats] from [tileFilter] tiles " - "Deal 30 damage to adjacent enemy units" - Deprecated As of 3.17.10, replace with "Adjacent enemy units ending their turn take [30] damage" \ No newline at end of file