Fixed unit upgrade check (#8686)

* Fixed unit upgrade check

* Replaced sequences with list.asSequence()

* Deleted missed comment
This commit is contained in:
Gualdimar
2023-02-18 18:58:21 +02:00
committed by GitHub
parent ec2be2ceca
commit be5608fdea

View File

@ -137,30 +137,34 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
yieldAll(getRejectionReasons(civInfo, cityConstructions.city)) yieldAll(getRejectionReasons(civInfo, cityConstructions.city))
} }
fun getRejectionReasons(civ: Civilization, city:City?=null): Sequence<RejectionReason> = sequence { fun getRejectionReasons(civ: Civilization, city:City?=null): Sequence<RejectionReason> {
val result = mutableListOf<RejectionReason>()
if (requiredTech != null && !civ.tech.isResearched(requiredTech!!)) if (requiredTech != null && !civ.tech.isResearched(requiredTech!!))
yield(RejectionReasonType.RequiresTech.toInstance("$requiredTech not researched")) result.add(RejectionReasonType.RequiresTech.toInstance("$requiredTech not researched"))
if (obsoleteTech != null && civ.tech.isResearched(obsoleteTech!!)) if (obsoleteTech != null && civ.tech.isResearched(obsoleteTech!!))
yield(RejectionReasonType.Obsoleted.toInstance("Obsolete by $obsoleteTech")) result.add(RejectionReasonType.Obsoleted.toInstance("Obsolete by $obsoleteTech"))
if (uniqueTo != null && uniqueTo != civ.civName) if (uniqueTo != null && uniqueTo != civ.civName)
yield(RejectionReasonType.UniqueToOtherNation.toInstance("Unique to $uniqueTo")) result.add(RejectionReasonType.UniqueToOtherNation.toInstance("Unique to $uniqueTo"))
if (civ.cache.uniqueUnits.any { it.replaces == name }) if (civ.cache.uniqueUnits.any { it.replaces == name })
yield(RejectionReasonType.ReplacedByOurUnique.toInstance("Our unique unit replaces this")) result.add(RejectionReasonType.ReplacedByOurUnique.toInstance("Our unique unit replaces this"))
if (!civ.gameInfo.gameParameters.nuclearWeaponsEnabled && isNuclearWeapon()) if (!civ.gameInfo.gameParameters.nuclearWeaponsEnabled && isNuclearWeapon())
yield(RejectionReasonType.DisabledBySetting.toInstance()) result.add(RejectionReasonType.DisabledBySetting.toInstance())
for (unique in uniqueObjects.filter { it.conditionalsApply(civ, city) }) { for (unique in uniqueObjects.filter { it.conditionalsApply(civ, city) }) {
when (unique.type) { when (unique.type) {
UniqueType.Unbuildable -> UniqueType.Unbuildable ->
yield(RejectionReasonType.Unbuildable.toInstance()) result.add(RejectionReasonType.Unbuildable.toInstance())
UniqueType.FoundCity -> if (civ.isCityState() || civ.isOneCityChallenger()) UniqueType.FoundCity -> if (civ.isCityState() || civ.isOneCityChallenger())
yield(RejectionReasonType.NoSettlerForOneCityPlayers.toInstance()) result.add(RejectionReasonType.NoSettlerForOneCityPlayers.toInstance())
UniqueType.MaxNumberBuildable -> if (civ.civConstructions.countConstructedObjects(this@BaseUnit) >= unique.params[0].toInt()) UniqueType.MaxNumberBuildable -> if (civ.civConstructions.countConstructedObjects(
yield(RejectionReasonType.MaxNumberBuildable.toInstance()) this@BaseUnit
) >= unique.params[0].toInt()
)
result.add(RejectionReasonType.MaxNumberBuildable.toInstance())
else -> {} else -> {}
} }
@ -170,18 +174,29 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction {
for ((resource, requiredAmount) in getResourceRequirements()) { for ((resource, requiredAmount) in getResourceRequirements()) {
val availableAmount = civ.getCivResourcesByName()[resource]!! val availableAmount = civ.getCivResourcesByName()[resource]!!
if (availableAmount < requiredAmount) { if (availableAmount < requiredAmount) {
yield(RejectionReasonType.ConsumesResources.toInstance(resource.getNeedMoreAmountString(requiredAmount - availableAmount))) result.add(
RejectionReasonType.ConsumesResources.toInstance(
resource.getNeedMoreAmountString(
requiredAmount - availableAmount
)
)
)
} }
} }
} }
for (unique in civ.getMatchingUniques(UniqueType.CannotBuildUnits)) for (unique in civ.getMatchingUniques(UniqueType.CannotBuildUnits))
if (this@BaseUnit.matchesFilter(unique.params[0])) { if (this@BaseUnit.matchesFilter(unique.params[0])) {
if (unique.conditionals.any { it.type == UniqueType.ConditionalBelowHappiness }){ if (unique.conditionals.any { it.type == UniqueType.ConditionalBelowHappiness }) {
yield(RejectionReasonType.CannotBeBuilt.toInstance(unique.text, true)) result.add(
} RejectionReasonType.CannotBeBuilt.toInstance(
else yield(RejectionReasonType.CannotBeBuilt.toInstance()) unique.text,
true
)
)
} else result.add(RejectionReasonType.CannotBeBuilt.toInstance())
} }
return result.asSequence()
} }
fun isBuildable(civInfo: Civilization) = getRejectionReasons(civInfo).none() fun isBuildable(civInfo: Civilization) = getRejectionReasons(civInfo).none()