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 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 {

View File

@ -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
}

View File

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