From 6951ec920a521a842854d9dafaaf544e24804e35 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 27 May 2019 11:17:06 -0400 Subject: [PATCH 1/4] updated MH1 spoiler --- Utils/mtg-cards-data.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 783e3ce4813..8cd37961ad1 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -35155,15 +35155,17 @@ Feaster of Fools|Modern Horizons|90|U|{4}{B}{B}|Creature - Demon|3|3|Convoke$Fly Force of Despair|Modern Horizons|92|R|{1}{B}{B}|Instant|||If it's not your turn, you may exile a black card from your hand rather than pay this spell's mana cost.$Destroy all creatures that entered the battlefield this turn.| Headless Specter|Modern Horizons|95|C|{1}{B}{B}|Creature - Specter|2|2|Flying$Hellbent — Whenever Headless Specter deals combat damage to a player, if you have no cards in hand, that player discards a card at random.| Plague Engineer|Modern Horizons|100|R|{2}{B}|Creature - Carrier|2|2|Deathtouch$As Plague Engineer enters the battlefield, choose a creature type.$Creatures of the chosen type your opponents control get -1/-1.| -Sling-Gang Lieutenant|Modern Horizons|108|U|{3}{B}|Creature - Goblin|||When Sling-Gang Lieutenant enters the battlefield, create two 1/1 red Goblin creature tokens.$Sacrifice a Goblin: Target player loses 1 life and you gain 1 life.| +Sling-Gang Lieutenant|Modern Horizons|108|U|{3}{B}|Creature - Goblin|1|1|When Sling-Gang Lieutenant enters the battlefield, create two 1/1 red Goblin creature tokens.$Sacrifice a Goblin: Target player loses 1 life and you gain 1 life.| Umezawa's Charm|Modern Horizons|111|C|{1}{B}|Instant|||Choose one—$• Target creature gets +2/+2 until end of turn.$• Target creature gets -1/-1 until end of turn.$• You gain 2 life.| Undead Augur|Modern Horizons|112|U|{B}{B}|Creature - Zombie Wizard|2|2|Whenever Undead Augur or another Zombie you control dies, you draw a card and you lose 1 life.| Venomous Changeling|Modern Horizons|114|C|{2}{B}|Creature - Shapeshifter|1|3|Changeling$Deathtouch| +Yawgmoth, Thran Physician|Modern Horizons|116|M|{2}{B}{B}|Legendary Creature - Human Cleric|2|4|Protection from Humans.$Pay 1 life, Sacrifice another creature: Put a -1/-1 counter on up to one target creature and draw a card.${B}{B}, Discard a card: Proliferate.| Aria of Flame|Modern Horizons|118|R|{2}{R}|Enchantment|||When Aria of Flame enters the battlefield, each opponent gains 10 life.$Whenever you cast an instant or sorcery spell, put a verse counter on Aria of Flame, then it deals damage equal to the number of verse counters on it to target player or planeswalker.| Firebolt|Modern Horizons|122|U|{R}|Sorcery|||Firebolt deals 2 damage to any target.$Flashback {4}{R}| Fists of Flame|Modern Horizons|123|C|{1}{R}|Instant|||Draw a card. Until end of turn, target creature gains trample and gets +1/+0 for each card you've drawn this turn.| Force of Rage|Modern Horizons|124|R|{1}{R}{R}|Instant|||If it's not your turn, you may exile a red card from your hand rather than pay this spell's mana cost.$Create two 3/1 red Elemental creature tokens with trample and haste. Sacrifice those tokens at the beginning of your next upkeep.| Goatnap|Modern Horizons|126|C|{2}{R}|Sorcery|||Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. If that creature is a Goat, it also gets +3/+0 until end of turn.| +Goblin Champion|Modern Horizons|127|C|{R}|Creature - Goblin Warrior|0|1|Haste$Exalted| Goblin Engineer|Modern Horizons|128|R|{1}{R}|Creature - Goblin Artificer|1|2|When Goblin Engineer enters the battlefield, you may search your library for an artifact card, put it into your graveyard, then shuffle your library.${R}, {T}, Sacrifice an artifact: Return target artifact card with converted mana cost 3 or less from your graveyard to the battlefield.| Goblin Matron|Modern Horizons|129|U|{2}{R}|Creature - Goblin|1|1|When Goblin Matron enters the battlefield, you may search your library for a Goblin card, reveal that card, and put it into your hand. If you do, shuffle your library.| Goblin War Party|Modern Horizons|131|C|{3}{R}|Sorcery|||Choose one —$• Create three 1/1 red Goblin creature tokens.$• Creatures you control get +1/+1 and gain haste until end of turn.$Entwine {2}{R}| @@ -35177,6 +35179,7 @@ Ravenous Giant|Modern Horizons|143|U|{2}{R}{R}|Creature - Giant|5|5|At the begin 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.| 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.| +Collector Ouphe|Modern Horizons|158|R|{1}{G}|Creature - Ouphe|2|2|Activated abilities of artifacts can't be activated.| Deep Forest Hermit|Modern Horizons|161|R|{3}{G}{G}|Creature - Elf Druid|1|1|Vanishing 3$When Deep Forest Hermit enters the battlefield, create four 1/1 green Squirrel creature tokens.$Squirrels you control get +1/+1.| Elvish Fury|Modern Horizons|162|C|{G}|Instant|||Buyback {4}$Target creature gets +2/+2 until end of turn.| Force of Vigor|Modern Horizons|164|R|{2}{G}{G}|Instant|||If it's not your turn, you may exile a green card from your hand rather than pay this spell's mana cost.$Destroy up to two target artifacts and/or enchantments.| From ab5036fcfb89be7bdda6a8ff0b46488c0282b996 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 27 May 2019 11:18:06 -0400 Subject: [PATCH 2/4] Implemented Goblin Champion --- .../src/mage/cards/g/GoblinChampion.java | 41 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GoblinChampion.java diff --git a/Mage.Sets/src/mage/cards/g/GoblinChampion.java b/Mage.Sets/src/mage/cards/g/GoblinChampion.java new file mode 100644 index 00000000000..3bd4c125b5d --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinChampion.java @@ -0,0 +1,41 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.keyword.ExaltedAbility; +import mage.abilities.keyword.HasteAbility; +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 GoblinChampion extends CardImpl { + + public GoblinChampion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(0); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Exalted + this.addAbility(new ExaltedAbility()); + } + + private GoblinChampion(final GoblinChampion card) { + super(card); + } + + @Override + public GoblinChampion copy() { + return new GoblinChampion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 208398cc2f3..36b0aafc521 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -68,6 +68,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Giver of Runes", 13, Rarity.RARE, mage.cards.g.GiverOfRunes.class)); cards.add(new SetCardInfo("Glacial Revelation", 167, Rarity.UNCOMMON, mage.cards.g.GlacialRevelation.class)); cards.add(new SetCardInfo("Goatnap", 126, Rarity.COMMON, mage.cards.g.Goatnap.class)); + cards.add(new SetCardInfo("Goblin Champion", 127, Rarity.COMMON, mage.cards.g.GoblinChampion.class)); cards.add(new SetCardInfo("Goblin Engineer", 128, Rarity.RARE, mage.cards.g.GoblinEngineer.class)); cards.add(new SetCardInfo("Goblin Matron", 129, Rarity.UNCOMMON, mage.cards.g.GoblinMatron.class)); cards.add(new SetCardInfo("Goblin War Party", 131, Rarity.COMMON, mage.cards.g.GoblinWarParty.class)); From a2f149f7e4aa6409cb24c37ffb1c91239e6a4ffa Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 27 May 2019 11:19:53 -0400 Subject: [PATCH 3/4] Implemented Collector Ouphe --- .../src/mage/cards/c/CollectorOuphe.java | 69 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CollectorOuphe.java diff --git a/Mage.Sets/src/mage/cards/c/CollectorOuphe.java b/Mage.Sets/src/mage/cards/c/CollectorOuphe.java new file mode 100644 index 00000000000..48cf57ace37 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CollectorOuphe.java @@ -0,0 +1,69 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CollectorOuphe extends CardImpl { + + public CollectorOuphe(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.OUPHE); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Activated abilities of artifacts can't be activated. + this.addAbility(new SimpleStaticAbility(new CollectorOupheEffect())); + } + + private CollectorOuphe(final CollectorOuphe card) { + super(card); + } + + @Override + public CollectorOuphe copy() { + return new CollectorOuphe(this); + } +} + +class CollectorOupheEffect extends RestrictionEffect { + + CollectorOupheEffect() { + super(Duration.WhileOnBattlefield); + staticText = "Activated abilities of artifacts can't be activated"; + } + + private CollectorOupheEffect(final CollectorOupheEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.isArtifact(); + } + + @Override + public boolean canUseActivatedAbilities(Permanent permanent, Ability source, Game game, boolean canUseChooseDialogs) { + return false; + } + + @Override + public CollectorOupheEffect copy() { + return new CollectorOupheEffect(this); + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index 36b0aafc521..b91a6ab280f 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -41,6 +41,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Choking Tethers", 44, Rarity.COMMON, mage.cards.c.ChokingTethers.class)); cards.add(new SetCardInfo("Cloudshredder Sliver", 195, Rarity.RARE, mage.cards.c.CloudshredderSliver.class)); cards.add(new SetCardInfo("Collected Conjuring", 196, Rarity.RARE, mage.cards.c.CollectedConjuring.class)); + cards.add(new SetCardInfo("Collector Ouphe", 158, Rarity.RARE, mage.cards.c.CollectorOuphe.class)); cards.add(new SetCardInfo("Crypt Rats", 84, Rarity.UNCOMMON, mage.cards.c.CryptRats.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)); From 2060035b32ce126ad8b259a18b755e487a40341d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 27 May 2019 11:26:33 -0400 Subject: [PATCH 4/4] Implemented Yawgmoth, Thran Physician --- .../mage/cards/y/YawgmothThranPhysician.java | 72 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons.java | 1 + 2 files changed, 73 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/y/YawgmothThranPhysician.java diff --git a/Mage.Sets/src/mage/cards/y/YawgmothThranPhysician.java b/Mage.Sets/src/mage/cards/y/YawgmothThranPhysician.java new file mode 100644 index 00000000000..b9dab388ccb --- /dev/null +++ b/Mage.Sets/src/mage/cards/y/YawgmothThranPhysician.java @@ -0,0 +1,72 @@ +package mage.cards.y; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.PayLifeCost; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.effects.common.counter.ProliferateEffect; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class YawgmothThranPhysician extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent(SubType.HUMAN, "Humans"); + + public YawgmothThranPhysician(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Protection from Humans. + this.addAbility(new ProtectionAbility(filter)); + + // Pay 1 life, Sacrifice another creature: Put a -1/-1 counter on up to one target creature and draw a card. + Ability ability = new SimpleActivatedAbility( + new AddCountersTargetEffect(CounterType.M1M1.createInstance()), new PayLifeCost(1) + ); + ability.addCost(new SacrificeTargetCost( + new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE) + )); + ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + this.addAbility(ability); + + // {B}{B}, Discard a card: Proliferate. + ability = new SimpleActivatedAbility(new ProliferateEffect(), new ManaCostsImpl("{B}{B}")); + ability.addCost(new DiscardCardCost()); + this.addAbility(ability); + } + + private YawgmothThranPhysician(final YawgmothThranPhysician card) { + super(card); + } + + @Override + public YawgmothThranPhysician copy() { + return new YawgmothThranPhysician(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons.java b/Mage.Sets/src/mage/sets/ModernHorizons.java index b91a6ab280f..bf8318e909f 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons.java @@ -139,6 +139,7 @@ public final class ModernHorizons extends ExpansionSet { cards.add(new SetCardInfo("Winds of Abandon", 37, Rarity.RARE, mage.cards.w.WindsOfAbandon.class)); cards.add(new SetCardInfo("Wing Shards", 38, Rarity.UNCOMMON, mage.cards.w.WingShards.class)); cards.add(new SetCardInfo("Wrenn and Six", 217, Rarity.MYTHIC, mage.cards.w.WrennAndSix.class)); + cards.add(new SetCardInfo("Yawgmoth, Thran Physician", 116, Rarity.MYTHIC, mage.cards.y.YawgmothThranPhysician.class)); cards.add(new SetCardInfo("Zhalfirin Decoy", 39, Rarity.UNCOMMON, mage.cards.z.ZhalfirinDecoy.class)); } }