From 28bfa88be1688d11a2c78e20c33bfee4c14fa04e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 12:40:22 -0400 Subject: [PATCH 01/11] Implemented Karn's Bastion --- Mage.Sets/src/mage/cards/k/KarnsBastion.java | 40 ++++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KarnsBastion.java diff --git a/Mage.Sets/src/mage/cards/k/KarnsBastion.java b/Mage.Sets/src/mage/cards/k/KarnsBastion.java new file mode 100644 index 0000000000..c57110985f --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KarnsBastion.java @@ -0,0 +1,40 @@ +package mage.cards.k; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.counter.ProliferateEffect; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KarnsBastion extends CardImpl { + + public KarnsBastion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {4}, {T}: Proliferate. + Ability ability = new SimpleActivatedAbility(new ProliferateEffect(), new GenericManaCost(4)); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private KarnsBastion(final KarnsBastion card) { + super(card); + } + + @Override + public KarnsBastion copy() { + return new KarnsBastion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 4d18dbdd66..18f30a2d6e 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -43,6 +43,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Island", 254, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 255, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jace, Wielder of Mysteries", 54, Rarity.RARE, mage.cards.j.JaceWielderOfMysteries.class)); + cards.add(new SetCardInfo("Karn's Bastion", 248, Rarity.RARE, mage.cards.k.KarnsBastion.class)); cards.add(new SetCardInfo("Liliana, Dreadhorde General", 97, Rarity.MYTHIC, mage.cards.l.LilianaDreadhordeGeneral.class)); cards.add(new SetCardInfo("Mountain", 259, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 260, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); From f4f89222bd1fae004b4fcdabeb1e9f027a6d6f40 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 12:41:32 -0400 Subject: [PATCH 02/11] Implemented Naga Eternal --- Mage.Sets/src/mage/cards/n/NagaEternal.java | 33 +++++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 34 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NagaEternal.java diff --git a/Mage.Sets/src/mage/cards/n/NagaEternal.java b/Mage.Sets/src/mage/cards/n/NagaEternal.java new file mode 100644 index 0000000000..4652ca3e8f --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NagaEternal.java @@ -0,0 +1,33 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NagaEternal extends CardImpl { + + public NagaEternal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.NAGA); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + } + + private NagaEternal(final NagaEternal card) { + super(card); + } + + @Override + public NagaEternal copy() { + return new NagaEternal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 18f30a2d6e..e20fe7cd9a 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -48,6 +48,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Mountain", 259, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 260, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 261, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Naga Eternal", 60, Rarity.COMMON, mage.cards.n.NagaEternal.class)); cards.add(new SetCardInfo("No Escape", 63, Rarity.COMMON, mage.cards.n.NoEscape.class)); cards.add(new SetCardInfo("Ob Nixilis's Cruelty", 101, Rarity.COMMON, mage.cards.o.ObNixilissCruelty.class)); cards.add(new SetCardInfo("Ob Nixilis, the Hate-Twisted", 100, Rarity.UNCOMMON, mage.cards.o.ObNixilisTheHateTwisted.class)); From 86e0ea1d87c45735934841234a6335180251a015 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 12:45:36 -0400 Subject: [PATCH 03/11] Implemented Wanderer's Strike --- .../src/mage/cards/w/WanderersStrike.java | 38 +++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 39 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WanderersStrike.java diff --git a/Mage.Sets/src/mage/cards/w/WanderersStrike.java b/Mage.Sets/src/mage/cards/w/WanderersStrike.java new file mode 100644 index 0000000000..1948747209 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WanderersStrike.java @@ -0,0 +1,38 @@ +package mage.cards.w; + +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.counter.ProliferateEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WanderersStrike extends CardImpl { + + public WanderersStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}"); + + + // Exile target creature, then proliferate. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addEffect(new ProliferateEffect().setText( + "then proliferate (Choose any number of permanents and/or players, " + + "then give each another counter of each kind already there.)" + )); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private WanderersStrike(final WanderersStrike card) { + super(card); + } + + @Override + public WanderersStrike copy() { + return new WanderersStrike(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index e20fe7cd9a..9a11a4a8a3 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -67,6 +67,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Time Wipe", 223, Rarity.RARE, mage.cards.t.TimeWipe.class)); cards.add(new SetCardInfo("Vraska's Finisher", 112, Rarity.COMMON, mage.cards.v.VraskasFinisher.class)); cards.add(new SetCardInfo("Vraska, Swarm's Eminence", 236, Rarity.UNCOMMON, mage.cards.v.VraskaSwarmsEminence.class)); + cards.add(new SetCardInfo("Wanderer's Strike", 38, Rarity.COMMON, mage.cards.w.WanderersStrike.class)); cards.add(new SetCardInfo("Widespread Brutality", 226, Rarity.RARE, mage.cards.w.WidespreadBrutality.class)); } } From d0c4967067ae9621d6c8aebe8431d5bdb69e06a4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 12:50:25 -0400 Subject: [PATCH 04/11] Implemented Samut's Sprint --- Mage.Sets/src/mage/cards/s/SamutsSprint.java | 42 ++++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 43 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SamutsSprint.java diff --git a/Mage.Sets/src/mage/cards/s/SamutsSprint.java b/Mage.Sets/src/mage/cards/s/SamutsSprint.java new file mode 100644 index 0000000000..28862ab573 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SamutsSprint.java @@ -0,0 +1,42 @@ +package mage.cards.s; + +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SamutsSprint extends CardImpl { + + public SamutsSprint(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}"); + + // Target creature gets +2/+1 and gains haste until end of turn. Scry 1. + this.getSpellAbility().addEffect(new BoostTargetEffect( + 2, 1, Duration.EndOfTurn + ).setText("target creature gets +2/+1")); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect( + HasteAbility.getInstance(), Duration.EndOfTurn + ).setText("and gains haste until end of turn.")); + this.getSpellAbility().addEffect(new ScryEffect(1)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private SamutsSprint(final SamutsSprint card) { + super(card); + } + + @Override + public SamutsSprint copy() { + return new SamutsSprint(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 9a11a4a8a3..fe4e7b72a3 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -58,6 +58,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Plains", 252, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ravnica at War", 28, Rarity.RARE, mage.cards.r.RavnicaAtWar.class)); cards.add(new SetCardInfo("Relentless Advance", 64, Rarity.COMMON, mage.cards.r.RelentlessAdvance.class)); + cards.add(new SetCardInfo("Samut's Sprint", 142, Rarity.COMMON, mage.cards.s.SamutsSprint.class)); cards.add(new SetCardInfo("Swamp", 256, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 257, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 258, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); From 56c459c0ff96aa19cf8667a114b6a42aca33478f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 12:56:10 -0400 Subject: [PATCH 05/11] Implemented Samut, Tyrant Smasher --- .../src/mage/cards/s/SamutTyrantSmasher.java | 61 +++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 62 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SamutTyrantSmasher.java diff --git a/Mage.Sets/src/mage/cards/s/SamutTyrantSmasher.java b/Mage.Sets/src/mage/cards/s/SamutTyrantSmasher.java new file mode 100644 index 0000000000..8340be7acc --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SamutTyrantSmasher.java @@ -0,0 +1,61 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SamutTyrantSmasher extends CardImpl { + + public SamutTyrantSmasher(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R/G}{R/G}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.SAMUT); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5)); + + // Creatures you control have haste. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.WhileOnBattlefield, + StaticFilters.FILTER_PERMANENT_CREATURES + ))); + + // -1: Target creature gets +2/+1 and gains haste until end of turn. Scry 1. + Ability ability = new LoyaltyAbility(new BoostTargetEffect( + 2, 1, Duration.EndOfTurn + ).setText("target creature gets +2/+1"), -1); + ability.addEffect(new GainAbilityTargetEffect( + HasteAbility.getInstance(), Duration.EndOfTurn + ).setText("and gains haste until end of turn.")); + ability.addEffect(new ScryEffect(1)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + private SamutTyrantSmasher(final SamutTyrantSmasher card) { + super(card); + } + + @Override + public SamutTyrantSmasher copy() { + return new SamutTyrantSmasher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index fe4e7b72a3..330e342bea 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -59,6 +59,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Ravnica at War", 28, Rarity.RARE, mage.cards.r.RavnicaAtWar.class)); cards.add(new SetCardInfo("Relentless Advance", 64, Rarity.COMMON, mage.cards.r.RelentlessAdvance.class)); cards.add(new SetCardInfo("Samut's Sprint", 142, Rarity.COMMON, mage.cards.s.SamutsSprint.class)); + cards.add(new SetCardInfo("Samut, Tyrant Smasher", 235, Rarity.UNCOMMON, mage.cards.s.SamutTyrantSmasher.class)); cards.add(new SetCardInfo("Swamp", 256, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 257, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swamp", 258, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); From 262b29897ddc419bc4c1fc9a1ec2425c11393d4c Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 12:59:58 -0400 Subject: [PATCH 06/11] Implemented Kiora, Behemoth Beckoner --- .../mage/cards/k/KioraBehemothBeckoner.java | 57 +++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KioraBehemothBeckoner.java diff --git a/Mage.Sets/src/mage/cards/k/KioraBehemothBeckoner.java b/Mage.Sets/src/mage/cards/k/KioraBehemothBeckoner.java new file mode 100644 index 0000000000..4e2483500a --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KioraBehemothBeckoner.java @@ -0,0 +1,57 @@ +package mage.cards.k; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KioraBehemothBeckoner extends CardImpl { + + private static final FilterPermanent filter + = new FilterCreaturePermanent("a creature with power 4 or greater"); + + static { + filter.add(new PowerPredicate(ComparisonType.MORE_THAN, 3)); + } + + public KioraBehemothBeckoner(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{G/U}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.KIORA); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(7)); + + // Whenever a creature with power 4 or greater enters the battlefield under your control, draw a card. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility( + Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), filter, false + )); + + // -1: Untap target permanent. + Ability ability = new LoyaltyAbility(new UntapTargetEffect(), -1); + ability.addTarget(new TargetPermanent()); + this.addAbility(ability); + } + + private KioraBehemothBeckoner(final KioraBehemothBeckoner card) { + super(card); + } + + @Override + public KioraBehemothBeckoner copy() { + return new KioraBehemothBeckoner(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 330e342bea..73388a27ca 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -44,6 +44,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Island", 255, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jace, Wielder of Mysteries", 54, Rarity.RARE, mage.cards.j.JaceWielderOfMysteries.class)); cards.add(new SetCardInfo("Karn's Bastion", 248, Rarity.RARE, mage.cards.k.KarnsBastion.class)); + cards.add(new SetCardInfo("Kiora, Behemoth Beckoner", 232, Rarity.UNCOMMON, mage.cards.k.KioraBehemothBeckoner.class)); cards.add(new SetCardInfo("Liliana, Dreadhorde General", 97, Rarity.MYTHIC, mage.cards.l.LilianaDreadhordeGeneral.class)); cards.add(new SetCardInfo("Mountain", 259, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 260, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); From 8f36dc3a8ca6e7dfb9ee4656e25a4d457b2f5798 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 13:02:52 -0400 Subject: [PATCH 07/11] Implemented Dovin's Veto --- Mage.Sets/src/mage/cards/d/DovinsVeto.java | 41 ++++++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DovinsVeto.java diff --git a/Mage.Sets/src/mage/cards/d/DovinsVeto.java b/Mage.Sets/src/mage/cards/d/DovinsVeto.java new file mode 100644 index 0000000000..2abe0030c5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DovinsVeto.java @@ -0,0 +1,41 @@ +package mage.cards.d; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CantBeCounteredSourceEffect; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.TargetSpell; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DovinsVeto extends CardImpl { + + public DovinsVeto(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}{U}"); + + // This spell can't be countered. + this.addAbility(new SimpleStaticAbility( + Zone.STACK, new CantBeCounteredSourceEffect() + ).setRuleAtTheTop(true)); + + // Counter target noncreature spell. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_NON_CREATURE)); + } + + private DovinsVeto(final DovinsVeto card) { + super(card); + } + + @Override + public DovinsVeto copy() { + return new DovinsVeto(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 73388a27ca..449044061f 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -29,6 +29,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Arlinn, Voice of the Pack", 150, Rarity.UNCOMMON, mage.cards.a.ArlinnVoiceOfThePack.class)); cards.add(new SetCardInfo("Augur of Bolas", 41, Rarity.UNCOMMON, mage.cards.a.AugurOfBolas.class)); cards.add(new SetCardInfo("Crush Dissent", 47, Rarity.COMMON, mage.cards.c.CrushDissent.class)); + cards.add(new SetCardInfo("Dovin's Veto", 193, Rarity.COMMON, mage.cards.d.DovinsVeto.class)); cards.add(new SetCardInfo("Dreadhorde Invasion", 86, Rarity.RARE, mage.cards.d.DreadhordeInvasion.class)); cards.add(new SetCardInfo("Emergence Zone", 245, Rarity.UNCOMMON, mage.cards.e.EmergenceZone.class)); cards.add(new SetCardInfo("Flux Channeler", 52, Rarity.UNCOMMON, mage.cards.f.FluxChanneler.class)); From b788b2f865a611fb88b93cf420d7bc77aedc246f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 13:05:23 -0400 Subject: [PATCH 08/11] Implemented Honor the God-Pharaoh --- .../src/mage/cards/h/HonorTheGodPharaoh.java | 36 +++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java diff --git a/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java b/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java new file mode 100644 index 0000000000..1f8f365df0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java @@ -0,0 +1,36 @@ +package mage.cards.h; + +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.keyword.AmassEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HonorTheGodPharaoh extends CardImpl { + + public HonorTheGodPharaoh(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}"); + + // As an additional cost to cast this spell, discard a card. + this.getSpellAbility().addCost(new DiscardCardCost(false)); + + // Draw two cards. Amass 1. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2).setText("draw two cards.")); + this.getSpellAbility().addEffect(new AmassEffect(1)); + } + + private HonorTheGodPharaoh(final HonorTheGodPharaoh card) { + super(card); + } + + @Override + public HonorTheGodPharaoh copy() { + return new HonorTheGodPharaoh(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 449044061f..54fced08e0 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -37,6 +37,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Forest", 263, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Herald of the Dreadhorde", 93, Rarity.COMMON, mage.cards.h.HeraldOfTheDreadhorde.class)); + cards.add(new SetCardInfo("Honor the God-Pharaoh", 132, Rarity.COMMON, mage.cards.h.HonorTheGodPharaoh.class)); cards.add(new SetCardInfo("Ignite the Beacon", 18, Rarity.RARE, mage.cards.i.IgniteTheBeacon.class)); cards.add(new SetCardInfo("Interplanar Beacon", 247, Rarity.UNCOMMON, mage.cards.i.InterplanarBeacon.class)); cards.add(new SetCardInfo("Invade the City", 201, Rarity.UNCOMMON, mage.cards.i.InvadeTheCity.class)); From 2e902d0bf13baea8d094a68072349a30f5a3b96b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 13:08:04 -0400 Subject: [PATCH 09/11] Implemented Erratic Visionary --- .../src/mage/cards/e/ErraticVisionary.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/ErraticVisionary.java diff --git a/Mage.Sets/src/mage/cards/e/ErraticVisionary.java b/Mage.Sets/src/mage/cards/e/ErraticVisionary.java new file mode 100644 index 0000000000..8ae0c49a79 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ErraticVisionary.java @@ -0,0 +1,45 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ErraticVisionary extends CardImpl { + + public ErraticVisionary(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // {1}{U}, {T}: Draw a card, then discard a card. + Ability ability = new SimpleActivatedAbility( + new DrawDiscardControllerEffect(), new ManaCostsImpl("{1}{U}") + ); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private ErraticVisionary(final ErraticVisionary card) { + super(card); + } + + @Override + public ErraticVisionary copy() { + return new ErraticVisionary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index 54fced08e0..a0a7de6418 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -32,6 +32,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Dovin's Veto", 193, Rarity.COMMON, mage.cards.d.DovinsVeto.class)); cards.add(new SetCardInfo("Dreadhorde Invasion", 86, Rarity.RARE, mage.cards.d.DreadhordeInvasion.class)); cards.add(new SetCardInfo("Emergence Zone", 245, Rarity.UNCOMMON, mage.cards.e.EmergenceZone.class)); + cards.add(new SetCardInfo("Erratic Visionary", 48, Rarity.COMMON, mage.cards.e.ErraticVisionary.class)); cards.add(new SetCardInfo("Flux Channeler", 52, Rarity.UNCOMMON, mage.cards.f.FluxChanneler.class)); cards.add(new SetCardInfo("Forest", 262, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 263, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); From c863de4044bda2db34bc7e79ea0fd5cbcba642a0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 13:11:19 -0400 Subject: [PATCH 10/11] Implemented Burning Prophet --- .../src/mage/cards/b/BurningProphet.java | 49 +++++++++++++++++++ Mage.Sets/src/mage/sets/WarOfTheSpark.java | 1 + 2 files changed, 50 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BurningProphet.java diff --git a/Mage.Sets/src/mage/cards/b/BurningProphet.java b/Mage.Sets/src/mage/cards/b/BurningProphet.java new file mode 100644 index 0000000000..99085c2af7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BurningProphet.java @@ -0,0 +1,49 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.keyword.ScryEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BurningProphet extends CardImpl { + + public BurningProphet(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Whenever you cast a noncreature spell, Burning Prophet gets +1/+0 until end of turn, then scry 1. + Ability ability = new SpellCastControllerTriggeredAbility( + new BoostSourceEffect( + 1, 0, Duration.EndOfTurn + ).setText("{this} gets +1/+0 until end of turn, then"), + StaticFilters.FILTER_SPELL_NON_CREATURE, false + ); + ability.addEffect(new ScryEffect(1)); + this.addAbility(ability); + } + + private BurningProphet(final BurningProphet card) { + super(card); + } + + @Override + public BurningProphet copy() { + return new BurningProphet(this); + } +} diff --git a/Mage.Sets/src/mage/sets/WarOfTheSpark.java b/Mage.Sets/src/mage/sets/WarOfTheSpark.java index a0a7de6418..7bcd6614f4 100644 --- a/Mage.Sets/src/mage/sets/WarOfTheSpark.java +++ b/Mage.Sets/src/mage/sets/WarOfTheSpark.java @@ -28,6 +28,7 @@ public final class WarOfTheSpark extends ExpansionSet { cards.add(new SetCardInfo("Arlinn's Wolf", 151, Rarity.COMMON, mage.cards.a.ArlinnsWolf.class)); cards.add(new SetCardInfo("Arlinn, Voice of the Pack", 150, Rarity.UNCOMMON, mage.cards.a.ArlinnVoiceOfThePack.class)); cards.add(new SetCardInfo("Augur of Bolas", 41, Rarity.UNCOMMON, mage.cards.a.AugurOfBolas.class)); + cards.add(new SetCardInfo("Burning Prophet", 117, Rarity.COMMON, mage.cards.b.BurningProphet.class)); cards.add(new SetCardInfo("Crush Dissent", 47, Rarity.COMMON, mage.cards.c.CrushDissent.class)); cards.add(new SetCardInfo("Dovin's Veto", 193, Rarity.COMMON, mage.cards.d.DovinsVeto.class)); cards.add(new SetCardInfo("Dreadhorde Invasion", 86, Rarity.RARE, mage.cards.d.DreadhordeInvasion.class)); From 461480b7c1d143d3d374502768f67942ddafa0e1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 1 Apr 2019 13:12:21 -0400 Subject: [PATCH 11/11] updated WAR spoiler --- Utils/mtg-cards-data.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 6c2e54450a..56dbb2a905 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34852,6 +34852,7 @@ The Haunt of Hightower|Ravnica Allegiance|273|M|{4}{B}{B}|Legendary Creature - V Serra the Benevolent|Modern Horizons|26|M|{2}{W}{W}|Legendary Planeswalker - Serra|4|+2: Creatures you control with flying get +1/+1 until end of turn.$-3: Create a 4/4 white Angel creature token with flying and vigilance.$-6: You get an emblem with "If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead."| Cabal Therapist|Modern Horizons|80|R|{B}|Creature - Horror|1|1|Menace$At the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name.| Ajani's Pridemate|War of the Spark|4|U|{1}{W}|Creature - Cat Soldier|2|2|Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate.| +Gideon's Triumph|War of the Spark|15|U|{1}{W}|Instant|||Target opponent sacrifices a creature that attacked or blocked this turn. If you control a Gideon planeswalker, that player sacrifices two of those creatures instead.| Ignite the Beacon|War of the Spark|18|R|{4}{W}|Instant|||Search your library for up to to two planeswalker cards, reveal them, put them into your hand, then shuffle your library.| Ravnica at War|War of the Spark|28|R|{3}{W}|Sorcery|||Exile all multicolored permanents.| Rising Populace|War of the Spark|29|C|{2}{W}|Creature - Human|2|2|Whenever another creature or planeswalker you control dies, put a +1/+1 counter on Rising Populace.|