From 77de68cfc5a47de336821da859071749b5dde230 Mon Sep 17 00:00:00 2001 From: SomeTroglodyte <63000004+SomeTroglodyte@users.noreply.github.com> Date: Mon, 18 Dec 2023 20:40:22 +0100 Subject: [PATCH] Fix any tech researched clearing all units from queues (#10777) --- .../civilization/managers/TechManager.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/core/src/com/unciv/logic/civilization/managers/TechManager.kt b/core/src/com/unciv/logic/civilization/managers/TechManager.kt index d6b114a774..6d7470a836 100644 --- a/core/src/com/unciv/logic/civilization/managers/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TechManager.kt @@ -23,7 +23,6 @@ import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.ui.components.MayaCalendar -import com.unciv.ui.components.extensions.toPercent import com.unciv.ui.components.extensions.withItem import kotlin.math.ceil import kotlin.math.max @@ -335,18 +334,25 @@ class TechManager : IsPartOfGameInfoSerialization { updateResearchProgress() } + /** A variant of kotlin's [associateBy] that omits null values */ + private inline fun Iterable.associateByNotNull(keySelector: (T) -> K, valueTransform: (T) -> V?): Map { + val destination = LinkedHashMap() + for (element in this) { + val value = valueTransform(element) ?: continue + destination[keySelector(element)] = value + } + return destination + } + private fun obsoleteOldUnits(techName: String) { // First build a map with obsoleted units to their (nation-specific) upgrade - val ruleset = getRuleset() fun BaseUnit.getEquivalentUpgradeOrNull(techName: String): BaseUnit? { - val unitUpgradesTo: String? = automaticallyUpgradedInProductionToUnitByTech(techName) - if (unitUpgradesTo == null) - return null - return civInfo.getEquivalentUnit(unitUpgradesTo!!) + val unitUpgradesTo = automaticallyUpgradedInProductionToUnitByTech(techName) + ?: return null + return civInfo.getEquivalentUnit(unitUpgradesTo) } - val obsoleteUnits = getRuleset().units.asSequence() - .map { it.key to it.value.getEquivalentUpgradeOrNull(techName) } - .toMap() + val obsoleteUnits = getRuleset().units.entries + .associateByNotNull({ it.key }, { it.value.getEquivalentUpgradeOrNull(techName) }) if (obsoleteUnits.isEmpty()) return // Apply each to all cities - and remember which cities had which obsoleted unit