diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index e0fbfb4e6a..70f063dd9d 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -169,19 +169,17 @@ object Battle { fun triggerVictoryUniques(ourUnit: MapUnitCombatant, enemy: MapUnitCombatant) { val stateForConditionals = StateForConditionals(civInfo = ourUnit.getCivInfo(), ourCombatant = ourUnit, theirCombatant = enemy, tile = attackedTile) - for (unique in ourUnit.unit.getTriggeredUniques(UniqueType.TriggerUponDefeatingUnit, stateForConditionals)) - if (unique.getModifiers(UniqueType.TriggerUponDefeatingUnit).any { enemy.unit.matchesFilter(it.params[0]) }) - UniqueTriggerActivation.triggerUnique(unique, ourUnit.unit, triggerNotificationText = "due to our [${ourUnit.getName()}] defeating a [${enemy.getName()}]") + for (unique in ourUnit.unit.getTriggeredUniques(UniqueType.TriggerUponDefeatingUnit, stateForConditionals) + { enemy.unit.matchesFilter(it.params[0]) }) + UniqueTriggerActivation.triggerUnique(unique, ourUnit.unit, triggerNotificationText = "due to our [${ourUnit.getName()}] defeating a [${enemy.getName()}]") } fun triggerDamageUniquesForUnit(triggeringUnit: MapUnitCombatant, enemy: MapUnitCombatant, combatAction: CombatAction){ val stateForConditionals = StateForConditionals(civInfo = triggeringUnit.getCivInfo(), ourCombatant = triggeringUnit, theirCombatant = enemy, tile = attackedTile, combatAction = combatAction) - for (unique in triggeringUnit.unit.getTriggeredUniques(UniqueType.TriggerUponDamagingUnit, stateForConditionals)){ - if (unique.getModifiers(UniqueType.TriggerUponDamagingUnit).none { enemy.matchesFilter(it.params[0]) }) - continue - + for (unique in triggeringUnit.unit.getTriggeredUniques(UniqueType.TriggerUponDamagingUnit, stateForConditionals) + { enemy.matchesFilter(it.params[0]) }){ if (unique.params[0] == Constants.targetUnit){ UniqueTriggerActivation.triggerUnique(unique, enemy.unit, triggerNotificationText = "due to our [${enemy.getName()}] being damaged by a [${triggeringUnit.getName()}]") } else { @@ -344,14 +342,14 @@ object Battle { val attackerDamageDealt = defenderHealthBefore - defender.getHealth() if (attacker is MapUnitCombatant) - for (unique in attacker.unit.getTriggeredUniques(UniqueType.TriggerUponLosingHealth)) - if (unique.modifiers.any { it.params[0].toInt() <= defenderDamageDealt }) - UniqueTriggerActivation.triggerUnique(unique, attacker.unit, triggerNotificationText = "due to losing [$defenderDamageDealt] HP") + for (unique in attacker.unit.getTriggeredUniques(UniqueType.TriggerUponLosingHealth) + { it.params[0].toInt() <= defenderDamageDealt }) + UniqueTriggerActivation.triggerUnique(unique, attacker.unit, triggerNotificationText = "due to losing [$defenderDamageDealt] HP") if (defender is MapUnitCombatant) - for (unique in defender.unit.getTriggeredUniques(UniqueType.TriggerUponLosingHealth)) - if (unique.modifiers.any { it.params[0].toInt() <= attackerDamageDealt }) - UniqueTriggerActivation.triggerUnique(unique, defender.unit, triggerNotificationText = "due to losing [$attackerDamageDealt] HP") + for (unique in defender.unit.getTriggeredUniques(UniqueType.TriggerUponLosingHealth) + { it.params[0].toInt() <= attackerDamageDealt }) + UniqueTriggerActivation.triggerUnique(unique, defender.unit, triggerNotificationText = "due to losing [$attackerDamageDealt] HP") plunderFromDamage(attacker, defender, attackerDamageDealt) return DamageDealt(attackerDamageDealt, defenderDamageDealt) diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 9c3b986c0d..c0ddf85934 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -186,8 +186,6 @@ class CityConstructions : IsPartOfGameInfoSerialization { fun getCurrentConstruction(): IConstruction = getConstruction(currentConstructionFromQueue) - fun isAllBuilt(buildingList: List): Boolean = buildingList.all { isBuilt(it) } - fun isBuilt(buildingName: String): Boolean = builtBuildings.contains(buildingName) // Note: There was a isEnqueued here functionally identical to isBeingConstructedOrEnqueued, @@ -566,14 +564,13 @@ class CityConstructions : IsPartOfGameInfoSerialization { if (!unique.hasTriggerConditional() && unique.conditionalsApply(stateForConditionals)) UniqueTriggerActivation.triggerUnique(unique, city, triggerNotificationText = triggerNotificationText) - for (unique in city.civ.getTriggeredUniques(UniqueType.TriggerUponConstructingBuilding, stateForConditionals)) - if (unique.getModifiers(UniqueType.TriggerUponConstructingBuilding).any { building.matchesFilter(it.params[0])} ) - UniqueTriggerActivation.triggerUnique(unique, city, triggerNotificationText = triggerNotificationText) + for (unique in city.civ.getTriggeredUniques(UniqueType.TriggerUponConstructingBuilding, stateForConditionals) + { building.matchesFilter(it.params[0]) }) + UniqueTriggerActivation.triggerUnique(unique, city, triggerNotificationText = triggerNotificationText) - for (unique in city.civ.getTriggeredUniques(UniqueType.TriggerUponConstructingBuildingCityFilter, stateForConditionals)) - if (unique.getModifiers(UniqueType.TriggerUponConstructingBuildingCityFilter).any { - building.matchesFilter(it.params[0]) && city.matchesFilter(it.params[1]) }) - UniqueTriggerActivation.triggerUnique(unique, city, triggerNotificationText = triggerNotificationText) + for (unique in city.civ.getTriggeredUniques(UniqueType.TriggerUponConstructingBuildingCityFilter, stateForConditionals) + { building.matchesFilter(it.params[0]) && city.matchesFilter(it.params[1]) }) + UniqueTriggerActivation.triggerUnique(unique, city, triggerNotificationText = triggerNotificationText) } fun removeBuilding(buildingName: String) { diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index c7b378f4b2..87d21672ee 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -541,18 +541,18 @@ class Civilization : IsPartOfGameInfoSerialization { fun getTriggeredUniques( trigger: UniqueType, stateForConditionals: StateForConditionals = StateForConditionals(this), - modifierFilter: (Unique) -> Boolean = { true } + triggerFilter: (Unique) -> Boolean = { true } ) : Iterable = sequence { - yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter)) + yieldAll(nation.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, triggerFilter)) yieldAll(cities.asSequence() - .flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter) } + .flatMap { city -> city.cityConstructions.builtBuildingUniqueMap.getTriggeredUniques(trigger, stateForConditionals, triggerFilter) } ) if (religionManager.religion != null) - 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)) + yieldAll(religionManager.religion!!.founderBeliefUniqueMap.getTriggeredUniques(trigger, stateForConditionals, triggerFilter)) + yieldAll(policies.policyUniques.getTriggeredUniques(trigger, stateForConditionals, triggerFilter)) + yieldAll(tech.techUniques.getTriggeredUniques(trigger, stateForConditionals, triggerFilter)) + yieldAll(getEra().uniqueMap.getTriggeredUniques (trigger, stateForConditionals, triggerFilter)) + yieldAll(gameInfo.ruleset.globalUniques.uniqueMap.getTriggeredUniques(trigger, stateForConditionals, triggerFilter)) }.toList() // Triggers can e.g. add buildings which contain triggers, causing concurrent modification errors diff --git a/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt b/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt index 78c7ce4cd0..219a9dbcea 100644 --- a/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt @@ -234,9 +234,8 @@ class PolicyManager : IsPartOfGameInfoSerialization { if (!unique.hasTriggerConditional() && unique.conditionalsApply(StateForConditionals(civInfo))) UniqueTriggerActivation.triggerUnique(unique, civInfo, triggerNotificationText = triggerNotificationText) - for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponAdoptingPolicyOrBelief)) - if (unique.getModifiers(UniqueType.TriggerUponAdoptingPolicyOrBelief).any { it.params[0] == policy.name }) - UniqueTriggerActivation.triggerUnique(unique, civInfo, triggerNotificationText = triggerNotificationText) + for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponAdoptingPolicyOrBelief) {it.params[0] == policy.name}) + UniqueTriggerActivation.triggerUnique(unique, civInfo, triggerNotificationText = triggerNotificationText) civInfo.cache.updateCivResources() diff --git a/core/src/com/unciv/logic/civilization/managers/TechManager.kt b/core/src/com/unciv/logic/civilization/managers/TechManager.kt index 792b949d5e..46d9dfe1a0 100644 --- a/core/src/com/unciv/logic/civilization/managers/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TechManager.kt @@ -316,9 +316,8 @@ class TechManager : IsPartOfGameInfoSerialization { if (!unique.hasTriggerConditional() && unique.conditionalsApply(StateForConditionals(civInfo))) UniqueTriggerActivation.triggerUnique(unique, civInfo, triggerNotificationText = triggerNotificationText) - for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponResearch)) - if (unique.getModifiers(UniqueType.TriggerUponResearch).any { newTech.matchesFilter(it.params[0]) }) - UniqueTriggerActivation.triggerUnique(unique, civInfo, triggerNotificationText = triggerNotificationText) + for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponResearch) { newTech.matchesFilter(it.params[0]) }) + UniqueTriggerActivation.triggerUnique(unique, civInfo, triggerNotificationText = triggerNotificationText) val revealedResources = getRuleset().tileResources.values.filter { techName == it.revealedBy } @@ -464,7 +463,7 @@ class TechManager : IsPartOfGameInfoSerialization { val eraNames = erasPassed.map { it.name }.toHashSet() for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponEnteringEra)) for (eraName in eraNames) - if (unique.modifiers.any { it.type == UniqueType.TriggerUponEnteringEra && it.params[0] == eraName }) + if (unique.getModifiers(UniqueType.TriggerUponEnteringEra).any { it.params[0] == eraName }) UniqueTriggerActivation.triggerUnique( unique, civInfo, diff --git a/core/src/com/unciv/logic/civilization/managers/UnitManager.kt b/core/src/com/unciv/logic/civilization/managers/UnitManager.kt index 5ed14b38d8..d0c75e989a 100644 --- a/core/src/com/unciv/logic/civilization/managers/UnitManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/UnitManager.kt @@ -103,9 +103,9 @@ class UnitManager(val civInfo: Civilization) { if (!unique.hasTriggerConditional() && unique.conditionalsApply(StateForConditionals(civInfo, unit = unit))) UniqueTriggerActivation.triggerUnique(unique, unit, triggerNotificationText = triggerNotificationText) - for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponGainingUnit)) - if (unique.getModifiers(UniqueType.TriggerUponGainingUnit).any { unit.matchesFilter(it.params[0]) }) - UniqueTriggerActivation.triggerUnique(unique, unit, triggerNotificationText = triggerNotificationText) + for (unique in civInfo.getTriggeredUniques(UniqueType.TriggerUponGainingUnit) + { unit.matchesFilter(it.params[0]) }) + UniqueTriggerActivation.triggerUnique(unique, unit, triggerNotificationText = triggerNotificationText) if (unit.getResourceRequirementsPerTurn().isNotEmpty()) civInfo.cache.updateCivResources() diff --git a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt index e9e442fdd2..99f8630ba7 100644 --- a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt +++ b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt @@ -300,11 +300,11 @@ class MapUnit : IsPartOfGameInfoSerialization { } fun getTriggeredUniques( - trigger: UniqueType, - stateForConditionals: StateForConditionals = StateForConditionals(civInfo = civ, unit = this), - modifierFilter: (Unique) -> Boolean = { true } + trigger: UniqueType, + stateForConditionals: StateForConditionals = StateForConditionals(civInfo = civ, unit = this), + triggerFilter: (Unique) -> Boolean = { true } ): Sequence { - return tempUniquesMap.getTriggeredUniques(trigger, stateForConditionals, modifierFilter) + return tempUniquesMap.getTriggeredUniques(trigger, stateForConditionals, triggerFilter) } @@ -834,10 +834,9 @@ class MapUnit : IsPartOfGameInfoSerialization { /** Destroys the unit and gives stats if its a great person */ fun consume() { - for (unique in civ.getTriggeredUniques(UniqueType.TriggerUponExpendingUnit)) - if (unique.getModifiers(UniqueType.TriggerUponExpendingUnit).any { matchesFilter(it.params[0]) }) - UniqueTriggerActivation.triggerUnique(unique, this, - triggerNotificationText = "due to expending our [${this.name}]") + for (unique in civ.getTriggeredUniques(UniqueType.TriggerUponExpendingUnit){ matchesFilter(it.params[0]) }) + UniqueTriggerActivation.triggerUnique(unique, this, + triggerNotificationText = "due to expending our [${this.name}]") destroy() } @@ -1041,10 +1040,8 @@ class MapUnit : IsPartOfGameInfoSerialization { statuses.add(status) updateUniques() - for (unique in getTriggeredUniques(UniqueType.TriggerUponStatusGain)) - if (unique.getModifiers(UniqueType.TriggerUponStatusGain) - .any { it.params[0] == name }) - UniqueTriggerActivation.triggerUnique(unique, this) + for (unique in getTriggeredUniques(UniqueType.TriggerUponStatusGain){ it.params[0] == name }) + UniqueTriggerActivation.triggerUnique(unique, this) } fun removeStatus(name:String){ @@ -1053,10 +1050,8 @@ class MapUnit : IsPartOfGameInfoSerialization { updateUniques() - for (unique in getTriggeredUniques(UniqueType.TriggerUponStatusLoss)) - if (unique.getModifiers(UniqueType.TriggerUponStatusLoss) - .any { it.params[0] == name }) - UniqueTriggerActivation.triggerUnique(unique, this) + for (unique in getTriggeredUniques(UniqueType.TriggerUponStatusLoss){ it.params[0] == name }) + UniqueTriggerActivation.triggerUnique(unique, this) } diff --git a/core/src/com/unciv/logic/map/mapunit/UnitPromotions.kt b/core/src/com/unciv/logic/map/mapunit/UnitPromotions.kt index 0d8d850639..7622c6ae2e 100644 --- a/core/src/com/unciv/logic/map/mapunit/UnitPromotions.kt +++ b/core/src/com/unciv/logic/map/mapunit/UnitPromotions.kt @@ -76,10 +76,8 @@ class UnitPromotions : IsPartOfGameInfoSerialization { for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponPromotion)) UniqueTriggerActivation.triggerUnique(unique, unit) - for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponPromotionGain)) - if (unique.getModifiers(UniqueType.TriggerUponPromotionGain) - .any { it.params[0] == promotionName }) - UniqueTriggerActivation.triggerUnique(unique, unit) + for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponPromotionGain){ it.params[0] == promotionName }) + UniqueTriggerActivation.triggerUnique(unique, unit) } if (!promotion.hasUnique(UniqueType.SkipPromotion)) @@ -106,10 +104,8 @@ class UnitPromotions : IsPartOfGameInfoSerialization { unit.updateUniques() unit.updateVisibleTiles() - for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponPromotionLoss)) - if (unique.getModifiers(UniqueType.TriggerUponPromotionLoss) - .any { it.params[0] == promotionName }) - UniqueTriggerActivation.triggerUnique(unique, unit) + for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponPromotionLoss){ it.params[0] == promotionName }) + UniqueTriggerActivation.triggerUnique(unique, unit) } } diff --git a/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt b/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt index 4427c8d5a0..70a0d1117a 100644 --- a/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt +++ b/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt @@ -66,10 +66,9 @@ class UnitTurnManager(val unit: MapUnit) { unit.addMovementMemory() - for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponEndingTurnInTile)) - if (unique.getModifiers(UniqueType.TriggerUponEndingTurnInTile).any { - unit.getTile().matchesFilter(it.params[0], unit.civ) }) - UniqueTriggerActivation.triggerUnique(unique, unit) + for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponEndingTurnInTile) + { unit.getTile().matchesFilter(it.params[0], unit.civ) }) + UniqueTriggerActivation.triggerUnique(unique, unit) } diff --git a/core/src/com/unciv/models/ruleset/unique/Unique.kt b/core/src/com/unciv/models/ruleset/unique/Unique.kt index 2b6a730ee1..8017639f21 100644 --- a/core/src/com/unciv/models/ruleset/unique/Unique.kt +++ b/core/src/com/unciv/models/ruleset/unique/Unique.kt @@ -324,9 +324,9 @@ open class UniqueMap() { fun getAllUniques() = innerUniqueMap.values.asSequence().flatten() fun getTriggeredUniques(trigger: UniqueType, stateForConditionals: StateForConditionals, - modifierFilter: (Unique) -> Boolean = { true }): Sequence { + triggerFilter: (Unique) -> Boolean = { true }): Sequence { return getAllUniques().filter { unique -> - unique.getModifiers(trigger).any(modifierFilter) && unique.conditionalsApply(stateForConditionals) + unique.getModifiers(trigger).any(triggerFilter) && unique.conditionalsApply(stateForConditionals) }.flatMap { it.getMultiplied(stateForConditionals) } }