From a4cc404e184304e0c356961b5549e936dfe526d9 Mon Sep 17 00:00:00 2001 From: PurpleCrowbar <26198472+PurpleCrowbar@users.noreply.github.com> Date: Sun, 18 Feb 2024 02:26:33 +0000 Subject: [PATCH] Implement common surveil triggered ability --- .../src/mage/cards/b/BloodOperative.java | 49 ++----------------- Mage.Sets/src/mage/cards/d/DimirSpybug.java | 40 +-------------- .../mage/cards/d/DisinformationCampaign.java | 38 +------------- .../mage/cards/t/ThoughtboundPhantasm.java | 39 +-------------- .../common/SurveilTriggeredAbility.java | 45 +++++++++++++++++ 5 files changed, 55 insertions(+), 156 deletions(-) create mode 100644 Mage/src/main/java/mage/abilities/common/SurveilTriggeredAbility.java diff --git a/Mage.Sets/src/mage/cards/b/BloodOperative.java b/Mage.Sets/src/mage/cards/b/BloodOperative.java index 9f8ec0cc94a..5306353c16a 100644 --- a/Mage.Sets/src/mage/cards/b/BloodOperative.java +++ b/Mage.Sets/src/mage/cards/b/BloodOperative.java @@ -3,8 +3,8 @@ package mage.cards.b; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SurveilTriggeredAbility; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.ExileTargetEffect; @@ -15,9 +15,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.players.Player; import mage.target.common.TargetCardInGraveyard; /** @@ -43,7 +40,9 @@ public final class BloodOperative extends CardImpl { this.addAbility(ability); // Whenever you surveil, if Blood Operative is in your graveyard, you may pay 3 life. If you do, return Blood Operative to your hand. - this.addAbility(new BloodOperativeTriggeredAbility()); + this.addAbility(new SurveilTriggeredAbility(Zone.GRAVEYARD, new DoIfCostPaid( + new ReturnSourceFromGraveyardToHandEffect(), new PayLifeCost(3) + ))); } private BloodOperative(final BloodOperative card) { @@ -55,43 +54,3 @@ public final class BloodOperative extends CardImpl { return new BloodOperative(this); } } - -class BloodOperativeTriggeredAbility extends TriggeredAbilityImpl { - - public BloodOperativeTriggeredAbility() { - super(Zone.GRAVEYARD, new DoIfCostPaid(new ReturnSourceFromGraveyardToHandEffect(), new PayLifeCost(3)), false); - } - - private BloodOperativeTriggeredAbility(final BloodOperativeTriggeredAbility ability) { - super(ability); - } - - @Override - public BloodOperativeTriggeredAbility copy() { - return new BloodOperativeTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEILED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getPlayerId().equals(getControllerId()); - } - - @Override - public boolean checkInterveningIfClause(Game game) { - Player controller = game.getPlayer(getControllerId()); - if (controller != null && controller.getGraveyard().contains(getSourceId())) { - return super.checkInterveningIfClause(game); - } - return false; - } - - @Override - public String getRule() { - return "Whenever you surveil, if {this} is in your graveyard, you may pay 3 life. If you do, return {this} to your hand."; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DimirSpybug.java b/Mage.Sets/src/mage/cards/d/DimirSpybug.java index c4b32af4921..b0566d38b22 100644 --- a/Mage.Sets/src/mage/cards/d/DimirSpybug.java +++ b/Mage.Sets/src/mage/cards/d/DimirSpybug.java @@ -2,7 +2,7 @@ package mage.cards.d; import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SurveilTriggeredAbility; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.MenaceAbility; @@ -10,10 +10,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -35,7 +32,7 @@ public final class DimirSpybug extends CardImpl { this.addAbility(new MenaceAbility()); // Whenever you surveil, put a +1/+1 counter on Dimir Spybug. - this.addAbility(new DimirSpybugTriggeredAbility()); + this.addAbility(new SurveilTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); } private DimirSpybug(final DimirSpybug card) { @@ -47,36 +44,3 @@ public final class DimirSpybug extends CardImpl { return new DimirSpybug(this); } } - -class DimirSpybugTriggeredAbility extends TriggeredAbilityImpl { - - public DimirSpybugTriggeredAbility() { - super(Zone.BATTLEFIELD, new AddCountersSourceEffect( - CounterType.P1P1.createInstance() - ), false); - } - - private DimirSpybugTriggeredAbility(final DimirSpybugTriggeredAbility ability) { - super(ability); - } - - @Override - public DimirSpybugTriggeredAbility copy() { - return new DimirSpybugTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEILED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getPlayerId().equals(this.getControllerId()); - } - - @Override - public String getRule() { - return "Whenever you surveil, put a +1/+1 counter on {this}."; - } -} diff --git a/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java b/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java index 95f7bc77848..e32fa4355ba 100644 --- a/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java +++ b/Mage.Sets/src/mage/cards/d/DisinformationCampaign.java @@ -1,8 +1,8 @@ package mage.cards.d; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SurveilTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; @@ -11,9 +11,6 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; import java.util.UUID; @@ -33,7 +30,7 @@ public final class DisinformationCampaign extends CardImpl { this.addAbility(ability); // Whenever you surveil, return Disinformation Campaign to its owner's hand. - this.addAbility(new DisinformationCampaignTriggeredAbility()); + this.addAbility(new SurveilTriggeredAbility(new ReturnToHandSourceEffect(true))); } private DisinformationCampaign(final DisinformationCampaign card) { @@ -45,34 +42,3 @@ public final class DisinformationCampaign extends CardImpl { return new DisinformationCampaign(this); } } - -class DisinformationCampaignTriggeredAbility extends TriggeredAbilityImpl { - - public DisinformationCampaignTriggeredAbility() { - super(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), false); - } - - private DisinformationCampaignTriggeredAbility(final DisinformationCampaignTriggeredAbility ability) { - super(ability); - } - - @Override - public DisinformationCampaignTriggeredAbility copy() { - return new DisinformationCampaignTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEILED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getPlayerId().equals(this.getControllerId()); - } - - @Override - public String getRule() { - return "Whenever you surveil, return {this} to its owner's hand."; - } -} diff --git a/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java b/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java index 1a7a091382c..9e252c6024d 100644 --- a/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java +++ b/Mage.Sets/src/mage/cards/t/ThoughtboundPhantasm.java @@ -2,8 +2,8 @@ package mage.cards.t; import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SurveilTriggeredAbility; import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.decorator.ConditionalAsThoughEffect; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderSourceEffect; @@ -16,8 +16,6 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Zone; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.events.GameEvent; /** * @@ -36,7 +34,7 @@ public final class ThoughtboundPhantasm extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // Whenever you surveil, put a +1/+1 counter on Thoughtbound Phantasm. - this.addAbility(new ThoughtboundPhantasmTriggeredAbility()); + this.addAbility(new SurveilTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()))); // As long as Thoughtbound Phantasm has three or more +1/+1 counters on it, it can attack as though it didn't have defender. this.addAbility(new SimpleStaticAbility( @@ -61,36 +59,3 @@ public final class ThoughtboundPhantasm extends CardImpl { return new ThoughtboundPhantasm(this); } } - -class ThoughtboundPhantasmTriggeredAbility extends TriggeredAbilityImpl { - - public ThoughtboundPhantasmTriggeredAbility() { - super(Zone.BATTLEFIELD, new AddCountersSourceEffect( - CounterType.P1P1.createInstance() - ), false); - } - - private ThoughtboundPhantasmTriggeredAbility(final ThoughtboundPhantasmTriggeredAbility ability) { - super(ability); - } - - @Override - public ThoughtboundPhantasmTriggeredAbility copy() { - return new ThoughtboundPhantasmTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.SURVEILED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getPlayerId().equals(this.getControllerId()); - } - - @Override - public String getRule() { - return "Whenever you surveil, put a +1/+1 counter on {this}."; - } -} diff --git a/Mage/src/main/java/mage/abilities/common/SurveilTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/SurveilTriggeredAbility.java new file mode 100644 index 00000000000..e4eee23d384 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/SurveilTriggeredAbility.java @@ -0,0 +1,45 @@ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; + +/** + * @author PurpleCrowbar + */ +public class SurveilTriggeredAbility extends TriggeredAbilityImpl { + + public SurveilTriggeredAbility(Effect effect) { + this(Zone.BATTLEFIELD, effect); + } + + public SurveilTriggeredAbility(Zone zone, Effect effect) { + super(zone, effect); + setTriggerPhrase("Whenever you surveil, " + (zone == Zone.GRAVEYARD ? "if {this} is in your graveyard, " : "")); + } + + private SurveilTriggeredAbility(final SurveilTriggeredAbility ability) { + super(ability); + } + + @Override + public SurveilTriggeredAbility copy() { + return new SurveilTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SURVEILED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (isControlledBy(event.getPlayerId())) { + this.getEffects().setValue("amount", event.getAmount()); + return true; + } + return false; + } +}