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(
trigger: UniqueType,
stateForConditionals: StateForConditionals = StateForConditionals(this)
stateForConditionals: StateForConditionals = StateForConditionals(this),
modifierFilter: (Unique) -> Boolean = { true }
) : Iterable<Unique> = 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

View File

@ -301,14 +301,13 @@ 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<Unique> {
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*/
fun getResourceRequirementsPerTurn(): Counter<String> {

View File

@ -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)
}

View File

@ -323,9 +323,10 @@ open class UniqueMap() {
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 ->
unique.hasModifier(trigger) && unique.conditionalsApply(stateForConditionals)
unique.getModifiers(trigger).any(modifierFilter) && unique.conditionalsApply(stateForConditionals)
}.flatMap { it.getMultiplied(stateForConditionals) }
}