From 287e25b28f6bcc67fbda9bc18de263bd040b8e54 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sun, 8 Oct 2023 07:41:01 +0200 Subject: [PATCH] [WHO] Implement Atraxi Warden, Bessie the Doctor's Roadster, Clockwork Droid, Crack in Time (#11271) * [WHO] Implement Atraxi Warden * [WHO] Implement Bessie, the Doctor's Roadster * [WHO] Implement Clockwork Droid * [WHO] Implement Crack in Time --- Mage.Sets/src/mage/cards/a/AtraxiWarden.java | 60 +++++++++++++++++++ .../cards/b/BessieTheDoctorsRoadster.java | 60 +++++++++++++++++++ .../src/mage/cards/c/ClockworkDroid.java | 44 ++++++++++++++ Mage.Sets/src/mage/cards/c/CrackInTime.java | 55 +++++++++++++++++ Mage.Sets/src/mage/sets/DoctorWho.java | 4 ++ 5 files changed, 223 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AtraxiWarden.java create mode 100644 Mage.Sets/src/mage/cards/b/BessieTheDoctorsRoadster.java create mode 100644 Mage.Sets/src/mage/cards/c/ClockworkDroid.java create mode 100644 Mage.Sets/src/mage/cards/c/CrackInTime.java diff --git a/Mage.Sets/src/mage/cards/a/AtraxiWarden.java b/Mage.Sets/src/mage/cards/a/AtraxiWarden.java new file mode 100644 index 00000000000..00c4b0e3474 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AtraxiWarden.java @@ -0,0 +1,60 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.SuspendAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class AtraxiWarden extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature"); + + static { + filter.add(TappedPredicate.TAPPED); + } + + + public AtraxiWarden(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); + + this.subtype.add(SubType.ALIEN); + this.subtype.add(SubType.EYE); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Atraxi Warden enters the battlefield, exile up to one target tapped creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetEffect()); + ability.addTarget(new TargetCreaturePermanent(0, 1, filter, false)); + this.addAbility(ability); + + // Suspend 5--{1}{W} + this.addAbility(new SuspendAbility(5, new ManaCostsImpl<>("{1}{W}"), this)); + } + + private AtraxiWarden(final AtraxiWarden card) { + super(card); + } + + @Override + public AtraxiWarden copy() { + return new AtraxiWarden(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BessieTheDoctorsRoadster.java b/Mage.Sets/src/mage/cards/b/BessieTheDoctorsRoadster.java new file mode 100644 index 00000000000..e4d53e394d4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BessieTheDoctorsRoadster.java @@ -0,0 +1,60 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; +import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class BessieTheDoctorsRoadster extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target legendary creature"); + + static { + filter.add(SuperType.LEGENDARY.getPredicate()); + filter.add(AnotherPredicate.instance); + } + + public BessieTheDoctorsRoadster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.VEHICLE); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Whenever Bessie attacks, another target legendary creature can't be blocked this turn. + Ability ability = new AttacksTriggeredAbility(new CantBeBlockedTargetEffect()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + + // Crew 2 + this.addAbility(new CrewAbility(2)); + } + + private BessieTheDoctorsRoadster(final BessieTheDoctorsRoadster card) { + super(card); + } + + @Override + public BessieTheDoctorsRoadster copy() { + return new BessieTheDoctorsRoadster(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/ClockworkDroid.java b/Mage.Sets/src/mage/cards/c/ClockworkDroid.java new file mode 100644 index 00000000000..535308912bb --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ClockworkDroid.java @@ -0,0 +1,44 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.common.BecomesExertSourceTriggeredAbility; +import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.keyword.ExertAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class ClockworkDroid extends CardImpl { + + public ClockworkDroid(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{2}"); + + this.subtype.add(SubType.ROBOT); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // You may exert Clockwork Droid as it attacks. When you do, it can't be blocked this turn and you scry 1. + BecomesExertSourceTriggeredAbility trigger = new BecomesExertSourceTriggeredAbility( + new CantBeBlockedSourceEffect(Duration.EndOfTurn) + ); + trigger.addEffect(new ScryEffect(1).concatBy("and")); + this.addAbility(new ExertAbility(trigger)); + } + + private ClockworkDroid(final ClockworkDroid card) { + super(card); + } + + @Override + public ClockworkDroid copy() { + return new ClockworkDroid(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CrackInTime.java b/Mage.Sets/src/mage/cards/c/CrackInTime.java new file mode 100644 index 00000000000..8f027152de3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrackInTime.java @@ -0,0 +1,55 @@ +package mage.cards.c; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfPreCombatMainTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VanishingSacrificeAbility; +import mage.abilities.keyword.VanishingUpkeepAbility; +import mage.abilities.meta.OrTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class CrackInTime extends CardImpl { + + public CrackInTime(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + + // Vanishing 3 + Ability ability = new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.TIME.createInstance(3))); + ability.setRuleVisible(false); + this.addAbility(ability); + this.addAbility(new VanishingUpkeepAbility(3)); + this.addAbility(new VanishingSacrificeAbility()); + + // When Crack in Time enters the battlefield and at the beginning of your precombat main phase, exile target creature an opponent controls until Crack in Time leaves the battlefield. + ability = new OrTriggeredAbility(Zone.BATTLEFIELD, new ExileUntilSourceLeavesEffect(), + new EntersBattlefieldTriggeredAbility(null), + new BeginningOfPreCombatMainTriggeredAbility(null, TargetController.YOU, false) + ); + ability.addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); + this.addAbility(ability); + } + + private CrackInTime(final CrackInTime card) { + super(card); + } + + @Override + public CrackInTime copy() { + return new CrackInTime(this); + } +} diff --git a/Mage.Sets/src/mage/sets/DoctorWho.java b/Mage.Sets/src/mage/sets/DoctorWho.java index 417b2eef343..dd1ed7759ed 100644 --- a/Mage.Sets/src/mage/sets/DoctorWho.java +++ b/Mage.Sets/src/mage/sets/DoctorWho.java @@ -22,8 +22,10 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("As Foretold", 214, Rarity.RARE, mage.cards.a.AsForetold.class)); cards.add(new SetCardInfo("Ash Barrens", 257, Rarity.UNCOMMON, mage.cards.a.AshBarrens.class)); cards.add(new SetCardInfo("Astrid Peth", 11, Rarity.RARE, mage.cards.a.AstridPeth.class)); + cards.add(new SetCardInfo("Atraxi Warden", 12, Rarity.UNCOMMON, mage.cards.a.AtraxiWarden.class)); cards.add(new SetCardInfo("Banish to Another Universe", 13, Rarity.UNCOMMON, mage.cards.b.BanishToAnotherUniverse.class)); cards.add(new SetCardInfo("Beast Within", 228, Rarity.UNCOMMON, mage.cards.b.BeastWithin.class)); + cards.add(new SetCardInfo("Bessie, the Doctor's Roadster", 171, Rarity.RARE, mage.cards.b.BessieTheDoctorsRoadster.class)); cards.add(new SetCardInfo("Blasphemous Act", 224, Rarity.RARE, mage.cards.b.BlasphemousAct.class)); cards.add(new SetCardInfo("Canopy Vista", 258, Rarity.RARE, mage.cards.c.CanopyVista.class)); cards.add(new SetCardInfo("Canyon Slough", 259, Rarity.RARE, mage.cards.c.CanyonSlough.class)); @@ -34,8 +36,10 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Cinder Glade", 262, Rarity.RARE, mage.cards.c.CinderGlade.class)); cards.add(new SetCardInfo("City of Death", 99, Rarity.RARE, mage.cards.c.CityOfDeath.class)); cards.add(new SetCardInfo("Clockspinning", 215, Rarity.COMMON, mage.cards.c.Clockspinning.class)); + cards.add(new SetCardInfo("Clockwork Droid", 172, Rarity.UNCOMMON, mage.cards.c.ClockworkDroid.class)); cards.add(new SetCardInfo("Command Tower", 263, Rarity.COMMON, mage.cards.c.CommandTower.class)); cards.add(new SetCardInfo("Commander's Sphere", 240, Rarity.COMMON, mage.cards.c.CommandersSphere.class)); + cards.add(new SetCardInfo("Crack in Time", 16, Rarity.RARE, mage.cards.c.CrackInTime.class)); cards.add(new SetCardInfo("Creeping Tar Pit", 267, Rarity.RARE, mage.cards.c.CreepingTarPit.class)); cards.add(new SetCardInfo("Crisis of Conscience", 17, Rarity.RARE, mage.cards.c.CrisisOfConscience.class)); cards.add(new SetCardInfo("Crumbling Necropolis", 268, Rarity.UNCOMMON, mage.cards.c.CrumblingNecropolis.class));