From 896fc575c0d0e9f0931dd8d1b2eeb1b6ce6b08a5 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Tue, 20 Dec 2022 10:17:04 +0200 Subject: [PATCH] Modding: Unbuildable units can still be upgraded to --- .../src/com/unciv/logic/city/IConstruction.kt | 17 +++--- core/src/com/unciv/logic/map/MapUnit.kt | 4 +- .../com/unciv/models/ruleset/unit/BaseUnit.kt | 55 ++++++++++--------- 3 files changed, 37 insertions(+), 39 deletions(-) diff --git a/core/src/com/unciv/logic/city/IConstruction.kt b/core/src/com/unciv/logic/city/IConstruction.kt index b61ee60f63..3f5d8cd35e 100644 --- a/core/src/com/unciv/logic/city/IConstruction.kt +++ b/core/src/com/unciv/logic/city/IConstruction.kt @@ -91,19 +91,16 @@ class RejectionReasons: HashSet() { fun contains(rejectionReason: RejectionReason) = any { it.rejectionReason == rejectionReason } - fun isOKIgnoringRequirements( + fun isOkForUnitUpgradeIgnoringRequirements( ignoreTechPolicyEraWonderRequirements: Boolean = false, ignoreResources: Boolean = false ): Boolean { - if (!ignoreTechPolicyEraWonderRequirements && !ignoreResources) return isEmpty() - if (!ignoreTechPolicyEraWonderRequirements) - return all { it.rejectionReason == RejectionReason.ConsumesResources } - if (!ignoreResources) - return all { it.rejectionReason in techPolicyEraWonderRequirements } - return all { - it.rejectionReason == RejectionReason.ConsumesResources || - it.rejectionReason in techPolicyEraWonderRequirements - } + var relevantRejectionReasons = this.asSequence().filterNot { it.rejectionReason == RejectionReason.Unbuildable } + if (ignoreTechPolicyEraWonderRequirements) + relevantRejectionReasons = relevantRejectionReasons.filterNot { it.rejectionReason in techPolicyEraWonderRequirements } + if (ignoreResources) + relevantRejectionReasons = relevantRejectionReasons.filterNot { it.rejectionReason == RejectionReason.ConsumesResources } + return relevantRejectionReasons.any() } fun hasAReasonToBeRemovedFromQueue(): Boolean { diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 71fffbbba3..9699eef9bd 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -556,7 +556,7 @@ class MapUnit : IsPartOfGameInfoSerialization { ): Boolean { if (name == unitToUpgradeTo.name) return false val rejectionReasons = unitToUpgradeTo.getRejectionReasons(civInfo) - if (rejectionReasons.isOKIgnoringRequirements(ignoreRequirements, ignoreResources)) return true + if (rejectionReasons.isOkForUnitUpgradeIgnoringRequirements(ignoreRequirements, ignoreResources)) return true // The resource requirements check above did not consider that the resources // this unit currently "consumes" are available for an upgrade too - if that's one of the @@ -572,7 +572,7 @@ class MapUnit : IsPartOfGameInfoSerialization { // WHEN THE CURRENT UNIT IS NOT HERE civInfo.removeUnit(this) val canUpgrade = unitToUpgradeTo.getRejectionReasons(civInfo) - .isOKIgnoringRequirements(ignoreTechPolicyEraWonderRequirements = ignoreRequirements) + .isOkForUnitUpgradeIgnoringRequirements(ignoreTechPolicyEraWonderRequirements = ignoreRequirements) civInfo.addUnit(this) return canUpgrade } diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 9409acf6e1..e89e232eb6 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -263,28 +263,34 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { if (cityInfo == null) return super.canBePurchasedWithStat(cityInfo, stat) val conditionalState = StateForConditionals(civInfo = cityInfo.civInfo, cityInfo = cityInfo) - return (cityInfo.getMatchingUniques(UniqueType.BuyUnitsIncreasingCost, conditionalState) - .any { - it.params[2] == stat.name - && matchesFilter(it.params[0]) - && cityInfo.matchesFilter(it.params[3]) - } - || cityInfo.getMatchingUniques(UniqueType.BuyUnitsByProductionCost, conditionalState) - .any { it.params[1] == stat.name && matchesFilter(it.params[0]) } - || cityInfo.getMatchingUniques(UniqueType.BuyUnitsWithStat, conditionalState) - .any { - it.params[1] == stat.name - && matchesFilter(it.params[0]) - && cityInfo.matchesFilter(it.params[2]) - } - || cityInfo.getMatchingUniques(UniqueType.BuyUnitsForAmountStat, conditionalState) - .any { - it.params[2] == stat.name - && matchesFilter(it.params[0]) - && cityInfo.matchesFilter(it.params[3]) - } - || return super.canBePurchasedWithStat(cityInfo, stat) - ) + if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsIncreasingCost, conditionalState) + .any { + it.params[2] == stat.name + && matchesFilter(it.params[0]) + && cityInfo.matchesFilter(it.params[3]) + }) return true + + if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsByProductionCost, conditionalState) + .any { it.params[1] == stat.name && matchesFilter(it.params[0]) }) + return true + + if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsWithStat, conditionalState) + .any { + it.params[1] == stat.name + && matchesFilter(it.params[0]) + && cityInfo.matchesFilter(it.params[2]) + }) + return true + + if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsForAmountStat, conditionalState) + .any { + it.params[2] == stat.name + && matchesFilter(it.params[0]) + && cityInfo.matchesFilter(it.params[3]) + }) + return true + + return super.canBePurchasedWithStat(cityInfo, stat) } override fun getBaseBuyCost(cityInfo: CityInfo, stat: Stat): Int? { @@ -444,11 +450,6 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { return getRejectionReasons(cityConstructions).isEmpty() } - fun isBuildableIgnoringTechs(civInfo: CivilizationInfo): Boolean { - val rejectionReasons = getRejectionReasons(civInfo) - return rejectionReasons.isOKIgnoringRequirements(ignoreTechPolicyEraWonderRequirements = true) - } - override fun postBuildEvent(cityConstructions: CityConstructions, boughtWith: Stat?): Boolean { val civInfo = cityConstructions.cityInfo.civInfo val unit = civInfo.placeUnitNearTile(cityConstructions.cityInfo.location, name)