From 8e41215fa53cfd297a0cdce6ec166d923c16a650 Mon Sep 17 00:00:00 2001 From: jeffwadsworth Date: Mon, 2 Mar 2020 16:01:33 -0600 Subject: [PATCH] - Refactor to resolve failing test --- .../src/mage/cards/v/VindictiveVampire.java | 88 +++++++++++++++++-- .../common/DiesCreatureTriggeredAbility.java | 34 ++----- 2 files changed, 89 insertions(+), 33 deletions(-) diff --git a/Mage.Sets/src/mage/cards/v/VindictiveVampire.java b/Mage.Sets/src/mage/cards/v/VindictiveVampire.java index 5a5e617e26b..617078741a3 100644 --- a/Mage.Sets/src/mage/cards/v/VindictiveVampire.java +++ b/Mage.Sets/src/mage/cards/v/VindictiveVampire.java @@ -2,7 +2,6 @@ package mage.cards.v; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; @@ -12,8 +11,17 @@ import mage.constants.SubType; import mage.constants.TargetController; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.AnotherPredicate; - import java.util.UUID; +import mage.MageObject; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; /** * @author TheElk801 @@ -34,9 +42,10 @@ public final class VindictiveVampire extends CardImpl { this.toughness = new MageInt(3); // Whenever another creature you control dies, Vindictive Vampire deals 1 damage to each opponent and you gain 1 life. - Ability ability = new DiesCreatureTriggeredAbility( - new DamagePlayersEffect(1, TargetController.OPPONENT), false, - filter, true + Ability ability = new VindictiveVampireTriggeredAbility(Zone.ALL, new DamagePlayersEffect(1, TargetController.OPPONENT), + false, + filter, + true ); ability.addEffect(new GainLifeEffect(1).concatBy("and")); this.addAbility(ability); @@ -51,3 +60,72 @@ public final class VindictiveVampire extends CardImpl { return new VindictiveVampire(this); } } + +class VindictiveVampireTriggeredAbility extends TriggeredAbilityImpl { + + protected FilterPermanent filter; + private final boolean setTargetPointer; + + public VindictiveVampireTriggeredAbility(Zone zone, Effect effect, + boolean optional, FilterPermanent filter, boolean setTargetPointer) { + super(zone, effect, optional); + this.filter = filter; + this.setTargetPointer = setTargetPointer; + } + + public VindictiveVampireTriggeredAbility(final VindictiveVampireTriggeredAbility ability) { + super(ability); + this.filter = ability.filter; + this.setTargetPointer = ability.setTargetPointer; + } + + @Override + public VindictiveVampireTriggeredAbility copy() { + return new VindictiveVampireTriggeredAbility(this); + } + + @Override + public boolean isInUseableZone(Game game, MageObject source, GameEvent event) { + Permanent sourcePermanent; + if (game.getState().getZone(getSourceId()) == Zone.BATTLEFIELD) { + sourcePermanent = game.getPermanent(getSourceId()); + } else { + sourcePermanent = (Permanent) game.getPermanentOrLKIBattlefield(getSourceId()); + } + if (sourcePermanent == null) { + return false; + } + return hasSourceObjectAbility(game, sourcePermanent, event); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (game.getPermanentOrLKIBattlefield(getSourceId()) == null) { + return false; + } + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.isDiesEvent()) { + if (zEvent.getTarget() != null) { + if (filter.match(zEvent.getTarget(), getSourceId(), getControllerId(), game)) { + if (setTargetPointer) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId(), game)); + } + } + return true; + } + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever " + filter.getMessage() + " dies, " + super.getRule(); + } +} diff --git a/Mage/src/main/java/mage/abilities/common/DiesCreatureTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DiesCreatureTriggeredAbility.java index 4f844626d21..d6dc69c5c6d 100644 --- a/Mage/src/main/java/mage/abilities/common/DiesCreatureTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DiesCreatureTriggeredAbility.java @@ -1,6 +1,5 @@ package mage.abilities.common; -import mage.MageObject; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.Zone; @@ -10,7 +9,6 @@ import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; /** @@ -42,8 +40,7 @@ public class DiesCreatureTriggeredAbility extends TriggeredAbilityImpl { } public DiesCreatureTriggeredAbility(Effect effect, boolean optional, FilterPermanent filter, boolean setTargetPointer) { - // Needs "Zone.ALL" if the source itself should trigger or multiple (incl. source go to grave) - this(Zone.ALL, effect, optional, filter, setTargetPointer); + this(Zone.BATTLEFIELD, effect, optional, filter, setTargetPointer); } public DiesCreatureTriggeredAbility(Zone zone, Effect effect, boolean optional, FilterPermanent filter, boolean setTargetPointer) { @@ -63,20 +60,6 @@ public class DiesCreatureTriggeredAbility extends TriggeredAbilityImpl { return new DiesCreatureTriggeredAbility(this); } - @Override - public boolean isInUseableZone(Game game, MageObject source, GameEvent event) { - Permanent sourcePermanent; - if (game.getState().getZone(getSourceId()) == Zone.BATTLEFIELD) { - sourcePermanent = game.getPermanent(getSourceId()); - } else { - sourcePermanent = (Permanent) game.getPermanentOrLKIBattlefield(getSourceId()); - } - if (sourcePermanent == null) { - return false; - } - return hasSourceObjectAbility(game, sourcePermanent, event); - } - @Override public boolean checkEventType(GameEvent event, Game game) { return event.getType() == GameEvent.EventType.ZONE_CHANGE; @@ -84,20 +67,15 @@ public class DiesCreatureTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (game.getPermanentOrLKIBattlefield(getSourceId()) == null) { - return false; - } ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.isDiesEvent()) { - if (zEvent.getTarget() != null) { - if (filter.match(zEvent.getTarget(), getSourceId(), getControllerId(), game)) { - if (setTargetPointer) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId(), game)); - } + if (filter.match(zEvent.getTarget(), sourceId, controllerId, game) && zEvent.getTarget().isCreature()) { + if (setTargetPointer) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId(), game)); } - return true; } + return true; } } return false;