From 8a97573c7dc00085903d8043d7e5aaeb3a44e29b Mon Sep 17 00:00:00 2001 From: yairm210 Date: Fri, 1 Nov 2024 14:25:15 +0200 Subject: [PATCH] United 'getTriggeredUniques' modifier filtering --- .../unciv/logic/civilization/Civilization.kt | 17 +++++++++-------- core/src/com/unciv/logic/map/mapunit/MapUnit.kt | 9 ++++----- .../logic/map/tile/TileImprovementFunctions.kt | 10 ++-------- .../com/unciv/models/ruleset/unique/Unique.kt | 5 +++-- 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index a5ace7ddc7..c7b378f4b2 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -540,18 +540,19 @@ class Civilization : IsPartOfGameInfoSerialization { fun getTriggeredUniques( trigger: UniqueType, - stateForConditionals: StateForConditionals = StateForConditionals(this) + stateForConditionals: StateForConditionals = StateForConditionals(this), + modifierFilter: (Unique) -> Boolean = { true } ) : Iterable = sequence { - yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals)) + yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)) yieldAll(cities.asSequence() - .flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals) } + .flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter) } ) if (religionManager.religion != null) - yieldAll(religionManager.religion!!.founderBeliefUniqueMap.getTriggeredUniques(trigger, stateForConditionals)) - yieldAll(policies.policyUniques.getTriggeredUniques(trigger, stateForConditionals)) - yieldAll(tech.techUniques.getTriggeredUniques(trigger, stateForConditionals)) - yieldAll(getEra().uniqueMap.getTriggeredUniques (trigger, stateForConditionals)) - yieldAll(gameInfo.ruleset.globalUniques.uniqueMap.getTriggeredUniques(trigger, stateForConditionals)) + yieldAll(religionManager.religion!!.founderBeliefUniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)) + yieldAll(policies.policyUniques.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)) + yieldAll(tech.techUniques.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)) + yieldAll(getEra().uniqueMap.getTriggeredUniques (trigger, stateForConditionals, modifierFilter)) + yieldAll(gameInfo.ruleset.globalUniques.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)) }.toList() // Triggers can e.g. add buildings which contain triggers, causing concurrent modification errors diff --git a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt index 10f81c7b64..e9e442fdd2 100644 --- a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt +++ b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt @@ -301,13 +301,12 @@ class MapUnit : IsPartOfGameInfoSerialization { fun getTriggeredUniques( trigger: UniqueType, - stateForConditionals: StateForConditionals = StateForConditionals(civInfo = civ, unit = this) + stateForConditionals: StateForConditionals = StateForConditionals(civInfo = civ, unit = this), + modifierFilter: (Unique) -> Boolean = { true } ): Sequence { - return getUniques().filter { unique -> - unique.hasModifier(trigger) - && unique.conditionalsApply(stateForConditionals) - } + return tempUniquesMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter) } + /** Gets *per turn* resource requirements - does not include immediate costs for stockpiled resources. * StateForConditionals is assumed to regarding this mapUnit*/ diff --git a/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt b/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt index 001a94a92d..4ff4abcd64 100644 --- a/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt +++ b/core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt @@ -260,18 +260,12 @@ class TileImprovementFunctions(val tile: Tile) { UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile) for (unique in civ.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement, stateForConditionals) - .filter { - it.getModifiers(UniqueType.TriggerUponBuildingImprovement).any { - improvement.matchesFilter(it.params[0]) - } }) + { improvement.matchesFilter(it.params[0]) }) UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile) if (unit == null) return for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement, stateForConditionals) - .filter { - it.getModifiers(UniqueType.TriggerUponBuildingImprovement).any { - improvement.matchesFilter(it.params[0]) - } }) + { improvement.matchesFilter(it.params[0]) }) UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile) } diff --git a/core/src/com/unciv/models/ruleset/unique/Unique.kt b/core/src/com/unciv/models/ruleset/unique/Unique.kt index deb84f90fd..2b6a730ee1 100644 --- a/core/src/com/unciv/models/ruleset/unique/Unique.kt +++ b/core/src/com/unciv/models/ruleset/unique/Unique.kt @@ -323,9 +323,10 @@ open class UniqueMap() { fun getAllUniques() = innerUniqueMap.values.asSequence().flatten() - fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals): Sequence { + fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals, + modifierFilter: (Unique) -> Boolean = { true }): Sequence { return getAllUniques().filter { unique -> - unique.hasModifier(trigger) && unique.conditionalsApply(stateForConditionals) + unique.getModifiers(trigger).any(modifierFilter) && unique.conditionalsApply(stateForConditionals) }.flatMap { it.getMultiplied(stateForConditionals) } }