Modding: Unbuildable units can still be upgraded to

This commit is contained in:
Yair Morgenstern
2022-12-20 10:17:04 +02:00
parent f974c3a8a5
commit 896fc575c0
3 changed files with 37 additions and 39 deletions

View File

@ -91,19 +91,16 @@ class RejectionReasons: HashSet<RejectionReasonInstance>() {
fun contains(rejectionReason: RejectionReason) = any { it.rejectionReason == rejectionReason } fun contains(rejectionReason: RejectionReason) = any { it.rejectionReason == rejectionReason }
fun isOKIgnoringRequirements( fun isOkForUnitUpgradeIgnoringRequirements(
ignoreTechPolicyEraWonderRequirements: Boolean = false, ignoreTechPolicyEraWonderRequirements: Boolean = false,
ignoreResources: Boolean = false ignoreResources: Boolean = false
): Boolean { ): Boolean {
if (!ignoreTechPolicyEraWonderRequirements && !ignoreResources) return isEmpty() var relevantRejectionReasons = this.asSequence().filterNot { it.rejectionReason == RejectionReason.Unbuildable }
if (!ignoreTechPolicyEraWonderRequirements) if (ignoreTechPolicyEraWonderRequirements)
return all { it.rejectionReason == RejectionReason.ConsumesResources } relevantRejectionReasons = relevantRejectionReasons.filterNot { it.rejectionReason in techPolicyEraWonderRequirements }
if (!ignoreResources) if (ignoreResources)
return all { it.rejectionReason in techPolicyEraWonderRequirements } relevantRejectionReasons = relevantRejectionReasons.filterNot { it.rejectionReason == RejectionReason.ConsumesResources }
return all { return relevantRejectionReasons.any()
it.rejectionReason == RejectionReason.ConsumesResources ||
it.rejectionReason in techPolicyEraWonderRequirements
}
} }
fun hasAReasonToBeRemovedFromQueue(): Boolean { fun hasAReasonToBeRemovedFromQueue(): Boolean {

View File

@ -556,7 +556,7 @@ class MapUnit : IsPartOfGameInfoSerialization {
): Boolean { ): Boolean {
if (name == unitToUpgradeTo.name) return false if (name == unitToUpgradeTo.name) return false
val rejectionReasons = unitToUpgradeTo.getRejectionReasons(civInfo) 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 // 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 // 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 // WHEN THE CURRENT UNIT IS NOT HERE
civInfo.removeUnit(this) civInfo.removeUnit(this)
val canUpgrade = unitToUpgradeTo.getRejectionReasons(civInfo) val canUpgrade = unitToUpgradeTo.getRejectionReasons(civInfo)
.isOKIgnoringRequirements(ignoreTechPolicyEraWonderRequirements = ignoreRequirements) .isOkForUnitUpgradeIgnoringRequirements(ignoreTechPolicyEraWonderRequirements = ignoreRequirements)
civInfo.addUnit(this) civInfo.addUnit(this)
return canUpgrade return canUpgrade
} }

View File

@ -263,28 +263,34 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
if (cityInfo == null) return super.canBePurchasedWithStat(cityInfo, stat) if (cityInfo == null) return super.canBePurchasedWithStat(cityInfo, stat)
val conditionalState = StateForConditionals(civInfo = cityInfo.civInfo, cityInfo = cityInfo) val conditionalState = StateForConditionals(civInfo = cityInfo.civInfo, cityInfo = cityInfo)
return (cityInfo.getMatchingUniques(UniqueType.BuyUnitsIncreasingCost, conditionalState) if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsIncreasingCost, conditionalState)
.any { .any {
it.params[2] == stat.name it.params[2] == stat.name
&& matchesFilter(it.params[0]) && matchesFilter(it.params[0])
&& cityInfo.matchesFilter(it.params[3]) && cityInfo.matchesFilter(it.params[3])
} }) return true
|| cityInfo.getMatchingUniques(UniqueType.BuyUnitsByProductionCost, conditionalState)
.any { it.params[1] == stat.name && matchesFilter(it.params[0]) } if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsByProductionCost, conditionalState)
|| cityInfo.getMatchingUniques(UniqueType.BuyUnitsWithStat, conditionalState) .any { it.params[1] == stat.name && matchesFilter(it.params[0]) })
.any { return true
it.params[1] == stat.name
&& matchesFilter(it.params[0]) if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsWithStat, conditionalState)
&& cityInfo.matchesFilter(it.params[2]) .any {
} it.params[1] == stat.name
|| cityInfo.getMatchingUniques(UniqueType.BuyUnitsForAmountStat, conditionalState) && matchesFilter(it.params[0])
.any { && cityInfo.matchesFilter(it.params[2])
it.params[2] == stat.name })
&& matchesFilter(it.params[0]) return true
&& cityInfo.matchesFilter(it.params[3])
} if (cityInfo.getMatchingUniques(UniqueType.BuyUnitsForAmountStat, conditionalState)
|| return super.canBePurchasedWithStat(cityInfo, stat) .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? { override fun getBaseBuyCost(cityInfo: CityInfo, stat: Stat): Int? {
@ -444,11 +450,6 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
return getRejectionReasons(cityConstructions).isEmpty() 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 { override fun postBuildEvent(cityConstructions: CityConstructions, boughtWith: Stat?): Boolean {
val civInfo = cityConstructions.cityInfo.civInfo val civInfo = cityConstructions.cityInfo.civInfo
val unit = civInfo.placeUnitNearTile(cityConstructions.cityInfo.location, name) val unit = civInfo.placeUnitNearTile(cityConstructions.cityInfo.location, name)