From 291c546decbc81009b7cfd22aab06f7e9af2f59a Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 18 Jun 2023 00:45:34 +0300 Subject: [PATCH] Performance improvements - use existing map for building resource check, instead of iterating over uniques - remove one retrieval for UniqueMap.addUnique Idea for future improvement: setTerrainFeatures currently populates a UniqueMap for each tile. MANY tiles share the same set of features... --- .../logic/civilization/transients/CivInfoTransientCache.kt | 1 + core/src/com/unciv/models/ruleset/Building.kt | 5 +---- core/src/com/unciv/models/ruleset/unique/Unique.kt | 6 ++++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index bf6848eebf..6acb63e90b 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -42,6 +42,7 @@ class CivInfoTransientCache(val civInfo: Civilization) { fun setTransients(){ val ruleset = civInfo.gameInfo.ruleset + for (resource in ruleset.tileResources.values.asSequence().filter { it.resourceType == ResourceType.Strategic }.map { it.name }) { val applicableBuildings = ruleset.buildings.values.filter { it.requiresResource(resource) && civInfo.getEquivalentBuilding(it) == it } val applicableUnits = ruleset.units.values.filter { it.requiresResource(resource) && civInfo.getEquivalentUnit(it) == it } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 2c00efbf0a..fd24aa0a0d 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -775,10 +775,7 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { } override fun requiresResource(resource: String): Boolean { - if (requiredResource == resource) return true - for (unique in getMatchingUniques(UniqueType.ConsumesResources)) { - if (unique.params[1] == resource) return true - } + if (resourceRequirementsInternal.contains(resource)) return true for (unique in getMatchingUniques(UniqueType.CostsResources)) { if (unique.params[1] == resource) return true } diff --git a/core/src/com/unciv/models/ruleset/unique/Unique.kt b/core/src/com/unciv/models/ruleset/unique/Unique.kt index 733bc764a4..eb75a6410a 100644 --- a/core/src/com/unciv/models/ruleset/unique/Unique.kt +++ b/core/src/com/unciv/models/ruleset/unique/Unique.kt @@ -355,8 +355,10 @@ class UniqueMap: HashMap>() { /** Adds one [unique] unless it has a ConditionalTimedUnique conditional */ fun addUnique(unique: Unique) { if (unique.conditionals.any { it.type == UniqueType.ConditionalTimedUnique }) return - if (!containsKey(unique.placeholderText)) this[unique.placeholderText] = ArrayList() - this[unique.placeholderText]!!.add(unique) + + val existingArrayList = get(unique.placeholderText) + if (existingArrayList != null) existingArrayList.add(unique) + else this[unique.placeholderText] = arrayListOf(unique) } /** Calls [addUnique] on each item from [uniques] */