From 629081f310fae5e28ae3f2b44e88ad29fe7a3c87 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Sat, 18 Jan 2025 19:54:26 +0200 Subject: [PATCH] Resolved #12823 - "Cannot attack" accepts "vs" conditionals --- .../com/unciv/logic/battle/TargetHelper.kt | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/core/src/com/unciv/logic/battle/TargetHelper.kt b/core/src/com/unciv/logic/battle/TargetHelper.kt index 6f3da8c33bda0..dff04edd5bc06 100644 --- a/core/src/com/unciv/logic/battle/TargetHelper.kt +++ b/core/src/com/unciv/logic/battle/TargetHelper.kt @@ -5,6 +5,7 @@ import com.unciv.logic.city.City import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.mapunit.movement.PathsToTilesWithinTurn import com.unciv.logic.map.tile.Tile +import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.UniqueType object TargetHelper { @@ -112,22 +113,27 @@ object TargetHelper { ) return false - if (combatant is MapUnitCombatant && combatant.hasUnique(UniqueType.CannotAttack)) - return false + + if (combatant is MapUnitCombatant) { + val stateForConditionals = StateForConditionals( + unit = (combatant as? MapUnitCombatant)?.unit, tile = tile, + ourCombatant = combatant, theirCombatant = tileCombatant, combatAction = CombatAction.Attack) - if (combatant is MapUnitCombatant && - combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackUnits).run { - any() && none { tileCombatant.matchesFilter(it.params[0]) } - } - ) - return false + if (combatant.hasUnique(UniqueType.CannotAttack, stateForConditionals)) + return false - if (combatant is MapUnitCombatant && - combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackTiles).run { - any() && none { tile.matchesFilter(it.params[0]) } - } - ) - return false + if (combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackUnits, stateForConditionals).run { + any() && none { tileCombatant.matchesFilter(it.params[0]) } + } + ) + return false + + if (combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackTiles, stateForConditionals).run { + any() && none { tile.matchesFilter(it.params[0]) } + } + ) + return false + } // Only units with the right unique can view submarines (or other invisible units) from more then one tile away. // Garrisoned invisible units can be attacked by anyone, as else the city will be in invincible. @@ -135,6 +141,7 @@ object TargetHelper { return combatant is MapUnitCombatant && combatant.getCivInfo().viewableInvisibleUnitsTiles.map { it.position }.contains(tile.position) } + return true }