More BaseUnit unique-finding including type uniques

This commit is contained in:
Yair Morgenstern 2023-07-21 15:18:39 +03:00
parent bc9b5615eb
commit 97b80973d1

View File

@ -137,18 +137,15 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
yield(RejectionReasonType.NoPlaceToPutUnit.toInstance())
}
val civInfo = cityConstructions.city.civ
for (unique in uniqueObjects) {
when (unique.type) {
UniqueType.OnlyAvailableWhen -> if (!unique.conditionalsApply(civInfo, cityConstructions.city))
for (unique in getMatchingUniques(UniqueType.OnlyAvailableWhen, StateForConditionals.IgnoreConditionals))
if (!unique.conditionalsApply(civInfo, cityConstructions.city))
yield(RejectionReasonType.ShouldNotBeDisplayed.toInstance())
UniqueType.RequiresPopulation -> if (unique.params[0].toInt() > cityConstructions.city.population.population)
for (unique in getMatchingUniques(UniqueType.RequiresPopulation))
if (unique.params[0].toInt() > cityConstructions.city.population.population)
yield(RejectionReasonType.PopulationRequirement.toInstance(unique.text))
else -> {}
}
}
yieldAll(getRejectionReasons(civInfo, cityConstructions.city))
}
@ -343,15 +340,11 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
fun isWaterUnit() = type.isWaterUnit()
fun isAirUnit() = type.isAirUnit()
fun isProbablySiegeUnit() =
(
isRanged()
&& (uniqueObjects + type.uniqueObjects)
.any { it.isOfType(UniqueType.Strength)
&& it.params[0].toInt() > 0
&& it.conditionals.any { conditional -> conditional.isOfType(UniqueType.ConditionalVsCity) }
fun isProbablySiegeUnit() = isRanged()
&& getMatchingUniques(UniqueType.Strength, StateForConditionals.IgnoreConditionals)
.any { it.params[0].toInt() > 0
&& it.conditionals.any { conditional -> conditional.type == UniqueType.ConditionalVsCity }
}
)
fun getForceEvaluation(): Int {
if (cachedForceEvaluation < 0) evaluateForce()
@ -392,7 +385,7 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
for (unique in allUniques) {
when (unique.type) {
UniqueType.Strength -> {
if (unique.params[0].toInt() > 0) {
if (unique.params[0].toInt() <= 0) continue
if (unique.conditionals.any { it.isOfType(UniqueType.ConditionalVsUnits) }) { // Bonus vs some units - a quarter of the bonus
power *= (unique.params[0].toInt() / 4f).toPercent()
} else if (
@ -406,7 +399,6 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
power *= (unique.params[0].toInt() / 2f).toPercent()
}
}
}
UniqueType.StrengthNearCapital ->
if (unique.params[0].toInt() > 0)
power *= (unique.params[0].toInt() / 4f).toPercent() // Bonus decreasing with distance from capital - not worth much most of the map???