From 4cfdfee301378dba854cba0127164778d0b20c20 Mon Sep 17 00:00:00 2001 From: Xander Lenstra <71121390+xlenstra@users.noreply.github.com> Date: Wed, 8 Sep 2021 20:12:57 +0200 Subject: [PATCH] Added "Incompatible with [promotionName]" unique (#5128) --- .../unciv/logic/automation/NextTurnAutomation.kt | 4 ++-- core/src/com/unciv/logic/map/UnitPromotions.kt | 16 ++++++++++++---- .../com/unciv/models/ruleset/unit/Promotion.kt | 4 +++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 6354aa1510..4888e4a54d 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -618,8 +618,8 @@ object NextTurnAutomation { for (unit in civInfo.getCivUnits()) { if (unit.promotions.canBePromoted()) { val availablePromotions = unit.promotions.getAvailablePromotions() - if (availablePromotions.isNotEmpty()) - unit.promotions.addPromotion(availablePromotions.random().name) + if (availablePromotions.any()) + unit.promotions.addPromotion(availablePromotions.toList().random().name) } when { diff --git a/core/src/com/unciv/logic/map/UnitPromotions.kt b/core/src/com/unciv/logic/map/UnitPromotions.kt index b848abfd0e..fda1bdc12a 100644 --- a/core/src/com/unciv/logic/map/UnitPromotions.kt +++ b/core/src/com/unciv/logic/map/UnitPromotions.kt @@ -2,6 +2,7 @@ package com.unciv.logic.map import com.unciv.models.ruleset.UniqueTriggerActivation import com.unciv.models.ruleset.unit.Promotion +import com.unciv.models.translations.equalsPlaceholderText class UnitPromotions { // Having this as mandatory constructor parameter would be safer, but this class is part of a @@ -27,7 +28,7 @@ class UnitPromotions { fun xpForNextPromotion() = (numberOfPromotions+1)*10 fun canBePromoted(): Boolean { if (XP < xpForNextPromotion()) return false - if (getAvailablePromotions().isEmpty()) return false + if (getAvailablePromotions().none()) return false return true } @@ -57,10 +58,17 @@ class UnitPromotions { } } - fun getAvailablePromotions(): List { + fun getAvailablePromotions(): Sequence { return unit.civInfo.gameInfo.ruleSet.unitPromotions.values - .filter { unit.type.name in it.unitTypes && it.name !in promotions } - .filter { it.prerequisites.isEmpty() || it.prerequisites.any { p->p in promotions } } + .asSequence() + .filter { unit.type.name in it.unitTypes && it.name !in promotions } + .filter { it.prerequisites.isEmpty() || it.prerequisites.any { p->p in promotions } } + .filter { + it.uniqueObjects.none { + unique -> unique.placeholderText == "Incompatible with []" + && promotions.any { chosenPromotions -> chosenPromotions == unique.params[0] } + } + } } fun clone(): UnitPromotions { diff --git a/core/src/com/unciv/models/ruleset/unit/Promotion.kt b/core/src/com/unciv/models/ruleset/unit/Promotion.kt index 8c97f8b62c..396ec44e29 100644 --- a/core/src/com/unciv/models/ruleset/unit/Promotion.kt +++ b/core/src/com/unciv/models/ruleset/unit/Promotion.kt @@ -12,7 +12,9 @@ import com.unciv.ui.civilopedia.ICivilopediaText class Promotion : INamed, ICivilopediaText, IHasUniques { override lateinit var name: String var prerequisites = listOf() - var effect = "" + // effect deprecated since 3.16.12, use uniques instead + var effect = "" + // var unitTypes = listOf() // The json parser wouldn't agree to deserialize this as a list of UnitTypes. =( override var uniques = ArrayList()