United 'getTriggeredUniques' modifier filtering

This commit is contained in:
yairm210 2024-11-01 14:25:15 +02:00
parent ba085ca585
commit 8a97573c7d
4 changed files with 18 additions and 23 deletions

View File

@ -540,18 +540,19 @@ class Civilization : IsPartOfGameInfoSerialization {
fun getTriggeredUniques( fun getTriggeredUniques(
trigger: UniqueType, trigger: UniqueType,
stateForConditionals: StateForConditionals = StateForConditionals(this) stateForConditionals: StateForConditionals = StateForConditionals(this),
modifierFilter: (Unique) -> Boolean = { true }
) : Iterable<Unique> = sequence { ) : Iterable<Unique> = sequence {
yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals)) yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter))
yieldAll(cities.asSequence() yieldAll(cities.asSequence()
.flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals) } .flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter) }
) )
if (religionManager.religion != null) if (religionManager.religion != null)
yieldAll(religionManager.religion!!.founderBeliefUniqueMap.getTriggeredUniques(trigger, stateForConditionals)) yieldAll(religionManager.religion!!.founderBeliefUniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter))
yieldAll(policies.policyUniques.getTriggeredUniques(trigger, stateForConditionals)) yieldAll(policies.policyUniques.getTriggeredUniques(trigger, stateForConditionals, modifierFilter))
yieldAll(tech.techUniques.getTriggeredUniques(trigger, stateForConditionals)) yieldAll(tech.techUniques.getTriggeredUniques(trigger, stateForConditionals, modifierFilter))
yieldAll(getEra().uniqueMap.getTriggeredUniques (trigger, stateForConditionals)) yieldAll(getEra().uniqueMap.getTriggeredUniques (trigger, stateForConditionals, modifierFilter))
yieldAll(gameInfo.ruleset.globalUniques.uniqueMap.getTriggeredUniques(trigger, stateForConditionals)) yieldAll(gameInfo.ruleset.globalUniques.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter))
}.toList() // Triggers can e.g. add buildings which contain triggers, causing concurrent modification errors }.toList() // Triggers can e.g. add buildings which contain triggers, causing concurrent modification errors

View File

@ -301,14 +301,13 @@ class MapUnit : IsPartOfGameInfoSerialization {
fun getTriggeredUniques( fun getTriggeredUniques(
trigger: UniqueType, trigger: UniqueType,
stateForConditionals: StateForConditionals = StateForConditionals(civInfo = civ, unit = this) stateForConditionals: StateForConditionals = StateForConditionals(civInfo = civ, unit = this),
modifierFilter: (Unique) -> Boolean = { true }
): Sequence<Unique> { ): Sequence<Unique> {
return getUniques().filter { unique -> return tempUniquesMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)
unique.hasModifier(trigger)
&& unique.conditionalsApply(stateForConditionals)
}
} }
/** Gets *per turn* resource requirements - does not include immediate costs for stockpiled resources. /** Gets *per turn* resource requirements - does not include immediate costs for stockpiled resources.
* StateForConditionals is assumed to regarding this mapUnit*/ * StateForConditionals is assumed to regarding this mapUnit*/
fun getResourceRequirementsPerTurn(): Counter<String> { fun getResourceRequirementsPerTurn(): Counter<String> {

View File

@ -260,18 +260,12 @@ class TileImprovementFunctions(val tile: Tile) {
UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile) UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile)
for (unique in civ.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement, stateForConditionals) for (unique in civ.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement, stateForConditionals)
.filter { { improvement.matchesFilter(it.params[0]) })
it.getModifiers(UniqueType.TriggerUponBuildingImprovement).any {
improvement.matchesFilter(it.params[0])
} })
UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile) UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile)
if (unit == null) return if (unit == null) return
for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement, stateForConditionals) for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement, stateForConditionals)
.filter { { improvement.matchesFilter(it.params[0]) })
it.getModifiers(UniqueType.TriggerUponBuildingImprovement).any {
improvement.matchesFilter(it.params[0])
} })
UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile) UniqueTriggerActivation.triggerUnique(unique, civ, unit = unit, tile = tile)
} }

View File

@ -323,9 +323,10 @@ open class UniqueMap() {
fun getAllUniques() = innerUniqueMap.values.asSequence().flatten() fun getAllUniques() = innerUniqueMap.values.asSequence().flatten()
fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals): Sequence<Unique> { fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals,
modifierFilter: (Unique) -> Boolean = { true }): Sequence<Unique> {
return getAllUniques().filter { unique -> return getAllUniques().filter { unique ->
unique.hasModifier(trigger) && unique.conditionalsApply(stateForConditionals) unique.getModifiers(trigger).any(modifierFilter) && unique.conditionalsApply(stateForConditionals)
}.flatMap { it.getMultiplied(stateForConditionals) } }.flatMap { it.getMultiplied(stateForConditionals) }
} }