diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 1e5de2fc58..44d8dea01d 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -504,9 +504,16 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { return true } + + val cachedMatchesFilterResult = HashMap() + /** Implements [UniqueParameterType.BuildingFilter] */ fun matchesFilter(filter: String): Boolean { - return MultiFilter.multiFilter(filter, ::matchesSingleFilter) + val cachedAnswer = cachedMatchesFilterResult[filter] + if (cachedAnswer != null) return cachedAnswer + val newAnswer = MultiFilter.multiFilter(filter, { matchesSingleFilter(it) }) + cachedMatchesFilterResult[filter] = newAnswer + return newAnswer } private fun matchesSingleFilter(filter: String): Boolean { diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 07f6de6f7e..4f7e9d62cf 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -12,11 +12,7 @@ import com.unciv.models.ruleset.RejectionReason import com.unciv.models.ruleset.RejectionReasonType import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetObject -import com.unciv.models.ruleset.unique.Conditionals -import com.unciv.models.ruleset.unique.StateForConditionals -import com.unciv.models.ruleset.unique.Unique -import com.unciv.models.ruleset.unique.UniqueTarget -import com.unciv.models.ruleset.unique.UniqueType +import com.unciv.models.ruleset.unique.* import com.unciv.models.stats.Stat import com.unciv.ui.components.extensions.getNeedMoreAmountString import com.unciv.ui.components.extensions.toPercent @@ -360,9 +356,16 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { else ruleset.units[replaces!!]!! } + + val cachedMatchesFilterResult = HashMap() + /** Implements [UniqueParameterType.BaseUnitFilter][com.unciv.models.ruleset.unique.UniqueParameterType.BaseUnitFilter] */ fun matchesFilter(filter: String): Boolean { - return MultiFilter.multiFilter(filter, ::matchesSingleFilter) + val cachedAnswer = cachedMatchesFilterResult[filter] + if (cachedAnswer != null) return cachedAnswer + val newAnswer = MultiFilter.multiFilter(filter, { matchesSingleFilter(it) }) + cachedMatchesFilterResult[filter] = newAnswer + return newAnswer } fun matchesSingleFilter(filter: String): Boolean {