From 0b1352f5c956e977f7a123a8fc80f32ab9dbba4e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 11 Sep 2020 13:14:19 -0400 Subject: [PATCH] [ZNR] Implemented Thieving Skydiver --- .../src/mage/cards/t/ThievingSkydiver.java | 121 ++++++++++++++++++ Mage.Sets/src/mage/sets/ZendikarRising.java | 1 + 2 files changed, 122 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/ThievingSkydiver.java diff --git a/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java b/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java new file mode 100644 index 00000000000..bb5e7de48f0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThievingSkydiver.java @@ -0,0 +1,121 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.KickedCondition; +import mage.abilities.costs.VariableCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.costs.mana.VariableManaCost; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.dynamicvalue.common.GetKickerXValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.KickerAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ThievingSkydiver extends CardImpl { + + public ThievingSkydiver(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Kicker {X}. X can't be 0. + Ability ability = new KickerAbility(new ManaCostsImpl<>("{X}")); + for (VariableCost cost : ability.getManaCosts().getVariableCosts()) { + if (cost instanceof VariableManaCost) { + ((VariableManaCost) cost).setMinX(1); + break; + } + } + this.addAbility(ability); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Thieving Skydiver enters the battlefield, if it was kicked, gain control of target artifact with converted mana cost X or less. If that artifact is an Equipment, attach it to Thieving Skydiver. + ability = new ConditionalInterveningIfTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new GainControlTargetEffect(Duration.Custom), false), + KickedCondition.instance, "When {this} enters the battlefield, if it was kicked, " + + "gain control of target artifact with converted mana cost X or less. " + + "If that artifact is an Equipment, attach it to {this}." + ); + ability.addEffect(new ThievingSkydiverEffect()); + ability.setTargetAdjuster(ThievingSkydiverAdjuster.instance); + this.addAbility(ability); + } + + private ThievingSkydiver(final ThievingSkydiver card) { + super(card); + } + + @Override + public ThievingSkydiver copy() { + return new ThievingSkydiver(this); + } +} + +enum ThievingSkydiverAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + int xValue = GetKickerXValue.instance.calculate(game, ability, null); + FilterPermanent filter = new FilterArtifactPermanent( + "artifact with converted mana cost " + xValue + " or less" + ); + filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1)); + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(filter)); + } +} + +class ThievingSkydiverEffect extends OneShotEffect { + + ThievingSkydiverEffect() { + super(Outcome.Benefit); + } + + private ThievingSkydiverEffect(final ThievingSkydiverEffect effect) { + super(effect); + } + + @Override + public ThievingSkydiverEffect copy() { + return new ThievingSkydiverEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + Permanent artifact = game.getPermanent(source.getFirstTarget()); + if (permanent == null + || artifact == null + || !artifact.isArtifact() + || !artifact.hasSubtype(SubType.EQUIPMENT, game)) { + return false; + } + game.applyEffects(); + artifact.attachTo(permanent.getId(), game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/ZendikarRising.java b/Mage.Sets/src/mage/sets/ZendikarRising.java index 12cf43730c4..589a4b00d69 100644 --- a/Mage.Sets/src/mage/sets/ZendikarRising.java +++ b/Mage.Sets/src/mage/sets/ZendikarRising.java @@ -366,6 +366,7 @@ public final class ZendikarRising extends ExpansionSet { cards.add(new SetCardInfo("Tazri, Beacon of Unity", 44, Rarity.MYTHIC, mage.cards.t.TazriBeaconOfUnity.class)); cards.add(new SetCardInfo("Teeterpeak Ambusher", 169, Rarity.COMMON, mage.cards.t.TeeterpeakAmbusher.class)); cards.add(new SetCardInfo("Territorial Scythecat", 213, Rarity.COMMON, mage.cards.t.TerritorialScythecat.class)); + cards.add(new SetCardInfo("Thieving Skydiver", 85, Rarity.RARE, mage.cards.t.ThievingSkydiver.class)); cards.add(new SetCardInfo("Throne of Makindi", 265, Rarity.RARE, mage.cards.t.ThroneOfMakindi.class)); cards.add(new SetCardInfo("Thundering Rebuke", 170, Rarity.UNCOMMON, mage.cards.t.ThunderingRebuke.class)); cards.add(new SetCardInfo("Thundering Sparkmage", 171, Rarity.UNCOMMON, mage.cards.t.ThunderingSparkmage.class));