From 33efe86500d8ffb13f7b34c295735fc3edf6ae66 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 18:08:19 -0400 Subject: [PATCH 01/14] Implemented Throes of Chaos --- Mage.Sets/src/mage/cards/t/ThroesOfChaos.java | 34 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 35 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/ThroesOfChaos.java diff --git a/Mage.Sets/src/mage/cards/t/ThroesOfChaos.java b/Mage.Sets/src/mage/cards/t/ThroesOfChaos.java new file mode 100644 index 00000000000..4ec17e13bc4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThroesOfChaos.java @@ -0,0 +1,34 @@ +package mage.cards.t; + +import mage.abilities.keyword.CascadeAbility; +import mage.abilities.keyword.RetraceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ThroesOfChaos extends CardImpl { + + public ThroesOfChaos(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}"); + + // Cascade + this.addAbility(new CascadeAbility()); + + // Retrace + this.addAbility(new RetraceAbility(this)); + } + + private ThroesOfChaos(final ThroesOfChaos card) { + super(card); + } + + @Override + public ThroesOfChaos copy() { + return new ThroesOfChaos(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index e393ba2c14f..937fc128c2f 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -149,6 +149,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Talisman of Resilience", 234, Rarity.UNCOMMON, mage.cards.t.TalismanOfResilience.class)); cards.add(new SetCardInfo("Tempered Sliver", 183, Rarity.UNCOMMON, mage.cards.t.TemperedSliver.class)); cards.add(new SetCardInfo("The First Sliver", 200, Rarity.MYTHIC, mage.cards.t.TheFirstSliver.class)); + cards.add(new SetCardInfo("Throes of Chaos", 150, Rarity.UNCOMMON, mage.cards.t.ThroesOfChaos.class)); cards.add(new SetCardInfo("Thundering Djinn", 215, Rarity.UNCOMMON, mage.cards.t.ThunderingDjinn.class)); cards.add(new SetCardInfo("Umezawa's Charm", 111, Rarity.COMMON, mage.cards.u.UmezawasCharm.class)); cards.add(new SetCardInfo("Undead Augur", 112, Rarity.UNCOMMON, mage.cards.u.UndeadAugur.class)); From 22658ff2cda680cbba85ea51564c4e2f00035750 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 18:32:07 -0400 Subject: [PATCH 02/14] Implemented Endling --- Mage.Sets/src/mage/cards/e/Endling.java | 107 ++++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 108 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/Endling.java diff --git a/Mage.Sets/src/mage/cards/e/Endling.java b/Mage.Sets/src/mage/cards/e/Endling.java new file mode 100644 index 00000000000..20aed35de9a --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/Endling.java @@ -0,0 +1,107 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.abilities.keyword.UndyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Endling extends CardImpl { + + public Endling(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {B}: Endling gains menace until end of turn. + this.addAbility(new SimpleActivatedAbility( + new GainAbilitySourceEffect( + new MenaceAbility(), + Duration.EndOfTurn + ), new ManaCostsImpl("{B}") + )); + + // {B}: Endling gains deathtouch until end of turn. + this.addAbility(new SimpleActivatedAbility( + new GainAbilitySourceEffect( + DeathtouchAbility.getInstance(), + Duration.EndOfTurn + ), new ManaCostsImpl("{B}") + )); + + // {B}: Endling gains undying until end of turn. + this.addAbility(new SimpleActivatedAbility( + new GainAbilitySourceEffect( + new UndyingAbility(), + Duration.EndOfTurn + ), new ManaCostsImpl("{B}") + )); + + // {1}: Endling gets +1/-1 or -1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility( + new EndlingEffect(), + new GenericManaCost(1) + )); + } + + private Endling(final Endling card) { + super(card); + } + + @Override + public Endling copy() { + return new Endling(this); + } +} + +class EndlingEffect extends OneShotEffect { + + EndlingEffect() { + super(Outcome.BoostCreature); + this.staticText = "{this} gets +1/-1 or -1/+1 until end of turn"; + } + + private EndlingEffect(final EndlingEffect effect) { + super(effect); + } + + @Override + public EndlingEffect copy() { + return new EndlingEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player == null || permanent == null) { + return false; + } + int boost = player.chooseUse(outcome, "Give +1/-1 or -1/+1?", null, "+1/-1", "-1/+1", source, game) ? 1 : -1; + game.addEffect(new BoostSourceEffect(boost, -1 * boost, Duration.EndOfTurn), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 937fc128c2f..2b436873f3f 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -52,6 +52,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Dregscape Sliver", 88, Rarity.UNCOMMON, mage.cards.d.DregscapeSliver.class)); cards.add(new SetCardInfo("Eladamri's Call", 197, Rarity.RARE, mage.cards.e.EladamrisCall.class)); cards.add(new SetCardInfo("Elvish Fury", 162, Rarity.COMMON, mage.cards.e.ElvishFury.class)); + cards.add(new SetCardInfo("Endling", 89, Rarity.RARE, mage.cards.e.Endling.class)); cards.add(new SetCardInfo("Enduring Sliver", 8, Rarity.COMMON, mage.cards.e.EnduringSliver.class)); cards.add(new SetCardInfo("Etchings of the Chosen", 198, Rarity.UNCOMMON, mage.cards.e.EtchingsOfTheChosen.class)); cards.add(new SetCardInfo("Exclude", 48, Rarity.UNCOMMON, mage.cards.e.Exclude.class)); From df6ba9fdb1220367d6872dc6ede7e4ebd48989be Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 18:38:26 -0400 Subject: [PATCH 03/14] Implemented On Thin Ice --- Mage.Sets/src/mage/cards/o/OnThinIce.java | 63 +++++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 64 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OnThinIce.java diff --git a/Mage.Sets/src/mage/cards/o/OnThinIce.java b/Mage.Sets/src/mage/cards/o/OnThinIce.java new file mode 100644 index 00000000000..93572c4d42f --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OnThinIce.java @@ -0,0 +1,63 @@ +package mage.cards.o; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.mageobject.SupertypePredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class OnThinIce extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledLandPermanent("snow land you control"); + + static { + filter.add(new SupertypePredicate(SuperType.SNOW)); + } + + public OnThinIce(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + + this.addSuperType(SuperType.SNOW); + this.subtype.add(SubType.AURA); + + // Enchant snow land you control + TargetPermanent auraTarget = new TargetPermanent(filter); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When On Thin Ice enters the battlefield, exile target creature an opponent controls until On Thin Ice leaves the battlefield. + ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect("creature")); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility())); + this.addAbility(ability); + } + + private OnThinIce(final OnThinIce card) { + super(card); + } + + @Override + public OnThinIce copy() { + return new OnThinIce(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 2b436873f3f..aa12580223d 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -106,6 +106,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Nether Spirit", 98, Rarity.RARE, mage.cards.n.NetherSpirit.class)); cards.add(new SetCardInfo("Nimble Mongoose", 174, Rarity.COMMON, mage.cards.n.NimbleMongoose.class)); cards.add(new SetCardInfo("Nurturing Peatland", 243, Rarity.RARE, mage.cards.n.NurturingPeatland.class)); + cards.add(new SetCardInfo("On Thin Ice", 20, Rarity.RARE, mage.cards.o.OnThinIce.class)); cards.add(new SetCardInfo("Orcish Hellraiser", 136, Rarity.COMMON, mage.cards.o.OrcishHellraiser.class)); cards.add(new SetCardInfo("Pillage", 139, Rarity.UNCOMMON, mage.cards.p.Pillage.class)); cards.add(new SetCardInfo("Plague Engineer", 100, Rarity.RARE, mage.cards.p.PlagueEngineer.class)); From 8e0200fd1e4dea4c0ba290ebb968b615eddc7cfc Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 18:52:21 -0400 Subject: [PATCH 04/14] Implemented Dead of WInter --- Mage.Sets/src/mage/cards/d/DeadOfWinter.java | 53 ++++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 54 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DeadOfWinter.java diff --git a/Mage.Sets/src/mage/cards/d/DeadOfWinter.java b/Mage.Sets/src/mage/cards/d/DeadOfWinter.java new file mode 100644 index 00000000000..4d635f93ce3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeadOfWinter.java @@ -0,0 +1,53 @@ +package mage.cards.d; + +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SupertypePredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DeadOfWinter extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + private static final FilterPermanent filter2 = new FilterControlledPermanent(); + + static { + filter.add(Predicates.not(new SupertypePredicate(SuperType.SNOW))); + filter2.add(new SupertypePredicate(SuperType.SNOW)); + } + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, -1); + + public DeadOfWinter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); + + // All nonsnow creatures get -X/-X until end of turn, where X is the number of snow permanents you control. + this.getSpellAbility().addEffect(new BoostAllEffect( + xValue, xValue, Duration.EndOfTurn, filter, false, + "All nonsnow creatures get -X/-X until end of turn," + + " where X is the number of snow permanents you control.", true + )); + } + + private DeadOfWinter(final DeadOfWinter card) { + super(card); + } + + @Override + public DeadOfWinter copy() { + return new DeadOfWinter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index aa12580223d..410b1065ea3 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -46,6 +46,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Collector Ouphe", 158, Rarity.RARE, mage.cards.c.CollectorOuphe.class)); cards.add(new SetCardInfo("Crashing Footfalls", 160, Rarity.RARE, mage.cards.c.CrashingFootfalls.class)); cards.add(new SetCardInfo("Crypt Rats", 84, Rarity.UNCOMMON, mage.cards.c.CryptRats.class)); + cards.add(new SetCardInfo("Dead of Winter", 85, Rarity.RARE, mage.cards.d.DeadOfWinter.class)); cards.add(new SetCardInfo("Deep Forest Hermit", 161, Rarity.RARE, mage.cards.d.DeepForestHermit.class)); cards.add(new SetCardInfo("Diabolic Edict", 87, Rarity.COMMON, mage.cards.d.DiabolicEdict.class)); cards.add(new SetCardInfo("Dismantling Blow", 5, Rarity.UNCOMMON, mage.cards.d.DismantlingBlow.class)); From c750228b3a05ddf703d40be9d3676bc8f476af29 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 19:06:09 -0400 Subject: [PATCH 05/14] Implemented Ruination Rioter --- .../src/mage/cards/r/RuinationRioter.java | 47 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 48 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RuinationRioter.java diff --git a/Mage.Sets/src/mage/cards/r/RuinationRioter.java b/Mage.Sets/src/mage/cards/r/RuinationRioter.java new file mode 100644 index 00000000000..ff3ff661538 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RuinationRioter.java @@ -0,0 +1,47 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RuinationRioter extends CardImpl { + + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_LAND); + + public RuinationRioter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{G}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.BERSERKER); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Ruination Rioter dies, you may have it deal damage to any target equal to the number of land cards in your graveyard. + Ability ability = new DiesTriggeredAbility( + new DamageTargetEffect(xValue).setText("you may have it deal damage to any target " + + "equal to the number of land cards in your graveyard."), true + ); + } + + private RuinationRioter(final RuinationRioter card) { + super(card); + } + + @Override + public RuinationRioter copy() { + return new RuinationRioter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 410b1065ea3..f19db9ebb84 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -119,6 +119,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Ranger-Captain of Eos", 21, Rarity.MYTHIC, mage.cards.r.RangerCaptainOfEos.class)); cards.add(new SetCardInfo("Ravenous Giant", 143, Rarity.UNCOMMON, mage.cards.r.RavenousGiant.class)); cards.add(new SetCardInfo("Regrowth", 175, Rarity.UNCOMMON, mage.cards.r.Regrowth.class)); + cards.add(new SetCardInfo("Ruination Rioter", 213, Rarity.UNCOMMON, mage.cards.r.RuinationRioter.class)); cards.add(new SetCardInfo("Savage Swipe", 178, Rarity.COMMON, mage.cards.s.SavageSwipe.class)); cards.add(new SetCardInfo("Scale Up", 179, Rarity.UNCOMMON, mage.cards.s.ScaleUp.class)); cards.add(new SetCardInfo("Scour All Possibilities", 67, Rarity.COMMON, mage.cards.s.ScourAllPossibilities.class)); From a2316f583edf2de1a54be0dd59817509e17e9f65 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 19:08:55 -0400 Subject: [PATCH 06/14] updated MH1 spoiler --- Utils/mtg-cards-data.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 8adc75d8381..b6db9708090 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -35192,6 +35192,7 @@ Planebound Accomplice|Modern Horizons|140|R|{2}{R}|Creature - Human Wizard|1|3|{ Pyrophobia|Modern Horizons|141|C|{1}{R}|Sorcery|||Pyrophobia deals 3 damage to target creature. Cowards can't block this turn.| Ravenous Giant|Modern Horizons|143|U|{2}{R}{R}|Creature - Giant|5|5|At the beginning of your upkeep, Ravenous Giant deals 1 damage to you.| Seasoned Pyromancer|Modern Horizons|145|M|{1}{R}{R}|Creature - Human Shaman|2|2|When Seasoned Pyromancer enters the battlefield, discard two cards, then draw two cards. For each nonland card discarded this way, create a 1/1 red Elemental creature token.${3}{R}{R}, Exile Seasoned Pyromancer from your graveyard: Create two 1/1 red Elemental creature tokens.| +Spiteful Sliver|Modern Horizons|148|R|{2}{R}|Creature - Sliver|2|2|Sliver creatures you control have "Whenever this creature is dealt damage, it deals that much damage to target player or planeswalker."| Throes of Chaos|Modern Horizons|150|U|{3}{R}|Sorcery|||Cascade$Retrace| Ayula, Queen Among Bears|Modern Horizons|155|R|{1}{G}|Legendary Creature - Bear|2|2|Whenever another Bear enters the battlefield under your control, choose one —$• Put two +1/+1 counters on target Bear.$• Target Bear you control fights target creature you don't control.| Ayula's Influence|Modern Horizons|156|R|{G}{G}{G}|Enchantment|||Discard a land card: Create a 2/2 green Bear creature token.| @@ -35203,6 +35204,7 @@ Force of Vigor|Modern Horizons|164|R|{2}{G}{G}|Instant|||If it's not your turn, Genesis|Modern Horizons|166|R|{4}{G}|Creature - Incarnation|4|4|At the beginning of your upkeep, if Genesis is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand.| Glacial Revelation|Modern Horizons|167|U|{2}{G}|Sorcery|||Reveal the top six cards of your library. You may put any number of snow permanent cards from among them into your hand. Put the rest into your graveyard.| Hexdrinker|Modern Horizons|168|M|{G}|Creature - Snake|2|1|Level up {1}$LEVEL 3-7$4/4$Protection from instants$LEVEL 8+$6/6$Protection from everything| +Llanowar Tribe|Modern Horizons|170|U|{G}{G}{G}|Creature - Elf Druid|3|3|{T}: Add {G}{G}{G}.| Mother Bear|Modern Horizons|171|C|{1}{G}|Creature - Bear|2|2|{3}{G}{G}, Exile Mother Bear from your graveyard: Create two 2/2 green Bear creature tokens. Activate this ability only any time you could cast a sorcery.| Nantuko Cultivator|Modern Horizons|173|U|{3}{G}|Creature - Insect Druid|2|2|When Nantuko Cultivator enters the battlefield, you may discard any number of land cards. Put that many +1/+1 counters on Nantuko Cultivator and draw that many cards.| Nimble Mongoose|Modern Horizons|174|C|{G}|Creature - Mongoose|1|1|Shroud$Threshold — Nimble Mongoose gets +2/+2 as long as seven or more cards are in your graveyard.| @@ -35238,6 +35240,7 @@ Wrenn and Six|Modern Horizons|217|M|{R}{G}|Legendary Planeswalker - Wrenn|3|+1: Altar of Dementia|Modern Horizons|218|R|{2}|Artifact|||Sacrifice a creature: Target player puts a number of cards equal to the sacrificed creature's power from the top of their library into their graveyard.| Arcum's Astrolabe|Modern Horizons|220|C|{S}|Snow Artifact|||({S} can be paid with one mana from a snow permanent.)$When Arcum's Astrolabe enters the battlefield, draw a card.${1}, {T}: Add one mana of any color.| Farmstead Gleaner|Modern Horizons|222|U|{3}|Artifact Creature - Scarecrow|2|2|Farmstead Gleaner doesn't untap during your untap step.${2}, {Q}: Put a +1/+1 counter on Farmstead Gleaner.| +Ice-Skin Golem|Modern Horizons|224|U|{S}|Snow Artifact Creature - Golem|2|2|({S} can be paid with one mana from a snow permanent.)| Lesser Masticore|Modern Horizons|225|U|{2}|Artifact Creature - Masticore|2|2|As an additional cost to cast this spell, discard a card.${4}: Lesser Masticore deals 1 damage to target creature.$Persist| Mox Tantalite|Modern Horizons|226|M||Artifact|||Suspend 3—{0}${T}: Add one mana of any color.| Scrapyard Recombiner|Modern Horizons|227|R|{3}|Artifact Creature - Construct|0|0|Modular 2${T}, Sacrifice an artifact: Search your library for a Construct card, reveal it, put it into your hand, then shuffle your library.| From 24876419c3778394ff20b89e2ec0f30ae11f462c Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 19:09:33 -0400 Subject: [PATCH 07/14] Implemented Ice-Skin Golem --- Mage.Sets/src/mage/cards/i/IceSkinGolem.java | 41 ++++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/i/IceSkinGolem.java diff --git a/Mage.Sets/src/mage/cards/i/IceSkinGolem.java b/Mage.Sets/src/mage/cards/i/IceSkinGolem.java new file mode 100644 index 00000000000..636817c08ee --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IceSkinGolem.java @@ -0,0 +1,41 @@ +package mage.cards.i; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.InfoEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class IceSkinGolem extends CardImpl { + + public IceSkinGolem(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{S}"); + + this.addSuperType(SuperType.SNOW); + this.subtype.add(SubType.GOLEM); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // ({S} can be paid with one mana from a snow permanent.) + this.addAbility(new SimpleStaticAbility( + new InfoEffect("({S} can be paid with one mana from a snow permanent.)") + )); + } + + private IceSkinGolem(final IceSkinGolem card) { + super(card); + } + + @Override + public IceSkinGolem copy() { + return new IceSkinGolem(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index f19db9ebb84..20499ed2a93 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -87,6 +87,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Hexdrinker", 168, Rarity.MYTHIC, mage.cards.h.Hexdrinker.class)); cards.add(new SetCardInfo("Hollowhead Sliver", 132, Rarity.UNCOMMON, mage.cards.h.HollowheadSliver.class)); cards.add(new SetCardInfo("Ice-Fang Coatl", 203, Rarity.RARE, mage.cards.i.IceFangCoatl.class)); + cards.add(new SetCardInfo("Ice-Skin Golem", 224, Rarity.UNCOMMON, mage.cards.i.IceSkinGolem.class)); cards.add(new SetCardInfo("Impostor of the Sixth Pride", 14, Rarity.COMMON, mage.cards.i.ImpostorOfTheSixthPride.class)); cards.add(new SetCardInfo("Ingenious Infiltrator", 204, Rarity.UNCOMMON, mage.cards.i.IngeniousInfiltrator.class)); cards.add(new SetCardInfo("Kaya's Guile", 205, Rarity.RARE, mage.cards.k.KayasGuile.class)); From 471549c58c7b987591ecfa477a6ee096e0391bef Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 19:13:41 -0400 Subject: [PATCH 08/14] Implemented Llanowar Tribe --- Mage.Sets/src/mage/cards/l/LlanowarTribe.java | 40 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LlanowarTribe.java diff --git a/Mage.Sets/src/mage/cards/l/LlanowarTribe.java b/Mage.Sets/src/mage/cards/l/LlanowarTribe.java new file mode 100644 index 00000000000..7036e2b1926 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LlanowarTribe.java @@ -0,0 +1,40 @@ +package mage.cards.l; + +import mage.MageInt; +import mage.Mana; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LlanowarTribe extends CardImpl { + + public LlanowarTribe(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{G}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {T}: Add {G}{G}{G}. + this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(3), new TapSourceCost())); + } + + private LlanowarTribe(final LlanowarTribe card) { + super(card); + } + + @Override + public LlanowarTribe copy() { + return new LlanowarTribe(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 20499ed2a93..9ae1d9c5c8a 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -97,6 +97,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Lavabelly Sliver", 207, Rarity.UNCOMMON, mage.cards.l.LavabellySliver.class)); cards.add(new SetCardInfo("Lesser Masticore", 225, Rarity.UNCOMMON, mage.cards.l.LesserMasticore.class)); cards.add(new SetCardInfo("Lightning Skelemental", 208, Rarity.RARE, mage.cards.l.LightningSkelemental.class)); + cards.add(new SetCardInfo("Llanowar Tribe", 170, Rarity.UNCOMMON, mage.cards.l.LlanowarTribe.class)); cards.add(new SetCardInfo("Man-o'-War", 55, Rarity.COMMON, mage.cards.m.ManOWar.class)); cards.add(new SetCardInfo("Martyr's Soul", 19, Rarity.COMMON, mage.cards.m.MartyrsSoul.class)); cards.add(new SetCardInfo("Morophon, the Boundless", 1, Rarity.MYTHIC, mage.cards.m.MorophonTheBoundless.class)); From 0b37ca81fc5d17cda6e4a996445951856d447c1a Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 19:16:06 -0400 Subject: [PATCH 09/14] Implemented Ore-Scale Guardian --- .../src/mage/cards/o/OreScaleGuardian.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 54 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OreScaleGuardian.java diff --git a/Mage.Sets/src/mage/cards/o/OreScaleGuardian.java b/Mage.Sets/src/mage/cards/o/OreScaleGuardian.java new file mode 100644 index 00000000000..cb8c54a0f6a --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OreScaleGuardian.java @@ -0,0 +1,53 @@ +package mage.cards.o; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.cost.SourceCostReductionForEachCardInGraveyardEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class OreScaleGuardian extends CardImpl { + + public OreScaleGuardian(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // This spell costs {1} less to cast for each land card in your graveyard. + Ability ability = new SimpleStaticAbility( + Zone.ALL, new SourceCostReductionForEachCardInGraveyardEffect(StaticFilters.FILTER_CARD_LAND) + ); + ability.setRuleAtTheTop(true); + this.addAbility(ability); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + } + + private OreScaleGuardian(final OreScaleGuardian card) { + super(card); + } + + @Override + public OreScaleGuardian copy() { + return new OreScaleGuardian(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 9ae1d9c5c8a..1b98cf1bff0 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -111,6 +111,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Nurturing Peatland", 243, Rarity.RARE, mage.cards.n.NurturingPeatland.class)); cards.add(new SetCardInfo("On Thin Ice", 20, Rarity.RARE, mage.cards.o.OnThinIce.class)); cards.add(new SetCardInfo("Orcish Hellraiser", 136, Rarity.COMMON, mage.cards.o.OrcishHellraiser.class)); + cards.add(new SetCardInfo("Ore-Scale Guardian", 137, Rarity.UNCOMMON, mage.cards.o.OreScaleGuardian.class)); cards.add(new SetCardInfo("Pillage", 139, Rarity.UNCOMMON, mage.cards.p.Pillage.class)); cards.add(new SetCardInfo("Plague Engineer", 100, Rarity.RARE, mage.cards.p.PlagueEngineer.class)); cards.add(new SetCardInfo("Planebound Accomplice", 140, Rarity.RARE, mage.cards.p.PlaneboundAccomplice.class)); From fb3c65d044d8f42f85ad4becafdfc86c00221e00 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 22:26:06 -0400 Subject: [PATCH 10/14] updated MH1 spoiler --- Utils/mtg-cards-data.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index b6db9708090..9de85fa36a6 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -35115,6 +35115,7 @@ Jace's Ruse|War of the Spark|273|R|{3}{U}{U}|Sorcery|||Return up to two target c Simic Guildgate|War of the Spark|274|C||Land - Gate|||Simic Guildgate enters the battlefield tapped.${T}: Add {G} or {U}.| Tezzeret, Master of the Bridge|War of the Spark|275|M|{4}{U}{B}|Legendary Planeswalker - Tezzeret|5|Creature and planeswalker spells you cast have affinity for artifacts.$+2: Tezzeret, Master of the Bridge deals X damage to each opponent, where X is the number of artifacts you control. You gain X life.$-3: Return target artifact card from your graveyard to your hand.$-8: Exile the top ten cards of your library. Put all artifact cards from among them onto the battlefield.| Morophon, the Boundless|Modern Horizons|1|M|{7}|Legendary Creature - Shapeshifter|6|6|Changeling$As Morophon, the Boundless enters the battlefield, choose a creature type.$Spells of the chosen type you cast cost {W}{U}{B}{R}{G} less to cast. This effect reduces only the amount of colored mana you pay.$Other creatures you control of the chosen type get +1/+1.| +Answered Prayers|Modern Horizons|2|C|{1}{W}{W}|Enchantment|||Whenever a creature enters the battlefield under your control, you gain 1 life. If Answered Prayers isn't a creature, it becomes a 3/3 Angel creature with flying in addition to its other types until end of turn.| Astral Drift|Modern Horizons|3|R|{2}{W}|Enchantment|||Whenever you cycle Astral Drift or cycle another card while Astral Drift is on the battlefield, you may exile target creature. If you do, return that card to the battlefield under its owner's control at the beginning of the next end step.$Cycling {2}{W}| Battle Screech|Modern Horizons|4|U|{2}{W}{W}|Sorcery|||Create two 1/1 white Bird creature tokens with flying.$Flashback—Tap three untapped white creatures you control.| Dismantling Blow|Modern Horizons|5|U|{2}{W}|Instant|||Kicker {2}{U}$Destroy target artifact or enchantment. If this spell was kicked, draw two cards.| @@ -35132,6 +35133,7 @@ Serra the Benevolent|Modern Horizons|26|M|{2}{W}{W}|Legendary Planeswalker - Ser Sisay, Weatherlight Captain|Modern Horizons|29|R|{2}{W}|Legendary Creature - Human Soldier|2|2|Sisay, Weatherlight Captain gets +1/+1 for each color among other legendary permanents you control.${W}{U}{B}{R}{G}: Search your library for a legendary permanent card with converted mana cost less than Sisay's power, put that card onto the battlefield, then shuffle your library.| Splicer's Skill|Modern Horizons|31|U|{2}{W}|Sorcery|||Create a 3/3 colorless Golem artifact creature token.$Splice onto instant or sorcery {3}{W}| Valiant Changeling|Modern Horizons|34|U|{5}{W}{W}|Creature - Shapeshifter|3|3|This spell costs {1} less to cast for each creature type among creatures you control. This effect can't reduce the amount of mana this spell costs by more than {5}.$Changeling$Double strike| +Vesperlark|Modern Horizons|35|U|{2}{W}|Creature - Elemental|2|1|Flying$When Vesperlark leaves the battlefield, return target creature card with power 1 or less from your graveyard to the battlefield.$Evok {1}{W}| Wall of One Thousand Cuts|Modern Horizons|36|C|{3}{W}{W}|Creature - Wall|3|5|Defender, flying${W}: Wall of One Thousand Cuts can attack this turn as though it didn't have defender.| Winds of Abandon|Modern Horizons|37|R|{1}{W}|Sorcery|||Exile target creature you don't control. For each creature exiled this way, its controller searches their library for a basic land card. Those players put those cards onto the battlefield tapped, then shuffle their libraries.$Overload {4}{W}{W}| Wing Shards|Modern Horizons|38|U|{1}{W}{W}|Instant|||Target player sacrifices an attacking creature.$Storm| @@ -35152,6 +35154,7 @@ Scuttling Sliver|Modern Horizons|68|U|{2}{U}|Creature - Sliver Trilobite|2|2|Sli Spell Snuff|Modern Horizons|70|C|{1}{U}{U}|Instant|||Counter target spell.$Fateful hour — If you have 5 or less life, draw a card.| Stream of Thought|Modern Horizons|71|C|{U}|Sorcery|||Target player puts the top four cards of their library into their graveyard. You shuffle up to four cards from your graveyard into your library.$Replicate {2}{U}{U}| String of Disappearances|Modern Horizons|72|C|{U}|Instant|||Return target creature to its owner's hand. Then that creature's controller may pay {U}{U}. If the player does, they may copy this spell and may choose a new target for that copy.| +Twisted Reflection|Modern Horizons|74|U|{1}{U}|Instant|||Choose one—$• Target creature gets -6/-0 until end of turn.$• Switch target creature's power and toughness until end of turn.$Entwine {B}| Urza, Lord High Artificer|Modern Horizons|75|M|{2}{U}{U}|Legendary Creature - Human Artificer|1|4|When Urza, Lord High Artificer enters the battlefield, create a 0/0 colorless Construct artifact creature token with "This creature gets +1/+1 for each artifact you control."$Tap an untapped artifact you control: Add {U}.${5}: Shuffle your library, then exile the top card. Until end of turn, you may play that card without paying its mana cost.| 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.| Changeling Outcast|Modern Horizons|82|C|{B}|Creature - Shapeshifter|1|1|Changeling$Changeling Outcast can't block and can't be blocked.| From 840032931f639ca31d365ef105b24e87f45c1b0d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 22:29:12 -0400 Subject: [PATCH 11/14] Implemented Twisted Reflection --- .../src/mage/cards/t/TwistedReflection.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TwistedReflection.java diff --git a/Mage.Sets/src/mage/cards/t/TwistedReflection.java b/Mage.Sets/src/mage/cards/t/TwistedReflection.java new file mode 100644 index 00000000000..22f7a4e9490 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TwistedReflection.java @@ -0,0 +1,45 @@ +package mage.cards.t; + +import mage.abilities.Mode; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.SwitchPowerToughnessTargetEffect; +import mage.abilities.keyword.EntwineAbility; +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 TwistedReflection extends CardImpl { + + public TwistedReflection(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); + + // Choose one— + // • Target creature gets -6/-0 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(-6, 0, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // • Switch target creature's power and toughness until end of turn. + Mode mode = new Mode(new SwitchPowerToughnessTargetEffect(Duration.EndOfTurn)); + mode.addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + + // Entwine {B} + this.addAbility(new EntwineAbility("{B}")); + } + + private TwistedReflection(final TwistedReflection card) { + super(card); + } + + @Override + public TwistedReflection copy() { + return new TwistedReflection(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 1b98cf1bff0..012c51ac9e1 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -158,6 +158,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("The First Sliver", 200, Rarity.MYTHIC, mage.cards.t.TheFirstSliver.class)); cards.add(new SetCardInfo("Throes of Chaos", 150, Rarity.UNCOMMON, mage.cards.t.ThroesOfChaos.class)); cards.add(new SetCardInfo("Thundering Djinn", 215, Rarity.UNCOMMON, mage.cards.t.ThunderingDjinn.class)); + cards.add(new SetCardInfo("Twisted Reflection", 74, Rarity.UNCOMMON, mage.cards.t.TwistedReflection.class)); cards.add(new SetCardInfo("Umezawa's Charm", 111, Rarity.COMMON, mage.cards.u.UmezawasCharm.class)); cards.add(new SetCardInfo("Undead Augur", 112, Rarity.UNCOMMON, mage.cards.u.UndeadAugur.class)); cards.add(new SetCardInfo("Unearth", 113, Rarity.COMMON, mage.cards.u.Unearth.class)); From 6faa1e26a2b36ae95c5786ddaa4951e5e4cdbd7a Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 22:46:45 -0400 Subject: [PATCH 12/14] Implemented Vesperlark --- Mage.Sets/src/mage/cards/v/Vesperlark.java | 62 +++++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + Utils/mtg-cards-data.txt | 2 +- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/v/Vesperlark.java diff --git a/Mage.Sets/src/mage/cards/v/Vesperlark.java b/Mage.Sets/src/mage/cards/v/Vesperlark.java new file mode 100644 index 00000000000..5140cff4f97 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/Vesperlark.java @@ -0,0 +1,62 @@ +package mage.cards.v; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.keyword.EvokeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.PowerPredicate; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Vesperlark extends CardImpl { + + private static final FilterCard filter + = new FilterCreatureCard("creature card with power 1 or less from your graveyard"); + + static { + filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 2)); + } + + public Vesperlark(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.ELEMENTAL); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Vesperlark leaves the battlefield, return target creature card with power 1 or less from your graveyard to the battlefield. + Ability ability = new LeavesBattlefieldTriggeredAbility( + new ReturnFromGraveyardToBattlefieldTargetEffect(), false + ); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(ability); + + // Evoke {1}{W} + this.addAbility(new EvokeAbility(this, "{1}{W}")); + } + + private Vesperlark(final Vesperlark card) { + super(card); + } + + @Override + public Vesperlark copy() { + return new Vesperlark(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 012c51ac9e1..a29800590a7 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -165,6 +165,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Urza, Lord High Artificer", 75, Rarity.MYTHIC, mage.cards.u.UrzaLordHighArtificer.class)); cards.add(new SetCardInfo("Valiant Changeling", 34, Rarity.UNCOMMON, mage.cards.v.ValiantChangeling.class)); cards.add(new SetCardInfo("Venomous Changeling", 114, Rarity.COMMON, mage.cards.v.VenomousChangeling.class)); + cards.add(new SetCardInfo("Vesperlark", 35, Rarity.UNCOMMON, mage.cards.v.Vesperlark.class)); cards.add(new SetCardInfo("Wall of One Thousand Cuts", 36, Rarity.COMMON, mage.cards.w.WallOfOneThousandCuts.class)); cards.add(new SetCardInfo("Waterlogged Grove", 249, Rarity.RARE, mage.cards.w.WaterloggedGrove.class)); cards.add(new SetCardInfo("Weather the Storm", 191, Rarity.COMMON, mage.cards.w.WeatherTheStorm.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 9de85fa36a6..a79eb860f19 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -35133,7 +35133,7 @@ Serra the Benevolent|Modern Horizons|26|M|{2}{W}{W}|Legendary Planeswalker - Ser Sisay, Weatherlight Captain|Modern Horizons|29|R|{2}{W}|Legendary Creature - Human Soldier|2|2|Sisay, Weatherlight Captain gets +1/+1 for each color among other legendary permanents you control.${W}{U}{B}{R}{G}: Search your library for a legendary permanent card with converted mana cost less than Sisay's power, put that card onto the battlefield, then shuffle your library.| Splicer's Skill|Modern Horizons|31|U|{2}{W}|Sorcery|||Create a 3/3 colorless Golem artifact creature token.$Splice onto instant or sorcery {3}{W}| Valiant Changeling|Modern Horizons|34|U|{5}{W}{W}|Creature - Shapeshifter|3|3|This spell costs {1} less to cast for each creature type among creatures you control. This effect can't reduce the amount of mana this spell costs by more than {5}.$Changeling$Double strike| -Vesperlark|Modern Horizons|35|U|{2}{W}|Creature - Elemental|2|1|Flying$When Vesperlark leaves the battlefield, return target creature card with power 1 or less from your graveyard to the battlefield.$Evok {1}{W}| +Vesperlark|Modern Horizons|35|U|{2}{W}|Creature - Elemental|2|1|Flying$When Vesperlark leaves the battlefield, return target creature card with power 1 or less from your graveyard to the battlefield.$Evoke {1}{W}| Wall of One Thousand Cuts|Modern Horizons|36|C|{3}{W}{W}|Creature - Wall|3|5|Defender, flying${W}: Wall of One Thousand Cuts can attack this turn as though it didn't have defender.| Winds of Abandon|Modern Horizons|37|R|{1}{W}|Sorcery|||Exile target creature you don't control. For each creature exiled this way, its controller searches their library for a basic land card. Those players put those cards onto the battlefield tapped, then shuffle their libraries.$Overload {4}{W}{W}| Wing Shards|Modern Horizons|38|U|{1}{W}{W}|Instant|||Target player sacrifices an attacking creature.$Storm| From fc92dd4908df95ff5a4dd65fe3f84528f4a85dc4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 23:00:54 -0400 Subject: [PATCH 13/14] Implemented Pashalik Mons --- Mage.Sets/src/mage/cards/p/PashalikMons.java | 75 ++++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 76 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PashalikMons.java diff --git a/Mage.Sets/src/mage/cards/p/PashalikMons.java b/Mage.Sets/src/mage/cards/p/PashalikMons.java new file mode 100644 index 00000000000..015c0805a78 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PashalikMons.java @@ -0,0 +1,75 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.permanent.token.GoblinToken; +import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetControlledPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PashalikMons extends CardImpl { + + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent(SubType.GOBLIN, "Goblin you control"); + private static final FilterControlledPermanent filter2 + = new FilterControlledCreaturePermanent(SubType.GOBLIN, "a Goblin"); + + static { + filter.add(AnotherPredicate.instance); + filter.add(new ControllerPredicate(TargetController.YOU)); + } + + public PashalikMons(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Pashalik Mons or another Goblin you control dies, Pashalik Mons deals 1 damage to any target. + Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility( + new DamageTargetEffect(1), false, filter + ); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); + + // {3}{R}, Sacrifice a Goblin: Create two 1/1 red Goblin creature tokens. + ability = new SimpleActivatedAbility( + new CreateTokenEffect(new GoblinToken(), 2), new ManaCostsImpl("{3}{R}") + ); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter2))); + this.addAbility(ability); + } + + private PashalikMons(final PashalikMons card) { + super(card); + } + + @Override + public PashalikMons copy() { + return new PashalikMons(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index a29800590a7..a00704b0dc5 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -112,6 +112,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("On Thin Ice", 20, Rarity.RARE, mage.cards.o.OnThinIce.class)); cards.add(new SetCardInfo("Orcish Hellraiser", 136, Rarity.COMMON, mage.cards.o.OrcishHellraiser.class)); cards.add(new SetCardInfo("Ore-Scale Guardian", 137, Rarity.UNCOMMON, mage.cards.o.OreScaleGuardian.class)); + cards.add(new SetCardInfo("Pashalik Mons", 138, Rarity.RARE, mage.cards.p.PashalikMons.class)); cards.add(new SetCardInfo("Pillage", 139, Rarity.UNCOMMON, mage.cards.p.Pillage.class)); cards.add(new SetCardInfo("Plague Engineer", 100, Rarity.RARE, mage.cards.p.PlagueEngineer.class)); cards.add(new SetCardInfo("Planebound Accomplice", 140, Rarity.RARE, mage.cards.p.PlaneboundAccomplice.class)); From 5afafd482b3e44d1585f8a777aec558312d25966 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 28 May 2019 23:15:23 -0400 Subject: [PATCH 14/14] fixed Ruination Rioter being incomplete --- Mage.Sets/src/mage/cards/r/RuinationRioter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mage.Sets/src/mage/cards/r/RuinationRioter.java b/Mage.Sets/src/mage/cards/r/RuinationRioter.java index ff3ff661538..d78762e48d0 100644 --- a/Mage.Sets/src/mage/cards/r/RuinationRioter.java +++ b/Mage.Sets/src/mage/cards/r/RuinationRioter.java @@ -11,6 +11,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.filter.StaticFilters; +import mage.target.common.TargetAnyTarget; import java.util.UUID; @@ -34,6 +35,8 @@ public final class RuinationRioter extends CardImpl { new DamageTargetEffect(xValue).setText("you may have it deal damage to any target " + "equal to the number of land cards in your graveyard."), true ); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); } private RuinationRioter(final RuinationRioter card) {