From 986346a127856b1d06b3a9d4ce25fd1a2633b04d Mon Sep 17 00:00:00 2001 From: Xander Lenstra <71121390+xlenstra@users.noreply.github.com> Date: Thu, 21 Jul 2022 08:16:33 +0200 Subject: [PATCH] Added a unique limiting what units can be intercepted (#7488) * Added a unique limiting what units can be intercepted * Cleaned up implementation and added stateForConditionals --- core/src/com/unciv/logic/battle/Battle.kt | 16 ++++++++++++---- .../unciv/models/ruleset/unique/UniqueType.kt | 1 + docs/Modders/uniques.md | 5 +++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 5c05dfee1e..af2aec9a33 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -811,12 +811,20 @@ object Battle { } private fun tryInterceptAirAttack(attacker: MapUnitCombatant, attackedTile: TileInfo, interceptingCiv: CivilizationInfo, defender: ICombatant?) { - if (attacker.unit.hasUnique(UniqueType.CannotBeIntercepted)) return + if (attacker.unit.hasUnique(UniqueType.CannotBeIntercepted, StateForConditionals(attacker.getCivInfo(), ourCombatant = attacker, theirCombatant = defender, attackedTile = attackedTile))) + return // Pick highest chance interceptor for (interceptor in interceptingCiv.getCivUnits() - .filter { it.canIntercept(attackedTile) } - .sortedByDescending { it.interceptChance() }) { - // defender can't also intercept + .filter { it.canIntercept(attackedTile) } + .sortedByDescending { it.interceptChance() } + ) { + // Can't intercept if we have a unique preventing it + val conditionalState = StateForConditionals(interceptingCiv, ourCombatant = MapUnitCombatant(interceptor), theirCombatant = attacker, combatAction = CombatAction.Intercept, attackedTile = attackedTile) + if (interceptor.getMatchingUniques(UniqueType.CannotInterceptUnits, conditionalState) + .any { attacker.matchesCategory(it.params[0]) } + ) continue + + // Defender can't intercept either if (defender != null && defender is MapUnitCombatant && interceptor == defender.unit) continue interceptor.attacksThisTurn++ // even if you miss, you took the shot // Does Intercept happen? If not, exit diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 069595b62c..32a4db0bd4 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -429,6 +429,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: DamageWhenIntercepting("[relativeAmount]% Damage when intercepting", UniqueTarget.Unit), ExtraInterceptionsPerTurn("[amount] extra interceptions may be made per turn", UniqueTarget.Unit), CannotBeIntercepted("Cannot be intercepted", UniqueTarget.Unit), + CannotInterceptUnits("Cannot intercept [mapUnitFilter] units", UniqueTarget.Unit), UnitMaintenanceDiscount("[relativeAmount]% maintenance costs", UniqueTarget.Unit, UniqueTarget.Global), UnitUpgradeCost("[relativeAmount]% Gold cost of upgrading", UniqueTarget.Unit, UniqueTarget.Global), diff --git a/docs/Modders/uniques.md b/docs/Modders/uniques.md index 8dfa020f58..7ac6cdc7f4 100644 --- a/docs/Modders/uniques.md +++ b/docs/Modders/uniques.md @@ -1139,6 +1139,11 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl ??? example "Cannot be intercepted" Applicable to: Unit +??? example "Cannot intercept [mapUnitFilter] units" + Example: "Cannot intercept [Wounded] units" + + Applicable to: Unit + ??? example "May capture killed [mapUnitFilter] units" Example: "May capture killed [Wounded] units"