From 33a27b35250b64a1e5c94b6ec2fd08aab30f8db2 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 23 Jan 2026 10:53:26 -0500 Subject: [PATCH] [TMT] Implement Turncoat Kunoichi --- .../src/mage/cards/t/TurncoatKunoichi.java | 55 +++++++++++++++++++ .../mage/sets/TeenageMutantNinjaTurtles.java | 1 + .../condition/common/SneakCondition.java | 26 +++++++++ 3 files changed, 82 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TurncoatKunoichi.java create mode 100644 Mage/src/main/java/mage/abilities/condition/common/SneakCondition.java diff --git a/Mage.Sets/src/mage/cards/t/TurncoatKunoichi.java b/Mage.Sets/src/mage/cards/t/TurncoatKunoichi.java new file mode 100644 index 00000000000..903c7263e70 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TurncoatKunoichi.java @@ -0,0 +1,55 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.SneakCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; +import mage.abilities.keyword.SneakAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.target.common.TargetOpponentsCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TurncoatKunoichi extends CardImpl { + + public TurncoatKunoichi(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.MUTANT); + this.subtype.add(SubType.NINJA); + this.subtype.add(SubType.FOX); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Sneak {2}{W}{B} + this.addAbility(new SneakAbility(this, "{2}{W}{B}")); + + // When this creature enters, choose target creature an opponent controls. Exile that creature until this creature leaves the battlefield. If this creature's sneak cost was paid, instead exile the chosen creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect( + new ExileTargetEffect(), new ExileUntilSourceLeavesEffect(), + SneakCondition.instance, "choose target creature an opponent controls. " + + "Exile that creature until this creature leaves the battlefield. " + + "If this creature's sneak cost was paid, instead exile the chosen creature" + )); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + } + + private TurncoatKunoichi(final TurncoatKunoichi card) { + super(card); + } + + @Override + public TurncoatKunoichi copy() { + return new TurncoatKunoichi(this); + } +} diff --git a/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java b/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java index 6e619cb2fe3..2dc962985c8 100644 --- a/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java +++ b/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java @@ -84,6 +84,7 @@ public final class TeenageMutantNinjaTurtles extends ExpansionSet { cards.add(new SetCardInfo("Tokka & Rahzar, Terrible Twos", 171, Rarity.RARE, mage.cards.t.TokkaAndRahzarTerribleTwos.class)); cards.add(new SetCardInfo("Transdimensional Bovine", 134, Rarity.RARE, mage.cards.t.TransdimensionalBovine.class)); cards.add(new SetCardInfo("Triceraton Commander", 25, Rarity.MYTHIC, mage.cards.t.TriceratonCommander.class)); + cards.add(new SetCardInfo("Turncoat Kunoichi", 26, Rarity.RARE, mage.cards.t.TurncoatKunoichi.class)); cards.add(new SetCardInfo("Turtle Power!", 135, Rarity.RARE, mage.cards.t.TurtlePower.class)); cards.add(new SetCardInfo("Turtle Van", 181, Rarity.RARE, mage.cards.t.TurtleVan.class)); cards.add(new SetCardInfo("Weather Maker", 182, Rarity.RARE, mage.cards.w.WeatherMaker.class)); diff --git a/Mage/src/main/java/mage/abilities/condition/common/SneakCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SneakCondition.java new file mode 100644 index 00000000000..f97c9e42593 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/SneakCondition.java @@ -0,0 +1,26 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.keyword.SneakAbility; +import mage.game.Game; +import mage.util.CardUtil; + +/** + * Checks if the spell was cast with the sneak cost + * + * @author TheElk801 + */ +public enum SneakCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + return CardUtil.checkSourceCostsTagExists(game, source, SneakAbility.SNEAK_ACTIVATION_VALUE_KEY); + } + + @Override + public String toString() { + return "sneak cost was paid"; + } +}