From d83d27dfa3067ff0d35cdcec358b68d8ce4d2024 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Thu, 21 Sep 2023 01:33:49 -0400 Subject: [PATCH] update SourceBecomesTargetTriggeredAbility with proper logic and trigger phrase generation --- .../src/mage/cards/b/BonecrusherGiant.java | 3 +- .../src/mage/cards/w/WardenOfTheWoods.java | 3 +- .../SourceBecomesTargetTriggeredAbility.java | 42 +++++++++++-------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java b/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java index 33c743ba440..ace07c97f3a 100644 --- a/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java +++ b/Mage.Sets/src/mage/cards/b/BonecrusherGiant.java @@ -31,8 +31,7 @@ public final class BonecrusherGiant extends AdventureCard { this.addAbility(new SourceBecomesTargetTriggeredAbility( new DamageTargetEffect( 2, true, "that spell's controller", "{this}" - ), StaticFilters.FILTER_SPELL_A, SetTargetPointer.PLAYER - ).setTriggerPhrase("Whenever {this} becomes the target of a spell, ")); + ), StaticFilters.FILTER_SPELL_A, SetTargetPointer.PLAYER, false)); // Stomp // Damage can’t be prevented this turn. Stomp deals 2 damage to any target. diff --git a/Mage.Sets/src/mage/cards/w/WardenOfTheWoods.java b/Mage.Sets/src/mage/cards/w/WardenOfTheWoods.java index 8597e1b07d6..6a4c068ce26 100644 --- a/Mage.Sets/src/mage/cards/w/WardenOfTheWoods.java +++ b/Mage.Sets/src/mage/cards/w/WardenOfTheWoods.java @@ -32,8 +32,7 @@ public final class WardenOfTheWoods extends CardImpl { this.addAbility(new SourceBecomesTargetTriggeredAbility( new DrawCardSourceControllerEffect(2), StaticFilters.FILTER_SPELL_OR_ABILITY_OPPONENTS, - SetTargetPointer.NONE, true - ).setTriggerPhrase("Whenever {this} becomes the target of a spell or ability an opponent controls, ")); + SetTargetPointer.NONE, true)); } private WardenOfTheWoods(final WardenOfTheWoods card) { diff --git a/Mage/src/main/java/mage/abilities/common/SourceBecomesTargetTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/SourceBecomesTargetTriggeredAbility.java index bb0c7ebb592..6c2aa3d210a 100644 --- a/Mage/src/main/java/mage/abilities/common/SourceBecomesTargetTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/SourceBecomesTargetTriggeredAbility.java @@ -2,6 +2,10 @@ package mage.abilities.common; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ExileSourceEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect; import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.filter.FilterStackObject; @@ -10,6 +14,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.StackObject; import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; /** * @author North @@ -24,18 +29,18 @@ public class SourceBecomesTargetTriggeredAbility extends TriggeredAbilityImpl { } public SourceBecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter) { - this(effect, filter, SetTargetPointer.NONE); - } - - public SourceBecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter, SetTargetPointer setTargetPointer) { - this(effect, filter, setTargetPointer, false); + this(effect, filter, SetTargetPointer.NONE, false); } public SourceBecomesTargetTriggeredAbility(Effect effect, FilterStackObject filter, SetTargetPointer setTargetPointer, boolean optional) { super(Zone.BATTLEFIELD, effect, optional); this.filter = filter; this.setTargetPointer = setTargetPointer; - setTriggerPhrase("When {this} becomes the target of " + filter.getMessage() + ", "); + boolean textWhen = (effect instanceof SacrificeSourceEffect + || effect instanceof ReturnToHandSourceEffect + || effect instanceof ShuffleIntoLibrarySourceEffect + || effect instanceof ExileSourceEffect); + setTriggerPhrase((textWhen ? "When" : "Whenever") + " {this} becomes the target of " + filter.getMessage() + ", "); } protected SourceBecomesTargetTriggeredAbility(final SourceBecomesTargetTriggeredAbility ability) { @@ -56,24 +61,27 @@ public class SourceBecomesTargetTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - StackObject sourceObject = game.getStack().getStackObject(event.getSourceId()); - if (!event.getTargetId().equals(getSourceId()) - || !filter.match(sourceObject, getControllerId(), this, game)) { + if (!event.getTargetId().equals(getSourceId())) { + return false; + } + StackObject targetingObject = CardUtil.getTargetingStackObject(event, game); + if (targetingObject == null || !filter.match(targetingObject, getControllerId(), this, game)) { + return false; + } + if (!CardUtil.checkTargetMap(this.id, targetingObject, event, game)) { return false; } switch (setTargetPointer) { case PLAYER: - this.getEffects().stream() - .forEach(effect -> effect.setTargetPointer( - new FixedTarget(sourceObject.getControllerId(), game) - )); + this.getAllEffects().setTargetPointer(new FixedTarget(targetingObject.getControllerId(), game)); break; case SPELL: - this.getEffects().stream() - .forEach(effect -> effect.setTargetPointer( - new FixedTarget(sourceObject.getId(), game) - )); + this.getAllEffects().setTargetPointer(new FixedTarget(targetingObject.getId())); break; + case NONE: + break; + default: + throw new IllegalArgumentException("Unsupported SetTargetPointer in BecomesTargetSourceTriggeredAbility"); } return true; }