From 155498dc43593aa16127612635b4d2729aeb00c4 Mon Sep 17 00:00:00 2001 From: dHannasch Date: Sun, 3 Dec 2023 13:26:16 -0700 Subject: [PATCH] Wrap BaseUnit.obsoleteTech into function (#10648) * Update BaseUnit.kt * Update BaseUnit.kt * Update TechManager.kt * Update BaseUnit.kt * Update RulesetValidator.kt * Update BasicTests.kt --- .../civilization/managers/TechManager.kt | 2 +- .../com/unciv/models/ruleset/unit/BaseUnit.kt | 7 +++-- .../ruleset/validation/RulesetValidator.kt | 30 ++++++++++--------- tests/src/com/unciv/testing/BasicTests.kt | 2 +- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/core/src/com/unciv/logic/civilization/managers/TechManager.kt b/core/src/com/unciv/logic/civilization/managers/TechManager.kt index a0957b1598..07c65721ad 100644 --- a/core/src/com/unciv/logic/civilization/managers/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TechManager.kt @@ -349,7 +349,7 @@ class TechManager : IsPartOfGameInfoSerialization { return civInfo.getEquivalentUnit(upgradesTo!!) } val obsoleteUnits = getRuleset().units.asSequence() - .filter { it.value.obsoleteTech == techName } + .filter { it.value.isObsoletedBy(techName) } .map { it.key to it.value.getEquivalentUpgradeOrNull() } .toMap() if (obsoleteUnits.isEmpty()) return diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index cf2c71cedc..06c1a17e79 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -48,6 +48,8 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { var replacementTextForUniques = "" var promotions = HashSet() var obsoleteTech: String? = null + fun techsThatObsoleteThis(): Sequence = if (obsoleteTech == null) sequenceOf() else sequenceOf(obsoleteTech!!) + fun isObsoletedBy(techName: String): Boolean = techsThatObsoleteThis().contains(techName) var upgradesTo: String? = null var replaces: String? = null var uniqueTo: String? = null @@ -159,8 +161,9 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { for (requiredTech: String in requiredTechs()) if (!civ.tech.isResearched(requiredTech)) yield(RejectionReasonType.RequiresTech.toInstance("$requiredTech not researched")) - if (obsoleteTech != null && civ.tech.isResearched(obsoleteTech!!)) - yield(RejectionReasonType.Obsoleted.toInstance("Obsolete by $obsoleteTech")) + for (obsoleteTech: String in techsThatObsoleteThis()) + if (civ.tech.isResearched(obsoleteTech)) + yield(RejectionReasonType.Obsoleted.toInstance("Obsolete by $obsoleteTech")) if (uniqueTo != null && uniqueTo != civ.civName) yield(RejectionReasonType.UniqueToOtherNation.toInstance("Unique to $uniqueTo")) diff --git a/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt b/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt index a5fdfd91b8..8c788bae37 100644 --- a/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt +++ b/core/src/com/unciv/models/ruleset/validation/RulesetValidator.kt @@ -658,25 +658,27 @@ class RulesetValidator(val ruleset: Ruleset) { for (requiredTech: String in unit.requiredTechs()) if (!ruleset.technologies.containsKey(requiredTech)) lines += "${unit.name} requires tech ${requiredTech} which does not exist!" - if (unit.obsoleteTech != null && !ruleset.technologies.containsKey(unit.obsoleteTech!!)) - lines += "${unit.name} obsoletes at tech ${unit.obsoleteTech} which does not exist!" + for (obsoleteTech: String in unit.techsThatObsoleteThis()) + if (!ruleset.technologies.containsKey(obsoleteTech)) + lines += "${unit.name} obsoletes at tech ${obsoleteTech} which does not exist!" if (unit.upgradesTo != null && !ruleset.units.containsKey(unit.upgradesTo!!)) lines += "${unit.name} upgrades to unit ${unit.upgradesTo} which does not exist!" // Check that we don't obsolete ourselves before we can upgrade - if (unit.upgradesTo!=null && ruleset.units.containsKey(unit.upgradesTo!!) - && unit.obsoleteTech!=null && ruleset.technologies.containsKey(unit.obsoleteTech!!)) { - val upgradedUnit = ruleset.units[unit.upgradesTo!!]!! - for (requiredTech: String in upgradedUnit.requiredTechs()) - if (requiredTech != unit.obsoleteTech - && !getPrereqTree(unit.obsoleteTech!!).contains(requiredTech) - ) - lines.add( - "${unit.name} obsoletes at tech ${unit.obsoleteTech}," + - " and therefore ${requiredTech} for its upgrade ${upgradedUnit.name} may not yet be researched!", - RulesetErrorSeverity.Warning + for (obsoleteTech: String in unit.techsThatObsoleteThis()) + if (unit.upgradesTo!=null && ruleset.units.containsKey(unit.upgradesTo!!) + && ruleset.technologies.containsKey(obsoleteTech)) { + val upgradedUnit = ruleset.units[unit.upgradesTo!!]!! + for (requiredTech: String in upgradedUnit.requiredTechs()) + if (requiredTech != obsoleteTech + && !getPrereqTree(obsoleteTech).contains(requiredTech) ) - } + lines.add( + "${unit.name} obsoletes at tech ${obsoleteTech}," + + " and therefore ${requiredTech} for its upgrade ${upgradedUnit.name} may not yet be researched!", + RulesetErrorSeverity.Warning + ) + } for (resource in unit.getResourceRequirementsPerTurn(StateForConditionals.IgnoreConditionals).keys) if (!ruleset.tileResources.containsKey(resource)) diff --git a/tests/src/com/unciv/testing/BasicTests.kt b/tests/src/com/unciv/testing/BasicTests.kt index 2bab5d41eb..04c8ea3b42 100644 --- a/tests/src/com/unciv/testing/BasicTests.kt +++ b/tests/src/com/unciv/testing/BasicTests.kt @@ -68,7 +68,7 @@ class BasicTests { val units: Collection = ruleset.units.values var allObsoletingUnitsHaveUpgrades = true for (unit in units) { - if (unit.obsoleteTech != null && unit.upgradesTo == null && unit.name !="Scout" ) { + if (unit.techsThatObsoleteThis().any() && unit.upgradesTo == null && unit.name !="Scout" ) { debug("%s obsoletes but has no upgrade", unit.name) allObsoletingUnitsHaveUpgrades = false }