mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-09 23:39:40 +07:00
Modding: Unbuildable units can still be upgraded to
This commit is contained in:
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user