From c9500859fe292a9bd94a45894977b9c17883c7dd Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 6 Dec 2020 17:51:15 +0100 Subject: [PATCH] RelaceDamage: fix DamageTarget check using Replaced values --- .../forge/game/replacement/ReplaceDamage.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java index a5ce0550ef2..c0d8e1ebcb0 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java @@ -17,6 +17,7 @@ */ package forge.game.replacement; +import forge.game.Game; import forge.game.GameEntity; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; @@ -48,6 +49,7 @@ public class ReplaceDamage extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { + final Game game = getHostCard().getGame(); if (!(runParams.containsKey(AbilityKey.Prevention) == (hasParam("PreventionEffect") || hasParam("Prevent")))) { return false; @@ -128,17 +130,33 @@ public class ReplaceDamage extends ReplacementEffect { } // check for DamageRedirection, the Thing where the damage is redirected to must be a creature or planeswalker or a player String def = getParam("DamageTarget"); - for (Player p : AbilityUtils.getDefinedPlayers(hostCard, def, null)) { - if (!p.getGame().getPlayers().contains(p)) { + if (def.startsWith("Replaced")) { + // this can't work with the Defined below because the replaced objects aren't set to a possible SA yet + if (def.equals("ReplacedSourceController")) { + Card source = (Card) runParams.get(AbilityKey.DamageSource); + if (!game.getPlayers().contains(source.getController())) { + return false; + } + } else if (def.equals("ReplacedTargetController")) { + if (!(affected instanceof Card) || !game.getPlayers().contains(((Card) affected).getController())) { + return false; + } + } else { return false; } - } - for (Card c : AbilityUtils.getDefinedCards(hostCard, def, null)) { - if (!c.isCreature() && !c.isPlaneswalker()) { - return false; + } else { + for (Player p : AbilityUtils.getDefinedPlayers(getHostCard(), def, null)) { + if (!game.getPlayers().contains(p)) { + return false; + } } - if (!c.isInPlay()) { - return false; + for (Card c : AbilityUtils.getDefinedCards(getHostCard(), def, null)) { + if (!c.isCreature() && !c.isPlaneswalker()) { + return false; + } + if (!c.isInPlay()) { + return false; + } } } }