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,17 +137,14 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
yield(RejectionReasonType.NoPlaceToPutUnit.toInstance()) yield(RejectionReasonType.NoPlaceToPutUnit.toInstance())
} }
val civInfo = cityConstructions.city.civ val civInfo = cityConstructions.city.civ
for (unique in uniqueObjects) {
when (unique.type) {
UniqueType.OnlyAvailableWhen -> 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.OnlyAvailableWhen, StateForConditionals.IgnoreConditionals))
yield(RejectionReasonType.PopulationRequirement.toInstance(unique.text)) if (!unique.conditionalsApply(civInfo, cityConstructions.city))
yield(RejectionReasonType.ShouldNotBeDisplayed.toInstance())
else -> {} for (unique in getMatchingUniques(UniqueType.RequiresPopulation))
} if (unique.params[0].toInt() > cityConstructions.city.population.population)
} yield(RejectionReasonType.PopulationRequirement.toInstance(unique.text))
yieldAll(getRejectionReasons(civInfo, cityConstructions.city)) yieldAll(getRejectionReasons(civInfo, cityConstructions.city))
} }
@ -343,19 +340,15 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
fun isWaterUnit() = type.isWaterUnit() fun isWaterUnit() = type.isWaterUnit()
fun isAirUnit() = type.isAirUnit() fun isAirUnit() = type.isAirUnit()
fun isProbablySiegeUnit() = fun isProbablySiegeUnit() = isRanged()
( && getMatchingUniques(UniqueType.Strength, StateForConditionals.IgnoreConditionals)
isRanged() .any { it.params[0].toInt() > 0
&& (uniqueObjects + type.uniqueObjects) && it.conditionals.any { conditional -> conditional.type == UniqueType.ConditionalVsCity }
.any { it.isOfType(UniqueType.Strength)
&& it.params[0].toInt() > 0
&& it.conditionals.any { conditional -> conditional.isOfType(UniqueType.ConditionalVsCity) }
} }
)
fun getForceEvaluation(): Int { fun getForceEvaluation(): Int {
if (cachedForceEvaluation < 0) evaluateForce() if (cachedForceEvaluation < 0) evaluateForce()
return cachedForceEvaluation return cachedForceEvaluation
} }
private fun evaluateForce() { private fun evaluateForce() {
@ -392,19 +385,18 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
for (unique in allUniques) { for (unique in allUniques) {
when (unique.type) { when (unique.type) {
UniqueType.Strength -> { 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 if (unique.conditionals.any { it.isOfType(UniqueType.ConditionalVsUnits) }) { // Bonus vs some units - a quarter of the bonus
power *= (unique.params[0].toInt() / 4f).toPercent() power *= (unique.params[0].toInt() / 4f).toPercent()
} else if ( } else if (
unique.conditionals.any { unique.conditionals.any {
it.isOfType(UniqueType.ConditionalVsCity) // City Attack - half the bonus it.isOfType(UniqueType.ConditionalVsCity) // City Attack - half the bonus
|| it.isOfType(UniqueType.ConditionalAttacking) // Attack - half the bonus || it.isOfType(UniqueType.ConditionalAttacking) // Attack - half the bonus
|| it.isOfType(UniqueType.ConditionalDefending) // Defense - half the bonus || it.isOfType(UniqueType.ConditionalDefending) // Defense - half the bonus
|| it.isOfType(UniqueType.ConditionalFightingInTiles) || it.isOfType(UniqueType.ConditionalFightingInTiles)
} // Bonus in terrain or feature - half the bonus } // Bonus in terrain or feature - half the bonus
) { ) {
power *= (unique.params[0].toInt() / 2f).toPercent() power *= (unique.params[0].toInt() / 2f).toPercent()
}
} }
} }
UniqueType.StrengthNearCapital -> UniqueType.StrengthNearCapital ->