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