From 2619333ff55b650b10a3be239e0b08e96ec779c1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 11 Apr 2022 18:36:38 -0400 Subject: [PATCH] [SNC] Implemented Psychic Pickpocket --- .../src/mage/cards/p/PsychicPickpocket.java | 43 +++++++++++++++++++ .../src/mage/sets/StreetsOfNewCapenna.java | 1 + .../effects/keyword/ConniveSourceEffect.java | 37 +++++++++++++--- .../target/common/TargetNonlandPermanent.java | 14 +++--- 4 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/p/PsychicPickpocket.java diff --git a/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java b/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java new file mode 100644 index 00000000000..e51d634e2fb --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PsychicPickpocket.java @@ -0,0 +1,43 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.keyword.ConniveSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.target.common.TargetNonlandPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PsychicPickpocket extends CardImpl { + + public PsychicPickpocket(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); + + this.subtype.add(SubType.CEPHALID); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When Psychic Pickpocket enters the battlefield, it connives. When it connives this way, return up to one target nonland permanent to its owner's hand. + ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnToHandTargetEffect(), false); + ability.addTarget(new TargetNonlandPermanent(0, 1)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConniveSourceEffect(ability))); + } + + private PsychicPickpocket(final PsychicPickpocket card) { + super(card); + } + + @Override + public PsychicPickpocket copy() { + return new PsychicPickpocket(this); + } +} diff --git a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java index 6072c78224c..9631a76a48e 100644 --- a/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java +++ b/Mage.Sets/src/mage/sets/StreetsOfNewCapenna.java @@ -72,6 +72,7 @@ public final class StreetsOfNewCapenna extends ExpansionSet { cards.add(new SetCardInfo("Obscura Charm", 208, Rarity.UNCOMMON, mage.cards.o.ObscuraCharm.class)); cards.add(new SetCardInfo("Plains", 262, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Professional Face-Breaker", 116, Rarity.RARE, mage.cards.p.ProfessionalFaceBreaker.class)); + cards.add(new SetCardInfo("Psychic Pickpocket", 54, Rarity.UNCOMMON, mage.cards.p.PsychicPickpocket.class)); cards.add(new SetCardInfo("Racers' Ring", 253, Rarity.COMMON, mage.cards.r.RacersRing.class)); cards.add(new SetCardInfo("Raffine's Informant", 26, Rarity.COMMON, mage.cards.r.RaffinesInformant.class)); cards.add(new SetCardInfo("Raffine's Tower", 254, Rarity.RARE, mage.cards.r.RaffinesTower.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java index 5c3ac657901..daf16396be9 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/ConniveSourceEffect.java @@ -1,6 +1,8 @@ package mage.abilities.effects.keyword; import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.counters.CounterType; @@ -8,20 +10,27 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; /** * @author TheElk801 */ public class ConniveSourceEffect extends OneShotEffect { + private final ReflexiveTriggeredAbility ability; + public ConniveSourceEffect() { + this((ReflexiveTriggeredAbility) null); + } + + public ConniveSourceEffect(ReflexiveTriggeredAbility ability) { super(Outcome.Benefit); - staticText = "{this} connives. (Draw a card, then discard a card. " + - "If you discarded a nonland card, put a +1/+1 counter on this creature.)"; + this.ability = ability; } private ConniveSourceEffect(final ConniveSourceEffect effect) { super(effect); + this.ability = effect.ability; } @Override @@ -32,10 +41,13 @@ public class ConniveSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent == null) { - return false; + if (permanent != null) { + connive(permanent, 1, source, game); } - return permanent != null && connive(permanent, 1, source, game); + if (ability != null) { + game.fireReflexiveTriggeredAbility(ability, source); + } + return permanent != null || ability != null; } public static boolean connive(Permanent permanent, int amount, Ability source, Game game) { @@ -55,4 +67,19 @@ public class ConniveSourceEffect extends OneShotEffect { } return true; } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + if (ability == null) { + return "{this} connives. (Draw a card, then discard a card. " + + "If you discarded a nonland card, put a +1/+1 counter on this creature.)"; + } + return "{this} connives. When it connives this way, " + + CardUtil.getTextWithFirstCharLowerCase(ability.getRule()) + + " (To have a creature connive, draw a card, then discard a card. " + + "If you discarded a nonland card, put a +1/+1 counter on that creature.)"; + } } diff --git a/Mage/src/main/java/mage/target/common/TargetNonlandPermanent.java b/Mage/src/main/java/mage/target/common/TargetNonlandPermanent.java index c60585c1252..fa1143077da 100644 --- a/Mage/src/main/java/mage/target/common/TargetNonlandPermanent.java +++ b/Mage/src/main/java/mage/target/common/TargetNonlandPermanent.java @@ -1,18 +1,16 @@ - - package mage.target.common; +import mage.filter.StaticFilters; import mage.filter.common.FilterNonlandPermanent; import mage.target.TargetPermanent; /** - * * @author BetaSteward_at_googlemail.com */ public class TargetNonlandPermanent extends TargetPermanent { public TargetNonlandPermanent() { - this(1, 1, false); + this(1); } public TargetNonlandPermanent(FilterNonlandPermanent filter) { @@ -20,11 +18,15 @@ public class TargetNonlandPermanent extends TargetPermanent { } public TargetNonlandPermanent(int numTargets) { - this(numTargets, numTargets, new FilterNonlandPermanent(), false); + this(numTargets, numTargets); + } + + public TargetNonlandPermanent(int minNumTargets, int maxNumTargets) { + this(minNumTargets, maxNumTargets, false); } public TargetNonlandPermanent(int minNumTargets, int maxNumTargets, boolean notTarget) { - this(minNumTargets, maxNumTargets, new FilterNonlandPermanent(), notTarget); + this(minNumTargets, maxNumTargets, StaticFilters.FILTER_PERMANENT_NON_LAND, notTarget); } public TargetNonlandPermanent(int minNumTargets, int maxNumTargets, FilterNonlandPermanent filter, boolean notTarget) {