From e5c716444424780a7add08de9880ff02ebf54f5d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 12:50:31 -0400 Subject: [PATCH 01/17] updated M20 spoiler and reprints --- Mage.Sets/src/mage/sets/CoreSet2020.java | 3 +++ Utils/mtg-cards-data.txt | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 307670240ac..08e7128a148 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -62,6 +62,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Goblin Ringleader", 143, Rarity.UNCOMMON, mage.cards.g.GoblinRingleader.class)); cards.add(new SetCardInfo("Growth Cycle", 175, Rarity.COMMON, mage.cards.g.GrowthCycle.class)); cards.add(new SetCardInfo("Hanged Executioner", 22, Rarity.RARE, mage.cards.h.HangedExecutioner.class)); + cards.add(new SetCardInfo("Heart-Piercer Bow", 228, Rarity.COMMON, mage.cards.h.HeartPiercerBow.class)); cards.add(new SetCardInfo("Infuriate", 145, Rarity.COMMON, mage.cards.i.Infuriate.class)); cards.add(new SetCardInfo("Ironroot Warlord", 209, Rarity.UNCOMMON, mage.cards.i.IronrootWarlord.class)); cards.add(new SetCardInfo("Kaalia, Zenith Seeker", 210, Rarity.MYTHIC, mage.cards.k.KaaliaZenithSeeker.class)); @@ -80,6 +81,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Pulse of Murasa", 189, Rarity.UNCOMMON, mage.cards.p.PulseOfMurasa.class)); cards.add(new SetCardInfo("Raise the Alarm", 34, Rarity.COMMON, mage.cards.r.RaiseTheAlarm.class)); cards.add(new SetCardInfo("Reckless Air Strike", 154, Rarity.COMMON, mage.cards.r.RecklessAirStrike.class)); + cards.add(new SetCardInfo("Renowned Weaponsmith", 72, Rarity.UNCOMMON, mage.cards.r.RenownedWeaponsmith.class)); cards.add(new SetCardInfo("Rotting Regisaur", 111, Rarity.RARE, mage.cards.r.RottingRegisaur.class)); cards.add(new SetCardInfo("Rule of Law", 35, Rarity.UNCOMMON, mage.cards.r.RuleOfLaw.class)); cards.add(new SetCardInfo("Scholar of the Ages", 74, Rarity.UNCOMMON, mage.cards.s.ScholarOfTheAges.class)); @@ -98,6 +100,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Unchained Berserker", 164, Rarity.UNCOMMON, mage.cards.u.UnchainedBerserker.class)); cards.add(new SetCardInfo("Unsummon", 78, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Vampire of the Dire Moon", 120, Rarity.UNCOMMON, mage.cards.v.VampireOfTheDireMoon.class)); + cards.add(new SetCardInfo("Vial of Dragonfire", 241, Rarity.COMMON, mage.cards.v.VialOfDragonfire.class)); cards.add(new SetCardInfo("Wakeroot Elemental", 202, Rarity.RARE, mage.cards.w.WakerootElemental.class)); cards.add(new SetCardInfo("Yarok's Fenlurker", 123, Rarity.UNCOMMON, mage.cards.y.YaroksFenlurker.class)); } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 1f9a8cf0fa5..4f2bbe2b068 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -35396,6 +35396,7 @@ Mu Yanling, Sky Dancer|Core Set 2020|68|M|{1}{U}{U}|Legendary Planeswalker - Yan Negate|Core Set 2020|69|C|{1}{U}|Instant|||Counter target noncreature spell.| Octoprophet|Core Set 2020|70|C|{3}{U}|Creature - Octopus|3|3|When Octoprophet enters the battlefield, scry 2.| Portal of Sanctuary|Core Set 2020|71|U|{2}{U}|Artifact|||{1}, {T}: Return target creature you control and each Aura attached to it to their owners' hands. Activate this ability only during your turn.| +Renowned Weaponsmith|Core Set 2020|72|U|{1}{U}|Creature - Human Artificer|1|3|{T}: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts.${U}, {T}: Search your library for a card named Heart-Piercer Bow or Vial of Dragonfire, reveal it, put it into your hand, then shuffle your library.| Scholar of the Ages|Core Set 2020|74|U|{5}{U}{U}|Creature - Human Wizard|3|3|When Scholar of the Ages enters the battlefield, return up to two target instant and/or sorcery cards from your graveyard to your hand.| Unsummon|Core Set 2020|78|C|{U}|Instant|||Return target creature to its owner's hand.| Blightbeetle|Core Set 2020|87|U|{1}{B}|Creature - Insect|1|1|Protection from green$Creatures your opponents control can't have +1/+1 counters put on them.| @@ -35407,7 +35408,7 @@ Legion's End|Core Set 2020|106|R|{1}{B}|Sorcery|||Exile target creature an oppon Leyline of the Void|Core Set 2020|107|R|{2}{B}{B}|Enchantment|||If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield.$If a card would be put into an opponent's graveyard from anywhere, exile it instead.| Rotting Regisaur|Core Set 2020|111|R|{2}{B}|Creature - Zombie Dinosaur|7|6|At the beginning of your upkeep, discard a card.| Scheming Symmetry|Core Set 2020|113|R|{B}|Sorcery|||Choose two target players. Each of them searches their library for a card, then shuffles their library and puts that card on top of it.| -Sorin, Imperious Bloodlord|Core Set 2020|115|M|{2}{B}|Legendary Planeswalker - Sorin|4|+1: Target creature you control gains deathtouch and lifelink until end of turn. If it's a Vampire, put a +1/+1 counter on it.$+1: You may sacrifice a Vampire. When you do, Sorin, Imperious Bloodlord deals 3 damage to any target and you gain 3 life.$−3: You may put a vampire creature card from your hand onto the battlefield.| +Sorin, Imperious Bloodlord|Core Set 2020|115|M|{2}{B}|Legendary Planeswalker - Sorin|4|+1: Target creature you control gains deathtouch and lifelink until end of turn. If it's a Vampire, put a +1/+1 counter on it.$+1: You may sacrifice a Vampire. When you do, Sorin, Imperious Bloodlord deals 3 damage to any target and you gain 3 life.$−3: You may put a Vampire creature card from your hand onto the battlefield.| Thought Distortion|Core Set 2020|117|U|{4}{B}{B}|Sorcery|||This spell can't be countered.$Target opponent reveals their hand. Exile all noncreature, nonland cards from that player's hand and graveyard.| Vampire of the Dire Moon|Core Set 2020|120|U|{B}|Creature - Vampire|1|1|Deathtouch$Lifelink| Yarok's Fenlurker|Core Set 2020|123|U|{B}{B}|Creature - Horror|1|1|When Yarok's Fenlurker enters the battlefield, each opponent exiles a card from their hand.${2}{B}: Yarok's Fenlurker gets +1/+1 until end of turn.| @@ -35434,6 +35435,7 @@ Uncaged Fury|Core Set 2020|163|U|{2}{R}|Instant|||Target creature gets +1/+1 and Unchained Berserker|Core Set 2020|164|U|{1}{R}|Creature - Human Berserker|1|1|Protection from white$Unchained Berserker gets +2/+0 as long as it's attacking.| Barkhide Troll|Core Set 2020|165|U|{G}{G}|Creature - Troll|2|2|Barkhide Troll enters the battlefield with a +1/+1 counter on it.${1}, Remove a +1/+1 counter from Barkhide Troll: Barkhide Troll gains hexproof until end of turn.| Elvish Reclaimer|Core Set 2020|169|R|{G}|Creature - Elf Warrior|1|2|Elvish Reclaimer gets +2/+2 as long as there are three or more land cards in your graveyard.${2}, {T}, Sacrifice a land: Search your library for a land card, put it onto the battlefield tapped, then shuffle your library.| +Ferocious Pup|Core Set 2020|171|C|{2}{G}|Creature - Wolf|0|1|When Ferocious Pup enters the battlefield, create a 2/2 green Wolf creature token.| Growth Cycle|Core Set 2020|175|C|{1}{G}|Instant|||Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard.| Leyline of Abundance|Core Set 2020|179|R|{2}{G}{G}|Enchantment|||If Leyline of Abundance is in your opening hand, you may begin the game with it on the battlefield.$Whenever you tap a creature for mana, add an additional {G}.${6}{G}{G}: Put a +1/+1 counter on each creature you control.| Loaming Shaman|Core Set 2020|180|U|{2}{G}|Creature - Centaur Shaman|3|2|When Loaming Shaman enters the battlefield, target player shuffles any number of target cards from their graveyard into their library.| @@ -35454,11 +35456,15 @@ Ironroot Warlord|Core Set 2020|209|U|{1}{G}{W}|Creature - Treefolk Soldier|*|5|I Kaalia, Zenith Seeker|Core Set 2020|210|M|{R}{W}{B}|Legendary Creature - Human Cleric|3|3|Flying, vigilance$When Kaalia, Zenith Seeker enters the battlefield, look at the top six cards of your library. You may reveal an Angel card, a Demon card, and/or a Dragon card from among them and put them into your hand. Put the rest on the bottom of your library in a random order.| Kykar, Wind's Fury|Core Set 2020|212|M|{1}{U}{R}{W}|Legendary Creature - Bird Wizard|3|3|Flying$Whenever you cast a noncreature spell, create a 1/1 white Spirit creature token with flying.$Sacrifice a Spirit: Add {R}.| Moldervine Reclamation|Core Set 2020|214|U|{3}{B}{G}|Enchantment|||Whenever a creature you control dies, you gain 1 life and draw a card.| +Ogre Siegebreaker|Core Set 2020|215|U|{2}{B}{R}|Creature - Ogre Berserker|4|3|{2}{B}{R}: Destroy target creature that was dealt damage this turn.| +Omnath, Locus of the Roil|Core Set 2020|216|M|{1}{G}{U}{R}|Legendary Creature - Elemental|3|3|When Omnath, Locus of the Roil enters the battlefield, it deals damage to any target equal to the number of Elementals you control.$Whenever a land enters the battlefield under your control, put a +1/+1 counter on target Elemental you control. If you control eight or more lands, draw a card.| Risen Reef|Core Set 2020|217|U|{1}{G}{U}|Creature - Elemental|1|1|Whenever Risen Reef or another Elemental enters the battlefield under your control, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. If you don't put the card onto the battlefield, put it into your hand.| Yarok, the Desecrated|Core Set 2020|220|M|{2}{B}{G}{U}|Legendary Creature - Elemental Horror|3|5|Deathtouch, lifelink$If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.| Golos, Tireless Pilgrim|Core Set 2020|226|R|{5}|Legendary Artifact Creature - Scout|3|5|When Golos, Tireless Pilgrim enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library.${2}{W}{U}{B}{R}{G}: Exile the top three cards of your library. You may play them this turn without paying their mana costs.| +Heart-Piercer Bow|Core Set 2020|228|C|{2}|Artifact - Equipment|||Whenever equipped creature attacks, Heart-Piercer Bow deals 1 damage to target creature defending player controls.$Equip {1}| Retributive Wand|Core Set 2020|236|U|{3}|Artifact|||{3}, {T}: Retributive Wand deals 1 damage to any target.$When Retributive Wand is put into a graveyard from the battlefield, it deals 5 damage to any target.| Scuttlemutt|Core Set 2020|238|U|{3}|Artifact Creature - Scarecrow|2|2|{T}: Add one mana of any color.${T}: Target creature becomes the color or colors of your choice until end of turn.| +Vial of Dragonfire|Core Set 2020|241|C|{2}|Artifact|||{2}, {T}, Sacrifice Vial of Dragonfire: It deals 2 damage to target creature.| Cryptic Caves|Core Set 2020|244|U||Land|||{T}: Add {C}.${1}, {T}, Sacrifice Cryptic Caves: Draw a card. Activate this ability only if you control five or more lands.| Field of the Dead|Core Set 2020|247|R||Land|||Field of the Dead enters the battlefield tapped.${T}: Add {C}.$Whenever Field of the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token.| Temple of Epiphany|Core Set 2020|253|R||Land|||Temple of Epiphany enters the battlefield tapped.$When Temple of Epiphany enters the battlefield, scry 1.${T}: Add {U} or {R}.| From ed01888cafda849cf005041db5b30d356293fedb Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 12:51:17 -0400 Subject: [PATCH 02/17] Implemented Ferocious Pup --- Mage.Sets/src/mage/cards/f/FerociousPup.java | 38 ++++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 39 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FerociousPup.java diff --git a/Mage.Sets/src/mage/cards/f/FerociousPup.java b/Mage.Sets/src/mage/cards/f/FerociousPup.java new file mode 100644 index 00000000000..4c3fa6ac5a5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FerociousPup.java @@ -0,0 +1,38 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.WolfToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FerociousPup extends CardImpl { + + public FerociousPup(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.WOLF); + this.power = new MageInt(0); + this.toughness = new MageInt(1); + + // When Ferocious Pup enters the battlefield, create a 2/2 green Wolf creature token. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WolfToken()))); + } + + private FerociousPup(final FerociousPup card) { + super(card); + } + + @Override + public FerociousPup copy() { + return new FerociousPup(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 08e7128a148..a9ca37a829f 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -54,6 +54,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Dungeon Geists", 57, Rarity.RARE, mage.cards.d.DungeonGeists.class)); cards.add(new SetCardInfo("Ember Hauler", 137, Rarity.UNCOMMON, mage.cards.e.EmberHauler.class)); cards.add(new SetCardInfo("Empyrean Eagle", 208, Rarity.UNCOMMON, mage.cards.e.EmpyreanEagle.class)); + cards.add(new SetCardInfo("Ferocious Pup", 171, Rarity.COMMON, mage.cards.f.FerociousPup.class)); cards.add(new SetCardInfo("Field of the Dead", 247, Rarity.RARE, mage.cards.f.FieldOfTheDead.class)); cards.add(new SetCardInfo("Flame Sweep", 139, Rarity.UNCOMMON, mage.cards.f.FlameSweep.class)); cards.add(new SetCardInfo("Flood of Tears", 59, Rarity.RARE, mage.cards.f.FloodOfTears.class)); From ae8c5be578b698b98bee82d7dcf5264bdb519be0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 12:55:50 -0400 Subject: [PATCH 03/17] Implemented Ogre Siegebreaker --- .../src/mage/cards/o/OgreSiegebreaker.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 54 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OgreSiegebreaker.java diff --git a/Mage.Sets/src/mage/cards/o/OgreSiegebreaker.java b/Mage.Sets/src/mage/cards/o/OgreSiegebreaker.java new file mode 100644 index 00000000000..5d1eadf1116 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OgreSiegebreaker.java @@ -0,0 +1,53 @@ +package mage.cards.o; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.WasDealtDamageThisTurnPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class OgreSiegebreaker extends CardImpl { + + private static final FilterPermanent filter + = new FilterCreaturePermanent("creature that was dealt damage this turn"); + + static { + filter.add(new WasDealtDamageThisTurnPredicate()); + } + + public OgreSiegebreaker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}"); + + this.subtype.add(SubType.OGRE); + this.subtype.add(SubType.BERSERKER); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // {2}{B}{R}: Destroy target creature that was dealt damage this turn. + Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new ManaCostsImpl("{2}{B}{R}")); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private OgreSiegebreaker(final OgreSiegebreaker card) { + super(card); + } + + @Override + public OgreSiegebreaker copy() { + return new OgreSiegebreaker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index a9ca37a829f..485f03c9e1a 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -77,6 +77,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Moldervine Reclamation", 214, Rarity.UNCOMMON, mage.cards.m.MoldervineReclamation.class)); cards.add(new SetCardInfo("Negate", 69, Rarity.COMMON, mage.cards.n.Negate.class)); cards.add(new SetCardInfo("Octoprophet", 70, Rarity.COMMON, mage.cards.o.Octoprophet.class)); + cards.add(new SetCardInfo("Ogre Siegebreaker", 215, Rarity.UNCOMMON, mage.cards.o.OgreSiegebreaker.class)); cards.add(new SetCardInfo("Pacifism", 32, Rarity.COMMON, mage.cards.p.Pacifism.class)); cards.add(new SetCardInfo("Planar Cleansing", 33, Rarity.RARE, mage.cards.p.PlanarCleansing.class)); cards.add(new SetCardInfo("Pulse of Murasa", 189, Rarity.UNCOMMON, mage.cards.p.PulseOfMurasa.class)); From 487ff228c80388b9841073b3d5bbe67354f34e7a Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 12:58:14 -0400 Subject: [PATCH 04/17] Implemented Drawn from Dreams --- .../src/mage/cards/d/DrawnFromDreams.java | 36 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DrawnFromDreams.java diff --git a/Mage.Sets/src/mage/cards/d/DrawnFromDreams.java b/Mage.Sets/src/mage/cards/d/DrawnFromDreams.java new file mode 100644 index 00000000000..b2ff445b845 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DrawnFromDreams.java @@ -0,0 +1,36 @@ +package mage.cards.d; + +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DrawnFromDreams extends CardImpl { + + public DrawnFromDreams(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{U}"); + + // Look at the top seven cards of your library. Put two of them into your hand and the rest on the bottom of your library in a random order. + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect( + new StaticValue(7), false, new StaticValue(2), + StaticFilters.FILTER_CARD, Zone.LIBRARY, false, false + ).setBackInRandomOrder(true)); + } + + private DrawnFromDreams(final DrawnFromDreams card) { + super(card); + } + + @Override + public DrawnFromDreams copy() { + return new DrawnFromDreams(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 485f03c9e1a..399722ee742 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -50,6 +50,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Disenchant", 14, Rarity.COMMON, mage.cards.d.Disenchant.class)); cards.add(new SetCardInfo("Disfigure", 95, Rarity.UNCOMMON, mage.cards.d.Disfigure.class)); cards.add(new SetCardInfo("Dragon Mage", 135, Rarity.UNCOMMON, mage.cards.d.DragonMage.class)); + cards.add(new SetCardInfo("Drawn from Dreams", 56, Rarity.RARE, mage.cards.d.DrawnFromDreams.class)); cards.add(new SetCardInfo("Dread Presence", 96, Rarity.RARE, mage.cards.d.DreadPresence.class)); cards.add(new SetCardInfo("Dungeon Geists", 57, Rarity.RARE, mage.cards.d.DungeonGeists.class)); cards.add(new SetCardInfo("Ember Hauler", 137, Rarity.UNCOMMON, mage.cards.e.EmberHauler.class)); From ccf0c32ab403e6ad4773460f1c711ecb1cb681cd Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 18:27:29 -0400 Subject: [PATCH 05/17] updated M20 spoiler and reprints --- Mage.Sets/src/mage/sets/CoreSet2020.java | 2 ++ Utils/mtg-cards-data.txt | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 399722ee742..55cd78517b9 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -92,6 +92,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Silverback Shaman", 195, Rarity.COMMON, mage.cards.s.SilverbackShaman.class)); cards.add(new SetCardInfo("Sorin, Imperious Bloodlord", 115, Rarity.MYTHIC, mage.cards.s.SorinImperiousBloodlord.class)); cards.add(new SetCardInfo("Starfield Mystic", 39, Rarity.RARE, mage.cards.s.StarfieldMystic.class)); + cards.add(new SetCardInfo("Steel Overseer", 239, Rarity.RARE, mage.cards.s.SteelOverseer.class)); cards.add(new SetCardInfo("Temple of Epiphany", 253, Rarity.RARE, mage.cards.t.TempleOfEpiphany.class)); cards.add(new SetCardInfo("Temple of Malady", 254, Rarity.RARE, mage.cards.t.TempleOfMalady.class)); cards.add(new SetCardInfo("Temple of Mystery", 255, Rarity.RARE, mage.cards.t.TempleOfMystery.class)); @@ -105,6 +106,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Vampire of the Dire Moon", 120, Rarity.UNCOMMON, mage.cards.v.VampireOfTheDireMoon.class)); cards.add(new SetCardInfo("Vial of Dragonfire", 241, Rarity.COMMON, mage.cards.v.VialOfDragonfire.class)); cards.add(new SetCardInfo("Wakeroot Elemental", 202, Rarity.RARE, mage.cards.w.WakerootElemental.class)); + cards.add(new SetCardInfo("Wolfkin Bond", 203, Rarity.COMMON, mage.cards.w.WolfkinBond.class)); cards.add(new SetCardInfo("Yarok's Fenlurker", 123, Rarity.UNCOMMON, mage.cards.y.YaroksFenlurker.class)); } } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 4f2bbe2b068..6e821bb6c56 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -35372,9 +35372,11 @@ Flusterstorm|Modern Horizons|255|R|{U}|Instant|||Counter target instant or sorce Ajani, Strength of the Pride|Core Set 2020|2|M|{2}{W}{W}|Legendary Planeswalker - Ajani|5|+1: You gain life equal to the number of creatures you control plus the number of planeswalkers you control.$−2: Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate."$0: If you have at least 15 life more than your starting life total, exile Ajani, Strength of the Pride and each artifact and creature your opponents control.| Angel of Vitality|Core Set 2020|4|U|{2}{W}|Creature - Angel|2|2|Flying$If you would gain life, you gain that much life plus 1 instead.$Angel of Vitality gets +2/+2 as long as you have 25 or more life.| Bishop of Wings|Core Set 2020|8|R|{W}{W}|Creature - Human Cleric|1|4|Whenever an Angel enters the battlefield under your control, you gain 4 life.$Whenever an Angel you control dies, create a 1/1 white Spirit creature token with flying.| +Cavalier of Dawn|Core Set 2020|10|M|{2}{W}{W}{W}|Creature - Elemental Knight|4|6|Vigilance$When Cavalier of Dawn enters the battlefield, destroy up to one target nonland permanent. Its controller creates a 3/3 colorless Golem artifact creature token.$When Cavalier of Dawn dies, return target artifact or enchantment card from your graveyard to your hand.| Devout Decree|Core Set 2020|13|U|{1}{W}|Sorcery|||Exile target creature or planeswalker that's black or red. Scry 1.| Disenchant|Core Set 2020|14|C|{1}{W}|Instant|||Destroy target artifact or enchantment.| Hanged Executioner|Core Set 2020|22|R|{2}{W}|Creature - Spirit|1|1|Flying$When Hanged Executioner enters the battlefield, create a 1/1 white Spirit creature token with flying.${3}{W}, Exile Hanged Executioner: Exile target creature.| +Herald of the Sun|Core Set 2020|23|U|{4}{W}{W}|Creature - Angel|4|4|Flying${3}{W}: Put a +1/+1 counter on another target creature with flying.| Leyline of Sanctity|Core Set 2020|26|R|{2}{W}{W}|Enchantment|||If Leyline of Sanctity is in your opening hand, you may begin the game with it on the battlefield.$You have hexproof.| Loxodon Lifechanter|Core Set 2020|27|R|{5}{W}|Creature - Elephant Cleric|4|6|When Loxodon Lifechanter enters the battlefield, you may have your life total become the total toughness of creatures you control.${5}{W}: Loxodon Lifechanter gets +X/+X until end of turn, where X is your life total.| Loyal Pegasus|Core Set 2020|28|U|{W}|Creature - Pegasus|2|1|Flying$Loyal Pegasus can't attack or block alone.| @@ -35384,8 +35386,10 @@ Raise the Alarm|Core Set 2020|34|C|{1}{W}|Instant|||Create two 1/1 white Soldier Rule of Law|Core Set 2020|35|U|{2}{W}|Enchantment|||Each player can't cast more than one spell each turn.| Starfield Mystic|Core Set 2020|39|R|{1}{W}|Creature - Human Cleric|2|2|Enchantment spells you cast cost {1} less to cast.$Whenever an enchantment you control is put into a graveyard from the battlefield, put a +1/+1 counter on Starfield Mystic.| Aether Gust|Core Set 2020|42|U|{1}{U}|Instant|||Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library.| +Agent of Treachery|Core Set 2020|43|R|{5}{U}{U}|Creature - Human Rogue|2|3|When Agent of Treachery enters the battlefield, gain control of target permanent.$At the beginning of your end step, if you control three or more permanents you don't own, draw three cards.| Atemsis, All-Seeing|Core Set 2020|46|R|{3}{U}{U}{U}|Legendary Creature - Sphinx|4|5|Flying${2}{U}, {T}: Draw two cards, then discard a card.$Whenever Atemsis, All-Seeing deals damage to an opponent, you may reveal your hand. If cards with at least six different converted mana costs are revealed this way, that player loses the game.| Captivating Gyre|Core Set 2020|51|U|{4}{U}{U}|Sorcery|||Return up to three target creatures to their owners' hands.| +Cerulean Drake|Core Set 2020|53|U|{1}{U}|Creature - Drake|1|1|Flying$Protection from red$Sacrifice Cerulean Drake: Counter target spell that targets you.| Convolute|Core Set 2020|55|C|{2}{U}|Instant|||Counter target spell unless its controller pays {4}.| Drawn from Dreams|Core Set 2020|56|R|{2}{U}{U}|Sorcery|||Look at the top seven cards of your library. Put two of them into your hand and the rest on the bottom of your library in a random order.| Dungeon Geists|Core Set 2020|57|R|{2}{U}{U}|Creature - Spirit|3|3|Flying$When Dungeon Geists enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's untap step for as long as you control Dungeon Geists.| @@ -35398,12 +35402,15 @@ Octoprophet|Core Set 2020|70|C|{3}{U}|Creature - Octopus|3|3|When Octoprophet en Portal of Sanctuary|Core Set 2020|71|U|{2}{U}|Artifact|||{1}, {T}: Return target creature you control and each Aura attached to it to their owners' hands. Activate this ability only during your turn.| Renowned Weaponsmith|Core Set 2020|72|U|{1}{U}|Creature - Human Artificer|1|3|{T}: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts.${U}, {T}: Search your library for a card named Heart-Piercer Bow or Vial of Dragonfire, reveal it, put it into your hand, then shuffle your library.| Scholar of the Ages|Core Set 2020|74|U|{5}{U}{U}|Creature - Human Wizard|3|3|When Scholar of the Ages enters the battlefield, return up to two target instant and/or sorcery cards from your graveyard to your hand.| +Spectral Sailor|Core Set 2020|76|U|{U}|Creature - Spirit Pirate|1|1|Flash$Flying${3}{U}: Draw a card.| Unsummon|Core Set 2020|78|C|{U}|Instant|||Return target creature to its owner's hand.| Blightbeetle|Core Set 2020|87|U|{1}{B}|Creature - Insect|1|1|Protection from green$Creatures your opponents control can't have +1/+1 counters put on them.| Bloodthirsty Aerialist|Core Set 2020|91|U|{1}{B}{B}|Creature - Vampire Rogue|2|3|Flying$Whenever you gain life, put a +1/+1 counter on Bloodthirsty Aerialist.| Bone Splinters|Core Set 2020|92|C|{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$Destroy target creature.| +Cavalier of Night|Core Set 2020|94|M|{2}{B}{B}{B}|Creature - Elemental Knight|4|5|Lifelink$When Cavalier of Night enters the battlefield, you may sacrifice another creature. When you do, destroy target creature an opponent controls.$When Cavalier of Night dies, return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.| Disfigure|Core Set 2020|95|U|{B}|Instant|||Target creature gets -2/-2 until end of turn.| Dread Presence|Core Set 2020|96|R|{3}{B}|Creature - Nightmare|3|3|Whenever a Swamp enters the battlefield under your control, choose one —$• You draw a card and you lose 1 life.$• Dread Presence deals 2 damage to any target and you gain 2 life.| +Knight of the Ebon Legion|Core Set 2020|105|R|{B}|Creature - Vampire Knight|1|2|{2}{B}: Knight of the Ebon Legion gets +3/+3 and gains deathtouch until end of turn.$At the beginning of your end step, if a player lost 4 or more life this turn, put a +1/+1 counter on Knight of the Ebon Legion.| Legion's End|Core Set 2020|106|R|{1}{B}|Sorcery|||Exile target creature an opponent controls with converted mana cost 2 or less and all other creatures that player controls with the same name as that creature. Then that player reveals their hand and exiles all cards with that name from their hand and graveyard.| Leyline of the Void|Core Set 2020|107|R|{2}{B}{B}|Enchantment|||If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield.$If a card would be put into an opponent's graveyard from anywhere, exile it instead.| Rotting Regisaur|Core Set 2020|111|R|{2}{B}|Creature - Zombie Dinosaur|7|6|At the beginning of your upkeep, discard a card.| @@ -35439,14 +35446,17 @@ Ferocious Pup|Core Set 2020|171|C|{2}{G}|Creature - Wolf|0|1|When Ferocious Pup Growth Cycle|Core Set 2020|175|C|{1}{G}|Instant|||Target creature gets +3/+3 until end of turn. It gets an additional +2/+2 until end of turn for each card named Growth Cycle in your graveyard.| Leyline of Abundance|Core Set 2020|179|R|{2}{G}{G}|Enchantment|||If Leyline of Abundance is in your opening hand, you may begin the game with it on the battlefield.$Whenever you tap a creature for mana, add an additional {G}.${6}{G}{G}: Put a +1/+1 counter on each creature you control.| Loaming Shaman|Core Set 2020|180|U|{2}{G}|Creature - Centaur Shaman|3|2|When Loaming Shaman enters the battlefield, target player shuffles any number of target cards from their graveyard into their library.| +Nightpack Ambusher|Core Set 2020|185|R|{2}{G}{G}|Creature - Wolf|4|4|Flash$Other Wolves and Werewolves you control get +1/+1.$At the beginning of your end step, if you didn't cast a spell this turn, create a 2/2 green Wolf creature token.| Overgrowth Elemental|Core Set 2020|187|U|{2}{G}|Creature - Elemental|3|2|When Overgrowth Elemental enters the battlefield, put a +1/+1 counter on another target Elemental you control.$Whenever another creature you control dies, you gain 1 life. If that creature was an Elemental, put a +1/+1 counter on Overgrowth Elemental.| Pulse of Murasa|Core Set 2020|189|U|{2}{G}|Instant|||Return target creature or land card from a graveyard to its owner's hand. You gain 6 life.| Season of Growth|Core Set 2020|191|U|{1}{G}|Enchantment|||Whenever a creature enters the battlefield under your control, scry 1.$Whenever you cast a spell that targets a creature you control, draw a card.| +Shifting Ceratops|Core Set 2020|194|R|{2}{G}{G}|Creature - Dinosaur|5|4|This spell can't be countered.$Protection from blue${G}: Shifting Ceratops gains your choice of reach, trample, or haste until end of turn.| Silverback Shaman|Core Set 2020|195|C|{3}{G}{G}|Creature - Ape Shaman|5|4|Trample$When Silverback Shaman dies, draw a card.| Thrashing Brontodon|Core Set 2020|197|U|{1}{G}{G}|Creature - Dinosaur|3|4|{1}, Sacrifice Thrashing Brontodon: Destroy target artifact or enchantment.| Veil of Summer|Core Set 2020|198|U|{G}|Instant|||Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn.| Voracious Hydra|Core Set 2020|200|R|{X}{G}{G}|Creature - Hydra|0|1|Trample$Voracious Hydra enters the battlefield with X +1/+1 counters on it.$When Voracious Hydra enters the battlefield, choose one —$• Double the number of +1/+1 counters on Voracious Hydra.$• Voracious Hydra fights target creature you don't control.| Wakeroot Elemental|Core Set 2020|202|R|{4}{G}{G}|Creature - Elemental|5|5|{G}{G}{G}{G}{G}: Untap target land you control. It becomes a 5/5 Elemental creature with haste. It's still a land.| +Wolfkin Bond|Core Set 2020|203|C|{4}{G}|Enchantment - Aura|||Enchant creature$When Wolfkin Bond enters the battlefield, create a 2/2 green Wolf creature token.$Enchanted creature gets +2/+2.| Wolfrider's Saddle|Core Set 2020|204|U|{3}{G}|Artifact - Equipment|||When Wolfrider's Saddle enters the battlefield, create a 2/2 green Wolf creature token, then attach Wolfrider's Saddle to it.$Equipped creature gets +1/+1 and can't be blocked by more than one creature.$Equip {3}| Woodland Champion|Core Set 2020|205|U|{1}{G}|Creature - Elf Scout|2|2|Whenever one or more tokens enter the battlefield under your control, put that many +1/+1 counters on Woodland Champion.| Corpse Knight|Core Set 2020|206|U|{W}{B}|Creature - Zombie Knight|2|2|Whenever another creature enters the battlefield under your control, each opponent loses 1 life.| @@ -35462,11 +35472,14 @@ Risen Reef|Core Set 2020|217|U|{1}{G}{U}|Creature - Elemental|1|1|Whenever Risen Yarok, the Desecrated|Core Set 2020|220|M|{2}{B}{G}{U}|Legendary Creature - Elemental Horror|3|5|Deathtouch, lifelink$If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.| Golos, Tireless Pilgrim|Core Set 2020|226|R|{5}|Legendary Artifact Creature - Scout|3|5|When Golos, Tireless Pilgrim enters the battlefield, you may search your library for a land card, put that card onto the battlefield tapped, then shuffle your library.${2}{W}{U}{B}{R}{G}: Exile the top three cards of your library. You may play them this turn without paying their mana costs.| Heart-Piercer Bow|Core Set 2020|228|C|{2}|Artifact - Equipment|||Whenever equipped creature attacks, Heart-Piercer Bow deals 1 damage to target creature defending player controls.$Equip {1}| +Manifold Key|Core Set 2020|230|U|{1}|Artifact|||{1}, {T}: Untap another target artifact.${3}, {T}: Target creature can't be blocked this turn.| Retributive Wand|Core Set 2020|236|U|{3}|Artifact|||{3}, {T}: Retributive Wand deals 1 damage to any target.$When Retributive Wand is put into a graveyard from the battlefield, it deals 5 damage to any target.| Scuttlemutt|Core Set 2020|238|U|{3}|Artifact Creature - Scarecrow|2|2|{T}: Add one mana of any color.${T}: Target creature becomes the color or colors of your choice until end of turn.| +Steel Overseer|Core Set 2020|239|R|{2}|Artifact Creature - Construct|1|1|{T}: Put a +1/+1 counter on each artifact creature you control.| Vial of Dragonfire|Core Set 2020|241|C|{2}|Artifact|||{2}, {T}, Sacrifice Vial of Dragonfire: It deals 2 damage to target creature.| Cryptic Caves|Core Set 2020|244|U||Land|||{T}: Add {C}.${1}, {T}, Sacrifice Cryptic Caves: Draw a card. Activate this ability only if you control five or more lands.| Field of the Dead|Core Set 2020|247|R||Land|||Field of the Dead enters the battlefield tapped.${T}: Add {C}.$Whenever Field of the Dead or another land enters the battlefield under your control, if you control seven or more lands with different names, create a 2/2 black Zombie creature token.| +Lotus Field|Core Set 2020|249|R||Land|||Hexproof$Lotus Field enters the battlefield tapped.$When Lotus Field enters the battlefield, sacrifice two lands.${T}: Add three mana of any color.| Temple of Epiphany|Core Set 2020|253|R||Land|||Temple of Epiphany enters the battlefield tapped.$When Temple of Epiphany enters the battlefield, scry 1.${T}: Add {U} or {R}.| Temple of Malady|Core Set 2020|254|R||Land|||Temple of Malady enters the battlefield tapped.$When Temple of Malady enters the battlefield, scry 1.${T}: Add {B} or {G}.| Temple of Mystery|Core Set 2020|255|R||Land|||Temple of Mystery enters the battlefield tapped.$When Temple of Mystery enters the battlefield, scry 1.${T}: Add {G} or {U}.| From d66ad70aeb2b7c7f15cf75392ad30c3b0eed5a1e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 18:35:31 -0400 Subject: [PATCH 06/17] Implemented Manifold Key --- Mage.Sets/src/mage/cards/m/ManifoldKey.java | 56 +++++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 57 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/ManifoldKey.java diff --git a/Mage.Sets/src/mage/cards/m/ManifoldKey.java b/Mage.Sets/src/mage/cards/m/ManifoldKey.java new file mode 100644 index 00000000000..87cb68873c8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/ManifoldKey.java @@ -0,0 +1,56 @@ +package mage.cards.m; + +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.UntapTargetEffect; +import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterArtifactPermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ManifoldKey extends CardImpl { + + private static final FilterPermanent filter = new FilterArtifactPermanent("another target artifact"); + + static { + filter.add(AnotherPredicate.instance); + } + + public ManifoldKey(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); + + // {1}, {T}: Untap another target artifact. + Ability ability = new SimpleActivatedAbility(new UntapTargetEffect(), new GenericManaCost(1)); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + + // {3}, {T}: Target creature can't be blocked this turn. + ability = new SimpleActivatedAbility(new CantBeBlockedTargetEffect(Duration.EndOfTurn), new GenericManaCost(3)); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + private ManifoldKey(final ManifoldKey card) { + super(card); + } + + @Override + public ManifoldKey copy() { + return new ManifoldKey(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 55cd78517b9..141de54c8cf 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -75,6 +75,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Loaming Shaman", 180, Rarity.UNCOMMON, mage.cards.l.LoamingShaman.class)); cards.add(new SetCardInfo("Loxodon Lifechanter", 27, Rarity.RARE, mage.cards.l.LoxodonLifechanter.class)); cards.add(new SetCardInfo("Loyal Pegasus", 28, Rarity.UNCOMMON, mage.cards.l.LoyalPegasus.class)); + cards.add(new SetCardInfo("Manifold Key", 230, Rarity.UNCOMMON, mage.cards.m.ManifoldKey.class)); cards.add(new SetCardInfo("Moldervine Reclamation", 214, Rarity.UNCOMMON, mage.cards.m.MoldervineReclamation.class)); cards.add(new SetCardInfo("Negate", 69, Rarity.COMMON, mage.cards.n.Negate.class)); cards.add(new SetCardInfo("Octoprophet", 70, Rarity.COMMON, mage.cards.o.Octoprophet.class)); From 47683599c7814ba3dc8f0ecdb235b69e6ba9d2c3 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 18:39:36 -0400 Subject: [PATCH 07/17] Implemented Lotus Field --- Mage.Sets/src/mage/cards/l/LotusField.java | 51 ++++++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 52 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LotusField.java diff --git a/Mage.Sets/src/mage/cards/l/LotusField.java b/Mage.Sets/src/mage/cards/l/LotusField.java new file mode 100644 index 00000000000..5b49ae609c3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LotusField.java @@ -0,0 +1,51 @@ +package mage.cards.l; + +import mage.abilities.common.EntersBattlefieldTappedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.SacrificeControllerEffect; +import mage.abilities.effects.mana.AddManaOfAnyColorEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.mana.SimpleManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LotusField extends CardImpl { + + public LotusField(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // Hexproof + this.addAbility(HexproofAbility.getInstance()); + + // Lotus Field enters the battlefield tapped. + this.addAbility(new EntersBattlefieldTappedAbility()); + + // When Lotus Field enters the battlefield, sacrifice two lands. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SacrificeControllerEffect(StaticFilters.FILTER_LAND, 2, "") + )); + + // {T}: Add three mana of any color. + this.addAbility(new SimpleManaAbility( + Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new TapSourceCost() + )); + } + + private LotusField(final LotusField card) { + super(card); + } + + @Override + public LotusField copy() { + return new LotusField(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 141de54c8cf..b22c8405932 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -73,6 +73,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Leyline of Sanctity", 26, Rarity.RARE, mage.cards.l.LeylineOfSanctity.class)); cards.add(new SetCardInfo("Leyline of the Void", 107, Rarity.RARE, mage.cards.l.LeylineOfTheVoid.class)); cards.add(new SetCardInfo("Loaming Shaman", 180, Rarity.UNCOMMON, mage.cards.l.LoamingShaman.class)); + cards.add(new SetCardInfo("Lotus Field", 249, Rarity.RARE, mage.cards.l.LotusField.class)); cards.add(new SetCardInfo("Loxodon Lifechanter", 27, Rarity.RARE, mage.cards.l.LoxodonLifechanter.class)); cards.add(new SetCardInfo("Loyal Pegasus", 28, Rarity.UNCOMMON, mage.cards.l.LoyalPegasus.class)); cards.add(new SetCardInfo("Manifold Key", 230, Rarity.UNCOMMON, mage.cards.m.ManifoldKey.class)); From f32f4525b3347e34cf6212dad8855cd884076fb1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 18:40:27 -0400 Subject: [PATCH 08/17] Implemented Spectral Sailor --- .../src/mage/cards/s/SpectralSailor.java | 49 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 50 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SpectralSailor.java diff --git a/Mage.Sets/src/mage/cards/s/SpectralSailor.java b/Mage.Sets/src/mage/cards/s/SpectralSailor.java new file mode 100644 index 00000000000..62e03bab366 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpectralSailor.java @@ -0,0 +1,49 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +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 SpectralSailor extends CardImpl { + + public SpectralSailor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}"); + + this.subtype.add(SubType.SPIRIT); + this.subtype.add(SubType.PIRATE); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {3}{U}: Draw a card. + this.addAbility(new SimpleActivatedAbility( + new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{3}{U}") + )); + } + + private SpectralSailor(final SpectralSailor card) { + super(card); + } + + @Override + public SpectralSailor copy() { + return new SpectralSailor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index b22c8405932..de144c3ce5a 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -93,6 +93,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Scuttlemutt", 238, Rarity.UNCOMMON, mage.cards.s.Scuttlemutt.class)); cards.add(new SetCardInfo("Silverback Shaman", 195, Rarity.COMMON, mage.cards.s.SilverbackShaman.class)); cards.add(new SetCardInfo("Sorin, Imperious Bloodlord", 115, Rarity.MYTHIC, mage.cards.s.SorinImperiousBloodlord.class)); + cards.add(new SetCardInfo("Spectral Sailor", 76, Rarity.UNCOMMON, mage.cards.s.SpectralSailor.class)); cards.add(new SetCardInfo("Starfield Mystic", 39, Rarity.RARE, mage.cards.s.StarfieldMystic.class)); cards.add(new SetCardInfo("Steel Overseer", 239, Rarity.RARE, mage.cards.s.SteelOverseer.class)); cards.add(new SetCardInfo("Temple of Epiphany", 253, Rarity.RARE, mage.cards.t.TempleOfEpiphany.class)); From ce42085c79327cb75d3c096112dab9683dd8c87e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 18:59:10 -0400 Subject: [PATCH 09/17] Implemented Retributive Wand --- .../src/mage/cards/r/RetributiveWand.java | 46 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RetributiveWand.java diff --git a/Mage.Sets/src/mage/cards/r/RetributiveWand.java b/Mage.Sets/src/mage/cards/r/RetributiveWand.java new file mode 100644 index 00000000000..9b3a222a68b --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RetributiveWand.java @@ -0,0 +1,46 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RetributiveWand extends CardImpl { + + public RetributiveWand(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); + + // {3}, {T}: Retributive Wand deals 1 damage to any target. + Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new GenericManaCost(3)); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); + + // When Retributive Wand is put into a graveyard from the battlefield, it deals 5 damage to any target. + ability = new PutIntoGraveFromBattlefieldSourceTriggeredAbility( + new DamageTargetEffect(5, "it") + ); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); + } + + private RetributiveWand(final RetributiveWand card) { + super(card); + } + + @Override + public RetributiveWand copy() { + return new RetributiveWand(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index de144c3ce5a..d1be834652d 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -87,6 +87,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Raise the Alarm", 34, Rarity.COMMON, mage.cards.r.RaiseTheAlarm.class)); cards.add(new SetCardInfo("Reckless Air Strike", 154, Rarity.COMMON, mage.cards.r.RecklessAirStrike.class)); cards.add(new SetCardInfo("Renowned Weaponsmith", 72, Rarity.UNCOMMON, mage.cards.r.RenownedWeaponsmith.class)); + cards.add(new SetCardInfo("Retributive Wand", 236, Rarity.UNCOMMON, mage.cards.r.RetributiveWand.class)); cards.add(new SetCardInfo("Rotting Regisaur", 111, Rarity.RARE, mage.cards.r.RottingRegisaur.class)); cards.add(new SetCardInfo("Rule of Law", 35, Rarity.UNCOMMON, mage.cards.r.RuleOfLaw.class)); cards.add(new SetCardInfo("Scholar of the Ages", 74, Rarity.UNCOMMON, mage.cards.s.ScholarOfTheAges.class)); From 33986bebfec1fcafac46786c851cc59ea4e04ec5 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 19:18:02 -0400 Subject: [PATCH 10/17] Implemented Mu Yanling, Sky Dancer --- .../src/mage/cards/m/MuYanlingSkyDancer.java | 60 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + .../emblems/MuYanlingSkyDancerEmblem.java | 33 ++++++++++ .../token/MuYanlingSkyDancerToken.java | 28 +++++++++ 4 files changed, 122 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MuYanlingSkyDancer.java create mode 100644 Mage/src/main/java/mage/game/command/emblems/MuYanlingSkyDancerEmblem.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/MuYanlingSkyDancerToken.java diff --git a/Mage.Sets/src/mage/cards/m/MuYanlingSkyDancer.java b/Mage.Sets/src/mage/cards/m/MuYanlingSkyDancer.java new file mode 100644 index 00000000000..76c07158049 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MuYanlingSkyDancer.java @@ -0,0 +1,60 @@ +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.GetEmblemEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +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.game.command.emblems.MuYanlingSkyDancerEmblem; +import mage.game.permanent.token.MuYanlingSkyDancerToken; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MuYanlingSkyDancer extends CardImpl { + + public MuYanlingSkyDancer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{U}{U}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.YANLING); + this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(2)); + + // +2: Until your next turn, up to one target creature gets -2/-0 and loses flying. + Ability ability = new LoyaltyAbility(new BoostTargetEffect( + -2, 0, Duration.UntilYourNextTurn + ).setText("Until your next turn, up to one target creature gets -2/-0"), 2); + ability.addEffect(new LoseAbilityTargetEffect( + FlyingAbility.getInstance(), Duration.UntilYourNextTurn + ).setText("and loses flying")); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + this.addAbility(ability); + + // −3: Create a 4/4 blue Elemental Bird creature token with flying. + this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new MuYanlingSkyDancerToken()), -3)); + + // −8: You get an emblem with "Islands you control have '{T}: Draw a card'." + this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new MuYanlingSkyDancerEmblem()))); + } + + private MuYanlingSkyDancer(final MuYanlingSkyDancer card) { + super(card); + } + + @Override + public MuYanlingSkyDancer copy() { + return new MuYanlingSkyDancer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index d1be834652d..0765e554474 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -78,6 +78,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Loyal Pegasus", 28, Rarity.UNCOMMON, mage.cards.l.LoyalPegasus.class)); cards.add(new SetCardInfo("Manifold Key", 230, Rarity.UNCOMMON, mage.cards.m.ManifoldKey.class)); cards.add(new SetCardInfo("Moldervine Reclamation", 214, Rarity.UNCOMMON, mage.cards.m.MoldervineReclamation.class)); + cards.add(new SetCardInfo("Mu Yanling, Sky Dancer", 68, Rarity.MYTHIC, mage.cards.m.MuYanlingSkyDancer.class)); cards.add(new SetCardInfo("Negate", 69, Rarity.COMMON, mage.cards.n.Negate.class)); cards.add(new SetCardInfo("Octoprophet", 70, Rarity.COMMON, mage.cards.o.Octoprophet.class)); cards.add(new SetCardInfo("Ogre Siegebreaker", 215, Rarity.UNCOMMON, mage.cards.o.OgreSiegebreaker.class)); diff --git a/Mage/src/main/java/mage/game/command/emblems/MuYanlingSkyDancerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/MuYanlingSkyDancerEmblem.java new file mode 100644 index 00000000000..62459de6a64 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/MuYanlingSkyDancerEmblem.java @@ -0,0 +1,33 @@ +package mage.game.command.emblems; + +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.command.Emblem; + +/** + * @author TheElk801 + */ +public final class MuYanlingSkyDancerEmblem extends Emblem { + + private static final FilterPermanent filter + = new FilterControlledPermanent(SubType.ISLAND, "Islands you control"); + + // "Islands you control have '{T}: Draw a card'." + public MuYanlingSkyDancerEmblem() { + this.setName("Emblem Yanling"); + this.getAbilities().add(new SimpleStaticAbility( + Zone.COMMAND, + new GainAbilityControlledEffect(new SimpleActivatedAbility( + new DrawCardSourceControllerEffect(1), new TapSourceCost() + ), Duration.EndOfGame, filter) + )); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/MuYanlingSkyDancerToken.java b/Mage/src/main/java/mage/game/permanent/token/MuYanlingSkyDancerToken.java new file mode 100644 index 00000000000..13e4b367b4b --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/MuYanlingSkyDancerToken.java @@ -0,0 +1,28 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +public final class MuYanlingSkyDancerToken extends TokenImpl { + + public MuYanlingSkyDancerToken() { + super("Elemental Bird", "4/4 blue Elemental Bird creature token with flying"); + cardType.add(CardType.CREATURE); + color.setBlue(true); + subtype.add(SubType.ELEMENTAL); + subtype.add(SubType.BIRD); + power = new MageInt(4); + toughness = new MageInt(4); + addAbility(FlyingAbility.getInstance()); + } + + private MuYanlingSkyDancerToken(final MuYanlingSkyDancerToken token) { + super(token); + } + + public MuYanlingSkyDancerToken copy() { + return new MuYanlingSkyDancerToken(this); + } +} From 1ff0f47829b020de4cc491592b9a202b2001a50b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 20:09:43 -0400 Subject: [PATCH 11/17] Implemented Herald of the Sun --- .../src/mage/cards/h/HeraldOfTheSun.java | 61 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 62 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HeraldOfTheSun.java diff --git a/Mage.Sets/src/mage/cards/h/HeraldOfTheSun.java b/Mage.Sets/src/mage/cards/h/HeraldOfTheSun.java new file mode 100644 index 00000000000..3c3975e8bad --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HeraldOfTheSun.java @@ -0,0 +1,61 @@ +package mage.cards.h; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HeraldOfTheSun extends CardImpl { + + private static final FilterPermanent filter + = new FilterCreaturePermanent("another target creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + filter.add(AnotherPredicate.instance); + } + + public HeraldOfTheSun(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); + + this.subtype.add(SubType.ANGEL); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {3}{W}: Put a +1/+1 counter on another target creature with flying. + Ability ability = new SimpleActivatedAbility( + new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl("{3}{W}") + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private HeraldOfTheSun(final HeraldOfTheSun card) { + super(card); + } + + @Override + public HeraldOfTheSun copy() { + return new HeraldOfTheSun(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 0765e554474..7cdad243c79 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -65,6 +65,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Growth Cycle", 175, Rarity.COMMON, mage.cards.g.GrowthCycle.class)); cards.add(new SetCardInfo("Hanged Executioner", 22, Rarity.RARE, mage.cards.h.HangedExecutioner.class)); cards.add(new SetCardInfo("Heart-Piercer Bow", 228, Rarity.COMMON, mage.cards.h.HeartPiercerBow.class)); + cards.add(new SetCardInfo("Herald of the Sun", 23, Rarity.UNCOMMON, mage.cards.h.HeraldOfTheSun.class)); cards.add(new SetCardInfo("Infuriate", 145, Rarity.COMMON, mage.cards.i.Infuriate.class)); cards.add(new SetCardInfo("Ironroot Warlord", 209, Rarity.UNCOMMON, mage.cards.i.IronrootWarlord.class)); cards.add(new SetCardInfo("Kaalia, Zenith Seeker", 210, Rarity.MYTHIC, mage.cards.k.KaaliaZenithSeeker.class)); From 930504bee088bec543a9b37c33c15b91c10439d7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 20:24:58 -0400 Subject: [PATCH 12/17] Implemented Cerulean Drake --- Mage.Sets/src/mage/cards/c/CeruleanDrake.java | 84 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 85 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CeruleanDrake.java diff --git a/Mage.Sets/src/mage/cards/c/CeruleanDrake.java b/Mage.Sets/src/mage/cards/c/CeruleanDrake.java new file mode 100644 index 00000000000..00cbafc41fa --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CeruleanDrake.java @@ -0,0 +1,84 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterSpell; +import mage.filter.predicate.ObjectPlayer; +import mage.filter.predicate.ObjectPlayerPredicate; +import mage.game.Game; +import mage.game.stack.StackObject; +import mage.target.TargetSpell; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CeruleanDrake extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("spell that targets you"); + + static { + filter.add(CeruleanDrakePredicate.instance); + } + + public CeruleanDrake(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.DRAKE); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Protection from red + this.addAbility(ProtectionAbility.from(ObjectColor.RED)); + + // Sacrifice Cerulean Drake: Counter target spell that targets you. + Ability ability = new SimpleActivatedAbility(new CounterTargetEffect(), new SacrificeSourceCost()); + ability.addTarget(new TargetSpell(filter)); + this.addAbility(ability); + } + + private CeruleanDrake(final CeruleanDrake card) { + super(card); + } + + @Override + public CeruleanDrake copy() { + return new CeruleanDrake(this); + } +} + +enum CeruleanDrakePredicate implements ObjectPlayerPredicate> { + instance; + + @Override + public boolean apply(ObjectPlayer input, Game game) { + if (input.getPlayerId() == null) { + return false; + } + return input + .getObject() + .getStackAbility() + .getTargets() + .stream() + .anyMatch( + target -> target + .getTargets() + .stream() + .anyMatch(uuid -> uuid != null && uuid.equals(input.getPlayerId())) + ); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 7cdad243c79..e27103ec6ba 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -36,6 +36,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Bloodthirsty Aerialist", 91, Rarity.UNCOMMON, mage.cards.b.BloodthirstyAerialist.class)); cards.add(new SetCardInfo("Bone Splinters", 92, Rarity.COMMON, mage.cards.b.BoneSplinters.class)); cards.add(new SetCardInfo("Captivating Gyre", 51, Rarity.UNCOMMON, mage.cards.c.CaptivatingGyre.class)); + cards.add(new SetCardInfo("Cerulean Drake", 53, Rarity.UNCOMMON, mage.cards.c.CeruleanDrake.class)); cards.add(new SetCardInfo("Chandra's Embercat", 129, Rarity.COMMON, mage.cards.c.ChandrasEmbercat.class)); cards.add(new SetCardInfo("Chandra's Spitfire", 132, Rarity.UNCOMMON, mage.cards.c.ChandrasSpitfire.class)); cards.add(new SetCardInfo("Chandra, Acolyte of Flame", 126, Rarity.RARE, mage.cards.c.ChandraAcolyteOfFlame.class)); From 446cb5e01ac801261753712fd4dec00b0f8aca96 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 20:36:55 -0400 Subject: [PATCH 13/17] Implemented Yarok, the Desecrated --- .../src/mage/cards/y/YarokTheDesecrated.java | 101 ++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 102 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java diff --git a/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java b/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java new file mode 100644 index 00000000000..ecbc06d1328 --- /dev/null +++ b/Mage.Sets/src/mage/cards/y/YarokTheDesecrated.java @@ -0,0 +1,101 @@ +package mage.cards.y; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.events.NumberOfTriggersEvent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class YarokTheDesecrated extends CardImpl { + + public YarokTheDesecrated(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{G}{U}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.HORROR); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. + this.addAbility(new SimpleStaticAbility(new YarokTheDesecratedEffect())); + } + + private YarokTheDesecrated(final YarokTheDesecrated card) { + super(card); + } + + @Override + public YarokTheDesecrated copy() { + return new YarokTheDesecrated(this); + } +} + +class YarokTheDesecratedEffect extends ReplacementEffectImpl { + + YarokTheDesecratedEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "If a permanent entering the battlefield causes a triggered ability " + + "of a permanent you control to trigger, that ability triggers an additional time"; + } + + private YarokTheDesecratedEffect(final YarokTheDesecratedEffect effect) { + super(effect); + } + + @Override + public YarokTheDesecratedEffect copy() { + return new YarokTheDesecratedEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.NUMBER_OF_TRIGGERS; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!(event instanceof NumberOfTriggersEvent)) { + return false; + } + NumberOfTriggersEvent numberOfTriggersEvent = (NumberOfTriggersEvent) event; + if (!source.isControlledBy(event.getPlayerId())) { + return false; + } + GameEvent sourceEvent = numberOfTriggersEvent.getSourceEvent(); + // Only EtB triggers + if (sourceEvent == null + || sourceEvent.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD + || !(sourceEvent instanceof EntersTheBattlefieldEvent)) { + return false; + } + EntersTheBattlefieldEvent entersTheBattlefieldEvent = (EntersTheBattlefieldEvent) sourceEvent; + // Only for triggers of permanents + return game.getPermanent(numberOfTriggersEvent.getSourceId()) != null; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(event.getAmount() + 1); + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index e27103ec6ba..c4e2fa03623 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -115,5 +115,6 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Wakeroot Elemental", 202, Rarity.RARE, mage.cards.w.WakerootElemental.class)); cards.add(new SetCardInfo("Wolfkin Bond", 203, Rarity.COMMON, mage.cards.w.WolfkinBond.class)); cards.add(new SetCardInfo("Yarok's Fenlurker", 123, Rarity.UNCOMMON, mage.cards.y.YaroksFenlurker.class)); + cards.add(new SetCardInfo("Yarok, the Desecrated", 220, Rarity.MYTHIC, mage.cards.y.YarokTheDesecrated.class)); } } From 4a1f56d8c8b67f81c1c30af53a18f9382434e440 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 20:44:19 -0400 Subject: [PATCH 14/17] Implemented Voracious Hydra --- .../src/mage/cards/v/VoraciousHydra.java | 104 ++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 105 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VoraciousHydra.java diff --git a/Mage.Sets/src/mage/cards/v/VoraciousHydra.java b/Mage.Sets/src/mage/cards/v/VoraciousHydra.java new file mode 100644 index 00000000000..d1cfd1d3904 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VoraciousHydra.java @@ -0,0 +1,104 @@ +package mage.cards.v; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; +import mage.abilities.effects.common.FightTargetSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class VoraciousHydra extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature you don't control"); + + static { + filter.add(new ControllerPredicate(TargetController.NOT_YOU)); + } + + public VoraciousHydra(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{G}"); + + this.subtype.add(SubType.HYDRA); + this.power = new MageInt(0); + this.toughness = new MageInt(1); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Voracious Hydra enters the battlefield with X +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance()) + )); + + // When Voracious Hydra enters the battlefield, choose one — + // • Double the number of +1/+1 counters on Voracious Hydra. + Ability ability = new EntersBattlefieldTriggeredAbility(new VoraciousHydraEffect(), false); + + // • Voracious Hydra fights target creature you don't control. + Mode mode = new Mode( + new FightTargetSourceEffect() + .setText("{this} fights target creature you don't control") + ); + mode.addTarget(new TargetPermanent(filter)); + ability.addMode(mode); + this.addAbility(ability); + } + + private VoraciousHydra(final VoraciousHydra card) { + super(card); + } + + @Override + public VoraciousHydra copy() { + return new VoraciousHydra(this); + } +} + +class VoraciousHydraEffect extends OneShotEffect { + + VoraciousHydraEffect() { + super(Outcome.Benefit); + staticText = "Double the number of +1/+1 counters on {this}"; + } + + private VoraciousHydraEffect(final VoraciousHydraEffect effect) { + super(effect); + } + + @Override + public VoraciousHydraEffect copy() { + return new VoraciousHydraEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent == null) { + return false; + } + return permanent.addCounters(CounterType.P1P1.createInstance( + permanent.getCounters(game).getCount(CounterType.P1P1) + ), source, game); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index c4e2fa03623..abe06d8e1b4 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -112,6 +112,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Unsummon", 78, Rarity.COMMON, mage.cards.u.Unsummon.class)); cards.add(new SetCardInfo("Vampire of the Dire Moon", 120, Rarity.UNCOMMON, mage.cards.v.VampireOfTheDireMoon.class)); cards.add(new SetCardInfo("Vial of Dragonfire", 241, Rarity.COMMON, mage.cards.v.VialOfDragonfire.class)); + cards.add(new SetCardInfo("Voracious Hydra", 200, Rarity.RARE, mage.cards.v.VoraciousHydra.class)); cards.add(new SetCardInfo("Wakeroot Elemental", 202, Rarity.RARE, mage.cards.w.WakerootElemental.class)); cards.add(new SetCardInfo("Wolfkin Bond", 203, Rarity.COMMON, mage.cards.w.WolfkinBond.class)); cards.add(new SetCardInfo("Yarok's Fenlurker", 123, Rarity.UNCOMMON, mage.cards.y.YaroksFenlurker.class)); From c37118e5f2c8ba7006cf4130584c755dd85135be Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 21:01:50 -0400 Subject: [PATCH 15/17] Implemented Leyline of Abundance --- .../src/mage/cards/l/LeylineOfAbundance.java | 57 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LeylineOfAbundance.java diff --git a/Mage.Sets/src/mage/cards/l/LeylineOfAbundance.java b/Mage.Sets/src/mage/cards/l/LeylineOfAbundance.java new file mode 100644 index 00000000000..8e1ac037a78 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LeylineOfAbundance.java @@ -0,0 +1,57 @@ +package mage.cards.l; + +import mage.Mana; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.TapForManaAllTriggeredManaAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ManaEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.keyword.LeylineAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SetTargetPointer; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LeylineOfAbundance extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("you tap a creature"); + + public LeylineOfAbundance(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{G}"); + + // If Leyline of Abundance is in your opening hand, you may begin the game with it on the battlefield. + this.addAbility(LeylineAbility.getInstance()); + + // Whenever you tap a creature for mana, add an additional {G}. + this.addAbility(new TapForManaAllTriggeredManaAbility( + (ManaEffect) new BasicManaEffect(Mana.GreenMana(1)) + .setText("add an additional {G}"), + filter, SetTargetPointer.NONE + )); + + // {6}{G}{G}: Put a +1/+1 counter on each creature you control. + this.addAbility(new SimpleActivatedAbility(new AddCountersAllEffect( + CounterType.P1P1.createInstance(), + StaticFilters.FILTER_CONTROLLED_CREATURE + ), new ManaCostsImpl("{6}{G}{G}"))); + } + + private LeylineOfAbundance(final LeylineOfAbundance card) { + super(card); + } + + @Override + public LeylineOfAbundance copy() { + return new LeylineOfAbundance(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index abe06d8e1b4..9163728eabc 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -71,6 +71,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Ironroot Warlord", 209, Rarity.UNCOMMON, mage.cards.i.IronrootWarlord.class)); cards.add(new SetCardInfo("Kaalia, Zenith Seeker", 210, Rarity.MYTHIC, mage.cards.k.KaaliaZenithSeeker.class)); cards.add(new SetCardInfo("Kykar, Wind's Fury", 212, Rarity.MYTHIC, mage.cards.k.KykarWindsFury.class)); + cards.add(new SetCardInfo("Leyline of Abundance", 179, Rarity.RARE, mage.cards.l.LeylineOfAbundance.class)); cards.add(new SetCardInfo("Leyline of Anticipation", 64, Rarity.RARE, mage.cards.l.LeylineOfAnticipation.class)); cards.add(new SetCardInfo("Leyline of Sanctity", 26, Rarity.RARE, mage.cards.l.LeylineOfSanctity.class)); cards.add(new SetCardInfo("Leyline of the Void", 107, Rarity.RARE, mage.cards.l.LeylineOfTheVoid.class)); From f0879115b1903244448182f0f3e0114a26d77529 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 21:12:05 -0400 Subject: [PATCH 16/17] Implemented Wolfrider's Saddle --- .../src/mage/cards/w/WolfridersSaddle.java | 86 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 87 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WolfridersSaddle.java diff --git a/Mage.Sets/src/mage/cards/w/WolfridersSaddle.java b/Mage.Sets/src/mage/cards/w/WolfridersSaddle.java new file mode 100644 index 00000000000..7208ef24447 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WolfridersSaddle.java @@ -0,0 +1,86 @@ +package mage.cards.w; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneSourceEffect; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.WolfToken; +import mage.players.Player; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WolfridersSaddle extends CardImpl { + + public WolfridersSaddle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}{G}"); + + this.subtype.add(SubType.EQUIPMENT); + + // When Wolfrider's Saddle enters the battlefield, create a 2/2 green Wolf creature token, then attach Wolfrider's Saddle to it. + this.addAbility(new EntersBattlefieldTriggeredAbility(new WolfridersSaddleEffect())); + + // Equipped creature gets +1/+1 and can't be blocked by more than one creature. + Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 1)); + ability.addEffect(new GainAbilityAttachedEffect( + new SimpleStaticAbility(new CantBeBlockedByMoreThanOneSourceEffect()), AttachmentType.EQUIPMENT + ).setText("and can't be blocked by more than one creature")); + this.addAbility(ability); + + // Equip {3} + this.addAbility(new EquipAbility(3)); + } + + private WolfridersSaddle(final WolfridersSaddle card) { + super(card); + } + + @Override + public WolfridersSaddle copy() { + return new WolfridersSaddle(this); + } +} + +class WolfridersSaddleEffect extends CreateTokenEffect { + + WolfridersSaddleEffect() { + super(new WolfToken()); + staticText = "create a 2/2 green Wolf creature token, then attach {this} to it."; + } + + private WolfridersSaddleEffect(final WolfridersSaddleEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null == !super.apply(game, source)) { + return false; + } + Permanent p = game.getPermanent(this.getLastAddedTokenId()); + if (p == null) { + return false; + } + p.addAttachment(source.getSourceId(), game); + return true; + } + + @Override + public WolfridersSaddleEffect copy() { + return new WolfridersSaddleEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index 9163728eabc..de3a9a4fc44 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -116,6 +116,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Voracious Hydra", 200, Rarity.RARE, mage.cards.v.VoraciousHydra.class)); cards.add(new SetCardInfo("Wakeroot Elemental", 202, Rarity.RARE, mage.cards.w.WakerootElemental.class)); cards.add(new SetCardInfo("Wolfkin Bond", 203, Rarity.COMMON, mage.cards.w.WolfkinBond.class)); + cards.add(new SetCardInfo("Wolfrider's Saddle", 204, Rarity.UNCOMMON, mage.cards.w.WolfridersSaddle.class)); cards.add(new SetCardInfo("Yarok's Fenlurker", 123, Rarity.UNCOMMON, mage.cards.y.YaroksFenlurker.class)); cards.add(new SetCardInfo("Yarok, the Desecrated", 220, Rarity.MYTHIC, mage.cards.y.YarokTheDesecrated.class)); } From ff74ccdb0a8be3e7b7d40bf07433d5e51f4b585d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Jun 2019 21:23:33 -0400 Subject: [PATCH 17/17] Implemented Elvish Reclaimer --- .../src/mage/cards/e/ElvishReclaimer.java | 67 +++++++++++++++++++ Mage.Sets/src/mage/sets/CoreSet2020.java | 1 + 2 files changed, 68 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/ElvishReclaimer.java diff --git a/Mage.Sets/src/mage/cards/e/ElvishReclaimer.java b/Mage.Sets/src/mage/cards/e/ElvishReclaimer.java new file mode 100644 index 00000000000..79fddbe5972 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ElvishReclaimer.java @@ -0,0 +1,67 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CardsInControllerGraveCondition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +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 mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetControlledPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ElvishReclaimer extends CardImpl { + + private static final Condition condition + = new CardsInControllerGraveCondition(3, StaticFilters.FILTER_CARD_LAND); + + public ElvishReclaimer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Elvish Reclaimer gets +2/+2 as long as there are three or more land cards in your graveyard. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), + condition, "{this} gets +2/+2 as long as there are three or more land cards in your graveyard." + ))); + + // {2}, {T}, Sacrifice a land: Search your library for a land card, put it onto the battlefield tapped, then shuffle your library. + Ability ability = new SimpleActivatedAbility(new SearchLibraryPutInPlayEffect( + new TargetCardInLibrary(StaticFilters.FILTER_CARD_LAND_A), true + ), new GenericManaCost(2)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent( + StaticFilters.FILTER_CONTROLLED_LAND_SHORT_TEXT + ))); + this.addAbility(ability); + } + + private ElvishReclaimer(final ElvishReclaimer card) { + super(card); + } + + @Override + public ElvishReclaimer copy() { + return new ElvishReclaimer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/CoreSet2020.java b/Mage.Sets/src/mage/sets/CoreSet2020.java index de3a9a4fc44..b11aef883fb 100644 --- a/Mage.Sets/src/mage/sets/CoreSet2020.java +++ b/Mage.Sets/src/mage/sets/CoreSet2020.java @@ -54,6 +54,7 @@ public final class CoreSet2020 extends ExpansionSet { cards.add(new SetCardInfo("Drawn from Dreams", 56, Rarity.RARE, mage.cards.d.DrawnFromDreams.class)); cards.add(new SetCardInfo("Dread Presence", 96, Rarity.RARE, mage.cards.d.DreadPresence.class)); cards.add(new SetCardInfo("Dungeon Geists", 57, Rarity.RARE, mage.cards.d.DungeonGeists.class)); + cards.add(new SetCardInfo("Elvish Reclaimer", 169, Rarity.RARE, mage.cards.e.ElvishReclaimer.class)); cards.add(new SetCardInfo("Ember Hauler", 137, Rarity.UNCOMMON, mage.cards.e.EmberHauler.class)); cards.add(new SetCardInfo("Empyrean Eagle", 208, Rarity.UNCOMMON, mage.cards.e.EmpyreanEagle.class)); cards.add(new SetCardInfo("Ferocious Pup", 171, Rarity.COMMON, mage.cards.f.FerociousPup.class));