From 606f213f9a70b34d73da8dbeff10d215545569bb Mon Sep 17 00:00:00 2001 From: PurpleCrowbar <26198472+PurpleCrowbar@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:33:02 +0000 Subject: [PATCH 01/91] [ECC] Implement Dread Tiller --- Mage.Sets/src/mage/cards/d/DreadTiller.java | 58 +++++++++++++++++++ .../mage/sets/LorwynEclipsedCommander.java | 2 + 2 files changed, 60 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DreadTiller.java diff --git a/Mage.Sets/src/mage/cards/d/DreadTiller.java b/Mage.Sets/src/mage/cards/d/DreadTiller.java new file mode 100644 index 00000000000..bae8745b04d --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DreadTiller.java @@ -0,0 +1,58 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.PutCardFromHandOrGraveyardOntoBattlefieldEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +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.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author PurpleCrowbar + */ +public final class DreadTiller extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("a creature with a -1/-1 counter on it"); + + static { + filter.add(CounterType.M1M1.getPredicate()); + } + + public DreadTiller(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{B}{G}"); + + this.subtype.add(SubType.SCARECROW); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // When this creature enters, put a -1/-1 counter on target creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance())); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Whenever a creature with a -1/-1 counter on it dies, you may put a land card from your hand or graveyard onto the battlefield tapped. + this.addAbility(new DiesCreatureTriggeredAbility( + new PutCardFromHandOrGraveyardOntoBattlefieldEffect(StaticFilters.FILTER_CARD_LAND_A, true), true, filter + )); + } + + private DreadTiller(final DreadTiller card) { + super(card); + } + + @Override + public DreadTiller copy() { + return new DreadTiller(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java index ad79b5a2a4c..e405f373946 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java @@ -56,6 +56,8 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Devoted Druid", 104, Rarity.UNCOMMON, mage.cards.d.DevotedDruid.class)); cards.add(new SetCardInfo("Distant Melody", 45, Rarity.COMMON, mage.cards.d.DistantMelody.class)); cards.add(new SetCardInfo("Dragonskull Summit", 147, Rarity.RARE, mage.cards.d.DragonskullSummit.class)); + cards.add(new SetCardInfo("Dread Tiller", 20, Rarity.RARE, mage.cards.d.DreadTiller.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dread Tiller", 40, Rarity.RARE, mage.cards.d.DreadTiller.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dusk Urchins", 73, Rarity.RARE, mage.cards.d.DuskUrchins.class)); cards.add(new SetCardInfo("Endurance", 51, Rarity.MYTHIC, mage.cards.e.Endurance.class)); cards.add(new SetCardInfo("Everlasting Torment", 121, Rarity.RARE, mage.cards.e.EverlastingTorment.class)); From 544733b22371b99fc81f7dba720207632daed06b Mon Sep 17 00:00:00 2001 From: PurpleCrowbar <26198472+PurpleCrowbar@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:33:24 +0000 Subject: [PATCH 02/91] Simplify The Scorpion God implementation --- .../src/mage/cards/t/TheScorpionGod.java | 66 ++++--------------- 1 file changed, 12 insertions(+), 54 deletions(-) diff --git a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java index 32a52560d5a..48ae5e12f04 100644 --- a/Mage.Sets/src/mage/cards/t/TheScorpionGod.java +++ b/Mage.Sets/src/mage/cards/t/TheScorpionGod.java @@ -1,12 +1,10 @@ - package mage.cards.t; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; @@ -22,12 +20,10 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.SuperType; -import mage.constants.Zone; import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; @@ -39,6 +35,12 @@ import static mage.filter.StaticFilters.FILTER_ANOTHER_TARGET_CREATURE; */ public final class TheScorpionGod extends CardImpl { + private static final FilterPermanent filter = new FilterCreaturePermanent("a creature with a -1/-1 counter on it"); + + static { + filter.add(CounterType.M1M1.getPredicate()); + } + public TheScorpionGod(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{R}"); @@ -48,7 +50,9 @@ public final class TheScorpionGod extends CardImpl { this.toughness = new MageInt(5); // Whenever a creature with a -1/-1 counter on it dies, draw a card. - this.addAbility(new TheScorpionGodTriggeredAbility()); + this.addAbility(new DiesCreatureTriggeredAbility( + new DrawCardSourceControllerEffect(1), false, filter + )); // {1}{B}{R}: Put a -1/-1 counter on another target creature. Ability ability = new SimpleActivatedAbility(new AddCountersTargetEffect(CounterType.M1M1.createInstance()), new ManaCostsImpl<>("{1}{B}{R}")); @@ -69,52 +73,6 @@ public final class TheScorpionGod extends CardImpl { } } -class TheScorpionGodTriggeredAbility extends TriggeredAbilityImpl { - - public TheScorpionGodTriggeredAbility() { - super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), false); - setLeavesTheBattlefieldTrigger(true); - } - - private TheScorpionGodTriggeredAbility(final TheScorpionGodTriggeredAbility ability) { - super(ability); - } - - @Override - public TheScorpionGodTriggeredAbility copy() { - return new TheScorpionGodTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.isDiesEvent()) { - Permanent permanent = game.getPermanentOrLKIBattlefield(zEvent.getTargetId()); - if (permanent != null - && permanent.isCreature(game) - && permanent.getCounters(game).containsKey(CounterType.M1M1)) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever a creature with a -1/-1 counter on it dies, draw a card."; - } - - @Override - public boolean isInUseableZone(Game game, MageObject sourceObject, GameEvent event) { - return TriggeredAbilityImpl.isInUseableZoneDiesTrigger(this, sourceObject, event, game); - } -} - class TheScorpionGodEffect extends OneShotEffect { private static final String effectText = "return it to its owner's hand at the beginning of the next end step"; From caad3b25292edc77c7d59ee343c696df2fdc4db4 Mon Sep 17 00:00:00 2001 From: PurpleCrowbar <26198472+PurpleCrowbar@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:21:12 +0000 Subject: [PATCH 03/91] Update ECL basic lands to full art render mode --- Mage.Sets/src/mage/sets/LorwynEclipsed.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index f3d695adb93..e91f83c7805 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -98,8 +98,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Flamekin Gildweaver", 140, Rarity.COMMON, mage.cards.f.FlamekinGildweaver.class)); cards.add(new SetCardInfo("Flock Impostor", 16, Rarity.UNCOMMON, mage.cards.f.FlockImpostor.class)); cards.add(new SetCardInfo("Forest", 273, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 278, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 283, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 278, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Forest", 283, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Formidable Speaker", 176, Rarity.RARE, mage.cards.f.FormidableSpeaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Formidable Speaker", 366, Rarity.RARE, mage.cards.f.FormidableSpeaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gallant Fowlknight", 17, Rarity.COMMON, mage.cards.g.GallantFowlknight.class)); @@ -134,8 +134,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Iron-Shield Elf", 108, Rarity.UNCOMMON, mage.cards.i.IronShieldElf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Iron-Shield Elf", 404, Rarity.UNCOMMON, mage.cards.i.IronShieldElf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 270, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 275, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 280, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 275, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Island", 280, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Kinsbaile Aspirant", 21, Rarity.UNCOMMON, mage.cards.k.KinsbaileAspirant.class)); cards.add(new SetCardInfo("Kirol, Attentive First-Year", 231, Rarity.RARE, mage.cards.k.KirolAttentiveFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kirol, Attentive First-Year", 374, Rarity.RARE, mage.cards.k.KirolAttentiveFirstYear.class, NON_FULL_USE_VARIOUS)); @@ -163,8 +163,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Morningtide's Light", 301, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 272, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 277, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 282, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 277, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 282, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Mudbutton Cursetosser", 112, Rarity.UNCOMMON, mage.cards.m.MudbuttonCursetosser.class)); cards.add(new SetCardInfo("Mutable Explorer", 186, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mutable Explorer", 327, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); @@ -179,8 +179,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Pestered Wellguard", 63, Rarity.UNCOMMON, mage.cards.p.PesteredWellguard.class)); cards.add(new SetCardInfo("Pitiless Fists", 187, Rarity.UNCOMMON, mage.cards.p.PitilessFists.class)); cards.add(new SetCardInfo("Plains", 269, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 274, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 279, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 274, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Plains", 279, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Prideful Feastling", 238, Rarity.COMMON, mage.cards.p.PridefulFeastling.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); @@ -214,8 +214,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Sun-Dappled Celebrant", 37, Rarity.COMMON, mage.cards.s.SunDappledCelebrant.class)); cards.add(new SetCardInfo("Surly Farrier", 196, Rarity.COMMON, mage.cards.s.SurlyFarrier.class)); cards.add(new SetCardInfo("Swamp", 271, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 276, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 281, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 276, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 281, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Swat Away", 75, Rarity.UNCOMMON, mage.cards.s.SwatAway.class)); cards.add(new SetCardInfo("Sygg, Wanderwine Wisdom", 288, Rarity.RARE, mage.cards.s.SyggWanderwineWisdom.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sygg, Wanderwine Wisdom", 76, Rarity.RARE, mage.cards.s.SyggWanderwineWisdom.class, NON_FULL_USE_VARIOUS)); From 6ae2f9ae0181d3a9a98b6e02aea4de1f472f2569 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:17:42 -0500 Subject: [PATCH 04/91] [ECL] update spoiler --- Utils/mtg-cards-data.txt | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 8a6e39e344c..406e89e574c 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -60819,6 +60819,8 @@ Arcane Signet|Avatar: The Last Airbender Eternal|315|R|{2}|Artifact|||{T}: Add o Sol Ring|Avatar: The Last Airbender Eternal|316|R|{1}|Artifact|||{T}: Add {C}{C}.| Swiftfoot Boots|Avatar: The Last Airbender Eternal|317|R|{2}|Artifact - Equipment|||Equipped creature has hexproof and haste.$Equip {1}| Rooftop Percher|Lorwyn Eclipsed|2|C|{5}|Creature - Shapeshifter|3|3|Changeling$Flying$When this creature enters, exile up to two target cards from graveyards. You gain 3 life.| +Adept Watershaper|Lorwyn Eclipsed|3|R|{2}{W}|Creature - Merfolk Cleric|3|4|Other tapped creatures you control have indestructible.| +Ajani, Outland Chaperone|Lorwyn Eclipsed|4|M|{1}{W}{W}|Legendary Planeswalker - Ajani|3|+1: Create a 1/1 green and white Kithkin creature token.$-2: Ajani deals 4 damage to target tapped creature.$-8: Look at the top X cards of your library, where X is your life total. You may put any number of nonland permanent cards with mana value 3 or less from among them onto the battlefield. Then shuffle.| Appeal to Eirdu|Lorwyn Eclipsed|5|C|{3}{W}|Instant|||Convoke$One or two target creatures each get +2/+1 until end of turn.| Bark of Doran|Lorwyn Eclipsed|6|U|{1}{W}|Artifact - Equipment|||Equipped creature gets +0/+1.$As long as equipped creature's toughness is greater than its power, it assigns combat damage equal to its toughness rather than its power.$Equip {1}| Brigid, Clachan's Heart|Lorwyn Eclipsed|7|R|{2}{W}|Legendary Creature - Kithkin Warrior|3|2|Whenever this creature enters or transforms into Brigid, Clachan's Heart, create a 1/1 green and white Kithkin creature token.$At the beginning of your first main phase, you may pay {G}. If you do, transform Brigid.| @@ -60830,11 +60832,13 @@ Crib Swap|Lorwyn Eclipsed|11|U|{2}{W}|Kindred Instant - Shapeshifter|||Changelin Curious Colossus|Lorwyn Eclipsed|12|M|{5}{W}{W}|Creature - Giant Warrior|7|7|When this creature enters, each creature target opponent controls loses all abilities, becomes a Coward in addition to its other types, and has base power and toughness 1/1.| Eirdu, Carrier of Dawn|Lorwyn Eclipsed|13|M|{3}{W}{W}|Legendary Creature - Elemental God|5|5|Flying, lifelink$Creature spells you cast have convoke.$At the beginning of your first main phase, you may pay {B}. If you do, transform Eirdu.| Isilu, Carrier of Twilight|Lorwyn Eclipsed|13|M||Legendary Creature - Elemental God|5|5|Flying, lifelink$Each other nontoken creature you control has persist.$At the beginning of your first main phase, you may pay {W}. If you do, transform Isilu.| +Encumbered Reejerey|Lorwyn Eclipsed|14|U|{1}{W}|Creature - Merfolk Soldier|5|4|This creature enters with three -1/-1 counters on it.$Whenever this creature becomes tapped while it has a -1/-1 counter on it, remove a -1/-1 counter from it.| Flock Impostor|Lorwyn Eclipsed|16|U|{2}{W}|Creature - Shapeshifter|2|2|Changeling$Flash$Flying$When this creature enters, return up to one other target creature you control to its owner's hand.| Gallant Fowlknight|Lorwyn Eclipsed|17|C|{3}{W}|Creature - Kithkin Knight|3|4|When this creature enters, creatures you control get +1/+0 until end of turn. Kithkin creatures you control also gain first strike until end of turn.| Goldmeadow Nomad|Lorwyn Eclipsed|18|C|{W}|Creature - Kithkin Scout|1|2|{W}, Exile this card from your graveyard: Create a 1/1 green and white Kithkin creature token. Activate only as a sorcery.| Kinbinding|Lorwyn Eclipsed|20|R|{3}{W}{W}|Enchantment|||Creatures you control get +X/+X, where X is the number of creatures that entered the battlefield under your control this turn.$At the beginning of combat on your turn, create a 1/1 green and white Kithkin creature token.| Kinsbaile Aspirant|Lorwyn Eclipsed|21|U|{W}|Creature - Kithkin Citizen|2|1|As an additional cost to cast this spell, behold a Kithkin or pay {2}.$Whenever another creature you control enters, this creature gets +1/+1 until end of turn.| +Kinscaer Sentry|Lorwyn Eclipsed|22|R|{1}{W}|Creature - Kithkin Soldier|2|2|First strike, lifelink$Whenever this creature attacks, you may put a creature card with mana value X or less from your hand onto the battlefield tapped and attacking, where X is the number of attacking creatures you control.| Kithkeeper|Lorwyn Eclipsed|23|U|{6}{W}|Creature - Elemental|3|3|Vivid -- When this creature enters, create X 1/1 green and white Kithkin creature tokens, where X is the number of colors among permanents you control.$Tap three untapped creatures you control: This creature gets +3/+0 and gains flying until end of turn.| Liminal Hold|Lorwyn Eclipsed|24|C|{3}{W}|Enchantment|||When this enchantment enters, exile up to one target nonland permanent an opponent controls until this enchantment leaves the battlefield. You gain 2 life.| Meanders Guide|Lorwyn Eclipsed|25|U|{2}{W}|Creature - Merfolk Scout|3|2|Whenever this creature attacks, you may tap another untapped Merfolk you control. When you do, return target creature card with mana value 3 or less from your graveyard to the battlefield.| @@ -60853,9 +60857,11 @@ Wanderbrine Preacher|Lorwyn Eclipsed|41|C|{1}{W}|Creature - Merfolk Cleric|2|2|W Winnowing|Lorwyn Eclipsed|43|R|{4}{W}{W}|Sorcery|||Convoke$For each player, you choose a creature that player controls. Then each player sacrifices all other creatures they control that don't share a creature type with the chosen creature they control.| Aquitect's Defenses|Lorwyn Eclipsed|44|C|{1}{U}|Enchantment - Aura|||Flash$Enchant creature you control$When this Aura enters, enchanted creature gains hexproof until end of turn.$Enchanted creature gets +1/+2.| Blossombind|Lorwyn Eclipsed|45|C|{1}{U}|Enchantment - Aura|||Enchant creature$When this Aura enters, tap enchanted creature.$Enchanted creature can't become untapped and can't have counters put on it.| +Champions of the Shoal|Lorwyn Eclipsed|46|R|{3}{U}|Creature - Merfolk Soldier|4|6|As an additional cost to cast this spell, behold a Merfolk and exile it.$Whenever this creature enters or becomes tapped, tap up to one target creature and put a stun counter on it.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Disruptor of Currents|Lorwyn Eclipsed|47|R|{3}{U}{U}|Creature - Merfolk Wizard|3|3|Flash$Convoke$When this creature enters, return up to one other target nonland permanent to its owner's hand.| Flitterwing Nuisance|Lorwyn Eclipsed|48|R|{U}|Creature - Faerie Rogue|2|2|Flying$This creature enters with a -1/-1 counter on it.${2}{U}, Remove a counter from this creature: Whenever a creature you control deals combat damage to a player or planeswalker this turn, draw a card.| Glamer Gifter|Lorwyn Eclipsed|49|U|{1}{U}|Creature - Faerie Wizard|1|2|Flash$Flying$When this creature enters, choose up to one other target creature. Until end of turn, that creature has base power and toughness 4/4 and gains all creature types.| +Glen Elendra Guardian|Lorwyn Eclipsed|51|R|{2}{U}|Creature - Faerie Wizard|3|4|Flash$Flying$This creature enters with a -1/-1 counter on it.${1}{U}, Remove a counter from this creature: Counter target noncreature spell. Its controller draws a card.| Glen Elendra's Answer|Lorwyn Eclipsed|52|M|{2}{U}{U}|Instant|||This spell can't be countered.$Counter all spells your opponents control and all abilities your opponents control. Create a 1/1 blue and black Faerie creature token with flying for each spell and ability countered this way.| Gravelgill Scoundrel|Lorwyn Eclipsed|53|C|{1}{U}|Creature - Merfolk Rogue|1|3|Vigilance$Whenever this creature attacks, you may tap another untapped creature you control. If you do, this creature can't be blocked this turn.| Harmonized Crescendo|Lorwyn Eclipsed|54|R|{4}{U}{U}|Instant|||Convoke$Choose a creature type. Draw a card for each permanent you control of that type.| @@ -60867,6 +60873,7 @@ Oko, Lorwyn Liege|Lorwyn Eclipsed|61|M|{2}{U}|Legendary Planeswalker - Oko|3|At Oko, Shadowmoor Scion|Lorwyn Eclipsed|61|M||Legendary Planeswalker - Oko|3|At the beginning of your first main phase, you may pay {U}. If you do, transform Oko.$-1: Mill three cards. You may put a permanent card from among them into your hand.$-3: Create two 3/3 green Elk creature tokens.$-6: Choose a creature type. You get an emblem with "Creatures you control of the chosen type get +3/+3 and have vigilance and hexproof."| Omni-Changeling|Lorwyn Eclipsed|62|U|{3}{U}{U}|Creature - Shapeshifter|0|0|Changeling$Convoke$You may have this creature enter as a copy of any creature on the battlefield, except it has changeling.| Pestered Wellguard|Lorwyn Eclipsed|63|U|{3}{U}|Creature - Merfolk Soldier|3|2|Whenever this creature becomes tapped, create a 1/1 blue and black Faerie creature token with flying.| +Rimefire Torque|Lorwyn Eclipsed|65|R|{1}{U}|Artifact|||As this artifact enters, choose a creature type.$Whenever a permanent you control of the chosen type enters, put a charge counter on this artifact.${T}, Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it. You may choose new targets for the copy.| Run Away Together|Lorwyn Eclipsed|67|C|{1}{U}|Instant|||Choose two target creatures controlled by different players. Return those creatures to their owners' hands.| Shinestriker|Lorwyn Eclipsed|68|U|{4}{U}{U}|Creature - Elemental|3|3|Flying$Vivid -- When this creature enters, draw cards equal to the number of colors among permanents you control.| Silvergill Peddler|Lorwyn Eclipsed|70|C|{2}{U}|Creature - Merfolk Citizen|2|3|Whenever this creature becomes tapped, draw a card, then discard a card.| @@ -60886,6 +60893,7 @@ Wild Unraveling|Lorwyn Eclipsed|84|C|{U}{U}|Instant|||As an additional cost to c Auntie's Sentence|Lorwyn Eclipsed|85|C|{1}{B}|Sorcery|||Choose one --$* Target opponent reveals their hand. You choose a nonland permanent card from it. That player discards that card.$* Target creature gets -2/-2 until end of turn.| Bile-Vial Boggart|Lorwyn Eclipsed|87|C|{B}|Creature - Goblin Assassin|1|1|When this creature dies, put a -1/-1 counter on up to one target creature.| Bitterbloom Bearer|Lorwyn Eclipsed|88|M|{B}{B}|Creature - Faerie Rogue|1|1|Flash$Flying$At the beginning of your upkeep, you lose 1 life and create a 1/1 blue and black Faerie creature token with flying.| +Blight Rot|Lorwyn Eclipsed|89|C|{2}{B}|Instant|||Put four -1/-1 counters on target creature.| Blighted Blackthorn|Lorwyn Eclipsed|90|C|{4}{B}|Creature - Treefolk Warlock|3|7|Whenever this creature enters or attacks, you may blight 2. If you do, you draw a card and lose 1 life.| Bloodline Bidding|Lorwyn Eclipsed|91|R|{6}{B}{B}|Sorcery|||Convoke$Choose a creature type. Return all creature cards of the chosen type from your graveyard to the battlefield.| Boggart Mischief|Lorwyn Eclipsed|92|U|{2}{B}|Kindred Enchantment - Goblin|||When this enchantment enters, you may blight 1. If you do, create two 1/1 black and red Goblin creature tokens.$Whenever a Goblin creature you control dies, each opponent loses 1 life and you gain 1 life.| @@ -60895,6 +60903,7 @@ Dawnhand Dissident|Lorwyn Eclipsed|98|R|{B}|Creature - Elf Warlock|1|2|{T}, Blig Dawnhand Eulogist|Lorwyn Eclipsed|99|C|{3}{B}|Creature - Elf Warlock|3|3|Menace$When this creature enters, mill three cards. Then if there is an Elf card in your graveyard, each opponent loses 2 life and you gain 2 life.| Dose of Dawnglow|Lorwyn Eclipsed|100|U|{4}{B}|Instant|||Return target creature card from your graveyard to the battlefield. Then if it isn't your main phase, blight 2.| Dream Seizer|Lorwyn Eclipsed|101|C|{3}{B}|Creature - Faerie Rogue|3|2|Flying$When this creature enters, you may blight 1. If you do, each opponent discards a card.| +Gloom Ripper|Lorwyn Eclipsed|102|R|{3}{B}{B}|Creature - Elf Assassin|4|4|When this creature enters, target creature you control gets +X/+0 until end of turn and up to one target creature an opponent controls gets -0/-X until end of turn, where X is the number of Elves you control plus the number of Elf cards in your graveyard.| Gnarlbark Elm|Lorwyn Eclipsed|103|U|{2}{B}|Creature - Treefolk Warlock|3|4|This creature enters with two -1/-1 counters on it.${2}{B}, Remove two counters from this creature: Target creature gets -2/-2 until end of turn. Activate only as a sorcery.| Graveshifter|Lorwyn Eclipsed|104|U|{3}{B}|Creature - Shapeshifter|2|2|Changeling$When this creature enters, you may return target creature card from your graveyard to your hand.| Grub, Storied Matriarch|Lorwyn Eclipsed|105|R|{2}{B}|Legendary Creature - Goblin Warlock|2|1|Menace$Whenever this creature enters or transforms into Grub, Storied Matriarch, return up to one target Goblin card from your graveyard to your hand.$At the beginning of your first main phase, you may pay {R}. If you do, transform Grub.| @@ -60903,6 +60912,7 @@ Gutsplitter Gang|Lorwyn Eclipsed|106|U|{3}{B}|Creature - Goblin Berserker|6|6|At Heirloom Auntie|Lorwyn Eclipsed|107|C|{2}{B}|Creature - Goblin Warlock|4|4|This creature enters with two -1/-1 counters on it.$Whenever another creature you control dies, surveil 1, then remove a -1/-1 counter from this creature.| Iron-Shield Elf|Lorwyn Eclipsed|108|U|{1}{B}|Creature - Elf Warrior|3|1|Discard a card: This creature gains indestructible until end of turn. Tap it.| Moonglove Extractor|Lorwyn Eclipsed|109|C|{2}{B}|Creature - Elf Warlock|2|1|Whenever this creature attacks, you draw a card and lose 1 life.| +Moonshadow|Lorwyn Eclipsed|110|M|{B}|Creature - Elemental|7|7|Menace$This creature enters with six -1/-1 counters on it.$Whenever one or more permanent cards are put into your graveyard from anywhere while this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature.| Mornsong Aria|Lorwyn Eclipsed|111|R|{1}{B}{B}|Legendary Enchantment|||Players can't draw cards or gain life.$At the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles.| Mudbutton Cursetosser|Lorwyn Eclipsed|112|U|{B}|Creature - Goblin Warlock|2|1|As an additional cost to cast this spell, behold a Goblin or pay {2}.$This creature can't block.$When this creature dies, destroy target creature an opponent controls with power 2 or less.| Nameless Inversion|Lorwyn Eclipsed|113|U|{1}{B}|Kindred Instant - Shapeshifter|||Changeling$Target creature gets +3/-3 and loses all creature types until end of turn.| @@ -60911,14 +60921,20 @@ Requiting Hex|Lorwyn Eclipsed|116|U|{B}|Instant|||As an additional cost to cast Retched Wretch|Lorwyn Eclipsed|117|U|{2}{B}|Creature - Goblin|4|2|When this creature dies, if it had a -1/-1 counter on it, return it to the battlefield under its owner's control and it loses all abilities.| Scarblade Scout|Lorwyn Eclipsed|118|C|{1}{B}|Creature - Elf Scout|2|2|Lifelink$When this creature enters, mill two cards.| Shimmercreep|Lorwyn Eclipsed|120|U|{4}{B}|Creature - Elemental|3|5|Menace$Vivid -- When this creature enters, each opponent loses X life and you gain X life, where X is the number of colors among permanents you control.| +Taster of Wares|Lorwyn Eclipsed|121|R|{2}{B}|Creature - Goblin Warlock|3|2|When this creature enters, target opponent reveals X cards from their hand, where X is the number of Goblins you control. You choose one of those cards. That player exiles it. If an instant or sorcery card is exiled this way, you may cast it for as long as you control this creature, and mana of any type can be spent to cast that spell.| +Twilight Diviner|Lorwyn Eclipsed|122|R|{2}{B}|Creature - Elf Cleric|3|3|When this creature enters, surveil 2.$Whenever one or more other creatures you control enter, if they entered or were cast from a graveyard, create a token that's a copy of one of them. This ability triggers only once each turn.| Unbury|Lorwyn Eclipsed|123|U|{1}{B}|Instant|||Choose one --$* Return target creature card from your graveyard to your hand.$* Return two target creature cards that share a creature type from your graveyard to your hand.| Ashling, Rekindled|Lorwyn Eclipsed|124|R|{1}{R}|Legendary Creature - Elemental Sorcerer|1|3|Whenever this creature enters or transforms into Ashling, Rekindled, you may discard a card. If you do, draw a card.$At the beginning of your first main phase, you may pay {U}. If you do, transform Ashling.| Ashling, Rimebound|Lorwyn Eclipsed|124|R||Legendary Creature - Elemental Wizard|1|3|Whenever this creature transforms into Ashling, Rimebound and at the beginning of your first main phase, add two mana of any one color. Spend this mana only to cast spells with mana value 4 or greater.$At the beginning of your first main phase, you may pay {R}. If you do, transform Ashling.| Boldwyr Aggressor|Lorwyn Eclipsed|125|U|{3}{R}{R}|Creature - Giant Warrior|2|5|Double strike$Other Giants you control have double strike.| Boneclub Berserker|Lorwyn Eclipsed|126|C|{3}{R}|Creature - Goblin Berserker|2|4|This creature gets +2/+0 for each other Goblin you control.| +Boulder Dash|Lorwyn Eclipsed|127|U|{1}{R}|Sorcery|||Boulder Dash deals 2 damage to any target and 1 damage to any other target.| +Brambleback Brute|Lorwyn Eclipsed|128|C|{2}{R}|Creature - Giant Warrior|4|5|This creature enters with two -1/-1 counters on it.${1}{R}, Remove a counter from this creature: Target creature can't block this turn. Activate only as a sorcery.| Burning Curiosity|Lorwyn Eclipsed|129|C|{2}{R}|Sorcery|||As an additional cost to cast this spell, you may blight 1.$Exile the top two cards of your library. If this spell's additional cost was paid, exile the top three cards instead. Until the end of your next turn, you may play those cards.| +Champion of the Path|Lorwyn Eclipsed|130|R|{3}{R}|Creature - Elemental Sorcerer|7|3|As an additional cost to cast this spell, behold an Elemental and exile it.$Whenever another Elemental you control enters, it deals damage equal to its power to each opponent.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Collective Inferno|Lorwyn Eclipsed|132|R|{3}{R}{R}|Enchantment|||Convoke$As this enchantment enters, choose a creature type.$Double all damage that sources you control of the chosen type would deal.| Elder Auntie|Lorwyn Eclipsed|133|C|{2}{R}|Creature - Goblin Warlock|2|2|When this creature enters, create a 1/1 black and red Goblin creature token.| +End-Blaze Epiphany|Lorwyn Eclipsed|134|R|{X}{R}|Instant|||End-Blaze Epiphany deals X damage to target creature. When that creature dies this turn, exile a number of cards from the top of your library equal to its power, then choose a card exiled this way. Until the end of your next turn, you may play that card.| Enraged Flamecaster|Lorwyn Eclipsed|135|C|{2}{R}|Creature - Elemental Sorcerer|3|2|Reach$Whenever you cast a spell with mana value 4 or greater, this creature deals 2 damage to each opponent.| Explosive Prodigy|Lorwyn Eclipsed|136|U|{1}{R}|Creature - Elemental Sorcerer|1|1|Vivid -- When this creature enters, it deals X damage to target creature an opponent controls, where X is the number of colors among permanents you control.| Flame-Chain Mauler|Lorwyn Eclipsed|138|C|{1}{R}|Creature - Elemental Warrior|2|2|{1}{R}: This creature gets +1/+0 and gains menace until end of turn.| @@ -60934,8 +60950,10 @@ Kulrath Zealot|Lorwyn Eclipsed|148|C|{5}{R}|Creature - Elemental Warrior|6|5|Whe Lasting Tarfire|Lorwyn Eclipsed|149|U|{1}{R}|Enchantment|||At the beginning of each end step, if you put a counter on a creature this turn, this enchantment deals 2 damage to each opponent.| Lavaleaper|Lorwyn Eclipsed|150|R|{3}{R}|Creature - Elemental|4|4|All creatures have haste.$Whenever a player taps a basic land for mana, that player adds one mana of any type that land produced.| Meek Attack|Lorwyn Eclipsed|151|M|{2}{R}|Enchantment|||{1}{R}: You may put a creature card with total power and toughness 5 or less from your hand onto the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice that creature.| +Scuzzback Scrounger|Lorwyn Eclipsed|153|R|{1}{R}|Creature - Goblin Warrior|3|2|At the beginning of your first main phase, you may blight 1. If you do, create a Treasure token.| Sear|Lorwyn Eclipsed|154|U|{1}{R}|Instant|||Sear deals 4 damage to target creature or planeswalker.| Sizzling Changeling|Lorwyn Eclipsed|155|U|{2}{R}|Creature - Shapeshifter|3|2|Changeling$When this creature dies, exile the top card of your library. Until the end of your next turn, you may play that card.| +Soul Immolation|Lorwyn Eclipsed|156|M|{3}{R}{R}|Sorcery|||As an additional cost to cast this spell, blight X. X can't be greater than the greatest toughness among creatures you control.$Soul Immolation deals X damage to each opponent and each creature they control.| Sourbread Auntie|Lorwyn Eclipsed|158|U|{2}{R}{R}|Creature - Goblin Warrior|4|3|When this creature enters, you may blight 2. If you do, create two 1/1 black and red Goblin creature tokens.| Spinerock Tyrant|Lorwyn Eclipsed|159|M|{3}{R}{R}|Creature - Dragon|6|6|Flying$Wither$Whenever you cast an instant or sorcery spell with a single target, you may copy it. If you do, those spells gain wither. You may choose new targets for the copy.| Squawkroaster|Lorwyn Eclipsed|160|U|{3}{R}|Creature - Elemental|*|4|Double strike$Vivid -- Squawkroaster's power is equal to the number of colors among permanents you control.| @@ -60963,9 +60981,11 @@ Morcant's Eyes|Lorwyn Eclipsed|185|U|{1}{G}|Kindred Enchantment - Elf|||At the b Mutable Explorer|Lorwyn Eclipsed|186|R|{2}{G}|Creature - Shapeshifter|1|1|Changeling$When this creature enters, create a tapped Mutavault token.| Pitiless Fists|Lorwyn Eclipsed|187|U|{3}{G}|Enchantment - Aura|||Enchant creature you control$When this Aura enters, enchanted creature fights up to one target creature an opponent controls.$Enchanted creature gets +2/+2.| Prismabasher|Lorwyn Eclipsed|188|U|{4}{G}{G}|Creature - Elemental|6|6|Trample$Vivid -- When this creature enters, up to X target creatures you control get +X/+X until end of turn, where X is the number of colors among permanents you control.| +Prismatic Undercurrents|Lorwyn Eclipsed|189|U|{3}{G}|Enchantment|||Vivid -- When this enchantment enters, search your library for up to X basic land cards, where X is the number of colors among permanents you control. Reveal those cards, put them into your hand, then shuffle.$You may play an additional land on each of your turns.| Sapling Nursery|Lorwyn Eclipsed|192|R|{6}{G}{G}|Enchantment|||Affinity for Forests$Landfall -- Whenever a land you control enters, create a 3/4 green Treefolk creature token with reach.${1}{G}, Exile this enchantment: Treefolk and Forests you control gain indestructible until end of turn.| Selfless Safewright|Lorwyn Eclipsed|193|R|{3}{G}{G}|Creature - Elf Warrior|4|2|Flash$Convoke$When this creature enters, choose a creature type. Other permanents you control of that type gain hexproof and indestructible until end of turn.| Shimmerwilds Growth|Lorwyn Eclipsed|194|U|{1}{G}|Enchantment - Aura|||Enchant land$As this Aura enters, choose a color.$Enchanted land is the chosen color.$Whenever enchanted land is tapped for mana, its controller adds an additional one mana of the chosen color.| +Spry and Mighty|Lorwyn Eclipsed|195|R|{4}{G}|Sorcery|||Choose two creatures you control. You draw X cards and the chosen creatures get +X/+X and gain trample until end of turn, where X is the difference between the chosen creatures' powers.| Surly Farrier|Lorwyn Eclipsed|196|C|{1}{G}|Creature - Kithkin Citizen|2|2|{T}: Target creature you control gets +1/+1 and gains vigilance until end of turn. Activate only as a sorcery.| Tend the Sprigs|Lorwyn Eclipsed|197|C|{2}{G}|Sorcery|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. Then if you control seven or more lands and/or Treefolk, create a 3/4 green Treefolk creature token with reach.| Thoughtweft Charge|Lorwyn Eclipsed|198|U|{1}{G}|Instant|||Target creature gets +3/+3 until end of turn. If a creature entered the battlefield under your control this turn, draw a card.| @@ -60976,14 +60996,21 @@ Vinebred Brawler|Lorwyn Eclipsed|201|U|{2}{G}|Creature - Elf Berserker|4|2|This Virulent Emissary|Lorwyn Eclipsed|202|U|{G}|Creature - Elf Assassin|1|1|Deathtouch$Whenever another creature you control enters, you gain 1 life.| Abigale, Eloquent First-Year|Lorwyn Eclipsed|204|R|{W/B}{W/B}|Legendary Creature - Bird Bard|1|1|Flying, first strike, lifelink$When Abigale enters, up to one other target creature loses all abilities. Put a flying counter, a first strike counter, and a lifelink counter on that creature.| Ashling's Command|Lorwyn Eclipsed|205|R|{3}{U}{R}|Kindred Instant - Elemental|||Choose two --$* Create a token that's a copy of target Elemental you control.$* Target player draws two cards.$* Ashling's Command deals 2 damage to each creature target player controls.$* Target player creates two Treasure tokens.| +Boggart Cursecrafter|Lorwyn Eclipsed|206|U|{B}{R}|Creature - Goblin Warlock|2|3|Deathtouch$Whenever another Goblin you control dies, this creature deals 1 damage to each opponent.| Bre of Clan Stoutarm|Lorwyn Eclipsed|207|R|{2}{R}{W}|Legendary Creature - Giant Warrior|4|4|{1}{W}, {T}: Another target creature you control gains flying and lifelink until end of turn.$At the beginning of your end step, if you gained life this turn, exile cards from the top of your library until you exile a nonland card. You may cast that card without paying its mana cost if the spell's mana value is less than or equal to the amount of life you gained this turn. Otherwise, put it into your hand.| Brigid's Command|Lorwyn Eclipsed|208|R|{1}{G}{W}|Kindred Sorcery - Kithkin|||Choose two --$* Create a token that's a copy of target Kithkin you control.$* Target player creates a 1/1 green and white Kithkin creature token.$* Target creature you control gets +3/+3 until end of turn.$* Target creature you control fights target creature an opponent controls.| +Catharsis|Lorwyn Eclipsed|209|M|{4}{R/W}{R/W}|Creature - Elemental Incarnation|3|4|When this creature enters, if {W}{W} was spent to cast it, create two 1/1 green and white Kithkin creature tokens.$When this creature enters, if {R}{R} was spent to cast it, creatures you control get +1/+1 and gain haste until end of turn.$Evoke {R/W}{R/W}| Chaos Spewer|Lorwyn Eclipsed|210|C|{2}{B/R}|Creature - Goblin Warlock|5|4|When this creature enters, you may pay {2}. If you don't, blight 2.| Chitinous Graspling|Lorwyn Eclipsed|211|C|{3}{G/U}|Creature - Shapeshifter|3|4|Changeling$Reach| Deceit|Lorwyn Eclipsed|212|M|{4}{U/B}{U/B}|Creature - Elemental Incarnation|5|5|When this creature enters, if {U}{U} was spent to cast it, return up to one other target nonland permanent to its owner's hand.$When this creature enters, if {B}{B} was spent to cast it, target opponent reveals their hand. You choose a nonland card from it. That player discards that card.$Evoke {U/B}{U/B}| Deepway Navigator|Lorwyn Eclipsed|214|R|{W}{U}|Creature - Merfolk Wizard|2|2|Flash$When this creature enters, untap each other Merfolk you control.$As long as you attacked with three or more Merfolk this turn, Merfolk you control get +1/+0.| Doran, Besieged by Time|Lorwyn Eclipsed|215|R|{1}{W}{B}{G}|Legendary Creature - Treefolk Druid|0|5|Each creature spell you cast with toughness greater than its power costs {1} less to cast.$Whenever a creature you control attacks or blocks, it gets +X/+X until end of turn, where X is the difference between its power and toughness.| +Dream Harvest|Lorwyn Eclipsed|216|R|{5}{U/B}{U/B}|Sorcery|||Each opponent exiles cards from the top of their library until they have exiled cards with total mana value 5 or greater this way. Until end of turn, you may cast cards exiled this way without paying their mana costs.| +Eclipsed Boggart|Lorwyn Eclipsed|217|U|{B/R}{B/R}{B/R}|Creature - Goblin Scout|2|3|When this creature enters, look at the top four cards of your library. You may reveal a Goblin, Swamp, or Mountain card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Eclipsed Elf|Lorwyn Eclipsed|218|U|{B/G}{B/G}{B/G}|Creature - Elf Scout|3|2|When this creature enters, look at the top four cards of your library. You may reveal an Elf, Swamp, or Forest card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Eclipsed Flamekin|Lorwyn Eclipsed|219|U|{1}{U/R}{U/R}|Creature - Elemental Scout|1|4|When this creature enters, look at the top four cards of your library. You may reveal an Elemental, Island, or Mountain card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Eclipsed Kithkin|Lorwyn Eclipsed|220|U|{G/W}{G/W}|Creature - Kithkin Scout|2|1|When this creature enters, look at the top four cards of your library. You may reveal a Kithkin, Forest, or Plains card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Eclipsed Merrow|Lorwyn Eclipsed|221|U|{W/U}{W/U}{W/U}|Creature - Merfolk Scout|2|3|When this creature enters, look at the top four cards of your library. You may reveal a Merfolk, Plains, or Island card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Emptiness|Lorwyn Eclipsed|222|M|{4}{W/B}{W/B}|Creature - Elemental Incarnation|3|5|When this creature enters, if {W}{W} was spent to cast it, return target creature card with mana value 3 or less from your graveyard to the battlefield.$When this creature enters, if {B}{B} was spent to cast it, put three -1/-1 counters on up to one target creature.$Evoke {W/B}{W/B}| Figure of Fable|Lorwyn Eclipsed|224|R|{G/W}|Creature - Kithkin|1|1|{G/W}: This creature becomes a Kithkin Scout with base power and toughness 2/3.${1}{G/W}{G/W}: If this creature is a Scout, it becomes a Kithkin Soldier with base power and toughness 4/5.${3}{G/W}{G/W}{G/W}: If this creature is a Soldier, it becomes a Kithkin Avatar with base power and toughness 7/8 and protection from each of your opponents.| Flaring Cinder|Lorwyn Eclipsed|225|C|{1}{U/R}{U/R}|Creature - Elemental Sorcerer|3|2|When this creature enters and whenever you cast a spell with mana value 4 or greater, you may discard a card. If you do, draw a card.| @@ -60996,12 +61023,17 @@ Kirol, Attentive First-Year|Lorwyn Eclipsed|231|R|{1}{R/W}{R/W}|Legendary Creatu Lluwen, Imperfect Naturalist|Lorwyn Eclipsed|232|R|{B/G}{B/G}|Legendary Creature - Elf Druid|1|3|When Lluwen enters, mill four cards, then you may put a creature or land card from among the milled cards on top of your library.${2}{B/G}{B/G}{B/G}, {T}, Discard a land card: Create a 1/1 black and green Worm creature token for each land card in your graveyard.| Maralen, Fae Ascendant|Lorwyn Eclipsed|233|R|{2}{B}{G}{U}|Legendary Creature - Elf Faerie Noble|4|5|Flying$Whenever Maralen or another Elf or Faerie you control enters, exile the top two cards of target opponent's library.$Once each turn, you may cast a spell with mana value less than or equal to the number of Elves and Faeries you control from among cards exiled with Maralen this turn without paying its mana cost.| Merrow Skyswimmer|Lorwyn Eclipsed|234|C|{3}{W/U}{W/U}|Creature - Merfolk Soldier|2|2|Convoke$Flying, vigilance$When this creature enters, create a 1/1 white and blue Merfolk creature token.| +Morcant's Loyalist|Lorwyn Eclipsed|236|U|{1}{B}{G}|Creature - Elf Warrior|3|2|Other Elves you control get +1/+1.$When this creature dies, return another target Elf card from your graveyard to your hand.| Noggle Robber|Lorwyn Eclipsed|237|U|{1}{R/G}{R/G}|Creature - Noggle Rogue|3|3|When this creature enters or dies, create a Treasure token.| Prideful Feastling|Lorwyn Eclipsed|238|C|{2}{W/B}|Creature - Shapeshifter|2|3|Changeling$Lifelink| +Raiding Schemes|Lorwyn Eclipsed|239|R|{3}{R}{G}|Enchantment|||Each noncreature spell you cast has conspire.| +Reaping Willow|Lorwyn Eclipsed|240|U|{1}{W/B}{W/B}{W/B}|Creature - Treefolk Cleric|3|6|Lifelink$This creature enters with two -1/-1 counters on it.${1}{W/B}, Remove two counters from this creature: Return target creature card with mana value 3 or less from your graveyard to the battlefield. Activate only as a sorcery.| Sanar, Innovative First-Year|Lorwyn Eclipsed|241|R|{2}{U/R}{U/R}|Legendary Creature - Goblin Sorcerer|2|4|Vivid -- At the beginning of your first main phase, reveal cards from the top of your library until you reveal X nonland cards, where X is the number of colors among permanents you control. For each of those colors, you may exile a card of that color from among the revealed cards. Then shuffle. You may cast the exiled cards this turn.| +Shadow Urchin|Lorwyn Eclipsed|242|R|{2}{B/R}|Creature - Ouphe|3|4|Whenever this creature attacks, blight 1.$Whenever a creature you control with one or more counters on it dies, exile that many cards from the top of your library. Until your next end step, you may play those cards.| Sygg's Command|Lorwyn Eclipsed|244|R|{1}{W}{U}|Kindred Sorcery - Merfolk|||Choose two --$* Create a token that's a copy of target Merfolk you control.$* Creatures target player controls gain lifelink until end of turn.$* Target player draws a card.$* Tap target creature. Put a stun counter on it.| Tam, Mindful First-Year|Lorwyn Eclipsed|245|R|{1}{G/U}|Legendary Creature - Gorgon Wizard|2|2|Each other creature you control has hexproof from each of its colors.${T}: Target creature you control becomes all colors until end of turn.| Thoughtweft Lieutenant|Lorwyn Eclipsed|246|U|{G}{W}|Creature - Kithkin Soldier|2|2|Whenever this creature or another Kithkin you control enters, target creature you control gets +1/+1 and gains trample until end of turn.| +Trystan's Command|Lorwyn Eclipsed|247|R|{4}{B}{G}|Kindred Sorcery - Elf|||Choose two --$* Create a token that's a copy of target Elf you control.$* Return one or two target permanent cards from your graveyard to your hand.$* Destroy target creature or enchantment.$* Creatures target player controls get +3/+3 until end of turn. Untap them.| Vibrance|Lorwyn Eclipsed|249|M|{3}{R/G}{R/G}|Creature - Elemental Incarnation|4|4|When this creature enters, if {R}{R} was spent to cast it, this creature deals 3 damage to any target.$When this creature enters, if {G}{G} was spent to cast it, search your library for a land card, reveal it, put it into your hand, then shuffle. You gain 2 life.$Evoke {R/G}{R/G}| Voracious Tome-Skimmer|Lorwyn Eclipsed|250|U|{U/B}{U/B}{U/B}|Creature - Faerie Rogue|2|3|Flying$Whenever you cast a spell during an opponent's turn, you may pay 1 life. If you do, draw a card.| Wary Farmer|Lorwyn Eclipsed|251|C|{1}{G/W}{G/W}|Creature - Kithkin Citizen|3|3|At the beginning of your end step, if another creature entered the battlefield under your control this turn, surveil 1.| @@ -61035,6 +61067,7 @@ Island|Lorwyn Eclipsed|280|C||Basic Land - Island|||({T}: Add {U}.)| Swamp|Lorwyn Eclipsed|281|C||Basic Land - Swamp|||({T}: Add {B}.)| Mountain|Lorwyn Eclipsed|282|C||Basic Land - Mountain|||({T}: Add {R}.)| Forest|Lorwyn Eclipsed|283|C||Basic Land - Forest|||({T}: Add {G}.)| +Ajani, Outland Chaperone|Lorwyn Eclipsed|284|M|{1}{W}{W}|Legendary Planeswalker - Ajani|3|+1: Create a 1/1 green and white Kithkin creature token.$-2: Ajani deals 4 damage to target tapped creature.$-8: Look at the top X cards of your library, where X is your life total. You may put any number of nonland permanent cards with mana value 3 or less from among them onto the battlefield. Then shuffle.| Brigid, Clachan's Heart|Lorwyn Eclipsed|285|R|{2}{W}|Legendary Creature - Kithkin Warrior|3|2|Whenever this creature enters or transforms into Brigid, Clachan's Heart, create a 1/1 green and white Kithkin creature token.$At the beginning of your first main phase, you may pay {G}. If you do, transform Brigid.| Brigid, Doun's Mind|Lorwyn Eclipsed|285|R||Legendary Creature - Kithkin Soldier|3|2|{T}: Add X {G} or X {W}, where X is the number of other creatures you control.$At the beginning of your first main phase, you may pay {W}. If you do, transform Brigid.| Eirdu, Carrier of Dawn|Lorwyn Eclipsed|286|M|{3}{W}{W}|Legendary Creature - Elemental God|5|5|Flying, lifelink$Creature spells you cast have convoke.$At the beginning of your first main phase, you may pay {B}. If you do, transform Eirdu.| @@ -61049,26 +61082,36 @@ Ashling, Rekindled|Lorwyn Eclipsed|290|R|{1}{R}|Legendary Creature - Elemental S Ashling, Rimebound|Lorwyn Eclipsed|290|R||Legendary Creature - Elemental Wizard|1|3|Whenever this creature transforms into Ashling, Rimebound and at the beginning of your first main phase, add two mana of any one color. Spend this mana only to cast spells with mana value 4 or greater.$At the beginning of your first main phase, you may pay {R}. If you do, transform Ashling.| Trystan, Callous Cultivator|Lorwyn Eclipsed|291|R|{2}{G}|Legendary Creature - Elf Druid|3|4|Deathtouch$Whenever this creature enters or transforms into Trystan, Callous Cultivator, mill three cards. Then if there is an Elf card in your graveyard, you gain 2 life.$At the beginning of your first main phase, you may pay {B}. If you do, transform Trystan.| Trystan, Penitent Culler|Lorwyn Eclipsed|291|R||Legendary Creature - Elf Warlock|3|4|Deathtouch$Whenever this creature transforms into Trystan, Penitent Culler, mill three cards, then you may exile an Elf card from your graveyard. If you do, each opponent loses 2 life.$At the beginning of your first main phase, you may pay {G}. If you do, transform Trystan.| +Catharsis|Lorwyn Eclipsed|292|M|{4}{R/W}{R/W}|Creature - Elemental Incarnation|3|4|When this creature enters, if {W}{W} was spent to cast it, create two 1/1 green and white Kithkin creature tokens.$When this creature enters, if {R}{R} was spent to cast it, creatures you control get +1/+1 and gain haste until end of turn.$Evoke {R/W}{R/W}| Deceit|Lorwyn Eclipsed|293|M|{4}{U/B}{U/B}|Creature - Elemental Incarnation|5|5|When this creature enters, if {U}{U} was spent to cast it, return up to one other target nonland permanent to its owner's hand.$When this creature enters, if {B}{B} was spent to cast it, target opponent reveals their hand. You choose a nonland card from it. That player discards that card.$Evoke {U/B}{U/B}| Emptiness|Lorwyn Eclipsed|294|M|{4}{W/B}{W/B}|Creature - Elemental Incarnation|3|5|When this creature enters, if {W}{W} was spent to cast it, return target creature card with mana value 3 or less from your graveyard to the battlefield.$When this creature enters, if {B}{B} was spent to cast it, put three -1/-1 counters on up to one target creature.$Evoke {W/B}{W/B}| Vibrance|Lorwyn Eclipsed|295|M|{3}{R/G}{R/G}|Creature - Elemental Incarnation|4|4|When this creature enters, if {R}{R} was spent to cast it, this creature deals 3 damage to any target.$When this creature enters, if {G}{G} was spent to cast it, search your library for a land card, reveal it, put it into your hand, then shuffle. You gain 2 life.$Evoke {R/G}{R/G}| Wistfulness|Lorwyn Eclipsed|296|M|{3}{G/U}{G/U}|Creature - Elemental Incarnation|6|5|When this creature enters, if {G}{G} was spent to cast it, exile target artifact or enchantment an opponent controls.$When this creature enters, if {U}{U} was spent to cast it, draw two cards, then discard a card.$Evoke {G/U}{G/U}| +Adept Watershaper|Lorwyn Eclipsed|297|R|{2}{W}|Creature - Merfolk Cleric|3|4|Other tapped creatures you control have indestructible.| Curious Colossus|Lorwyn Eclipsed|298|M|{5}{W}{W}|Creature - Giant Warrior|7|7|When this creature enters, each creature target opponent controls loses all abilities, becomes a Coward in addition to its other types, and has base power and toughness 1/1.| Kinbinding|Lorwyn Eclipsed|299|R|{3}{W}{W}|Enchantment|||Creatures you control get +X/+X, where X is the number of creatures that entered the battlefield under your control this turn.$At the beginning of combat on your turn, create a 1/1 green and white Kithkin creature token.| +Kinscaer Sentry|Lorwyn Eclipsed|300|R|{1}{W}|Creature - Kithkin Soldier|2|2|First strike, lifelink$Whenever this creature attacks, you may put a creature card with mana value X or less from your hand onto the battlefield tapped and attacking, where X is the number of attacking creatures you control.| Morningtide's Light|Lorwyn Eclipsed|301|M|{3}{W}|Sorcery|||Exile any number of target creatures. At the beginning of the next end step, return those cards to the battlefield tapped under their owners' control.$Until your next turn, prevent all damage that would be dealt to you.$Exile Morningtide's Light.| Slumbering Walker|Lorwyn Eclipsed|302|R|{3}{W}{W}|Creature - Giant Warrior|4|7|This creature enters with two -1/-1 counters on it.$At the beginning of your end step, you may remove a counter from this creature. When you do, return target creature card with power 2 or less from your graveyard to the battlefield.| Disruptor of Currents|Lorwyn Eclipsed|303|R|{3}{U}{U}|Creature - Merfolk Wizard|3|3|Flash$Convoke$When this creature enters, return up to one other target nonland permanent to its owner's hand.| Flitterwing Nuisance|Lorwyn Eclipsed|304|R|{U}|Creature - Faerie Rogue|2|2|Flying$This creature enters with a -1/-1 counter on it.${2}{U}, Remove a counter from this creature: Whenever a creature you control deals combat damage to a player or planeswalker this turn, draw a card.| +Glen Elendra Guardian|Lorwyn Eclipsed|305|R|{2}{U}|Creature - Faerie Wizard|3|4|Flash$Flying$This creature enters with a -1/-1 counter on it.${1}{U}, Remove a counter from this creature: Counter target noncreature spell. Its controller draws a card.| Glen Elendra's Answer|Lorwyn Eclipsed|306|M|{2}{U}{U}|Instant|||This spell can't be countered.$Counter all spells your opponents control and all abilities your opponents control. Create a 1/1 blue and black Faerie creature token with flying for each spell and ability countered this way.| Loch Mare|Lorwyn Eclipsed|307|M|{1}{U}|Creature - Horse Serpent|4|5|This creature enters with three -1/-1 counters on it.${1}{U}, Remove a counter from this creature: Draw a card.${2}{U}, Remove two counters from this creature: Tap target creature. Put a stun counter on it.| Mirrorform|Lorwyn Eclipsed|308|M|{4}{U}{U}|Instant|||Each nonland permanent you control becomes a copy of target non-Aura permanent.| Sunderflock|Lorwyn Eclipsed|309|R|{7}{U}{U}|Creature - Elemental|5|5|This spell costs {X} less to cast, where X is the greatest mana value among Elementals you control.$Flying$When this creature enters, if you cast it, return all non-Elemental creatures to their owners' hands.| Bitterbloom Bearer|Lorwyn Eclipsed|310|M|{B}{B}|Creature - Faerie Rogue|1|1|Flash$Flying$At the beginning of your upkeep, you lose 1 life and create a 1/1 blue and black Faerie creature token with flying.| Dawnhand Dissident|Lorwyn Eclipsed|311|R|{B}|Creature - Elf Warlock|1|2|{T}, Blight 1: Surveil 1.${T}, Blight 2: Exile target card from a graveyard.$During your turn, you may cast creature spells from among cards you own exiled with this creature by removing three counters from among creatures you control in addition to paying their other costs.| +Gloom Ripper|Lorwyn Eclipsed|312|R|{3}{B}{B}|Creature - Elf Assassin|4|4|When this creature enters, target creature you control gets +X/+0 until end of turn and up to one target creature an opponent controls gets -0/-X until end of turn, where X is the number of Elves you control plus the number of Elf cards in your graveyard.| +Moonshadow|Lorwyn Eclipsed|313|M|{B}|Creature - Elemental|7|7|Menace$This creature enters with six -1/-1 counters on it.$Whenever one or more permanent cards are put into your graveyard from anywhere while this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature.| +Taster of Wares|Lorwyn Eclipsed|314|R|{2}{B}|Creature - Goblin Warlock|3|2|When this creature enters, target opponent reveals X cards from their hand, where X is the number of Goblins you control. You choose one of those cards. That player exiles it. If an instant or sorcery card is exiled this way, you may cast it for as long as you control this creature, and mana of any type can be spent to cast that spell.| +Twilight Diviner|Lorwyn Eclipsed|315|R|{2}{B}|Creature - Elf Cleric|3|3|When this creature enters, surveil 2.$Whenever one or more other creatures you control enter, if they entered or were cast from a graveyard, create a token that's a copy of one of them. This ability triggers only once each turn.| Goliath Daydreamer|Lorwyn Eclipsed|316|R|{2}{R}{R}|Creature - Giant Wizard|4|4|Whenever you cast an instant or sorcery spell from your hand, exile that card with a dream counter on it instead of putting it into your graveyard as it resolves.$Whenever this creature attacks, you may cast a spell from among cards you own in exile with dream counters on them without paying its mana cost.| Hexing Squelcher|Lorwyn Eclipsed|317|R|{1}{R}|Creature - Goblin Sorcerer|2|2|This spell can't be countered.$Ward--Pay 2 life.$Spells you control can't be countered.$Other creatures you control have "Ward--Pay 2 life."| Lavaleaper|Lorwyn Eclipsed|318|R|{3}{R}|Creature - Elemental|4|4|All creatures have haste.$Whenever a player taps a basic land for mana, that player adds one mana of any type that land produced.| Meek Attack|Lorwyn Eclipsed|319|M|{2}{R}|Enchantment|||{1}{R}: You may put a creature card with total power and toughness 5 or less from your hand onto the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice that creature.| +Scuzzback Scrounger|Lorwyn Eclipsed|320|R|{1}{R}|Creature - Goblin Warrior|3|2|At the beginning of your first main phase, you may blight 1. If you do, create a Treasure token.| +Soul Immolation|Lorwyn Eclipsed|321|M|{3}{R}{R}|Sorcery|||As an additional cost to cast this spell, blight X. X can't be greater than the greatest toughness among creatures you control.$Soul Immolation deals X damage to each opponent and each creature they control.| Spinerock Tyrant|Lorwyn Eclipsed|322|M|{3}{R}{R}|Creature - Dragon|6|6|Flying$Wither$Whenever you cast an instant or sorcery spell with a single target, you may copy it. If you do, those spells gain wither. You may choose new targets for the copy.| Aurora Awakener|Lorwyn Eclipsed|323|M|{6}{G}|Creature - Giant Druid|7|7|Trample$Vivid -- When this creature enters, reveal cards from the top of your library until you reveal X permanent cards, where X is the number of colors among permanents you control. Put any number of those permanent cards onto the battlefield, then put the rest of the revealed cards on the bottom of your library in a random order.| Bloom Tender|Lorwyn Eclipsed|324|M|{1}{G}|Creature - Elf Druid|1|1|Vivid -- {T}: For each color among permanents you control, add one mana of that color.| @@ -61076,11 +61119,18 @@ Bristlebane Battler|Lorwyn Eclipsed|325|R|{1}{G}|Creature - Kithkin Soldier|6|6| Celestial Reunion|Lorwyn Eclipsed|326|M|{X}{G}|Sorcery|||As an additional cost to cast this spell, you may choose a creature type and behold two creatures of that type.$Search your library for a creature card with mana value X or less, reveal it, put it into your hand, then shuffle. If this spell's additional cost was paid and the revealed card is the chosen type, put that card onto the battlefield instead of putting it into your hand.| Mutable Explorer|Lorwyn Eclipsed|327|R|{2}{G}|Creature - Shapeshifter|1|1|Changeling$When this creature enters, create a tapped Mutavault token.| Sapling Nursery|Lorwyn Eclipsed|328|R|{6}{G}{G}|Enchantment|||Affinity for Forests$Landfall -- Whenever a land you control enters, create a 3/4 green Treefolk creature token with reach.${1}{G}, Exile this enchantment: Treefolk and Forests you control gain indestructible until end of turn.| +Spry and Mighty|Lorwyn Eclipsed|329|R|{4}{G}|Sorcery|||Choose two creatures you control. You draw X cards and the chosen creatures get +X/+X and gain trample until end of turn, where X is the difference between the chosen creatures' powers.| Ashling's Command|Lorwyn Eclipsed|330|R|{3}{U}{R}|Kindred Instant - Elemental|||Choose two --$* Create a token that's a copy of target Elemental you control.$* Target player draws two cards.$* Ashling's Command deals 2 damage to each creature target player controls.$* Target player creates two Treasure tokens.| +Boggart Cursecrafter|Lorwyn Eclipsed|331|U|{B}{R}|Creature - Goblin Warlock|2|3|Deathtouch$Whenever another Goblin you control dies, this creature deals 1 damage to each opponent.| Brigid's Command|Lorwyn Eclipsed|332|R|{1}{G}{W}|Kindred Sorcery - Kithkin|||Choose two --$* Create a token that's a copy of target Kithkin you control.$* Target player creates a 1/1 green and white Kithkin creature token.$* Target creature you control gets +3/+3 until end of turn.$* Target creature you control fights target creature an opponent controls.| Doran, Besieged by Time|Lorwyn Eclipsed|334|R|{1}{W}{B}{G}|Legendary Creature - Treefolk Druid|0|5|Each creature spell you cast with toughness greater than its power costs {1} less to cast.$Whenever a creature you control attacks or blocks, it gets +X/+X until end of turn, where X is the difference between its power and toughness.| +Eclipsed Boggart|Lorwyn Eclipsed|335|U|{B/R}{B/R}{B/R}|Creature - Goblin Scout|2|3|When this creature enters, look at the top four cards of your library. You may reveal a Goblin, Swamp, or Mountain card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Eclipsed Elf|Lorwyn Eclipsed|336|U|{B/G}{B/G}{B/G}|Creature - Elf Scout|3|2|When this creature enters, look at the top four cards of your library. You may reveal an Elf, Swamp, or Forest card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Eclipsed Flamekin|Lorwyn Eclipsed|337|U|{1}{U/R}{U/R}|Creature - Elemental Scout|1|4|When this creature enters, look at the top four cards of your library. You may reveal an Elemental, Island, or Mountain card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Eclipsed Kithkin|Lorwyn Eclipsed|338|U|{G/W}{G/W}|Creature - Kithkin Scout|2|1|When this creature enters, look at the top four cards of your library. You may reveal a Kithkin, Forest, or Plains card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| +Eclipsed Merrow|Lorwyn Eclipsed|339|U|{W/U}{W/U}{W/U}|Creature - Merfolk Scout|2|3|When this creature enters, look at the top four cards of your library. You may reveal a Merfolk, Plains, or Island card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Grub's Command|Lorwyn Eclipsed|340|R|{3}{B}{R}|Kindred Sorcery - Goblin|||Choose two --$* Create a token that's a copy of target Goblin you control.$* Creatures target player controls get +1/+1 and gain haste until end of turn.$* Destroy target artifact or creature.$* Target player mills five cards, then puts each Goblin card milled this way into their hand.| +Morcant's Loyalist|Lorwyn Eclipsed|341|U|{1}{B}{G}|Creature - Elf Warrior|3|2|Other Elves you control get +1/+1.$When this creature dies, return another target Elf card from your graveyard to your hand.| Sygg's Command|Lorwyn Eclipsed|342|R|{1}{W}{U}|Kindred Sorcery - Merfolk|||Choose two --$* Create a token that's a copy of target Merfolk you control.$* Creatures target player controls gain lifelink until end of turn.$* Target player draws a card.$* Tap target creature. Put a stun counter on it.| Thoughtweft Lieutenant|Lorwyn Eclipsed|343|U|{G}{W}|Creature - Kithkin Soldier|2|2|Whenever this creature or another Kithkin you control enters, target creature you control gets +1/+1 and gains trample until end of turn.| Chronicle of Victory|Lorwyn Eclipsed|346|M|{6}|Legendary Artifact|||As Chronicle of Victory enters, choose a creature type.$Creatures you control of the chosen type get +2/+2 and have first strike and trample.$Whenever you cast a spell of the chosen type, draw a card.| @@ -61099,6 +61149,7 @@ Champion of the Clachan|Lorwyn Eclipsed|353|R|{3}{W}|Creature - Kithkin Knight|4 Rhys, the Evermore|Lorwyn Eclipsed|354|R|{1}{W}|Legendary Creature - Elf Warrior|2|2|Flash$When Rhys enters, another target creature you control gains persist until end of turn.${W}, {T}: Remove any number of counters from target creature you control. Activate only as a sorcery.| Winnowing|Lorwyn Eclipsed|355|R|{4}{W}{W}|Sorcery|||Convoke$For each player, you choose a creature that player controls. Then each player sacrifices all other creatures they control that don't share a creature type with the chosen creature they control.| Harmonized Crescendo|Lorwyn Eclipsed|357|R|{4}{U}{U}|Instant|||Convoke$Choose a creature type. Draw a card for each permanent you control of that type.| +Rimefire Torque|Lorwyn Eclipsed|358|R|{1}{U}|Artifact|||As this artifact enters, choose a creature type.$Whenever a permanent you control of the chosen type enters, put a charge counter on this artifact.${T}, Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it. You may choose new targets for the copy.| Bloodline Bidding|Lorwyn Eclipsed|359|R|{6}{B}{B}|Sorcery|||Convoke$Choose a creature type. Return all creature cards of the chosen type from your graveyard to the battlefield.| Champion of the Weird|Lorwyn Eclipsed|360|R|{3}{B}|Creature - Goblin Berserker|5|5|As an additional cost to cast this spell, behold a Goblin and exile it.$Pay 1 life, Blight 2: Target opponent blights 2. Activate only as a sorcery.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Mornsong Aria|Lorwyn Eclipsed|361|R|{1}{B}{B}|Legendary Enchantment|||Players can't draw cards or gain life.$At the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles.| @@ -61109,6 +61160,7 @@ Selfless Safewright|Lorwyn Eclipsed|367|R|{3}{G}{G}|Creature - Elf Warrior|4|2|F Abigale, Eloquent First-Year|Lorwyn Eclipsed|368|R|{W/B}{W/B}|Legendary Creature - Bird Bard|1|1|Flying, first strike, lifelink$When Abigale enters, up to one other target creature loses all abilities. Put a flying counter, a first strike counter, and a lifelink counter on that creature.| Bre of Clan Stoutarm|Lorwyn Eclipsed|369|R|{2}{R}{W}|Legendary Creature - Giant Warrior|4|4|{1}{W}, {T}: Another target creature you control gains flying and lifelink until end of turn.$At the beginning of your end step, if you gained life this turn, exile cards from the top of your library until you exile a nonland card. You may cast that card without paying its mana cost if the spell's mana value is less than or equal to the amount of life you gained this turn. Otherwise, put it into your hand.| Deepway Navigator|Lorwyn Eclipsed|370|R|{W}{U}|Creature - Merfolk Wizard|2|2|Flash$When this creature enters, untap each other Merfolk you control.$As long as you attacked with three or more Merfolk this turn, Merfolk you control get +1/+0.| +Dream Harvest|Lorwyn Eclipsed|371|R|{5}{U/B}{U/B}|Sorcery|||Each opponent exiles cards from the top of their library until they have exiled cards with total mana value 5 or greater this way. Until end of turn, you may cast cards exiled this way without paying their mana costs.| Figure of Fable|Lorwyn Eclipsed|372|R|{G/W}|Creature - Kithkin|1|1|{G/W}: This creature becomes a Kithkin Scout with base power and toughness 2/3.${1}{G/W}{G/W}: If this creature is a Scout, it becomes a Kithkin Soldier with base power and toughness 4/5.${3}{G/W}{G/W}{G/W}: If this creature is a Soldier, it becomes a Kithkin Avatar with base power and toughness 7/8 and protection from each of your opponents.| High Perfect Morcant|Lorwyn Eclipsed|373|R|{2}{B}{G}|Legendary Creature - Elf Noble|4|4|Whenever High Perfect Morcant or another Elf you control enters, each opponent blights 1.$Tap three untapped Elves you control: Proliferate. Activate only as a sorcery.| Kirol, Attentive First-Year|Lorwyn Eclipsed|374|R|{1}{R/W}{R/W}|Legendary Creature - Vampire Cleric|3|3|Tap two untapped creatures you control: Copy target triggered ability you control. You may choose new targets for the copy. Activate only once each turn.| From 754038af584f29786ba059d9a3637e7d6c37a131 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:28:13 -0500 Subject: [PATCH 05/91] [ECL] Implement Catharsis --- Mage.Sets/src/mage/cards/c/Catharsis.java | 63 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/Catharsis.java diff --git a/Mage.Sets/src/mage/cards/c/Catharsis.java b/Mage.Sets/src/mage/cards/c/Catharsis.java new file mode 100644 index 00000000000..1da17282bcd --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Catharsis.java @@ -0,0 +1,63 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.TwoOfManaColorSpentCondition; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.EvokeAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.permanent.token.KithkinGreenWhiteToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Catharsis extends CardImpl { + + public Catharsis(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R/W}{R/W}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.INCARNATION); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // When this creature enters, if {W}{W} was spent to cast it, create two 1/1 green and white Kithkin creature tokens. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new CreateTokenEffect(new KithkinGreenWhiteToken(), 2) + ).withInterveningIf(TwoOfManaColorSpentCondition.WHITE)); + + // When this creature enters, if {R}{R} was spent to cast it, creatures you control get +1/+1 and gain haste until end of turn. + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostControlledEffect(1, 1, Duration.EndOfTurn) + .setText("creatures you control get +1/+1") + ).withInterveningIf(TwoOfManaColorSpentCondition.RED); + ability.addEffect(new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.EndOfTurn, + StaticFilters.FILTER_CONTROLLED_CREATURES + ).setText("and gain haste until end of turn")); + this.addAbility(ability); + + // Evoke {R/W}{R/W} + this.addAbility(new EvokeAbility("{R/W}{R/W}")); + } + + private Catharsis(final Catharsis card) { + super(card); + } + + @Override + public Catharsis copy() { + return new Catharsis(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index e91f83c7805..6a7978db040 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -57,6 +57,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Bristlebane Battler", 325, Rarity.RARE, mage.cards.b.BristlebaneBattler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Burdened Stoneback", 8, Rarity.UNCOMMON, mage.cards.b.BurdenedStoneback.class)); cards.add(new SetCardInfo("Burning Curiosity", 129, Rarity.COMMON, mage.cards.b.BurningCuriosity.class)); + cards.add(new SetCardInfo("Catharsis", 209, Rarity.MYTHIC, mage.cards.c.Catharsis.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Catharsis", 292, Rarity.MYTHIC, mage.cards.c.Catharsis.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Clachan", 353, Rarity.RARE, mage.cards.c.ChampionOfTheClachan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Clachan", 9, Rarity.RARE, mage.cards.c.ChampionOfTheClachan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Weird", 360, Rarity.RARE, mage.cards.c.ChampionOfTheWeird.class, NON_FULL_USE_VARIOUS)); From 9a29bb4187d3627a73cb02b06062607f875e23b5 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:30:57 -0500 Subject: [PATCH 06/91] [ECL] Implement Eclipsed Boggart --- .../src/mage/cards/e/EclipsedBoggart.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EclipsedBoggart.java diff --git a/Mage.Sets/src/mage/cards/e/EclipsedBoggart.java b/Mage.Sets/src/mage/cards/e/EclipsedBoggart.java new file mode 100644 index 00000000000..de1fae7f897 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EclipsedBoggart.java @@ -0,0 +1,53 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EclipsedBoggart extends CardImpl { + + private static final FilterCard filter = new FilterCard("Goblin, Swamp, or Mountain card"); + + static { + filter.add(Predicates.or( + SubType.GOBLIN.getPredicate(), + SubType.SWAMP.getPredicate(), + SubType.MOUNTAIN.getPredicate() + )); + } + + public EclipsedBoggart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B/R}{B/R}{B/R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When this creature enters, look at the top four cards of your library. You may reveal a Goblin, Swamp, or Mountain card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 4, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM + ))); + } + + private EclipsedBoggart(final EclipsedBoggart card) { + super(card); + } + + @Override + public EclipsedBoggart copy() { + return new EclipsedBoggart(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 6a7978db040..3fdc5341c83 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -83,6 +83,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Dose of Dawnglow", 100, Rarity.UNCOMMON, mage.cards.d.DoseOfDawnglow.class)); cards.add(new SetCardInfo("Dream Seizer", 101, Rarity.COMMON, mage.cards.d.DreamSeizer.class)); cards.add(new SetCardInfo("Dundoolin Weaver", 175, Rarity.UNCOMMON, mage.cards.d.DundoolinWeaver.class)); + cards.add(new SetCardInfo("Eclipsed Boggart", 217, Rarity.UNCOMMON, mage.cards.e.EclipsedBoggart.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Boggart", 335, Rarity.UNCOMMON, mage.cards.e.EclipsedBoggart.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Flamekin", 219, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Flamekin", 337, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eirdu, Carrier of Dawn", 13, Rarity.MYTHIC, mage.cards.e.EirduCarrierOfDawn.class, NON_FULL_USE_VARIOUS)); From 1dcfe87584fcc494fe51ccdf65e9a7b5107dfd97 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:32:26 -0500 Subject: [PATCH 07/91] [ECL] Implement Eclipsed Elf --- Mage.Sets/src/mage/cards/e/EclipsedElf.java | 53 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EclipsedElf.java diff --git a/Mage.Sets/src/mage/cards/e/EclipsedElf.java b/Mage.Sets/src/mage/cards/e/EclipsedElf.java new file mode 100644 index 00000000000..2a0ffe593a9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EclipsedElf.java @@ -0,0 +1,53 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EclipsedElf extends CardImpl { + + private static final FilterCard filter = new FilterCard("Elf, Swamp, or Forest card"); + + static { + filter.add(Predicates.or( + SubType.ELF.getPredicate(), + SubType.SWAMP.getPredicate(), + SubType.FOREST.getPredicate() + )); + } + + public EclipsedElf(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B/G}{B/G}{B/G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When this creature enters, look at the top four cards of your library. You may reveal an Elf, Swamp, or Forest card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 4, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM + ))); + } + + private EclipsedElf(final EclipsedElf card) { + super(card); + } + + @Override + public EclipsedElf copy() { + return new EclipsedElf(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 3fdc5341c83..e9d8ebda48c 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -85,6 +85,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Dundoolin Weaver", 175, Rarity.UNCOMMON, mage.cards.d.DundoolinWeaver.class)); cards.add(new SetCardInfo("Eclipsed Boggart", 217, Rarity.UNCOMMON, mage.cards.e.EclipsedBoggart.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Boggart", 335, Rarity.UNCOMMON, mage.cards.e.EclipsedBoggart.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Elf", 218, Rarity.UNCOMMON, mage.cards.e.EclipsedElf.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Elf", 336, Rarity.UNCOMMON, mage.cards.e.EclipsedElf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Flamekin", 219, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Flamekin", 337, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eirdu, Carrier of Dawn", 13, Rarity.MYTHIC, mage.cards.e.EirduCarrierOfDawn.class, NON_FULL_USE_VARIOUS)); From a853e63ddc211b1dc10dde069d43c9534a479a4f Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:33:53 -0500 Subject: [PATCH 08/91] [ECL] Implement Eclipsed Kithkin --- .../src/mage/cards/e/EclipsedKithkin.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EclipsedKithkin.java diff --git a/Mage.Sets/src/mage/cards/e/EclipsedKithkin.java b/Mage.Sets/src/mage/cards/e/EclipsedKithkin.java new file mode 100644 index 00000000000..9fab79d2410 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EclipsedKithkin.java @@ -0,0 +1,53 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EclipsedKithkin extends CardImpl { + + private static final FilterCard filter = new FilterCard("Kithkin, Forest, or Plains card"); + + static { + filter.add(Predicates.or( + SubType.KITHKIN.getPredicate(), + SubType.FOREST.getPredicate(), + SubType.PLAINS.getPredicate() + )); + } + + public EclipsedKithkin(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G/W}{G/W}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // When this creature enters, look at the top four cards of your library. You may reveal a Kithkin, Forest, or Plains card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 4, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM + ))); + } + + private EclipsedKithkin(final EclipsedKithkin card) { + super(card); + } + + @Override + public EclipsedKithkin copy() { + return new EclipsedKithkin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index e9d8ebda48c..123d6d10ade 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -89,6 +89,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Eclipsed Elf", 336, Rarity.UNCOMMON, mage.cards.e.EclipsedElf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Flamekin", 219, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Flamekin", 337, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Kithkin", 220, Rarity.UNCOMMON, mage.cards.e.EclipsedKithkin.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Kithkin", 338, Rarity.UNCOMMON, mage.cards.e.EclipsedKithkin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eirdu, Carrier of Dawn", 13, Rarity.MYTHIC, mage.cards.e.EirduCarrierOfDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eirdu, Carrier of Dawn", 286, Rarity.MYTHIC, mage.cards.e.EirduCarrierOfDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elder Auntie", 133, Rarity.COMMON, mage.cards.e.ElderAuntie.class)); From 078ca1e8e4e9f374fdef6737e82edbca1c00841a Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:35:11 -0500 Subject: [PATCH 09/91] [ECL] Implement Eclipsed Merrow --- .../src/mage/cards/e/EclipsedMerrow.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EclipsedMerrow.java diff --git a/Mage.Sets/src/mage/cards/e/EclipsedMerrow.java b/Mage.Sets/src/mage/cards/e/EclipsedMerrow.java new file mode 100644 index 00000000000..f6f03631d03 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EclipsedMerrow.java @@ -0,0 +1,53 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EclipsedMerrow extends CardImpl { + + private static final FilterCard filter = new FilterCard("Merfolk, Plains, or Island card"); + + static { + filter.add(Predicates.or( + SubType.MERFOLK.getPredicate(), + SubType.PLAINS.getPredicate(), + SubType.ISLAND.getPredicate() + )); + } + + public EclipsedMerrow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W/U}{W/U}{W/U}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // When this creature enters, look at the top four cards of your library. You may reveal a Merfolk, Plains, or Island card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. + this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( + 4, 1, filter, PutCards.HAND, PutCards.BOTTOM_RANDOM + ))); + } + + private EclipsedMerrow(final EclipsedMerrow card) { + super(card); + } + + @Override + public EclipsedMerrow copy() { + return new EclipsedMerrow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 123d6d10ade..5d2c0786ad6 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -91,6 +91,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Eclipsed Flamekin", 337, Rarity.UNCOMMON, mage.cards.e.EclipsedFlamekin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Kithkin", 220, Rarity.UNCOMMON, mage.cards.e.EclipsedKithkin.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eclipsed Kithkin", 338, Rarity.UNCOMMON, mage.cards.e.EclipsedKithkin.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Merrow", 221, Rarity.UNCOMMON, mage.cards.e.EclipsedMerrow.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Eclipsed Merrow", 339, Rarity.UNCOMMON, mage.cards.e.EclipsedMerrow.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eirdu, Carrier of Dawn", 13, Rarity.MYTHIC, mage.cards.e.EirduCarrierOfDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Eirdu, Carrier of Dawn", 286, Rarity.MYTHIC, mage.cards.e.EirduCarrierOfDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elder Auntie", 133, Rarity.COMMON, mage.cards.e.ElderAuntie.class)); From 6eed582cd06061908297f39d4a94b452c80eb1fc Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:36:51 -0500 Subject: [PATCH 10/91] [ECL] Implement Blight Rot --- Mage.Sets/src/mage/cards/b/BlightRot.java | 33 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 34 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BlightRot.java diff --git a/Mage.Sets/src/mage/cards/b/BlightRot.java b/Mage.Sets/src/mage/cards/b/BlightRot.java new file mode 100644 index 00000000000..b2ecf3d0fec --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BlightRot.java @@ -0,0 +1,33 @@ +package mage.cards.b; + +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BlightRot extends CardImpl { + + public BlightRot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{B}"); + + // Put four -1/-1 counters on target creature. + this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance(4))); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private BlightRot(final BlightRot card) { + super(card); + } + + @Override + public BlightRot copy() { + return new BlightRot(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 5d2c0786ad6..5ea92b95fbe 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -35,6 +35,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Bitterbloom Bearer", 310, Rarity.MYTHIC, mage.cards.b.BitterbloomBearer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bitterbloom Bearer", 352, Rarity.MYTHIC, mage.cards.b.BitterbloomBearer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bitterbloom Bearer", 88, Rarity.MYTHIC, mage.cards.b.BitterbloomBearer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Blight Rot", 89, Rarity.COMMON, mage.cards.b.BlightRot.class)); cards.add(new SetCardInfo("Blighted Blackthorn", 90, Rarity.COMMON, mage.cards.b.BlightedBlackthorn.class)); cards.add(new SetCardInfo("Blood Crypt", "349b", Rarity.RARE, mage.cards.b.BloodCrypt.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Blood Crypt", 262, Rarity.RARE, mage.cards.b.BloodCrypt.class, NON_FULL_USE_VARIOUS)); From 36e1fb6ea2e520e76f4093fc4fb46ea7af326ba1 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:41:52 -0500 Subject: [PATCH 11/91] [ECL] Implement Adept Watershaper --- .../src/mage/cards/a/AdeptWatershaper.java | 51 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 53 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AdeptWatershaper.java diff --git a/Mage.Sets/src/mage/cards/a/AdeptWatershaper.java b/Mage.Sets/src/mage/cards/a/AdeptWatershaper.java new file mode 100644 index 00000000000..aea5c3bd4bc --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AdeptWatershaper.java @@ -0,0 +1,51 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.TappedPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AdeptWatershaper extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("tapped creatures"); + + static { + filter.add(TappedPredicate.TAPPED); + } + + public AdeptWatershaper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Other tapped creatures you control have indestructible. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true + ))); + } + + private AdeptWatershaper(final AdeptWatershaper card) { + super(card); + } + + @Override + public AdeptWatershaper copy() { + return new AdeptWatershaper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 5ea92b95fbe..088d056116a 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -22,6 +22,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Abigale, Eloquent First-Year", 204, Rarity.RARE, mage.cards.a.AbigaleEloquentFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Abigale, Eloquent First-Year", 368, Rarity.RARE, mage.cards.a.AbigaleEloquentFirstYear.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Adept Watershaper", 297, Rarity.RARE, mage.cards.a.AdeptWatershaper.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Adept Watershaper", 3, Rarity.RARE, mage.cards.a.AdeptWatershaper.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Appeal to Eirdu", 5, Rarity.COMMON, mage.cards.a.AppealToEirdu.class)); cards.add(new SetCardInfo("Aquitect's Defenses", 44, Rarity.COMMON, mage.cards.a.AquitectsDefenses.class)); cards.add(new SetCardInfo("Ashling's Command", 205, Rarity.RARE, mage.cards.a.AshlingsCommand.class, NON_FULL_USE_VARIOUS)); From 550279d371f5be16ffb42f7a9440a7b9df6a67f1 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:49:37 -0500 Subject: [PATCH 12/91] [ECL] Implement Encumbered Reejerey --- .../src/mage/cards/e/EncumberedReejerey.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 54 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EncumberedReejerey.java diff --git a/Mage.Sets/src/mage/cards/e/EncumberedReejerey.java b/Mage.Sets/src/mage/cards/e/EncumberedReejerey.java new file mode 100644 index 00000000000..a2bf6857779 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EncumberedReejerey.java @@ -0,0 +1,53 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.common.BecomesTappedSourceTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EncumberedReejerey extends CardImpl { + + private static final Condition condition = new SourceHasCounterCondition(CounterType.M1M1); + + public EncumberedReejerey(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // This creature enters with three -1/-1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(3)), + "with three -1/-1 counters on it" + )); + + // Whenever this creature becomes tapped while it has a -1/-1 counter on it, remove a -1/-1 counter from it. + this.addAbility(new BecomesTappedSourceTriggeredAbility( + new RemoveCounterSourceEffect(CounterType.M1M1.createInstance()) + ).withTriggerCondition(condition)); + } + + private EncumberedReejerey(final EncumberedReejerey card) { + super(card); + } + + @Override + public EncumberedReejerey copy() { + return new EncumberedReejerey(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 088d056116a..f2c682c6ed1 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -101,6 +101,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Elder Auntie", 133, Rarity.COMMON, mage.cards.e.ElderAuntie.class)); cards.add(new SetCardInfo("Emptiness", 222, Rarity.MYTHIC, mage.cards.e.Emptiness.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Emptiness", 294, Rarity.MYTHIC, mage.cards.e.Emptiness.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Encumbered Reejerey", 14, Rarity.UNCOMMON, mage.cards.e.EncumberedReejerey.class)); cards.add(new SetCardInfo("Enraged Flamecaster", 135, Rarity.COMMON, mage.cards.e.EnragedFlamecaster.class)); cards.add(new SetCardInfo("Evolving Wilds", 264, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Explosive Prodigy", 136, Rarity.UNCOMMON, mage.cards.e.ExplosiveProdigy.class)); From 2c8da099553adef7a50f858380f09ba103b93c67 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:51:52 -0500 Subject: [PATCH 13/91] [ECL] Implement Brambleback Brute --- .../src/mage/cards/b/BramblebackBrute.java | 54 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BramblebackBrute.java diff --git a/Mage.Sets/src/mage/cards/b/BramblebackBrute.java b/Mage.Sets/src/mage/cards/b/BramblebackBrute.java new file mode 100644 index 00000000000..c50cebe79de --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BramblebackBrute.java @@ -0,0 +1,54 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BramblebackBrute extends CardImpl { + + public BramblebackBrute(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.GIANT); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // This creature enters with two -1/-1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(2)), + "with two -1/-1 counters on it" + )); + + // {1}{R}, Remove a counter from this creature: Target creature can't block this turn. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(new CantBlockTargetEffect(), new ManaCostsImpl<>("{1}{R}")); + ability.addCost(new RemoveCountersSourceCost(1)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + private BramblebackBrute(final BramblebackBrute card) { + super(card); + } + + @Override + public BramblebackBrute copy() { + return new BramblebackBrute(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index f2c682c6ed1..ac53bf253ad 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -54,6 +54,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Boggart Mischief", 92, Rarity.UNCOMMON, mage.cards.b.BoggartMischief.class)); cards.add(new SetCardInfo("Boldwyr Aggressor", 125, Rarity.UNCOMMON, mage.cards.b.BoldwyrAggressor.class)); cards.add(new SetCardInfo("Boneclub Berserker", 126, Rarity.COMMON, mage.cards.b.BoneclubBerserker.class)); + cards.add(new SetCardInfo("Brambleback Brute", 128, Rarity.COMMON, mage.cards.b.BramblebackBrute.class)); cards.add(new SetCardInfo("Brigid's Command", 208, Rarity.RARE, mage.cards.b.BrigidsCommand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Brigid's Command", 332, Rarity.RARE, mage.cards.b.BrigidsCommand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bristlebane Battler", 168, Rarity.RARE, mage.cards.b.BristlebaneBattler.class, NON_FULL_USE_VARIOUS)); From 4def8afd7ddb155cce58fbcef7a3654d99ff1df2 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 10:53:02 -0500 Subject: [PATCH 14/91] [ECL] Implement Scuzzback Scrounger --- .../src/mage/cards/s/ScuzzbackScrounger.java | 43 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 45 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ScuzzbackScrounger.java diff --git a/Mage.Sets/src/mage/cards/s/ScuzzbackScrounger.java b/Mage.Sets/src/mage/cards/s/ScuzzbackScrounger.java new file mode 100644 index 00000000000..d8aa0d56a10 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ScuzzbackScrounger.java @@ -0,0 +1,43 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.costs.common.BlightCost; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.TreasureToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ScuzzbackScrounger extends CardImpl { + + public ScuzzbackScrounger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // At the beginning of your first main phase, you may blight 1. If you do, create a Treasure token. + this.addAbility(new BeginningOfFirstMainTriggeredAbility( + new DoIfCostPaid(new CreateTokenEffect(new TreasureToken()), new BlightCost(1)) + )); + } + + private ScuzzbackScrounger(final ScuzzbackScrounger card) { + super(card); + } + + @Override + public ScuzzbackScrounger copy() { + return new ScuzzbackScrounger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index ac53bf253ad..cd566280864 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -208,6 +208,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Sapling Nursery", 192, Rarity.RARE, mage.cards.s.SaplingNursery.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sapling Nursery", 328, Rarity.RARE, mage.cards.s.SaplingNursery.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Scarblade Scout", 118, Rarity.COMMON, mage.cards.s.ScarbladeScout.class)); + cards.add(new SetCardInfo("Scuzzback Scrounger", 153, Rarity.RARE, mage.cards.s.ScuzzbackScrounger.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Scuzzback Scrounger", 320, Rarity.RARE, mage.cards.s.ScuzzbackScrounger.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sear", 154, Rarity.UNCOMMON, mage.cards.s.Sear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sear", 405, Rarity.UNCOMMON, mage.cards.s.Sear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shimmercreep", 120, Rarity.UNCOMMON, mage.cards.s.Shimmercreep.class)); From c9b82e7742c15aa6cae50f0fe6cf6c11e52ddfb0 Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 09:54:09 -0600 Subject: [PATCH 15/91] [ECL] Implement Omni-Changeling (#14202) --- .../src/mage/cards/o/OmniChangeling.java | 70 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OmniChangeling.java diff --git a/Mage.Sets/src/mage/cards/o/OmniChangeling.java b/Mage.Sets/src/mage/cards/o/OmniChangeling.java new file mode 100644 index 00000000000..ca0a69217df --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OmniChangeling.java @@ -0,0 +1,70 @@ +package mage.cards.o; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.util.functions.CopyApplier; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.EntersBattlefieldEffect; +import mage.abilities.effects.common.CopyPermanentEffect; +import mage.abilities.keyword.ChangelingAbility; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class OmniChangeling extends CardImpl { + + private static final CopyApplier applier = new CopyApplier() { + @Override + public boolean apply(Game game, MageObject blueprint, Ability source, UUID copyToObjectId) { + blueprint.getAbilities().add(new ChangelingAbility()); + return true; + } + }; + + public OmniChangeling(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); + + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Changeling + this.addAbility(new ChangelingAbility()); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // You may have this creature enter as a copy of any creature on the battlefield, except it has changeling. + this.addAbility(new SimpleStaticAbility( + Zone.ALL, + new EntersBattlefieldEffect( + new CopyPermanentEffect( + StaticFilters.FILTER_PERMANENT_CREATURE, + applier + ).setText("You may have {this} enter as a copy of any creature on the battlefield, except it has changeling"), + "", + true + ) + )); + } + + private OmniChangeling(final OmniChangeling card) { + super(card); + } + + @Override + public OmniChangeling copy() { + return new OmniChangeling(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index cd566280864..a8f6d36a0db 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -185,6 +185,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Mutable Explorer", 327, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Nameless Inversion", 113, Rarity.UNCOMMON, mage.cards.n.NamelessInversion.class)); cards.add(new SetCardInfo("Noggle Robber", 237, Rarity.UNCOMMON, mage.cards.n.NoggleRobber.class)); + cards.add(new SetCardInfo("Omni-Changeling", 62, Rarity.UNCOMMON, mage.cards.o.OmniChangeling.class)); cards.add(new SetCardInfo("Overgrown Tomb", "350b", Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Overgrown Tomb", 266, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Overgrown Tomb", 350, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); From 679334dca08e9e546fbc92c91f248f55eade12db Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 09:55:58 -0600 Subject: [PATCH 16/91] [ECL] Implement Unbury (#14200) --- Mage.Sets/src/mage/cards/u/Unbury.java | 110 ++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 111 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/Unbury.java diff --git a/Mage.Sets/src/mage/cards/u/Unbury.java b/Mage.Sets/src/mage/cards/u/Unbury.java new file mode 100644 index 00000000000..a79b8ba2902 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/Unbury.java @@ -0,0 +1,110 @@ +package mage.cards.u; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author muz + */ +public final class Unbury extends CardImpl { + + public Unbury(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}"); + + // Choose one -- + // * Return target creature card from your graveyard to your hand. + this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); + + // * Return two target creature cards that share a creature type from your graveyard to your hand. + Mode mode = new Mode(new ReturnFromGraveyardToHandTargetEffect()); + mode.addTarget(new UnburyTarget()); + this.getSpellAbility().addMode(mode); + } + + private Unbury(final Unbury card) { + super(card); + } + + @Override + public Unbury copy() { + return new Unbury(this); + } +} + +class UnburyTarget extends TargetCardInYourGraveyard { + + UnburyTarget() { + super(2, 2, StaticFilters.FILTER_CARD_CREATURE, false); + targetName = "creature cards that share a creature type from your graveyard"; + } + + private UnburyTarget(final UnburyTarget target) { + super(target); + } + + @Override + public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) { + if (!super.canTarget(playerId, id, source, game)) { + return false; + } + if (getTargets().isEmpty()) { + return true; + } + Card targetOne = game.getCard(getTargets().get(0)); + Card targetTwo = game.getCard(id); + if (targetOne == null || targetTwo == null) { + return false; + } + return targetOne.shareCreatureTypes(game, targetTwo); + } + + @Override + public boolean canChoose(UUID sourceControllerId, Ability source, Game game) { + MageObject targetSource = game.getObject(source); + Player player = game.getPlayer(sourceControllerId); + if (player == null) { + return false; + } + if (targetSource == null) { + return false; + } + List cards = player.getGraveyard().getCards( + filter, sourceControllerId, source, game + ).stream().collect(Collectors.toList()); + if (cards.size() < 2) { + return false; + } + for (int i = 0; i < cards.size(); i++) { + for (int j = 0; j < cards.size(); j++) { + if (i <= j) { + continue; + } + if (cards.get(i).shareCreatureTypes(game, cards.get(j))) { + return true; + } + } + } + return false; + } + + @Override + public UnburyTarget copy() { + return new UnburyTarget(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index a8f6d36a0db..af2c4c6cf33 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -251,6 +251,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Trystan, Callous Cultivator", 199, Rarity.RARE, mage.cards.t.TrystanCallousCultivator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Trystan, Callous Cultivator", 291, Rarity.RARE, mage.cards.t.TrystanCallousCultivator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tweeze", 162, Rarity.COMMON, mage.cards.t.Tweeze.class)); + cards.add(new SetCardInfo("Unbury", 123, Rarity.UNCOMMON, mage.cards.u.Unbury.class)); cards.add(new SetCardInfo("Unexpected Assistance", 80, Rarity.COMMON, mage.cards.u.UnexpectedAssistance.class)); cards.add(new SetCardInfo("Unforgiving Aim", 200, Rarity.COMMON, mage.cards.u.UnforgivingAim.class)); cards.add(new SetCardInfo("Unwelcome Sprite", 81, Rarity.UNCOMMON, mage.cards.u.UnwelcomeSprite.class)); From 92bc6a3b9a761ff07cbf0fdf190dbef9b7e9afae Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 10:00:31 -0600 Subject: [PATCH 17/91] [ECL] Implement Wary Farmer (#14197) --- Mage.Sets/src/mage/cards/w/WaryFarmer.java | 110 ++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 111 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WaryFarmer.java diff --git a/Mage.Sets/src/mage/cards/w/WaryFarmer.java b/Mage.Sets/src/mage/cards/w/WaryFarmer.java new file mode 100644 index 00000000000..98d80497fcb --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WaryFarmer.java @@ -0,0 +1,110 @@ +package mage.cards.w; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.constants.SubType; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class WaryFarmer extends CardImpl { + + public WaryFarmer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G/W}{G/W}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.CITIZEN); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // At the beginning of your end step, if another creature entered the battlefield under your control this turn, surveil 1. + this.addAbility( + new BeginningOfEndStepTriggeredAbility( + new SurveilEffect(1) + ).withInterveningIf(WaryFarmerCondition.instance), + new WaryFarmerWatcher() + ); + } + + private WaryFarmer(final WaryFarmer card) { + super(card); + } + + @Override + public WaryFarmer copy() { + return new WaryFarmer(this); + } +} + +enum WaryFarmerCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + return WaryFarmerWatcher.checkPermanent(game, source); + } + + @Override + public String toString() { + return "another creature entered the battlefield under your control this turn"; + } +} + +class WaryFarmerWatcher extends Watcher { + + // Key: Player id + // Value: set of all creatures that entered under that player's control this turn + private final Map> map = new HashMap<>(); + + WaryFarmerWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { + return; + } + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null) { + map.computeIfAbsent(permanent.getControllerId(), x -> new HashSet<>()) + .add(new MageObjectReference(permanent, game)); + } + + } + + @Override + public void reset() { + map.clear(); + super.reset(); + } + + static boolean checkPermanent(Game game, Ability source) { + return game + .getState() + .getWatcher(WaryFarmerWatcher.class) + .map + .getOrDefault(source.getControllerId(), Collections.emptySet()) + .stream() + .anyMatch(mor -> !mor.refersTo(source, game)); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index af2c4c6cf33..2a4a4d4f8ad 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -264,6 +264,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Wanderbrine Preacher", 41, Rarity.COMMON, mage.cards.w.WanderbrinePreacher.class)); cards.add(new SetCardInfo("Wanderwine Distracter", 82, Rarity.COMMON, mage.cards.w.WanderwineDistracter.class)); cards.add(new SetCardInfo("Warren Torchmaster", 163, Rarity.UNCOMMON, mage.cards.w.WarrenTorchmaster.class)); + cards.add(new SetCardInfo("Wary Farmer", 251, Rarity.COMMON, mage.cards.w.WaryFarmer.class)); cards.add(new SetCardInfo("Wild Unraveling", 84, Rarity.COMMON, mage.cards.w.WildUnraveling.class)); cards.add(new SetCardInfo("Wistfulness", 252, Rarity.MYTHIC, mage.cards.w.Wistfulness.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wistfulness", 296, Rarity.MYTHIC, mage.cards.w.Wistfulness.class, NON_FULL_USE_VARIOUS)); From a35d46a4fd2f249d65e58915656d4bb0e279eb53 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:01:47 -0500 Subject: [PATCH 18/91] fix error --- Mage.Sets/src/mage/cards/b/BramblebackBrute.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/b/BramblebackBrute.java b/Mage.Sets/src/mage/cards/b/BramblebackBrute.java index c50cebe79de..a58b043920f 100644 --- a/Mage.Sets/src/mage/cards/b/BramblebackBrute.java +++ b/Mage.Sets/src/mage/cards/b/BramblebackBrute.java @@ -11,6 +11,7 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; import mage.counters.CounterType; import mage.target.common.TargetCreaturePermanent; @@ -37,7 +38,7 @@ public final class BramblebackBrute extends CardImpl { )); // {1}{R}, Remove a counter from this creature: Target creature can't block this turn. Activate only as a sorcery. - Ability ability = new ActivateAsSorceryActivatedAbility(new CantBlockTargetEffect(), new ManaCostsImpl<>("{1}{R}")); + Ability ability = new ActivateAsSorceryActivatedAbility(new CantBlockTargetEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{1}{R}")); ability.addCost(new RemoveCountersSourceCost(1)); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); From d88b0b67c26db67a95830f2fe660f1ad99438e8c Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:03:01 -0500 Subject: [PATCH 19/91] [ECL] Implement Boggart Cursecrafter --- .../src/mage/cards/b/BoggartCursecrafter.java | 54 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BoggartCursecrafter.java diff --git a/Mage.Sets/src/mage/cards/b/BoggartCursecrafter.java b/Mage.Sets/src/mage/cards/b/BoggartCursecrafter.java new file mode 100644 index 00000000000..07d465fbc00 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoggartCursecrafter.java @@ -0,0 +1,54 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BoggartCursecrafter extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GOBLIN, "another Goblin you control"); + + static { + filter.add(AnotherPredicate.instance); + } + + public BoggartCursecrafter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARLOCK); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Whenever another Goblin you control dies, this creature deals 1 damage to each opponent. + this.addAbility(new DiesCreatureTriggeredAbility( + new DamagePlayersEffect(1, TargetController.OPPONENT), false, filter + )); + } + + private BoggartCursecrafter(final BoggartCursecrafter card) { + super(card); + } + + @Override + public BoggartCursecrafter copy() { + return new BoggartCursecrafter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 2a4a4d4f8ad..877d1e56f78 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -51,6 +51,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Bloom Tender", 390, Rarity.MYTHIC, mage.cards.b.BloomTender.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bloom Tender", 400, Rarity.MYTHIC, mage.cards.b.BloomTender.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Blossoming Defense", 167, Rarity.UNCOMMON, mage.cards.b.BlossomingDefense.class)); + cards.add(new SetCardInfo("Boggart Cursecrafter", 206, Rarity.UNCOMMON, mage.cards.b.BoggartCursecrafter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Boggart Cursecrafter", 331, Rarity.UNCOMMON, mage.cards.b.BoggartCursecrafter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boggart Mischief", 92, Rarity.UNCOMMON, mage.cards.b.BoggartMischief.class)); cards.add(new SetCardInfo("Boldwyr Aggressor", 125, Rarity.UNCOMMON, mage.cards.b.BoldwyrAggressor.class)); cards.add(new SetCardInfo("Boneclub Berserker", 126, Rarity.COMMON, mage.cards.b.BoneclubBerserker.class)); From a05b4db27eb450a5f128a5d7bae327bde64bdf02 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:31:29 -0500 Subject: [PATCH 20/91] [ECL] Implement Kinscaer Sentry --- .../src/mage/cards/k/KinscaerSentry.java | 88 +++++++++++++++++ .../src/mage/cards/m/MinionOfTheMighty.java | 67 ++----------- .../cards/p/PaladinElizabethTaggerdy.java | 84 ++++++---------- .../src/mage/cards/p/PreeminentCaptain.java | 72 +++----------- .../mage/cards/s/ShadowfaxLordOfHorses.java | 96 +++++++------------ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + .../PutCardFromHandOntoBattlefieldEffect.java | 58 ++++++++--- 7 files changed, 218 insertions(+), 249 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/k/KinscaerSentry.java diff --git a/Mage.Sets/src/mage/cards/k/KinscaerSentry.java b/Mage.Sets/src/mage/cards/k/KinscaerSentry.java new file mode 100644 index 00000000000..a041bdf4951 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KinscaerSentry.java @@ -0,0 +1,88 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.game.Game; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KinscaerSentry extends CardImpl { + + private static final FilterCard filter = new FilterCard( + "creature card with mana value less than or equal to the number of attacking creatures you control" + ); + + static { + filter.add(KinscaerSentryPredicate.instance); + } + + public KinscaerSentry(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // Whenever this creature attacks, you may put a creature card with mana value X or less from your hand onto the battlefield tapped and attacking, where X is the number of attacking creatures you control. + this.addAbility(new AttacksTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect( + filter, false, true, true + ).setText("you may put a creature card with mana value X or less from your hand onto the battlefield " + + "tapped and attacking, where X is the number of attacking creatures you control")).addHint(KinscaerSentryPredicate.getHint())); + } + + private KinscaerSentry(final KinscaerSentry card) { + super(card); + } + + @Override + public KinscaerSentry copy() { + return new KinscaerSentry(this); + } +} + +enum KinscaerSentryPredicate implements ObjectSourcePlayerPredicate { + instance; + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(AttackingPredicate.instance); + } + + private static final Hint hint = new ValueHint("Attacking creatures you control", new PermanentsOnBattlefieldCount(filter)); + + public static Hint getHint() { + return hint; + } + + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + return input.getObject().getManaValue() <= game.getBattlefield().count(filter, input.getPlayerId(), input.getSource(), game); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MinionOfTheMighty.java b/Mage.Sets/src/mage/cards/m/MinionOfTheMighty.java index da230db6b23..96f949f66f9 100644 --- a/Mage.Sets/src/mage/cards/m/MinionOfTheMighty.java +++ b/Mage.Sets/src/mage/cards/m/MinionOfTheMighty.java @@ -1,24 +1,15 @@ package mage.cards.m; import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.PackTacticsAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInHand; -import mage.util.CardUtil; import java.util.UUID; @@ -27,6 +18,12 @@ import java.util.UUID; */ public final class MinionOfTheMighty extends CardImpl { + private static final FilterCard filter = new FilterCreatureCard("a Dragon creature card"); + + static { + filter.add(SubType.DRAGON.getPredicate()); + } + public MinionOfTheMighty(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); @@ -38,7 +35,9 @@ public final class MinionOfTheMighty extends CardImpl { this.addAbility(new MenaceAbility(false)); // Pack tactics — Whenever Minion of the Mighty attacks, if you attacked with creatures wih total power 6 or greater this combat, you may put a Dragon creature card from your hand onto the battlefield tapped and attacking. - this.addAbility(new PackTacticsAbility(new MinionOfTheMightyEffect())); + this.addAbility(new PackTacticsAbility(new PutCardFromHandOntoBattlefieldEffect( + filter, false, true, true + ))); } private MinionOfTheMighty(final MinionOfTheMighty card) { @@ -50,49 +49,3 @@ public final class MinionOfTheMighty extends CardImpl { return new MinionOfTheMighty(this); } } - -class MinionOfTheMightyEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCreatureCard("a Dragon creature card"); - - static { - filter.add(SubType.DRAGON.getPredicate()); - } - - MinionOfTheMightyEffect() { - super(Outcome.Benefit); - staticText = "you may put a Dragon creature card from your hand onto the battlefield tapped and attacking"; - } - - private MinionOfTheMightyEffect(final MinionOfTheMightyEffect effect) { - super(effect); - } - - @Override - public MinionOfTheMightyEffect copy() { - return new MinionOfTheMightyEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - TargetCardInHand target = new TargetCardInHand(filter); - if (controller == null) { - return false; - } - target.choose(outcome, controller.getId(), source.getSourceId(), source, game); - Card card = controller.getHand().get(target.getFirstTarget(), game); - if (card == null) { - return false; - } - controller.moveCards( - card, Zone.BATTLEFIELD, source, game, true, - false, true, null - ); - Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); - if (permanent != null) { - game.getCombat().addAttackingCreature(permanent.getId(), game); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/p/PaladinElizabethTaggerdy.java b/Mage.Sets/src/mage/cards/p/PaladinElizabethTaggerdy.java index 9548a0a9b8b..42db506c060 100644 --- a/Mage.Sets/src/mage/cards/p/PaladinElizabethTaggerdy.java +++ b/Mage.Sets/src/mage/cards/p/PaladinElizabethTaggerdy.java @@ -1,33 +1,41 @@ package mage.cards.p; import mage.MageInt; +import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.BattalionAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.card.ManaValueLessThanOrEqualToSourcePowerPredicate; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInHand; -import mage.util.CardUtil; +import java.util.Optional; import java.util.UUID; /** - * * @author notgreat */ public final class PaladinElizabethTaggerdy extends CardImpl { + + private static final FilterCard filter = new FilterCreatureCard("creature card with mana value X or less"); + + static { + filter.add(PaladinElizabethTaggerdyPredicate.instance); + } + public PaladinElizabethTaggerdy(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}"); - + this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.KNIGHT); @@ -36,9 +44,11 @@ public final class PaladinElizabethTaggerdy extends CardImpl { // Battalion -- Whenever Paladin Elizabeth Taggerdy and at least two other creatures attack, draw a card, then you may put a creature card with mana value X or less from your hand onto the battlefield tapped and attacking, where X is Paladin Elizabeth Taggerdy's power. Ability ability = new BattalionAbility(new DrawCardSourceControllerEffect(1)); - ability.addEffect(new PaladinElizabethTaggerdyEffect().concatBy(", then")); + ability.addEffect(new PutCardFromHandOntoBattlefieldEffect( + filter, false, true, true + ).concatBy(", then")); + ability.addEffect(new InfoEffect(", where X is {this}'s power")); this.addAbility(ability); - } private PaladinElizabethTaggerdy(final PaladinElizabethTaggerdy card) { @@ -51,50 +61,16 @@ public final class PaladinElizabethTaggerdy extends CardImpl { } } -//Based on Preeminent Captain -class PaladinElizabethTaggerdyEffect extends OneShotEffect { - - private static final FilterCard filter = new FilterCreatureCard("a creature card with mana value less than or equal to {this}'s power"); - - static { - filter.add(ManaValueLessThanOrEqualToSourcePowerPredicate.instance); - } - - public PaladinElizabethTaggerdyEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "you may put a creature card with mana value X or less from your hand onto the battlefield tapped and attacking, where X is {this}'s power"; - } - - private PaladinElizabethTaggerdyEffect(final PaladinElizabethTaggerdyEffect effect) { - super(effect); - } +enum PaladinElizabethTaggerdyPredicate implements ObjectSourcePlayerPredicate { + instance; @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - TargetCardInHand target = new TargetCardInHand(filter); - if (controller != null && target.canChoose(controller.getId(), source, game) - && target.choose(outcome, controller.getId(), source.getSourceId(), source, game)) { - if (!target.getTargets().isEmpty()) { - UUID cardId = target.getFirstTarget(); - Card card = controller.getHand().get(cardId, game); - if (card != null) { - if (controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null)) { - Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); - if (permanent != null) { - game.getCombat().addAttackingCreature(permanent.getId(), game); - } - } - } - } - return true; - } - return false; + public boolean apply(ObjectSourcePlayer input, Game game) { + return Optional + .ofNullable(input.getSource().getSourcePermanentOrLKI(game)) + .map(MageObject::getPower) + .map(MageInt::getValue) + .filter(power -> input.getObject().getManaValue() <= power) + .isPresent(); } - - @Override - public PaladinElizabethTaggerdyEffect copy() { - return new PaladinElizabethTaggerdyEffect(this); - } - } diff --git a/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java b/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java index 52a27a5fbba..c784dddc623 100644 --- a/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java +++ b/Mage.Sets/src/mage/cards/p/PreeminentCaptain.java @@ -1,23 +1,14 @@ package mage.cards.p; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.keyword.FirstStrikeAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInHand; -import mage.util.CardUtil; import java.util.UUID; @@ -26,6 +17,12 @@ import java.util.UUID; */ public final class PreeminentCaptain extends CardImpl { + private static final FilterCreatureCard filter = new FilterCreatureCard("Soldier creature card"); + + static { + filter.add(SubType.SOLDIER.getPredicate()); + } + public PreeminentCaptain(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.KITHKIN); @@ -35,9 +32,11 @@ public final class PreeminentCaptain extends CardImpl { this.toughness = new MageInt(2); this.addAbility(FirstStrikeAbility.getInstance()); - // Whenever Preeminent Captain attacks, you may put a Soldier creature - // card from your hand onto the battlefield tapped and attacking. - this.addAbility(new AttacksTriggeredAbility(new PreeminentCaptainEffect(), true)); + + // Whenever Preeminent Captain attacks, you may put a Soldier creature card from your hand onto the battlefield tapped and attacking. + this.addAbility(new AttacksTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect( + filter, false, true, true + ), true)); } private PreeminentCaptain(final PreeminentCaptain card) { @@ -49,50 +48,3 @@ public final class PreeminentCaptain extends CardImpl { return new PreeminentCaptain(this); } } - -class PreeminentCaptainEffect extends OneShotEffect { - - private static final FilterCreatureCard filter = new FilterCreatureCard("a soldier creature card"); - - static { - filter.add(SubType.SOLDIER.getPredicate()); - } - - public PreeminentCaptainEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "put a Soldier creature card from your hand onto the battlefield tapped and attacking"; - } - - private PreeminentCaptainEffect(final PreeminentCaptainEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - TargetCardInHand target = new TargetCardInHand(filter); - if (controller != null && target.canChoose(controller.getId(), source, game) - && target.choose(outcome, controller.getId(), source.getSourceId(), source, game)) { - if (!target.getTargets().isEmpty()) { - UUID cardId = target.getFirstTarget(); - Card card = controller.getHand().get(cardId, game); - if (card != null) { - if (controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null)) { - Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); - if (permanent != null) { - game.getCombat().addAttackingCreature(permanent.getId(), game); - } - } - } - } - return true; - } - return false; - } - - @Override - public PreeminentCaptainEffect copy() { - return new PreeminentCaptainEffect(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/s/ShadowfaxLordOfHorses.java b/Mage.Sets/src/mage/cards/s/ShadowfaxLordOfHorses.java index 4256be9eb53..0fec06983df 100644 --- a/Mage.Sets/src/mage/cards/s/ShadowfaxLordOfHorses.java +++ b/Mage.Sets/src/mage/cards/s/ShadowfaxLordOfHorses.java @@ -1,49 +1,56 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; +import mage.MageObject; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutCardFromHandOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.Card; -import mage.constants.*; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.PowerPredicate; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.common.TargetCardInHand; -import mage.util.CardUtil; + +import java.util.Optional; +import java.util.UUID; /** - * * @author Susucr */ public final class ShadowfaxLordOfHorses extends CardImpl { private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.HORSE, "Horses"); + private static final FilterCard filter2 = new FilterCreatureCard("creature card with lesser power"); + + static { + filter.add(ShadowfaxLordOfHorsesPredicate.instance); + } public ShadowfaxLordOfHorses(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{W}"); - + this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.HORSE); this.power = new MageInt(4); this.toughness = new MageInt(4); // Horses you control have haste. - this.addAbility(new SimpleStaticAbility( - new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter))); + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter + ))); - // Whenever Shadowfax, Lord of Horses attacks, you may put a creature card - // with lesser power from your hand onto the battlefield tapped and attacking. - this.addAbility(new AttacksTriggeredAbility(new ShadowfaxLordOfHorsesEffect())); + // Whenever Shadowfax, Lord of Horses attacks, you may put a creature card with lesser power from your hand onto the battlefield tapped and attacking. + this.addAbility(new AttacksTriggeredAbility(new PutCardFromHandOntoBattlefieldEffect(filter2, false, true, true))); } private ShadowfaxLordOfHorses(final ShadowfaxLordOfHorses card) { @@ -56,55 +63,16 @@ public final class ShadowfaxLordOfHorses extends CardImpl { } } -class ShadowfaxLordOfHorsesEffect extends OneShotEffect { - - ShadowfaxLordOfHorsesEffect() { - super(Outcome.PutCreatureInPlay); - staticText = "you may put a creature card with lesser power " + - "from your hand onto the battlefield tapped and attacking."; - } - - private ShadowfaxLordOfHorsesEffect(final ShadowfaxLordOfHorsesEffect effect) { - super(effect); - } +enum ShadowfaxLordOfHorsesPredicate implements ObjectSourcePlayerPredicate { + instance; @Override - public ShadowfaxLordOfHorsesEffect copy() { - return new ShadowfaxLordOfHorsesEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - if (player == null) { - return false; - } - - Permanent shadowfax = source.getSourcePermanentOrLKI(game); - if (shadowfax == null) { - return false; - } - - FilterCreatureCard filter = new FilterCreatureCard("a creature card with lesser power"); - filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, shadowfax.getPower().getValue())); - TargetCardInHand target = new TargetCardInHand(0,1,filter); - target.withNotTarget(true); - - if (!player.choose(outcome, player.getHand(), target, source, game)) { - return false; - } - - Card card = game.getCard(target.getFirstTarget()); - if(card == null) { - return false; - } - - player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, true, null); - Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game); - if (permanent != null) { - game.getCombat().addAttackingCreature(permanent.getId(), game); - } - - return true; + public boolean apply(ObjectSourcePlayer input, Game game) { + return Optional + .ofNullable(input.getSource().getSourcePermanentOrLKI(game)) + .map(MageObject::getPower) + .map(MageInt::getValue) + .filter(power -> input.getObject().getPower().getValue() < power) + .isPresent(); } } diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 877d1e56f78..5870ad9fce2 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -154,6 +154,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Island", 275, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Island", 280, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Kinsbaile Aspirant", 21, Rarity.UNCOMMON, mage.cards.k.KinsbaileAspirant.class)); + cards.add(new SetCardInfo("Kinscaer Sentry", 22, Rarity.RARE, mage.cards.k.KinscaerSentry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kinscaer Sentry", 300, Rarity.RARE, mage.cards.k.KinscaerSentry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kirol, Attentive First-Year", 231, Rarity.RARE, mage.cards.k.KirolAttentiveFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kirol, Attentive First-Year", 374, Rarity.RARE, mage.cards.k.KirolAttentiveFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kithkeeper", 23, Rarity.UNCOMMON, mage.cards.k.Kithkeeper.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java index 5a67997ff02..7b2a7abb6c9 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PutCardFromHandOntoBattlefieldEffect.java @@ -7,10 +7,13 @@ import mage.cards.Card; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.filter.common.FilterPermanentCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInHand; +import mage.util.CardUtil; + +import java.util.Optional; /** * @author magenoxx_at_gmail.com @@ -20,9 +23,10 @@ public class PutCardFromHandOntoBattlefieldEffect extends OneShotEffect { private final FilterCard filter; private final boolean useTargetController; private final boolean tapped; + private final boolean attacking; public PutCardFromHandOntoBattlefieldEffect() { - this(new FilterPermanentCard("a permanent card"), false); + this(StaticFilters.FILTER_CARD_A_PERMANENT, false); } public PutCardFromHandOntoBattlefieldEffect(FilterCard filter) { @@ -34,10 +38,15 @@ public class PutCardFromHandOntoBattlefieldEffect extends OneShotEffect { } public PutCardFromHandOntoBattlefieldEffect(FilterCard filter, boolean useTargetController, boolean tapped) { + this(filter, useTargetController, tapped, false); + } + + public PutCardFromHandOntoBattlefieldEffect(FilterCard filter, boolean useTargetController, boolean tapped, boolean attacking) { super(Outcome.PutCardInPlay); this.filter = filter; this.useTargetController = useTargetController; this.tapped = tapped; + this.attacking = attacking; } protected PutCardFromHandOntoBattlefieldEffect(final PutCardFromHandOntoBattlefieldEffect effect) { @@ -45,6 +54,7 @@ public class PutCardFromHandOntoBattlefieldEffect extends OneShotEffect { this.filter = effect.filter.copy(); this.useTargetController = effect.useTargetController; this.tapped = effect.tapped; + this.attacking = effect.attacking; } @Override @@ -63,16 +73,20 @@ public class PutCardFromHandOntoBattlefieldEffect extends OneShotEffect { if (player == null) { return false; } - if (player.chooseUse(Outcome.PutCardInPlay, "Put " + filter.getMessage() + " from your hand onto the battlefield?", source, game)) { - TargetCardInHand target = new TargetCardInHand(filter); - if (player.choose(Outcome.PutCardInPlay, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - return player.moveCards(card, Zone.BATTLEFIELD, source, game, tapped, false, false, null); - } - } + if (!player.chooseUse(Outcome.PutCardInPlay, "Put " + filter.getMessage() + " from your hand onto the battlefield?", source, game)) { + return false; } - return false; + TargetCardInHand target = new TargetCardInHand(filter); + player.choose(Outcome.PutCardInPlay, target, source, game); + Card card = game.getCard(target.getFirstTarget()); + if (card == null || !player.moveCards(card, Zone.BATTLEFIELD, source, game, tapped, false, false, null)) { + return false; + } + if (attacking) { + Optional.ofNullable(CardUtil.getPermanentFromCardPutToBattlefield(card, game)) + .ifPresent(permanent -> game.getCombat().addAttackingCreature(permanent.getId(), game)); + } + return true; } @Override @@ -80,11 +94,27 @@ public class PutCardFromHandOntoBattlefieldEffect extends OneShotEffect { if (this.staticText != null && !this.staticText.isEmpty()) { return staticText; } - + StringBuilder sb = new StringBuilder(); if (useTargetController) { - return "that player may put " + filter.getMessage() + " from their hand onto the battlefield" + (this.tapped ? " tapped" : ""); + sb.append("that player"); } else { - return "you may put " + filter.getMessage() + " from your hand onto the battlefield" + (this.tapped ? " tapped" : ""); + sb.append("you"); } + sb.append(" may put "); + sb.append(CardUtil.addArticle(filter.getMessage())); + sb.append(" from "); + if (useTargetController) { + sb.append("their"); + } else { + sb.append("your"); + } + sb.append(" hand onto the battlefield"); + if (tapped) { + sb.append(" tapped"); + } + if (attacking) { + sb.append(" and attacking"); + } + return sb.toString(); } } From d4e3bcd79eebd1e0f71b65e1e3c94d705a8a0df5 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:36:31 -0500 Subject: [PATCH 21/91] [ECL] update spoiler --- Mage.Sets/src/mage/sets/LorwynEclipsed.java | 3 +- Utils/mtg-cards-data.txt | 53 +++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 5870ad9fce2..c87f8057541 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -220,7 +220,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Shimmercreep", 120, Rarity.UNCOMMON, mage.cards.s.Shimmercreep.class)); cards.add(new SetCardInfo("Shinestriker", 68, Rarity.UNCOMMON, mage.cards.s.Shinestriker.class)); cards.add(new SetCardInfo("Shore Lurker", 34, Rarity.COMMON, mage.cards.s.ShoreLurker.class)); - cards.add(new SetCardInfo("Silvergill Mentor", 403, Rarity.UNCOMMON, mage.cards.s.SilvergillMentor.class)); + cards.add(new SetCardInfo("Silvergill Mentor", 403, Rarity.UNCOMMON, mage.cards.s.SilvergillMentor.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Silvergill Mentor", 69, Rarity.UNCOMMON, mage.cards.s.SilvergillMentor.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Silvergill Peddler", 70, Rarity.COMMON, mage.cards.s.SilvergillPeddler.class)); cards.add(new SetCardInfo("Sizzling Changeling", 155, Rarity.UNCOMMON, mage.cards.s.SizzlingChangeling.class)); cards.add(new SetCardInfo("Slumbering Walker", 302, Rarity.RARE, mage.cards.s.SlumberingWalker.class, NON_FULL_USE_VARIOUS)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 406e89e574c..1ca68c977d9 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -60818,6 +60818,7 @@ Worldly Tutor|Avatar: The Last Airbender Eternal|314|R|{G}|Instant|||Search your Arcane Signet|Avatar: The Last Airbender Eternal|315|R|{2}|Artifact|||{T}: Add one mana of any color in your commander's color identity.| Sol Ring|Avatar: The Last Airbender Eternal|316|R|{1}|Artifact|||{T}: Add {C}{C}.| Swiftfoot Boots|Avatar: The Last Airbender Eternal|317|R|{2}|Artifact - Equipment|||Equipped creature has hexproof and haste.$Equip {1}| +Changeling Wayfinder|Lorwyn Eclipsed|1|C|{3}|Creature - Shapeshifter|1|2|Changeling$When this creature enters, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle.| Rooftop Percher|Lorwyn Eclipsed|2|C|{5}|Creature - Shapeshifter|3|3|Changeling$Flying$When this creature enters, exile up to two target cards from graveyards. You gain 3 life.| Adept Watershaper|Lorwyn Eclipsed|3|R|{2}{W}|Creature - Merfolk Cleric|3|4|Other tapped creatures you control have indestructible.| Ajani, Outland Chaperone|Lorwyn Eclipsed|4|M|{1}{W}{W}|Legendary Planeswalker - Ajani|3|+1: Create a 1/1 green and white Kithkin creature token.$-2: Ajani deals 4 damage to target tapped creature.$-8: Look at the top X cards of your library, where X is your life total. You may put any number of nonland permanent cards with mana value 3 or less from among them onto the battlefield. Then shuffle.| @@ -60833,27 +60834,34 @@ Curious Colossus|Lorwyn Eclipsed|12|M|{5}{W}{W}|Creature - Giant Warrior|7|7|Whe Eirdu, Carrier of Dawn|Lorwyn Eclipsed|13|M|{3}{W}{W}|Legendary Creature - Elemental God|5|5|Flying, lifelink$Creature spells you cast have convoke.$At the beginning of your first main phase, you may pay {B}. If you do, transform Eirdu.| Isilu, Carrier of Twilight|Lorwyn Eclipsed|13|M||Legendary Creature - Elemental God|5|5|Flying, lifelink$Each other nontoken creature you control has persist.$At the beginning of your first main phase, you may pay {W}. If you do, transform Isilu.| Encumbered Reejerey|Lorwyn Eclipsed|14|U|{1}{W}|Creature - Merfolk Soldier|5|4|This creature enters with three -1/-1 counters on it.$Whenever this creature becomes tapped while it has a -1/-1 counter on it, remove a -1/-1 counter from it.| +Evershrike's Gift|Lorwyn Eclipsed|15|U|{W}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +1/+0 and has flying.${1}{W}, Blight 2: Return this card from your graveyard to your hand. Activate only as a sorcery.| Flock Impostor|Lorwyn Eclipsed|16|U|{2}{W}|Creature - Shapeshifter|2|2|Changeling$Flash$Flying$When this creature enters, return up to one other target creature you control to its owner's hand.| Gallant Fowlknight|Lorwyn Eclipsed|17|C|{3}{W}|Creature - Kithkin Knight|3|4|When this creature enters, creatures you control get +1/+0 until end of turn. Kithkin creatures you control also gain first strike until end of turn.| Goldmeadow Nomad|Lorwyn Eclipsed|18|C|{W}|Creature - Kithkin Scout|1|2|{W}, Exile this card from your graveyard: Create a 1/1 green and white Kithkin creature token. Activate only as a sorcery.| +Keep Out|Lorwyn Eclipsed|19|C|{1}{W}|Instant|||Choose one --$* Keep Out deals 4 damage to target tapped creature.$* Destroy target enchantment.| Kinbinding|Lorwyn Eclipsed|20|R|{3}{W}{W}|Enchantment|||Creatures you control get +X/+X, where X is the number of creatures that entered the battlefield under your control this turn.$At the beginning of combat on your turn, create a 1/1 green and white Kithkin creature token.| Kinsbaile Aspirant|Lorwyn Eclipsed|21|U|{W}|Creature - Kithkin Citizen|2|1|As an additional cost to cast this spell, behold a Kithkin or pay {2}.$Whenever another creature you control enters, this creature gets +1/+1 until end of turn.| Kinscaer Sentry|Lorwyn Eclipsed|22|R|{1}{W}|Creature - Kithkin Soldier|2|2|First strike, lifelink$Whenever this creature attacks, you may put a creature card with mana value X or less from your hand onto the battlefield tapped and attacking, where X is the number of attacking creatures you control.| Kithkeeper|Lorwyn Eclipsed|23|U|{6}{W}|Creature - Elemental|3|3|Vivid -- When this creature enters, create X 1/1 green and white Kithkin creature tokens, where X is the number of colors among permanents you control.$Tap three untapped creatures you control: This creature gets +3/+0 and gains flying until end of turn.| Liminal Hold|Lorwyn Eclipsed|24|C|{3}{W}|Enchantment|||When this enchantment enters, exile up to one target nonland permanent an opponent controls until this enchantment leaves the battlefield. You gain 2 life.| Meanders Guide|Lorwyn Eclipsed|25|U|{2}{W}|Creature - Merfolk Scout|3|2|Whenever this creature attacks, you may tap another untapped Merfolk you control. When you do, return target creature card with mana value 3 or less from your graveyard to the battlefield.| +Moonlit Lamenter|Lorwyn Eclipsed|26|U|{2}{W}|Creature - Treefolk Cleric|2|5|This creature enters with a -1/-1 counter on it.${1}{W}, Remove a counter from this creature: Draw a card. Activate only as a sorcery.| Morningtide's Light|Lorwyn Eclipsed|27|M|{3}{W}|Sorcery|||Exile any number of target creatures. At the beginning of the next end step, return those cards to the battlefield tapped under their owners' control.$Until your next turn, prevent all damage that would be dealt to you.$Exile Morningtide's Light.| Personify|Lorwyn Eclipsed|28|U|{1}{W}|Instant|||Exile target creature you control, then return that card to the battlefield under its owner's control. Create a 1/1 colorless Shapeshifter creature token with changeling.| +Protective Response|Lorwyn Eclipsed|29|U|{2}{W}|Instant|||Convoke$Destroy target attacking or blocking creature.| Pyrrhic Strike|Lorwyn Eclipsed|30|U|{2}{W}|Instant|||As an additional cost to cast this spell, you may blight 2.$Choose one. If this spell's additional cost was paid, choose both instead.$* Destroy target artifact or enchantment.$* Destroy target creature with mana value 3 or greater.| Reluctant Dounguard|Lorwyn Eclipsed|31|C|{2}{W}|Creature - Kithkin Soldier|4|4|This creature enters with two -1/-1 counters on it.$Whenever another creature you control enters while this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature.| Rhys, the Evermore|Lorwyn Eclipsed|32|R|{1}{W}|Legendary Creature - Elf Warrior|2|2|Flash$When Rhys enters, another target creature you control gains persist until end of turn.${W}, {T}: Remove any number of counters from target creature you control. Activate only as a sorcery.| +Riverguard's Reflexes|Lorwyn Eclipsed|33|C|{1}{W}|Instant|||Target creature gets +2/+2 and gains first strike until end of turn. Untap it.| Shore Lurker|Lorwyn Eclipsed|34|C|{3}{W}|Creature - Merfolk Scout|3|3|Flying$When this creature enters, surveil 1.| Slumbering Walker|Lorwyn Eclipsed|35|R|{3}{W}{W}|Creature - Giant Warrior|4|7|This creature enters with two -1/-1 counters on it.$At the beginning of your end step, you may remove a counter from this creature. When you do, return target creature card with power 2 or less from your graveyard to the battlefield.| Spiral into Solitude|Lorwyn Eclipsed|36|C|{1}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature can't attack or block.${1}{W}, Blight 1, Sacrifice this Aura: Exile enchanted creature.| Sun-Dappled Celebrant|Lorwyn Eclipsed|37|C|{4}{W}{W}|Creature - Treefolk Cleric|5|6|Convoke$Vigilance| Thoughtweft Imbuer|Lorwyn Eclipsed|38|U|{3}{W}|Creature - Kithkin Advisor|0|5|Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of Kithkin you control.| +Timid Shieldbearer|Lorwyn Eclipsed|39|C|{1}{W}|Creature - Kithkin Soldier|2|2|{4}{W}: Creatures you control get +1/+1 until end of turn.| Tributary Vaulter|Lorwyn Eclipsed|40|C|{2}{W}|Creature - Merfolk Warrior|1|3|Flying$Whenever this creature becomes tapped, another target Merfolk you control gets +2/+0 until end of turn.| Wanderbrine Preacher|Lorwyn Eclipsed|41|C|{1}{W}|Creature - Merfolk Cleric|2|2|Whenever this creature becomes tapped, you gain 2 life.| +Wanderbrine Trapper|Lorwyn Eclipsed|42|U|{W}|Creature - Merfolk Scout|2|1|{1}, {T}, Tap another untapped creature you control: Tap target creature an opponent controls.| Winnowing|Lorwyn Eclipsed|43|R|{4}{W}{W}|Sorcery|||Convoke$For each player, you choose a creature that player controls. Then each player sacrifices all other creatures they control that don't share a creature type with the chosen creature they control.| Aquitect's Defenses|Lorwyn Eclipsed|44|C|{1}{U}|Enchantment - Aura|||Flash$Enchant creature you control$When this Aura enters, enchanted creature gains hexproof until end of turn.$Enchanted creature gets +1/+2.| Blossombind|Lorwyn Eclipsed|45|C|{1}{U}|Enchantment - Aura|||Enchant creature$When this Aura enters, tap enchanted creature.$Enchanted creature can't become untapped and can't have counters put on it.| @@ -60861,43 +60869,55 @@ Champions of the Shoal|Lorwyn Eclipsed|46|R|{3}{U}|Creature - Merfolk Soldier|4| Disruptor of Currents|Lorwyn Eclipsed|47|R|{3}{U}{U}|Creature - Merfolk Wizard|3|3|Flash$Convoke$When this creature enters, return up to one other target nonland permanent to its owner's hand.| Flitterwing Nuisance|Lorwyn Eclipsed|48|R|{U}|Creature - Faerie Rogue|2|2|Flying$This creature enters with a -1/-1 counter on it.${2}{U}, Remove a counter from this creature: Whenever a creature you control deals combat damage to a player or planeswalker this turn, draw a card.| Glamer Gifter|Lorwyn Eclipsed|49|U|{1}{U}|Creature - Faerie Wizard|1|2|Flash$Flying$When this creature enters, choose up to one other target creature. Until end of turn, that creature has base power and toughness 4/4 and gains all creature types.| +Glamermite|Lorwyn Eclipsed|50|C|{2}{U}|Creature - Faerie Rogue|2|2|Flash$Flying$When this creature enters, choose one --$* Tap target creature.$* Untap target creature.| Glen Elendra Guardian|Lorwyn Eclipsed|51|R|{2}{U}|Creature - Faerie Wizard|3|4|Flash$Flying$This creature enters with a -1/-1 counter on it.${1}{U}, Remove a counter from this creature: Counter target noncreature spell. Its controller draws a card.| Glen Elendra's Answer|Lorwyn Eclipsed|52|M|{2}{U}{U}|Instant|||This spell can't be countered.$Counter all spells your opponents control and all abilities your opponents control. Create a 1/1 blue and black Faerie creature token with flying for each spell and ability countered this way.| Gravelgill Scoundrel|Lorwyn Eclipsed|53|C|{1}{U}|Creature - Merfolk Rogue|1|3|Vigilance$Whenever this creature attacks, you may tap another untapped creature you control. If you do, this creature can't be blocked this turn.| Harmonized Crescendo|Lorwyn Eclipsed|54|R|{4}{U}{U}|Instant|||Convoke$Choose a creature type. Draw a card for each permanent you control of that type.| +Illusion Spinners|Lorwyn Eclipsed|55|U|{4}{U}|Creature - Faerie Wizard|4|3|You may cast this spell as though it had flash if you control a Faerie.$Flying$This creature has hexproof as long as it's untapped.| Kulrath Mystic|Lorwyn Eclipsed|56|C|{2}{U}|Creature - Elemental Wizard|2|4|Whenever you cast a spell with mana value 4 or greater, this creature gets +2/+0 and gains vigilance until end of turn.| Loch Mare|Lorwyn Eclipsed|57|M|{1}{U}|Creature - Horse Serpent|4|5|This creature enters with three -1/-1 counters on it.${1}{U}, Remove a counter from this creature: Draw a card.${2}{U}, Remove two counters from this creature: Tap target creature. Put a stun counter on it.| Lofty Dreams|Lorwyn Eclipsed|58|U|{3}{U}{U}|Enchantment - Aura|||Convoke$Enchant creature$When this Aura enters, draw a card.$Enchanted creature gets +2/+2 and has flying.| Mirrorform|Lorwyn Eclipsed|59|M|{4}{U}{U}|Instant|||Each nonland permanent you control becomes a copy of target non-Aura permanent.| +Noggle the Mind|Lorwyn Eclipsed|60|U|{1}{U}|Enchantment - Aura|||Flash$Enchant creature$Enchanted creature loses all abilities and is a colorless Noggle with base power and toughness 1/1.| Oko, Lorwyn Liege|Lorwyn Eclipsed|61|M|{2}{U}|Legendary Planeswalker - Oko|3|At the beginning of your first main phase, you may pay {G}. If you do, transform Oko.$+2: Up to one target creature gains all creature types.$+1: Target creature gets -2/-0 until your next turn.| Oko, Shadowmoor Scion|Lorwyn Eclipsed|61|M||Legendary Planeswalker - Oko|3|At the beginning of your first main phase, you may pay {U}. If you do, transform Oko.$-1: Mill three cards. You may put a permanent card from among them into your hand.$-3: Create two 3/3 green Elk creature tokens.$-6: Choose a creature type. You get an emblem with "Creatures you control of the chosen type get +3/+3 and have vigilance and hexproof."| Omni-Changeling|Lorwyn Eclipsed|62|U|{3}{U}{U}|Creature - Shapeshifter|0|0|Changeling$Convoke$You may have this creature enter as a copy of any creature on the battlefield, except it has changeling.| Pestered Wellguard|Lorwyn Eclipsed|63|U|{3}{U}|Creature - Merfolk Soldier|3|2|Whenever this creature becomes tapped, create a 1/1 blue and black Faerie creature token with flying.| +Rime Chill|Lorwyn Eclipsed|64|U|{6}{U}|Instant|||Vivid -- This spell costs {1} less to cast for each color among permanents you control.$Tap up to two target creatures. Put a stun counter on each of them.$Draw a card.| Rimefire Torque|Lorwyn Eclipsed|65|R|{1}{U}|Artifact|||As this artifact enters, choose a creature type.$Whenever a permanent you control of the chosen type enters, put a charge counter on this artifact.${T}, Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it. You may choose new targets for the copy.| +Rimekin Recluse|Lorwyn Eclipsed|66|U|{2}{U}|Creature - Elemental Wizard|3|2|When this creature enters, return up to one other target creature to its owner's hand.| Run Away Together|Lorwyn Eclipsed|67|C|{1}{U}|Instant|||Choose two target creatures controlled by different players. Return those creatures to their owners' hands.| Shinestriker|Lorwyn Eclipsed|68|U|{4}{U}{U}|Creature - Elemental|3|3|Flying$Vivid -- When this creature enters, draw cards equal to the number of colors among permanents you control.| +Silvergill Mentor|Lorwyn Eclipsed|69|U|{1}{U}|Creature - Merfolk Wizard|2|1|As an additional cost to cast this spell, behold a Merfolk or pay {2}.$When this creature enters, create a 1/1 white and blue Merfolk creature token.| Silvergill Peddler|Lorwyn Eclipsed|70|C|{2}{U}|Creature - Merfolk Citizen|2|3|Whenever this creature becomes tapped, draw a card, then discard a card.| Spell Snare|Lorwyn Eclipsed|71|U|{U}|Instant|||Counter target spell with mana value 2.| Stratosoarer|Lorwyn Eclipsed|72|C|{4}{U}|Creature - Elemental|3|5|Flying$When this creature enters, target creature gains flying until end of turn.$Basic landcycling {1}{U}| +Summit Sentinel|Lorwyn Eclipsed|73|C|{1}{U}|Creature - Elemental Soldier|1|3|When this creature dies, draw a card.| Sunderflock|Lorwyn Eclipsed|74|R|{7}{U}{U}|Creature - Elemental|5|5|This spell costs {X} less to cast, where X is the greatest mana value among Elementals you control.$Flying$When this creature enters, if you cast it, return all non-Elemental creatures to their owners' hands.| Swat Away|Lorwyn Eclipsed|75|U|{2}{U}{U}|Instant|||This spell costs {2} less to cast if a creature is attacking you.$The owner of target spell or creature puts it on their choice of the top or bottom of their library.| Sygg, Wanderwine Wisdom|Lorwyn Eclipsed|76|R|{1}{U}|Legendary Creature - Merfolk Wizard|2|2|Sygg can't be blocked.$Whenever this creature enters or transforms into Sygg, Wanderwine Wisdom, target creature gains "Whenever this creature deals combat damage to a player or planeswalker, draw a card" until end of turn.$At the beginning of your first main phase, you may pay {W}. If you do, transform Sygg.| Sygg, Wanderbrine Shield|Lorwyn Eclipsed|76|R||Legendary Creature - Merfolk Rogue|2|2|Sygg can't be blocked.$Whenever this creature transforms into Sygg, Wanderbrine Shield, target creature you control gains protection from each color until your next turn.$At the beginning of your first main phase, you may pay {U}. If you do, transform Sygg.| Tanufel Rimespeaker|Lorwyn Eclipsed|77|U|{3}{U}|Creature - Elemental Wizard|2|4|Whenever you cast a spell with mana value 4 or greater, draw a card.| Temporal Cleansing|Lorwyn Eclipsed|78|C|{3}{U}|Sorcery|||Convoke$The owner of target nonland permanent puts it into their library second from the top or on the bottom.| +Thirst for Identity|Lorwyn Eclipsed|79|U|{2}{U}|Instant|||Draw three cards. Then discard two cards unless you discard a creature card.| Unexpected Assistance|Lorwyn Eclipsed|80|C|{3}{U}{U}|Instant|||Convoke$Draw three cards, then discard a card.| Unwelcome Sprite|Lorwyn Eclipsed|81|U|{1}{U}|Creature - Faerie Rogue|2|1|Flying$Whenever you cast a spell during an opponent's turn, surveil 2.| Wanderwine Distracter|Lorwyn Eclipsed|82|C|{3}{U}|Creature - Merfolk Wizard|4|3|Whenever this creature becomes tapped, target creature an opponent controls gets -3/-0 until end of turn.| Wanderwine Farewell|Lorwyn Eclipsed|83|U|{5}{U}{U}|Kindred Sorcery - Merfolk|||Convoke$Return one or two target nonland permanents to their owners' hands. Then if you control a Merfolk, create a 1/1 white and blue Merfolk creature token for each permanent returned to its owner's hand this way.| Wild Unraveling|Lorwyn Eclipsed|84|C|{U}{U}|Instant|||As an additional cost to cast this spell, blight 2 or pay {1}.$Counter target spell.| Auntie's Sentence|Lorwyn Eclipsed|85|C|{1}{B}|Sorcery|||Choose one --$* Target opponent reveals their hand. You choose a nonland permanent card from it. That player discards that card.$* Target creature gets -2/-2 until end of turn.| +Barbed Bloodletter|Lorwyn Eclipsed|86|C|{1}{B}|Artifact - Equipment|||Flash$When this Equipment enters, attach it to target creature you control. That creature gains wither until end of turn.$Equipped creature gets +1/+2.$Equip {2}| Bile-Vial Boggart|Lorwyn Eclipsed|87|C|{B}|Creature - Goblin Assassin|1|1|When this creature dies, put a -1/-1 counter on up to one target creature.| Bitterbloom Bearer|Lorwyn Eclipsed|88|M|{B}{B}|Creature - Faerie Rogue|1|1|Flash$Flying$At the beginning of your upkeep, you lose 1 life and create a 1/1 blue and black Faerie creature token with flying.| Blight Rot|Lorwyn Eclipsed|89|C|{2}{B}|Instant|||Put four -1/-1 counters on target creature.| Blighted Blackthorn|Lorwyn Eclipsed|90|C|{4}{B}|Creature - Treefolk Warlock|3|7|Whenever this creature enters or attacks, you may blight 2. If you do, you draw a card and lose 1 life.| Bloodline Bidding|Lorwyn Eclipsed|91|R|{6}{B}{B}|Sorcery|||Convoke$Choose a creature type. Return all creature cards of the chosen type from your graveyard to the battlefield.| Boggart Mischief|Lorwyn Eclipsed|92|U|{2}{B}|Kindred Enchantment - Goblin|||When this enchantment enters, you may blight 1. If you do, create two 1/1 black and red Goblin creature tokens.$Whenever a Goblin creature you control dies, each opponent loses 1 life and you gain 1 life.| +Boggart Prankster|Lorwyn Eclipsed|93|C|{1}{B}|Creature - Goblin Warrior|1|3|Whenever you attack, target attacking Goblin you control gets +1/+0 until end of turn.| +Bogslither's Embrace|Lorwyn Eclipsed|94|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, blight 1 or pay {3}.$Exile target creature.| Champion of the Weird|Lorwyn Eclipsed|95|R|{3}{B}|Creature - Goblin Berserker|5|5|As an additional cost to cast this spell, behold a Goblin and exile it.$Pay 1 life, Blight 2: Target opponent blights 2. Activate only as a sorcery.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| +Creakwood Safewright|Lorwyn Eclipsed|96|U|{1}{B}|Creature - Elf Warrior|5|5|This creature enters with three -1/-1 counters on it.$At the beginning of your end step, if there is an Elf card in your graveyard and this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature.| Darkness Descends|Lorwyn Eclipsed|97|U|{2}{B}{B}|Sorcery|||Put two -1/-1 counters on each creature.| Dawnhand Dissident|Lorwyn Eclipsed|98|R|{B}|Creature - Elf Warlock|1|2|{T}, Blight 1: Surveil 1.${T}, Blight 2: Exile target card from a graveyard.$During your turn, you may cast creature spells from among cards you own exiled with this creature by removing three counters from among creatures you control in addition to paying their other costs.| Dawnhand Eulogist|Lorwyn Eclipsed|99|C|{3}{B}|Creature - Elf Warlock|3|3|Menace$When this creature enters, mill three cards. Then if there is an Elf card in your graveyard, each opponent loses 2 life and you gain 2 life.| @@ -60916,10 +60936,12 @@ Moonshadow|Lorwyn Eclipsed|110|M|{B}|Creature - Elemental|7|7|Menace$This creatu Mornsong Aria|Lorwyn Eclipsed|111|R|{1}{B}{B}|Legendary Enchantment|||Players can't draw cards or gain life.$At the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles.| Mudbutton Cursetosser|Lorwyn Eclipsed|112|U|{B}|Creature - Goblin Warlock|2|1|As an additional cost to cast this spell, behold a Goblin or pay {2}.$This creature can't block.$When this creature dies, destroy target creature an opponent controls with power 2 or less.| Nameless Inversion|Lorwyn Eclipsed|113|U|{1}{B}|Kindred Instant - Shapeshifter|||Changeling$Target creature gets +3/-3 and loses all creature types until end of turn.| +Nightmare Sower|Lorwyn Eclipsed|114|U|{3}{B}|Creature - Faerie Assassin|2|3|Flying, lifelink$Whenever you cast a spell during an opponent's turn, put a -1/-1 counter on up to one target creature.| Perfect Intimidation|Lorwyn Eclipsed|115|U|{3}{B}|Sorcery|||Choose one or both --$* Target opponent exiles two cards from their hand.$* Remove all counters from target creature.| Requiting Hex|Lorwyn Eclipsed|116|U|{B}|Instant|||As an additional cost to cast this spell, you may blight 1.$Destroy target creature with mana value 2 or less. If this spell's additional cost was paid, you gain 2 life.| Retched Wretch|Lorwyn Eclipsed|117|U|{2}{B}|Creature - Goblin|4|2|When this creature dies, if it had a -1/-1 counter on it, return it to the battlefield under its owner's control and it loses all abilities.| Scarblade Scout|Lorwyn Eclipsed|118|C|{1}{B}|Creature - Elf Scout|2|2|Lifelink$When this creature enters, mill two cards.| +Scarblade's Malice|Lorwyn Eclipsed|119|C|{B}|Instant|||Target creature you control gains deathtouch and lifelink until end of turn. When that creature dies this turn, create a 2/2 black and green Elf creature token.| Shimmercreep|Lorwyn Eclipsed|120|U|{4}{B}|Creature - Elemental|3|5|Menace$Vivid -- When this creature enters, each opponent loses X life and you gain X life, where X is the number of colors among permanents you control.| Taster of Wares|Lorwyn Eclipsed|121|R|{2}{B}|Creature - Goblin Warlock|3|2|When this creature enters, target opponent reveals X cards from their hand, where X is the number of Goblins you control. You choose one of those cards. That player exiles it. If an instant or sorcery card is exiled this way, you may cast it for as long as you control this creature, and mana of any type can be spent to cast that spell.| Twilight Diviner|Lorwyn Eclipsed|122|R|{2}{B}|Creature - Elf Cleric|3|3|When this creature enters, surveil 2.$Whenever one or more other creatures you control enter, if they entered or were cast from a graveyard, create a token that's a copy of one of them. This ability triggers only once each turn.| @@ -60932,14 +60954,17 @@ Boulder Dash|Lorwyn Eclipsed|127|U|{1}{R}|Sorcery|||Boulder Dash deals 2 damage Brambleback Brute|Lorwyn Eclipsed|128|C|{2}{R}|Creature - Giant Warrior|4|5|This creature enters with two -1/-1 counters on it.${1}{R}, Remove a counter from this creature: Target creature can't block this turn. Activate only as a sorcery.| Burning Curiosity|Lorwyn Eclipsed|129|C|{2}{R}|Sorcery|||As an additional cost to cast this spell, you may blight 1.$Exile the top two cards of your library. If this spell's additional cost was paid, exile the top three cards instead. Until the end of your next turn, you may play those cards.| Champion of the Path|Lorwyn Eclipsed|130|R|{3}{R}|Creature - Elemental Sorcerer|7|3|As an additional cost to cast this spell, behold an Elemental and exile it.$Whenever another Elemental you control enters, it deals damage equal to its power to each opponent.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| +Cinder Strike|Lorwyn Eclipsed|131|C|{R}|Sorcery|||As an additional cost to cast this spell, you may blight 1.$Cinder Strike deals 2 damage to target creature. It deals 4 damage to that creature instead if this spell's additional cost was paid.| Collective Inferno|Lorwyn Eclipsed|132|R|{3}{R}{R}|Enchantment|||Convoke$As this enchantment enters, choose a creature type.$Double all damage that sources you control of the chosen type would deal.| Elder Auntie|Lorwyn Eclipsed|133|C|{2}{R}|Creature - Goblin Warlock|2|2|When this creature enters, create a 1/1 black and red Goblin creature token.| End-Blaze Epiphany|Lorwyn Eclipsed|134|R|{X}{R}|Instant|||End-Blaze Epiphany deals X damage to target creature. When that creature dies this turn, exile a number of cards from the top of your library equal to its power, then choose a card exiled this way. Until the end of your next turn, you may play that card.| Enraged Flamecaster|Lorwyn Eclipsed|135|C|{2}{R}|Creature - Elemental Sorcerer|3|2|Reach$Whenever you cast a spell with mana value 4 or greater, this creature deals 2 damage to each opponent.| Explosive Prodigy|Lorwyn Eclipsed|136|U|{1}{R}|Creature - Elemental Sorcerer|1|1|Vivid -- When this creature enters, it deals X damage to target creature an opponent controls, where X is the number of colors among permanents you control.| +Feed the Flames|Lorwyn Eclipsed|137|C|{3}{R}|Instant|||Feed the Flames deals 5 damage to target creature. If that creature would die this turn, exile it instead.| Flame-Chain Mauler|Lorwyn Eclipsed|138|C|{1}{R}|Creature - Elemental Warrior|2|2|{1}{R}: This creature gets +1/+0 and gains menace until end of turn.| Flamebraider|Lorwyn Eclipsed|139|U|{1}{R}|Creature - Elemental Bard|2|2|{T}: Add two mana in any combination of colors. Spend this mana only to cast Elemental spells or activate abilities of Elemental sources.| Flamekin Gildweaver|Lorwyn Eclipsed|140|C|{3}{R}|Creature - Elemental Sorcerer|4|3|Trample$When this creature enters, create a Treasure token.| +Giantfall|Lorwyn Eclipsed|141|U|{1}{R}|Instant|||Choose one --$* Target creature you control deals damage equal to its power to target creature an opponent controls.$* Destroy target artifact.| Goatnap|Lorwyn Eclipsed|142|U|{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.| Goliath Daydreamer|Lorwyn Eclipsed|143|R|{2}{R}{R}|Creature - Giant Wizard|4|4|Whenever you cast an instant or sorcery spell from your hand, exile that card with a dream counter on it instead of putting it into your graveyard as it resolves.$Whenever this creature attacks, you may cast a spell from among cards you own in exile with dream counters on them without paying its mana cost.| Gristle Glutton|Lorwyn Eclipsed|144|C|{1}{R}|Creature - Goblin Scout|1|3|{T}, Blight 1: Discard a card. If you do, draw a card.| @@ -60950,13 +60975,16 @@ Kulrath Zealot|Lorwyn Eclipsed|148|C|{5}{R}|Creature - Elemental Warrior|6|5|Whe Lasting Tarfire|Lorwyn Eclipsed|149|U|{1}{R}|Enchantment|||At the beginning of each end step, if you put a counter on a creature this turn, this enchantment deals 2 damage to each opponent.| Lavaleaper|Lorwyn Eclipsed|150|R|{3}{R}|Creature - Elemental|4|4|All creatures have haste.$Whenever a player taps a basic land for mana, that player adds one mana of any type that land produced.| Meek Attack|Lorwyn Eclipsed|151|M|{2}{R}|Enchantment|||{1}{R}: You may put a creature card with total power and toughness 5 or less from your hand onto the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice that creature.| +Reckless Ransacking|Lorwyn Eclipsed|152|C|{1}{R}|Instant|||Target creature gets +3/+2 until end of turn. Create a Treasure token.| Scuzzback Scrounger|Lorwyn Eclipsed|153|R|{1}{R}|Creature - Goblin Warrior|3|2|At the beginning of your first main phase, you may blight 1. If you do, create a Treasure token.| Sear|Lorwyn Eclipsed|154|U|{1}{R}|Instant|||Sear deals 4 damage to target creature or planeswalker.| Sizzling Changeling|Lorwyn Eclipsed|155|U|{2}{R}|Creature - Shapeshifter|3|2|Changeling$When this creature dies, exile the top card of your library. Until the end of your next turn, you may play that card.| Soul Immolation|Lorwyn Eclipsed|156|M|{3}{R}{R}|Sorcery|||As an additional cost to cast this spell, blight X. X can't be greater than the greatest toughness among creatures you control.$Soul Immolation deals X damage to each opponent and each creature they control.| +Soulbright Seeker|Lorwyn Eclipsed|157|U|{R}|Creature - Elemental Sorcerer|2|1|As an additional cost to cast this spell, behold an Elemental or pay {2}.${R}: Target creature you control gains trample until end of turn. If this is the third time this ability has resolved this turn, add {R}{R}{R}{R}.| Sourbread Auntie|Lorwyn Eclipsed|158|U|{2}{R}{R}|Creature - Goblin Warrior|4|3|When this creature enters, you may blight 2. If you do, create two 1/1 black and red Goblin creature tokens.| Spinerock Tyrant|Lorwyn Eclipsed|159|M|{3}{R}{R}|Creature - Dragon|6|6|Flying$Wither$Whenever you cast an instant or sorcery spell with a single target, you may copy it. If you do, those spells gain wither. You may choose new targets for the copy.| Squawkroaster|Lorwyn Eclipsed|160|U|{3}{R}|Creature - Elemental|*|4|Double strike$Vivid -- Squawkroaster's power is equal to the number of colors among permanents you control.| +Sting-Slinger|Lorwyn Eclipsed|161|U|{2}{R}|Creature - Goblin Warrior|3|3|{1}{R}, {T}, Blight 1: This creature deals 2 damage to each opponent.| Tweeze|Lorwyn Eclipsed|162|C|{2}{R}|Instant|||Tweeze deals 3 damage to any target. You may discard a card. If you do, draw a card.| Warren Torchmaster|Lorwyn Eclipsed|163|U|{1}{R}|Creature - Goblin Warrior|2|2|At the beginning of combat on your turn, you may blight 1. When you do, target creature gains haste until end of turn.| Assert Perfection|Lorwyn Eclipsed|164|C|{1}{G}|Sorcery|||Target creature you control gets +1/+0 until end of turn. It deals damage equal to its power to up to one target creature an opponent controls.| @@ -60972,16 +61000,21 @@ Crossroads Watcher|Lorwyn Eclipsed|173|C|{2}{G}|Creature - Kithkin Ranger|3|3|Tr Dawn's Light Archer|Lorwyn Eclipsed|174|C|{2}{G}|Creature - Elf Archer|4|2|Flash$Reach| Dundoolin Weaver|Lorwyn Eclipsed|175|U|{1}{G}|Creature - Kithkin Druid|2|1|When this creature enters, if you control three or more creatures, return target permanent card from your graveyard to your hand.| Formidable Speaker|Lorwyn Eclipsed|176|R|{2}{G}|Creature - Elf Druid|2|4|When this creature enters, you may discard a card. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle.${1}, {T}: Untap another target permanent.| +Gilt-Leaf's Embrace|Lorwyn Eclipsed|177|C|{2}{G}|Enchantment - Aura|||Flash$Enchant creature$When this Aura enters, enchanted creature gains trample and indestructible until end of turn.$Enchanted creature gets +2/+0.| Great Forest Druid|Lorwyn Eclipsed|178|C|{1}{G}|Creature - Treefolk Druid|0|4|{T}: Add one mana of any color.| Luminollusk|Lorwyn Eclipsed|179|U|{3}{G}|Creature - Elemental|2|4|Deathtouch$Vivid -- When this creature enters, you gain life equal to the number of colors among permanents you control.| +Lys Alana Dignitary|Lorwyn Eclipsed|180|U|{1}{G}|Creature - Elf Advisor|2|3|As an additional cost to cast this spell, behold an Elf or pay {2}.${T}: Add {G}{G}. Activate only if there is an Elf card in your graveyard.| Lys Alana Informant|Lorwyn Eclipsed|181|C|{1}{G}|Creature - Elf Scout|3|1|When this creature enters or dies, surveil 1.| Midnight Tilling|Lorwyn Eclipsed|182|C|{1}{G}|Instant|||Mill four cards, then you may return a permanent card from among them to your hand.| Mistmeadow Council|Lorwyn Eclipsed|183|C|{4}{G}|Creature - Kithkin Advisor|4|3|This spell costs {1} less to cast if you control a Kithkin.$When this creature enters, draw a card.| +Moon-Vigil Adherents|Lorwyn Eclipsed|184|U|{2}{G}{G}|Creature - Elf Druid|0|0|Trample$This creature gets +1/+1 for each creature you control and each creature card in your graveyard.| Morcant's Eyes|Lorwyn Eclipsed|185|U|{1}{G}|Kindred Enchantment - Elf|||At the beginning of your upkeep, surveil 1.${4}{G}{G}, Sacrifice this enchantment: Create X 2/2 black and green Elf creature tokens, where X is the number of Elf cards in your graveyard. Activate only as a sorcery.| Mutable Explorer|Lorwyn Eclipsed|186|R|{2}{G}|Creature - Shapeshifter|1|1|Changeling$When this creature enters, create a tapped Mutavault token.| Pitiless Fists|Lorwyn Eclipsed|187|U|{3}{G}|Enchantment - Aura|||Enchant creature you control$When this Aura enters, enchanted creature fights up to one target creature an opponent controls.$Enchanted creature gets +2/+2.| Prismabasher|Lorwyn Eclipsed|188|U|{4}{G}{G}|Creature - Elemental|6|6|Trample$Vivid -- When this creature enters, up to X target creatures you control get +X/+X until end of turn, where X is the number of colors among permanents you control.| Prismatic Undercurrents|Lorwyn Eclipsed|189|U|{3}{G}|Enchantment|||Vivid -- When this enchantment enters, search your library for up to X basic land cards, where X is the number of colors among permanents you control. Reveal those cards, put them into your hand, then shuffle.$You may play an additional land on each of your turns.| +Pummeler for Hire|Lorwyn Eclipsed|190|U|{4}{G}|Creature - Giant Mercenary|4|4|Vigilance, reach$Ward {2}$When this creature enters, you gain X life, where X is the greatest power among Giants you control.| +Safewright Cavalry|Lorwyn Eclipsed|191|C|{3}{G}|Creature - Elf Warrior|4|4|This creature can't be blocked by more than one creature.${5}: Target Elf you control gets +2/+2 until end of turn.| Sapling Nursery|Lorwyn Eclipsed|192|R|{6}{G}{G}|Enchantment|||Affinity for Forests$Landfall -- Whenever a land you control enters, create a 3/4 green Treefolk creature token with reach.${1}{G}, Exile this enchantment: Treefolk and Forests you control gain indestructible until end of turn.| Selfless Safewright|Lorwyn Eclipsed|193|R|{3}{G}{G}|Creature - Elf Warrior|4|2|Flash$Convoke$When this creature enters, choose a creature type. Other permanents you control of that type gain hexproof and indestructible until end of turn.| Shimmerwilds Growth|Lorwyn Eclipsed|194|U|{1}{G}|Enchantment - Aura|||Enchant land$As this Aura enters, choose a color.$Enchanted land is the chosen color.$Whenever enchanted land is tapped for mana, its controller adds an additional one mana of the chosen color.| @@ -60994,6 +61027,7 @@ Trystan, Penitent Culler|Lorwyn Eclipsed|199|R||Legendary Creature - Elf Warlock Unforgiving Aim|Lorwyn Eclipsed|200|C|{2}{G}|Instant|||Choose one --$* Destroy target creature with flying.$* Destroy target enchantment.$* Create a 2/2 black and green Elf creature token.| Vinebred Brawler|Lorwyn Eclipsed|201|U|{2}{G}|Creature - Elf Berserker|4|2|This creature must be blocked if able.$Whenever this creature attacks, another target Elf you control gets +2/+1 until end of turn.| Virulent Emissary|Lorwyn Eclipsed|202|U|{G}|Creature - Elf Assassin|1|1|Deathtouch$Whenever another creature you control enters, you gain 1 life.| +Wildvine Pummeler|Lorwyn Eclipsed|203|C|{6}{G}|Creature - Giant Berserker|6|5|Vivid -- This spell costs {1} less to cast for each color among permanents you control.$Reach, trample| Abigale, Eloquent First-Year|Lorwyn Eclipsed|204|R|{W/B}{W/B}|Legendary Creature - Bird Bard|1|1|Flying, first strike, lifelink$When Abigale enters, up to one other target creature loses all abilities. Put a flying counter, a first strike counter, and a lifelink counter on that creature.| Ashling's Command|Lorwyn Eclipsed|205|R|{3}{U}{R}|Kindred Instant - Elemental|||Choose two --$* Create a token that's a copy of target Elemental you control.$* Target player draws two cards.$* Ashling's Command deals 2 damage to each creature target player controls.$* Target player creates two Treasure tokens.| Boggart Cursecrafter|Lorwyn Eclipsed|206|U|{B}{R}|Creature - Goblin Warlock|2|3|Deathtouch$Whenever another Goblin you control dies, this creature deals 1 damage to each opponent.| @@ -61003,6 +61037,7 @@ Catharsis|Lorwyn Eclipsed|209|M|{4}{R/W}{R/W}|Creature - Elemental Incarnation|3 Chaos Spewer|Lorwyn Eclipsed|210|C|{2}{B/R}|Creature - Goblin Warlock|5|4|When this creature enters, you may pay {2}. If you don't, blight 2.| Chitinous Graspling|Lorwyn Eclipsed|211|C|{3}{G/U}|Creature - Shapeshifter|3|4|Changeling$Reach| Deceit|Lorwyn Eclipsed|212|M|{4}{U/B}{U/B}|Creature - Elemental Incarnation|5|5|When this creature enters, if {U}{U} was spent to cast it, return up to one other target nonland permanent to its owner's hand.$When this creature enters, if {B}{B} was spent to cast it, target opponent reveals their hand. You choose a nonland card from it. That player discards that card.$Evoke {U/B}{U/B}| +Deepchannel Duelist|Lorwyn Eclipsed|213|U|{W}{U}|Creature - Merfolk Soldier|2|2|At the beginning of your end step, untap target Merfolk you control.$Other Merfolk you control get +1/+1.| Deepway Navigator|Lorwyn Eclipsed|214|R|{W}{U}|Creature - Merfolk Wizard|2|2|Flash$When this creature enters, untap each other Merfolk you control.$As long as you attacked with three or more Merfolk this turn, Merfolk you control get +1/+0.| Doran, Besieged by Time|Lorwyn Eclipsed|215|R|{1}{W}{B}{G}|Legendary Creature - Treefolk Druid|0|5|Each creature spell you cast with toughness greater than its power costs {1} less to cast.$Whenever a creature you control attacks or blocks, it gets +X/+X until end of turn, where X is the difference between its power and toughness.| Dream Harvest|Lorwyn Eclipsed|216|R|{5}{U/B}{U/B}|Sorcery|||Each opponent exiles cards from the top of their library until they have exiled cards with total mana value 5 or greater this way. Until end of turn, you may cast cards exiled this way without paying their mana costs.| @@ -61012,6 +61047,7 @@ Eclipsed Flamekin|Lorwyn Eclipsed|219|U|{1}{U/R}{U/R}|Creature - Elemental Scout Eclipsed Kithkin|Lorwyn Eclipsed|220|U|{G/W}{G/W}|Creature - Kithkin Scout|2|1|When this creature enters, look at the top four cards of your library. You may reveal a Kithkin, Forest, or Plains card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Eclipsed Merrow|Lorwyn Eclipsed|221|U|{W/U}{W/U}{W/U}|Creature - Merfolk Scout|2|3|When this creature enters, look at the top four cards of your library. You may reveal a Merfolk, Plains, or Island card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Emptiness|Lorwyn Eclipsed|222|M|{4}{W/B}{W/B}|Creature - Elemental Incarnation|3|5|When this creature enters, if {W}{W} was spent to cast it, return target creature card with mana value 3 or less from your graveyard to the battlefield.$When this creature enters, if {B}{B} was spent to cast it, put three -1/-1 counters on up to one target creature.$Evoke {W/B}{W/B}| +Feisty Spikeling|Lorwyn Eclipsed|223|C|{1}{R/W}|Creature - Shapeshifter|2|1|Changeling$During your turn, this creature has first strike.| Figure of Fable|Lorwyn Eclipsed|224|R|{G/W}|Creature - Kithkin|1|1|{G/W}: This creature becomes a Kithkin Scout with base power and toughness 2/3.${1}{G/W}{G/W}: If this creature is a Scout, it becomes a Kithkin Soldier with base power and toughness 4/5.${3}{G/W}{G/W}{G/W}: If this creature is a Soldier, it becomes a Kithkin Avatar with base power and toughness 7/8 and protection from each of your opponents.| Flaring Cinder|Lorwyn Eclipsed|225|C|{1}{U/R}{U/R}|Creature - Elemental Sorcerer|3|2|When this creature enters and whenever you cast a spell with mana value 4 or greater, you may discard a card. If you do, draw a card.| Gangly Stompling|Lorwyn Eclipsed|226|C|{2}{R/G}|Creature - Shapeshifter|4|2|Changeling$Trample| @@ -61023,6 +61059,7 @@ Kirol, Attentive First-Year|Lorwyn Eclipsed|231|R|{1}{R/W}{R/W}|Legendary Creatu Lluwen, Imperfect Naturalist|Lorwyn Eclipsed|232|R|{B/G}{B/G}|Legendary Creature - Elf Druid|1|3|When Lluwen enters, mill four cards, then you may put a creature or land card from among the milled cards on top of your library.${2}{B/G}{B/G}{B/G}, {T}, Discard a land card: Create a 1/1 black and green Worm creature token for each land card in your graveyard.| Maralen, Fae Ascendant|Lorwyn Eclipsed|233|R|{2}{B}{G}{U}|Legendary Creature - Elf Faerie Noble|4|5|Flying$Whenever Maralen or another Elf or Faerie you control enters, exile the top two cards of target opponent's library.$Once each turn, you may cast a spell with mana value less than or equal to the number of Elves and Faeries you control from among cards exiled with Maralen this turn without paying its mana cost.| Merrow Skyswimmer|Lorwyn Eclipsed|234|C|{3}{W/U}{W/U}|Creature - Merfolk Soldier|2|2|Convoke$Flying, vigilance$When this creature enters, create a 1/1 white and blue Merfolk creature token.| +Mischievous Sneakling|Lorwyn Eclipsed|235|C|{1}{U/B}|Creature - Shapeshifter|2|2|Changeling$Flash| Morcant's Loyalist|Lorwyn Eclipsed|236|U|{1}{B}{G}|Creature - Elf Warrior|3|2|Other Elves you control get +1/+1.$When this creature dies, return another target Elf card from your graveyard to your hand.| Noggle Robber|Lorwyn Eclipsed|237|U|{1}{R/G}{R/G}|Creature - Noggle Rogue|3|3|When this creature enters or dies, create a Treasure token.| Prideful Feastling|Lorwyn Eclipsed|238|C|{2}{W/B}|Creature - Shapeshifter|2|3|Changeling$Lifelink| @@ -61030,10 +61067,12 @@ Raiding Schemes|Lorwyn Eclipsed|239|R|{3}{R}{G}|Enchantment|||Each noncreature s Reaping Willow|Lorwyn Eclipsed|240|U|{1}{W/B}{W/B}{W/B}|Creature - Treefolk Cleric|3|6|Lifelink$This creature enters with two -1/-1 counters on it.${1}{W/B}, Remove two counters from this creature: Return target creature card with mana value 3 or less from your graveyard to the battlefield. Activate only as a sorcery.| Sanar, Innovative First-Year|Lorwyn Eclipsed|241|R|{2}{U/R}{U/R}|Legendary Creature - Goblin Sorcerer|2|4|Vivid -- At the beginning of your first main phase, reveal cards from the top of your library until you reveal X nonland cards, where X is the number of colors among permanents you control. For each of those colors, you may exile a card of that color from among the revealed cards. Then shuffle. You may cast the exiled cards this turn.| Shadow Urchin|Lorwyn Eclipsed|242|R|{2}{B/R}|Creature - Ouphe|3|4|Whenever this creature attacks, blight 1.$Whenever a creature you control with one or more counters on it dies, exile that many cards from the top of your library. Until your next end step, you may play those cards.| +Stoic Grove-Guide|Lorwyn Eclipsed|243|C|{4}{B/G}|Creature - Elf Druid|5|4|{1}{b/g}, Exile this card from your graveyard: Create a 2/2 black and green Elf creature token. Activate only as a sorcery.| Sygg's Command|Lorwyn Eclipsed|244|R|{1}{W}{U}|Kindred Sorcery - Merfolk|||Choose two --$* Create a token that's a copy of target Merfolk you control.$* Creatures target player controls gain lifelink until end of turn.$* Target player draws a card.$* Tap target creature. Put a stun counter on it.| Tam, Mindful First-Year|Lorwyn Eclipsed|245|R|{1}{G/U}|Legendary Creature - Gorgon Wizard|2|2|Each other creature you control has hexproof from each of its colors.${T}: Target creature you control becomes all colors until end of turn.| Thoughtweft Lieutenant|Lorwyn Eclipsed|246|U|{G}{W}|Creature - Kithkin Soldier|2|2|Whenever this creature or another Kithkin you control enters, target creature you control gets +1/+1 and gains trample until end of turn.| Trystan's Command|Lorwyn Eclipsed|247|R|{4}{B}{G}|Kindred Sorcery - Elf|||Choose two --$* Create a token that's a copy of target Elf you control.$* Return one or two target permanent cards from your graveyard to your hand.$* Destroy target creature or enchantment.$* Creatures target player controls get +3/+3 until end of turn. Untap them.| +Twinflame Travelers|Lorwyn Eclipsed|248|U|{2}{U}{R}|Creature - Elemental Sorcerer|3|3|Flying$If a triggered ability of another Elemental you control triggers, it triggers an additional time.| Vibrance|Lorwyn Eclipsed|249|M|{3}{R/G}{R/G}|Creature - Elemental Incarnation|4|4|When this creature enters, if {R}{R} was spent to cast it, this creature deals 3 damage to any target.$When this creature enters, if {G}{G} was spent to cast it, search your library for a land card, reveal it, put it into your hand, then shuffle. You gain 2 life.$Evoke {R/G}{R/G}| Voracious Tome-Skimmer|Lorwyn Eclipsed|250|U|{U/B}{U/B}{U/B}|Creature - Faerie Rogue|2|3|Flying$Whenever you cast a spell during an opponent's turn, you may pay 1 life. If you do, draw a card.| Wary Farmer|Lorwyn Eclipsed|251|C|{1}{G/W}{G/W}|Creature - Kithkin Citizen|3|3|At the beginning of your end step, if another creature entered the battlefield under your control this turn, surveil 1.| @@ -61041,10 +61080,12 @@ Wistfulness|Lorwyn Eclipsed|252|M|{3}{G/U}{G/U}|Creature - Elemental Incarnation Chronicle of Victory|Lorwyn Eclipsed|253|M|{6}|Legendary Artifact|||As Chronicle of Victory enters, choose a creature type.$Creatures you control of the chosen type get +2/+2 and have first strike and trample.$Whenever you cast a spell of the chosen type, draw a card.| Dawn-Blessed Pennant|Lorwyn Eclipsed|254|U|{1}|Artifact|||As this artifact enters, choose Elemental, Elf, Faerie, Giant, Goblin, Kithkin, Merfolk, or Treefolk.$Whenever a permanent you control of the chosen type enters, you gain 1 life.${2}, {T}, Sacrifice this artifact: Return target card of the chosen type from your graveyard to your hand.| Firdoch Core|Lorwyn Eclipsed|255|C|{3}|Kindred Artifact - Shapeshifter|||Changeling${T}: Add one mana of any color.${4}: This artifact becomes a 4/4 artifact creature until end of turn.| +Foraging Wickermaw|Lorwyn Eclipsed|256|C|{2}|Artifact Creature - Scarecrow|1|3|When this creature enters, surveil 1.${1}: Add one mana of any color. This creature becomes that color until end of turn. Activate only once each turn.| Gathering Stone|Lorwyn Eclipsed|257|U|{4}|Artifact|||As this artifact enters, choose a creature type.$Spells you cast of the chosen type cost {1} less to cast.$When this artifact enters and at the beginning of your upkeep, look at the top card of your library. If it's a card of the chosen type, you may reveal it and put it into your hand. If you don't put the card into your hand, you may put it into your graveyard.| Mirrormind Crown|Lorwyn Eclipsed|258|R|{4}|Artifact - Equipment|||As long as this Equipment is attached to a creature, the first time you would create one or more tokens each turn, you may instead create that many tokens that are copies of equipped creature.$Equip {2}| Puca's Eye|Lorwyn Eclipsed|259|U|{2}|Artifact|||When this artifact enters, draw a card, then choose a color. This artifact becomes the chosen color.${3}, {T}: Draw a card. Activate only if there are five colors among permanents you control.| Springleaf Drum|Lorwyn Eclipsed|260|U|{1}|Artifact|||{T}, Tap an untapped creature you control: Add one mana of any color.| +Stalactite Dagger|Lorwyn Eclipsed|261|C|{2}|Artifact - Equipment|||When this Equipment enters, create a 1/1 colorless Shapeshifter creature token with changeling.$Equipped creature gets +1/+1 and is all creature types.$Equip {2}| Blood Crypt|Lorwyn Eclipsed|262|R||Land - Swamp Mountain|||({T}: Add {B} or {R}.)$As this land enters, you may pay 2 life. If you don't, it enters tapped.| Eclipsed Realms|Lorwyn Eclipsed|263|U||Land|||As this land enters, choose Elemental, Elf, Faerie, Giant, Goblin, Kithkin, Merfolk, or Treefolk.${T}: Add {C}.${T}: Add one mana of any color. Spend this mana only to cast a spell of the chosen type or activate an ability of a source of the chosen type.| Evolving Wilds|Lorwyn Eclipsed|264|C||Land|||{T}, Sacrifice this land: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| @@ -61123,6 +61164,7 @@ Spry and Mighty|Lorwyn Eclipsed|329|R|{4}{G}|Sorcery|||Choose two creatures you Ashling's Command|Lorwyn Eclipsed|330|R|{3}{U}{R}|Kindred Instant - Elemental|||Choose two --$* Create a token that's a copy of target Elemental you control.$* Target player draws two cards.$* Ashling's Command deals 2 damage to each creature target player controls.$* Target player creates two Treasure tokens.| Boggart Cursecrafter|Lorwyn Eclipsed|331|U|{B}{R}|Creature - Goblin Warlock|2|3|Deathtouch$Whenever another Goblin you control dies, this creature deals 1 damage to each opponent.| Brigid's Command|Lorwyn Eclipsed|332|R|{1}{G}{W}|Kindred Sorcery - Kithkin|||Choose two --$* Create a token that's a copy of target Kithkin you control.$* Target player creates a 1/1 green and white Kithkin creature token.$* Target creature you control gets +3/+3 until end of turn.$* Target creature you control fights target creature an opponent controls.| +Deepchannel Duelist|Lorwyn Eclipsed|333|U|{W}{U}|Creature - Merfolk Soldier|2|2|At the beginning of your end step, untap target Merfolk you control.$Other Merfolk you control get +1/+1.| Doran, Besieged by Time|Lorwyn Eclipsed|334|R|{1}{W}{B}{G}|Legendary Creature - Treefolk Druid|0|5|Each creature spell you cast with toughness greater than its power costs {1} less to cast.$Whenever a creature you control attacks or blocks, it gets +X/+X until end of turn, where X is the difference between its power and toughness.| Eclipsed Boggart|Lorwyn Eclipsed|335|U|{B/R}{B/R}{B/R}|Creature - Goblin Scout|2|3|When this creature enters, look at the top four cards of your library. You may reveal a Goblin, Swamp, or Mountain card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Eclipsed Elf|Lorwyn Eclipsed|336|U|{B/G}{B/G}{B/G}|Creature - Elf Scout|3|2|When this creature enters, look at the top four cards of your library. You may reveal an Elf, Swamp, or Forest card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| @@ -61133,6 +61175,8 @@ Grub's Command|Lorwyn Eclipsed|340|R|{3}{B}{R}|Kindred Sorcery - Goblin|||Choose Morcant's Loyalist|Lorwyn Eclipsed|341|U|{1}{B}{G}|Creature - Elf Warrior|3|2|Other Elves you control get +1/+1.$When this creature dies, return another target Elf card from your graveyard to your hand.| Sygg's Command|Lorwyn Eclipsed|342|R|{1}{W}{U}|Kindred Sorcery - Merfolk|||Choose two --$* Create a token that's a copy of target Merfolk you control.$* Creatures target player controls gain lifelink until end of turn.$* Target player draws a card.$* Tap target creature. Put a stun counter on it.| Thoughtweft Lieutenant|Lorwyn Eclipsed|343|U|{G}{W}|Creature - Kithkin Soldier|2|2|Whenever this creature or another Kithkin you control enters, target creature you control gets +1/+1 and gains trample until end of turn.| +Trystan's Command|Lorwyn Eclipsed|344|R|{4}{B}{G}|Kindred Sorcery - Elf|||Choose two --$* Create a token that's a copy of target Elf you control.$* Return one or two target permanent cards from your graveyard to your hand.$* Destroy target creature or enchantment.$* Creatures target player controls get +3/+3 until end of turn. Untap them.| +Twinflame Travelers|Lorwyn Eclipsed|345|U|{2}{U}{R}|Creature - Elemental Sorcerer|3|3|Flying$If a triggered ability of another Elemental you control triggers, it triggers an additional time.| Chronicle of Victory|Lorwyn Eclipsed|346|M|{6}|Legendary Artifact|||As Chronicle of Victory enters, choose a creature type.$Creatures you control of the chosen type get +2/+2 and have first strike and trample.$Whenever you cast a spell of the chosen type, draw a card.| Hallowed Fountain|Lorwyn Eclipsed|347|R||Land - Plains Island|||({T}: Add {W} or {U}.)$As this land enters, you may pay 2 life. If you don't, it enters tapped.| Hallowed Fountain|Lorwyn Eclipsed|347b|R||Land - Plains Island|||({T}: Add {W} or {U}.)$As this land enters, you may pay 2 life. If you don't, it enters tapped.| @@ -61148,12 +61192,15 @@ Bitterbloom Bearer|Lorwyn Eclipsed|352|M|{B}{B}|Creature - Faerie Rogue|1|1|Flas Champion of the Clachan|Lorwyn Eclipsed|353|R|{3}{W}|Creature - Kithkin Knight|4|5|Flash$As an additional cost to cast this spell, behold a Kithkin and exile it.$Other Kithkin you control get +1/+1.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Rhys, the Evermore|Lorwyn Eclipsed|354|R|{1}{W}|Legendary Creature - Elf Warrior|2|2|Flash$When Rhys enters, another target creature you control gains persist until end of turn.${W}, {T}: Remove any number of counters from target creature you control. Activate only as a sorcery.| Winnowing|Lorwyn Eclipsed|355|R|{4}{W}{W}|Sorcery|||Convoke$For each player, you choose a creature that player controls. Then each player sacrifices all other creatures they control that don't share a creature type with the chosen creature they control.| +Champions of the Shoal|Lorwyn Eclipsed|356|R|{3}{U}|Creature - Merfolk Soldier|4|6|As an additional cost to cast this spell, behold a Merfolk and exile it.$Whenever this creature enters or becomes tapped, tap up to one target creature and put a stun counter on it.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Harmonized Crescendo|Lorwyn Eclipsed|357|R|{4}{U}{U}|Instant|||Convoke$Choose a creature type. Draw a card for each permanent you control of that type.| Rimefire Torque|Lorwyn Eclipsed|358|R|{1}{U}|Artifact|||As this artifact enters, choose a creature type.$Whenever a permanent you control of the chosen type enters, put a charge counter on this artifact.${T}, Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it. You may choose new targets for the copy.| Bloodline Bidding|Lorwyn Eclipsed|359|R|{6}{B}{B}|Sorcery|||Convoke$Choose a creature type. Return all creature cards of the chosen type from your graveyard to the battlefield.| Champion of the Weird|Lorwyn Eclipsed|360|R|{3}{B}|Creature - Goblin Berserker|5|5|As an additional cost to cast this spell, behold a Goblin and exile it.$Pay 1 life, Blight 2: Target opponent blights 2. Activate only as a sorcery.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Mornsong Aria|Lorwyn Eclipsed|361|R|{1}{B}{B}|Legendary Enchantment|||Players can't draw cards or gain life.$At the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles.| +Champion of the Path|Lorwyn Eclipsed|362|R|{3}{R}|Creature - Elemental Sorcerer|7|3|As an additional cost to cast this spell, behold an Elemental and exile it.$Whenever another Elemental you control enters, it deals damage equal to its power to each opponent.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Collective Inferno|Lorwyn Eclipsed|363|R|{3}{R}{R}|Enchantment|||Convoke$As this enchantment enters, choose a creature type.$Double all damage that sources you control of the chosen type would deal.| +End-Blaze Epiphany|Lorwyn Eclipsed|364|R|{X}{R}|Instant|||End-Blaze Epiphany deals X damage to target creature. When that creature dies this turn, exile a number of cards from the top of your library equal to its power, then choose a card exiled this way. Until the end of your next turn, you may play that card.| Champions of the Perfect|Lorwyn Eclipsed|365|R|{3}{G}|Creature - Elf Warrior|6|6|As an additional cost to cast this spell, behold an Elf and exile it.$Whenever you cast a creature spell, draw a card.$When this creature leaves the battlefield, return the exiled card to its owner's hand.| Formidable Speaker|Lorwyn Eclipsed|366|R|{2}{G}|Creature - Elf Druid|2|4|When this creature enters, you may discard a card. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle.${1}, {T}: Untap another target permanent.| Selfless Safewright|Lorwyn Eclipsed|367|R|{3}{G}{G}|Creature - Elf Warrior|4|2|Flash$Convoke$When this creature enters, choose a creature type. Other permanents you control of that type gain hexproof and indestructible until end of turn.| @@ -61166,20 +61213,26 @@ High Perfect Morcant|Lorwyn Eclipsed|373|R|{2}{B}{G}|Legendary Creature - Elf No Kirol, Attentive First-Year|Lorwyn Eclipsed|374|R|{1}{R/W}{R/W}|Legendary Creature - Vampire Cleric|3|3|Tap two untapped creatures you control: Copy target triggered ability you control. You may choose new targets for the copy. Activate only once each turn.| Lluwen, Imperfect Naturalist|Lorwyn Eclipsed|375|R|{B/G}{B/G}|Legendary Creature - Elf Druid|1|3|When Lluwen enters, mill four cards, then you may put a creature or land card from among the milled cards on top of your library.${2}{B/G}{B/G}{B/G}, {T}, Discard a land card: Create a 1/1 black and green Worm creature token for each land card in your graveyard.| Maralen, Fae Ascendant|Lorwyn Eclipsed|376|R|{2}{B}{G}{U}|Legendary Creature - Elf Faerie Noble|4|5|Flying$Whenever Maralen or another Elf or Faerie you control enters, exile the top two cards of target opponent's library.$Once each turn, you may cast a spell with mana value less than or equal to the number of Elves and Faeries you control from among cards exiled with Maralen this turn without paying its mana cost.| +Raiding Schemes|Lorwyn Eclipsed|377|R|{3}{R}{G}|Enchantment|||Each noncreature spell you cast has conspire.| Sanar, Innovative First-Year|Lorwyn Eclipsed|378|R|{2}{U/R}{U/R}|Legendary Creature - Goblin Sorcerer|2|4|Vivid -- At the beginning of your first main phase, reveal cards from the top of your library until you reveal X nonland cards, where X is the number of colors among permanents you control. For each of those colors, you may exile a card of that color from among the revealed cards. Then shuffle. You may cast the exiled cards this turn.| +Shadow Urchin|Lorwyn Eclipsed|379|R|{2}{B/R}|Creature - Ouphe|3|4|Whenever this creature attacks, blight 1.$Whenever a creature you control with one or more counters on it dies, exile that many cards from the top of your library. Until your next end step, you may play those cards.| Tam, Mindful First-Year|Lorwyn Eclipsed|380|R|{1}{G/U}|Legendary Creature - Gorgon Wizard|2|2|Each other creature you control has hexproof from each of its colors.${T}: Target creature you control becomes all colors until end of turn.| Mirrormind Crown|Lorwyn Eclipsed|381|R|{4}|Artifact - Equipment|||As long as this Equipment is attached to a creature, the first time you would create one or more tokens each turn, you may instead create that many tokens that are copies of equipped creature.$Equip {2}| Winnowing|Lorwyn Eclipsed|382|M|{4}{W}{W}|Sorcery|||Convoke$For each player, you choose a creature that player controls. Then each player sacrifices all other creatures they control that don't share a creature type with the chosen creature they control.| +Glen Elendra Guardian|Lorwyn Eclipsed|383|M|{2}{U}|Creature - Faerie Wizard|3|4|Flash$Flying$This creature enters with a -1/-1 counter on it.${1}{U}, Remove a counter from this creature: Counter target noncreature spell. Its controller draws a card.| Harmonized Crescendo|Lorwyn Eclipsed|384|M|{4}{U}{U}|Instant|||Convoke$Choose a creature type. Draw a card for each permanent you control of that type.| Bloodline Bidding|Lorwyn Eclipsed|385|M|{6}{B}{B}|Sorcery|||Convoke$Choose a creature type. Return all creature cards of the chosen type from your graveyard to the battlefield.| +Moonshadow|Lorwyn Eclipsed|386|M|{B}|Creature - Elemental|7|7|Menace$This creature enters with six -1/-1 counters on it.$Whenever one or more permanent cards are put into your graveyard from anywhere while this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature.| Collective Inferno|Lorwyn Eclipsed|387|M|{3}{R}{R}|Enchantment|||Convoke$As this enchantment enters, choose a creature type.$Double all damage that sources you control of the chosen type would deal.| Meek Attack|Lorwyn Eclipsed|388|M|{2}{R}|Enchantment|||{1}{R}: You may put a creature card with total power and toughness 5 or less from your hand onto the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice that creature.| Spinerock Tyrant|Lorwyn Eclipsed|389|M|{3}{R}{R}|Creature - Dragon|6|6|Flying$Wither$Whenever you cast an instant or sorcery spell with a single target, you may copy it. If you do, those spells gain wither. You may choose new targets for the copy.| Bloom Tender|Lorwyn Eclipsed|390|M|{1}{G}|Creature - Elf Druid|1|1|Vivid -- {T}: For each color among permanents you control, add one mana of that color.| Selfless Safewright|Lorwyn Eclipsed|391|M|{3}{G}{G}|Creature - Elf Warrior|4|2|Flash$Convoke$When this creature enters, choose a creature type. Other permanents you control of that type gain hexproof and indestructible until end of turn.| Winnowing|Lorwyn Eclipsed|392|M|{4}{W}{W}|Sorcery|||Convoke$For each player, you choose a creature that player controls. Then each player sacrifices all other creatures they control that don't share a creature type with the chosen creature they control.| +Glen Elendra Guardian|Lorwyn Eclipsed|393|M|{2}{U}|Creature - Faerie Wizard|3|4|Flash$Flying$This creature enters with a -1/-1 counter on it.${1}{U}, Remove a counter from this creature: Counter target noncreature spell. Its controller draws a card.| Harmonized Crescendo|Lorwyn Eclipsed|394|M|{4}{U}{U}|Instant|||Convoke$Choose a creature type. Draw a card for each permanent you control of that type.| Bloodline Bidding|Lorwyn Eclipsed|395|M|{6}{B}{B}|Sorcery|||Convoke$Choose a creature type. Return all creature cards of the chosen type from your graveyard to the battlefield.| +Moonshadow|Lorwyn Eclipsed|396|M|{B}|Creature - Elemental|7|7|Menace$This creature enters with six -1/-1 counters on it.$Whenever one or more permanent cards are put into your graveyard from anywhere while this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature.| Collective Inferno|Lorwyn Eclipsed|397|M|{3}{R}{R}|Enchantment|||Convoke$As this enchantment enters, choose a creature type.$Double all damage that sources you control of the chosen type would deal.| Meek Attack|Lorwyn Eclipsed|398|M|{2}{R}|Enchantment|||{1}{R}: You may put a creature card with total power and toughness 5 or less from your hand onto the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice that creature.| Spinerock Tyrant|Lorwyn Eclipsed|399|M|{3}{R}{R}|Creature - Dragon|6|6|Flying$Wither$Whenever you cast an instant or sorcery spell with a single target, you may copy it. If you do, those spells gain wither. You may choose new targets for the copy.| From c04b961c3255f6285e0a5f0aaa91a20d659dd5e0 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:38:57 -0500 Subject: [PATCH 22/91] [ECL] Implement Deepchannel Duelist --- .../src/mage/cards/d/DeepchannelDuelist.java | 54 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DeepchannelDuelist.java diff --git a/Mage.Sets/src/mage/cards/d/DeepchannelDuelist.java b/Mage.Sets/src/mage/cards/d/DeepchannelDuelist.java new file mode 100644 index 00000000000..1ccee4738cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeepchannelDuelist.java @@ -0,0 +1,54 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DeepchannelDuelist extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.MERFOLK); + + public DeepchannelDuelist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{U}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // At the beginning of your end step, untap target Merfolk you control. + Ability ability = new BeginningOfEndStepTriggeredAbility(new UntapTargetEffect()); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + + // Other Merfolk you control get +1/+1. + this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + 1, 1, Duration.WhileOnBattlefield, filter, true + ))); + } + + private DeepchannelDuelist(final DeepchannelDuelist card) { + super(card); + } + + @Override + public DeepchannelDuelist copy() { + return new DeepchannelDuelist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index c87f8057541..66e3e7d5f24 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -82,6 +82,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Dawnhand Eulogist", 99, Rarity.COMMON, mage.cards.d.DawnhandEulogist.class)); cards.add(new SetCardInfo("Deceit", 212, Rarity.MYTHIC, mage.cards.d.Deceit.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Deceit", 293, Rarity.MYTHIC, mage.cards.d.Deceit.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Deepchannel Duelist", 213, Rarity.UNCOMMON, mage.cards.d.DeepchannelDuelist.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Deepchannel Duelist", 333, Rarity.UNCOMMON, mage.cards.d.DeepchannelDuelist.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Disruptor of Currents", 303, Rarity.RARE, mage.cards.d.DisruptorOfCurrents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Disruptor of Currents", 47, Rarity.RARE, mage.cards.d.DisruptorOfCurrents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Doran, Besieged by Time", 215, Rarity.RARE, mage.cards.d.DoranBesiegedByTime.class, NON_FULL_USE_VARIOUS)); From b921e1e86a773e28f8cf646a5c25f43f48fb3e94 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:40:13 -0500 Subject: [PATCH 23/91] [ECL] Implement Feisty Spikeling --- .../src/mage/cards/f/FeistySpikeling.java | 48 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 49 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FeistySpikeling.java diff --git a/Mage.Sets/src/mage/cards/f/FeistySpikeling.java b/Mage.Sets/src/mage/cards/f/FeistySpikeling.java new file mode 100644 index 00000000000..11b91272bd4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FeistySpikeling.java @@ -0,0 +1,48 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.MyTurnCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.ChangelingAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FeistySpikeling extends CardImpl { + + public FeistySpikeling(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R/W}"); + + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Changeling + this.addAbility(new ChangelingAbility()); + + // During your turn, this creature has first strike. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield), + MyTurnCondition.instance, "during your turn, {this} has first strike" + ))); + } + + private FeistySpikeling(final FeistySpikeling card) { + super(card); + } + + @Override + public FeistySpikeling copy() { + return new FeistySpikeling(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 66e3e7d5f24..46608a89d1b 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -110,6 +110,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Enraged Flamecaster", 135, Rarity.COMMON, mage.cards.e.EnragedFlamecaster.class)); cards.add(new SetCardInfo("Evolving Wilds", 264, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Explosive Prodigy", 136, Rarity.UNCOMMON, mage.cards.e.ExplosiveProdigy.class)); + cards.add(new SetCardInfo("Feisty Spikeling", 223, Rarity.COMMON, mage.cards.f.FeistySpikeling.class)); cards.add(new SetCardInfo("Figure of Fable", 224, Rarity.RARE, mage.cards.f.FigureOfFable.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Figure of Fable", 372, Rarity.RARE, mage.cards.f.FigureOfFable.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Flame-Chain Mauler", 138, Rarity.COMMON, mage.cards.f.FlameChainMauler.class)); From 82c2cb6dc169f8ebc77503b1badb1f0d01905026 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:42:01 -0500 Subject: [PATCH 24/91] [ECL] Implement Safewright Cavalry --- .../src/mage/cards/s/SafewrightCavalry.java | 52 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 53 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SafewrightCavalry.java diff --git a/Mage.Sets/src/mage/cards/s/SafewrightCavalry.java b/Mage.Sets/src/mage/cards/s/SafewrightCavalry.java new file mode 100644 index 00000000000..c6a4625e5bd --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SafewrightCavalry.java @@ -0,0 +1,52 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SafewrightCavalry extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ELF); + + public SafewrightCavalry(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // This creature can't be blocked by more than one creature. + this.addAbility(new SimpleStaticAbility(new CantBeBlockedByMoreThanOneSourceEffect())); + + // {5}: Target Elf you control gets +2/+2 until end of turn. + Ability ability = new SimpleActivatedAbility(new BoostTargetEffect(2, 2), new GenericManaCost(5)); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private SafewrightCavalry(final SafewrightCavalry card) { + super(card); + } + + @Override + public SafewrightCavalry copy() { + return new SafewrightCavalry(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 46608a89d1b..e374582d8ad 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -211,6 +211,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Rhys, the Evermore", 354, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rooftop Percher", 2, Rarity.COMMON, mage.cards.r.RooftopPercher.class)); cards.add(new SetCardInfo("Run Away Together", 67, Rarity.COMMON, mage.cards.r.RunAwayTogether.class)); + cards.add(new SetCardInfo("Safewright Cavalry", 191, Rarity.COMMON, mage.cards.s.SafewrightCavalry.class)); cards.add(new SetCardInfo("Sanar, Innovative First-Year", 241, Rarity.RARE, mage.cards.s.SanarInnovativeFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sanar, Innovative First-Year", 378, Rarity.RARE, mage.cards.s.SanarInnovativeFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sapling Nursery", 192, Rarity.RARE, mage.cards.s.SaplingNursery.class, NON_FULL_USE_VARIOUS)); From 86a8b6adda7a246710bdd375ca2919fd6599f05b Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:43:36 -0500 Subject: [PATCH 25/91] [ECL] Implement Stalactite Dagger --- .../src/mage/cards/s/StalactiteDagger.java | 48 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 49 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/StalactiteDagger.java diff --git a/Mage.Sets/src/mage/cards/s/StalactiteDagger.java b/Mage.Sets/src/mage/cards/s/StalactiteDagger.java new file mode 100644 index 00000000000..ac7cfc4930e --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StalactiteDagger.java @@ -0,0 +1,48 @@ +package mage.cards.s; + +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.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAllCreatureTypesAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.permanent.token.ShapeshifterColorlessToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class StalactiteDagger extends CardImpl { + + public StalactiteDagger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + this.subtype.add(SubType.EQUIPMENT); + + // When this Equipment enters, create a 1/1 colorless Shapeshifter creature token with changeling. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ShapeshifterColorlessToken()))); + + // Equipped creature gets +1/+1 and is all creature types. + Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 1)); + ability.addEffect(new GainAllCreatureTypesAttachedEffect()); + this.addAbility(ability); + + // Equip {2} + this.addAbility(new EquipAbility(2)); + } + + private StalactiteDagger(final StalactiteDagger card) { + super(card); + } + + @Override + public StalactiteDagger copy() { + return new StalactiteDagger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index e374582d8ad..9459185ea7d 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -234,6 +234,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Spell Snare", 71, Rarity.UNCOMMON, mage.cards.s.SpellSnare.class)); cards.add(new SetCardInfo("Springleaf Drum", 260, Rarity.UNCOMMON, mage.cards.s.SpringleafDrum.class)); cards.add(new SetCardInfo("Squawkroaster", 160, Rarity.UNCOMMON, mage.cards.s.Squawkroaster.class)); + cards.add(new SetCardInfo("Stalactite Dagger", 261, Rarity.COMMON, mage.cards.s.StalactiteDagger.class)); cards.add(new SetCardInfo("Steam Vents", "348b", Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 267, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 348, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); From 36ce74e77dffacea324ad8b00d3aaa18e5cd168c Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:45:18 -0500 Subject: [PATCH 26/91] [ECL] Implement Bogslither's Embrace --- .../src/mage/cards/b/BogslithersEmbrace.java | 40 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BogslithersEmbrace.java diff --git a/Mage.Sets/src/mage/cards/b/BogslithersEmbrace.java b/Mage.Sets/src/mage/cards/b/BogslithersEmbrace.java new file mode 100644 index 00000000000..9b14d9d2d33 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BogslithersEmbrace.java @@ -0,0 +1,40 @@ +package mage.cards.b; + +import mage.abilities.costs.OrCost; +import mage.abilities.costs.common.BlightCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BogslithersEmbrace extends CardImpl { + + public BogslithersEmbrace(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + // As an additional cost to cast this spell, blight 1 or pay {3}. + this.getSpellAbility().addCost(new OrCost( + "blight 1 or pay {3}", new BlightCost(1), new GenericManaCost(3) + )); + + // Exile target creature. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private BogslithersEmbrace(final BogslithersEmbrace card) { + super(card); + } + + @Override + public BogslithersEmbrace copy() { + return new BogslithersEmbrace(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 9459185ea7d..ed5b3098358 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -54,6 +54,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Boggart Cursecrafter", 206, Rarity.UNCOMMON, mage.cards.b.BoggartCursecrafter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boggart Cursecrafter", 331, Rarity.UNCOMMON, mage.cards.b.BoggartCursecrafter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boggart Mischief", 92, Rarity.UNCOMMON, mage.cards.b.BoggartMischief.class)); + cards.add(new SetCardInfo("Bogslither's Embrace", 94, Rarity.COMMON, mage.cards.b.BogslithersEmbrace.class)); cards.add(new SetCardInfo("Boldwyr Aggressor", 125, Rarity.UNCOMMON, mage.cards.b.BoldwyrAggressor.class)); cards.add(new SetCardInfo("Boneclub Berserker", 126, Rarity.COMMON, mage.cards.b.BoneclubBerserker.class)); cards.add(new SetCardInfo("Brambleback Brute", 128, Rarity.COMMON, mage.cards.b.BramblebackBrute.class)); From 39022a06a3b08bfed1ff15fbb00b4aad475fcb20 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:46:55 -0500 Subject: [PATCH 27/91] [ECL] Implement Barbed Bloodletter --- .../src/mage/cards/b/BarbedBloodletter.java | 52 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 53 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BarbedBloodletter.java diff --git a/Mage.Sets/src/mage/cards/b/BarbedBloodletter.java b/Mage.Sets/src/mage/cards/b/BarbedBloodletter.java new file mode 100644 index 00000000000..67b03bdd768 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BarbedBloodletter.java @@ -0,0 +1,52 @@ +package mage.cards.b; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAttachToTarget; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.WitherAbility; +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 BarbedBloodletter extends CardImpl { + + public BarbedBloodletter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{B}"); + + this.subtype.add(SubType.EQUIPMENT); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // When this Equipment enters, attach it to target creature you control. That creature gains wither until end of turn. + Ability ability = new EntersBattlefieldAttachToTarget(); + ability.addEffect(new GainAbilityTargetEffect(WitherAbility.getInstance()) + .setText("That creature gains wither until end of turn")); + this.addAbility(ability); + + // Equipped creature gets +1/+2. + this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 2))); + + // Equip {2} + this.addAbility(new EquipAbility(2)); + } + + private BarbedBloodletter(final BarbedBloodletter card) { + super(card); + } + + @Override + public BarbedBloodletter copy() { + return new BarbedBloodletter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index ed5b3098358..9a1e76048c9 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -33,6 +33,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Assert Perfection", 164, Rarity.COMMON, mage.cards.a.AssertPerfection.class)); cards.add(new SetCardInfo("Aurora Awakener", 165, Rarity.MYTHIC, mage.cards.a.AuroraAwakener.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aurora Awakener", 323, Rarity.MYTHIC, mage.cards.a.AuroraAwakener.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Barbed Bloodletter", 86, Rarity.COMMON, mage.cards.b.BarbedBloodletter.class)); cards.add(new SetCardInfo("Bile-Vial Boggart", 87, Rarity.COMMON, mage.cards.b.BileVialBoggart.class)); cards.add(new SetCardInfo("Bitterbloom Bearer", 310, Rarity.MYTHIC, mage.cards.b.BitterbloomBearer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bitterbloom Bearer", 352, Rarity.MYTHIC, mage.cards.b.BitterbloomBearer.class, NON_FULL_USE_VARIOUS)); From 2510b2247d241b31a40093ffecd2af8bf02fec5f Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:48:02 -0500 Subject: [PATCH 28/91] [ECL] Implement Summit Sentinel --- .../src/mage/cards/s/SummitSentinel.java | 38 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 39 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SummitSentinel.java diff --git a/Mage.Sets/src/mage/cards/s/SummitSentinel.java b/Mage.Sets/src/mage/cards/s/SummitSentinel.java new file mode 100644 index 00000000000..e909e5a88a5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SummitSentinel.java @@ -0,0 +1,38 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +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 SummitSentinel extends CardImpl { + + public SummitSentinel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // When this creature dies, draw a card. + this.addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1))); + } + + private SummitSentinel(final SummitSentinel card) { + super(card); + } + + @Override + public SummitSentinel copy() { + return new SummitSentinel(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 9a1e76048c9..08ec4c396cc 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -241,6 +241,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Steam Vents", 267, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 348, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Stratosoarer", 72, Rarity.COMMON, mage.cards.s.Stratosoarer.class)); + cards.add(new SetCardInfo("Summit Sentinel", 73, Rarity.COMMON, mage.cards.s.SummitSentinel.class)); cards.add(new SetCardInfo("Sun-Dappled Celebrant", 37, Rarity.COMMON, mage.cards.s.SunDappledCelebrant.class)); cards.add(new SetCardInfo("Surly Farrier", 196, Rarity.COMMON, mage.cards.s.SurlyFarrier.class)); cards.add(new SetCardInfo("Swamp", 271, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); From ab885be2d5d7b81dc6e2b25588e24827d8b74fa5 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 11:49:26 -0500 Subject: [PATCH 29/91] [ECL] Implement Glamermite --- Mage.Sets/src/mage/cards/g/Glamermite.java | 56 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 57 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/Glamermite.java diff --git a/Mage.Sets/src/mage/cards/g/Glamermite.java b/Mage.Sets/src/mage/cards/g/Glamermite.java new file mode 100644 index 00000000000..384e66c0b8f --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/Glamermite.java @@ -0,0 +1,56 @@ +package mage.cards.g; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.effects.common.UntapTargetEffect; +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 mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Glamermite extends CardImpl { + + public Glamermite(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.FAERIE); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When this creature enters, choose one -- + // * Tap target creature. + Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect()); + ability.addTarget(new TargetCreaturePermanent()); + + // * Untap target creature. + ability.addMode(new Mode(new UntapTargetEffect()).addTarget(new TargetCreaturePermanent())); + this.addAbility(ability); + } + + private Glamermite(final Glamermite card) { + super(card); + } + + @Override + public Glamermite copy() { + return new Glamermite(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 08ec4c396cc..ba1bae71347 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -127,6 +127,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Gallant Fowlknight", 17, Rarity.COMMON, mage.cards.g.GallantFowlknight.class)); cards.add(new SetCardInfo("Gangly Stompling", 226, Rarity.COMMON, mage.cards.g.GanglyStompling.class)); cards.add(new SetCardInfo("Glamer Gifter", 49, Rarity.UNCOMMON, mage.cards.g.GlamerGifter.class)); + cards.add(new SetCardInfo("Glamermite", 50, Rarity.COMMON, mage.cards.g.Glamermite.class)); cards.add(new SetCardInfo("Glister Bairn", 227, Rarity.UNCOMMON, mage.cards.g.GlisterBairn.class)); cards.add(new SetCardInfo("Gnarlbark Elm", 103, Rarity.UNCOMMON, mage.cards.g.GnarlbarkElm.class)); cards.add(new SetCardInfo("Goatnap", 142, Rarity.UNCOMMON, mage.cards.g.Goatnap.class)); From c2ba51af8801f9db09c4f4d15a01d2ffa4ee1d49 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:02:26 -0500 Subject: [PATCH 30/91] refactor Friends Forever ability to be a Partner variant --- .../src/mage/deck/AbstractCommander.java | 1 - .../cards/b/BjornaNightfallAlchemist.java | 5 +-- .../src/mage/cards/c/CecilyHauntedMage.java | 3 +- .../mage/cards/e/ElmarUlvenwaldInformant.java | 4 +- .../cards/h/HargildeKindlyRunechanter.java | 4 +- .../mage/cards/o/OthelmSigardianOutcast.java | 4 +- .../cards/s/SophinaSpearsageDeserter.java | 4 +- .../mage/cards/w/WernogRidersChaplain.java | 8 +--- .../keyword/FriendsForeverAbility.java | 37 ------------------- .../mage/constants/PartnerVariantType.java | 1 + .../validation/FriendsForeverValidator.java | 16 -------- 11 files changed, 14 insertions(+), 73 deletions(-) delete mode 100644 Mage/src/main/java/mage/abilities/keyword/FriendsForeverAbility.java delete mode 100644 Mage/src/main/java/mage/util/validation/FriendsForeverValidator.java diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java index e6b93fb521d..c3bfbae9868 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AbstractCommander.java @@ -28,7 +28,6 @@ public abstract class AbstractCommander extends Constructed { private static List validators = Arrays.asList( PartnerValidator.instance, PartnerVariantValidator.instance, - FriendsForeverValidator.instance, PartnerWithValidator.instance, ChooseABackgroundValidator.instance, DoctorsCompanionValidator.instance diff --git a/Mage.Sets/src/mage/cards/b/BjornaNightfallAlchemist.java b/Mage.Sets/src/mage/cards/b/BjornaNightfallAlchemist.java index a87b4b6189e..f23ba173219 100644 --- a/Mage.Sets/src/mage/cards/b/BjornaNightfallAlchemist.java +++ b/Mage.Sets/src/mage/cards/b/BjornaNightfallAlchemist.java @@ -7,14 +7,13 @@ import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.combat.GoadTargetEffect; -import mage.abilities.keyword.FriendsForeverAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.PartnerVariantType; import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.StaticFilters; -import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -40,7 +39,7 @@ public final class BjornaNightfallAlchemist extends CardImpl { this.addAbility(ability); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private BjornaNightfallAlchemist(final BjornaNightfallAlchemist card) { diff --git a/Mage.Sets/src/mage/cards/c/CecilyHauntedMage.java b/Mage.Sets/src/mage/cards/c/CecilyHauntedMage.java index 66a3de5573d..41ad792a802 100644 --- a/Mage.Sets/src/mage/cards/c/CecilyHauntedMage.java +++ b/Mage.Sets/src/mage/cards/c/CecilyHauntedMage.java @@ -6,7 +6,6 @@ import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect; -import mage.abilities.keyword.FriendsForeverAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -40,7 +39,7 @@ public final class CecilyHauntedMage extends CardImpl { this.addAbility(new AttacksTriggeredAbility(new CecilyHauntedMageEffect())); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private CecilyHauntedMage(final CecilyHauntedMage card) { diff --git a/Mage.Sets/src/mage/cards/e/ElmarUlvenwaldInformant.java b/Mage.Sets/src/mage/cards/e/ElmarUlvenwaldInformant.java index 546ad0b68ca..4f45c6e45e4 100644 --- a/Mage.Sets/src/mage/cards/e/ElmarUlvenwaldInformant.java +++ b/Mage.Sets/src/mage/cards/e/ElmarUlvenwaldInformant.java @@ -5,11 +5,11 @@ import mage.abilities.Ability; import mage.abilities.common.CastSecondSpellTriggeredAbility; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.keyword.InvestigateEffect; -import mage.abilities.keyword.FriendsForeverAbility; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.PartnerVariantType; import mage.constants.SubType; import mage.constants.SuperType; import mage.target.common.TargetCreaturePermanent; @@ -39,7 +39,7 @@ public final class ElmarUlvenwaldInformant extends CardImpl { this.addAbility(ability); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private ElmarUlvenwaldInformant(final ElmarUlvenwaldInformant card) { diff --git a/Mage.Sets/src/mage/cards/h/HargildeKindlyRunechanter.java b/Mage.Sets/src/mage/cards/h/HargildeKindlyRunechanter.java index e82531a4cbf..01adba4edfa 100644 --- a/Mage.Sets/src/mage/cards/h/HargildeKindlyRunechanter.java +++ b/Mage.Sets/src/mage/cards/h/HargildeKindlyRunechanter.java @@ -7,12 +7,12 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.keyword.FriendsForeverAbility; import mage.abilities.mana.ConditionalColorlessManaAbility; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.PartnerVariantType; import mage.constants.SubType; import mage.constants.SuperType; import mage.game.Game; @@ -38,7 +38,7 @@ public final class HargildeKindlyRunechanter extends CardImpl { )); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private HargildeKindlyRunechanter(final HargildeKindlyRunechanter card) { diff --git a/Mage.Sets/src/mage/cards/o/OthelmSigardianOutcast.java b/Mage.Sets/src/mage/cards/o/OthelmSigardianOutcast.java index 1fb77dd636b..f02b6f1cb6f 100644 --- a/Mage.Sets/src/mage/cards/o/OthelmSigardianOutcast.java +++ b/Mage.Sets/src/mage/cards/o/OthelmSigardianOutcast.java @@ -6,10 +6,10 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; -import mage.abilities.keyword.FriendsForeverAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.PartnerVariantType; import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.FilterCard; @@ -54,7 +54,7 @@ public final class OthelmSigardianOutcast extends CardImpl { this.addAbility(ability, new CardsPutIntoGraveyardWatcher()); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private OthelmSigardianOutcast(final OthelmSigardianOutcast card) { diff --git a/Mage.Sets/src/mage/cards/s/SophinaSpearsageDeserter.java b/Mage.Sets/src/mage/cards/s/SophinaSpearsageDeserter.java index f43f0c8f384..308d4dd8459 100644 --- a/Mage.Sets/src/mage/cards/s/SophinaSpearsageDeserter.java +++ b/Mage.Sets/src/mage/cards/s/SophinaSpearsageDeserter.java @@ -5,11 +5,11 @@ import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.keyword.InvestigateEffect; -import mage.abilities.keyword.FriendsForeverAbility; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.PartnerVariantType; import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.FilterPermanent; @@ -48,7 +48,7 @@ public final class SophinaSpearsageDeserter extends CardImpl { .setText("investigate once for each nontoken attacking creature"))); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private SophinaSpearsageDeserter(final SophinaSpearsageDeserter card) { diff --git a/Mage.Sets/src/mage/cards/w/WernogRidersChaplain.java b/Mage.Sets/src/mage/cards/w/WernogRidersChaplain.java index 0ba99ca4dde..1f5738510ac 100644 --- a/Mage.Sets/src/mage/cards/w/WernogRidersChaplain.java +++ b/Mage.Sets/src/mage/cards/w/WernogRidersChaplain.java @@ -6,13 +6,9 @@ import mage.abilities.common.EntersBattlefieldOrLeavesSourceTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.keyword.InvestigateEffect; import mage.abilities.effects.keyword.InvestigateTargetEffect; -import mage.abilities.keyword.FriendsForeverAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.constants.*; import mage.game.Game; import mage.players.Player; import mage.target.targetpointer.FixedTarget; @@ -36,7 +32,7 @@ public final class WernogRidersChaplain extends CardImpl { this.addAbility(new EntersBattlefieldOrLeavesSourceTriggeredAbility(new WernogRidersChaplainEffect(), false)); // Friends forever - this.addAbility(FriendsForeverAbility.getInstance()); + this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility()); } private WernogRidersChaplain(final WernogRidersChaplain card) { diff --git a/Mage/src/main/java/mage/abilities/keyword/FriendsForeverAbility.java b/Mage/src/main/java/mage/abilities/keyword/FriendsForeverAbility.java deleted file mode 100644 index f53cf3d2ec5..00000000000 --- a/Mage/src/main/java/mage/abilities/keyword/FriendsForeverAbility.java +++ /dev/null @@ -1,37 +0,0 @@ -package mage.abilities.keyword; - -import mage.abilities.MageSingleton; -import mage.abilities.StaticAbility; -import mage.constants.Zone; - -import java.io.ObjectStreamException; - -/** - * @author TheElk801 - */ -public class FriendsForeverAbility extends StaticAbility implements MageSingleton { - - private static final FriendsForeverAbility instance = new FriendsForeverAbility(); - - private Object readResolve() throws ObjectStreamException { - return instance; - } - - public static FriendsForeverAbility getInstance() { - return instance; - } - - private FriendsForeverAbility() { - super(Zone.BATTLEFIELD, null); - } - - @Override - public String getRule() { - return "Friends forever (You can have two commanders if both have friends forever.)"; - } - - @Override - public FriendsForeverAbility copy() { - return instance; - } -} diff --git a/Mage/src/main/java/mage/constants/PartnerVariantType.java b/Mage/src/main/java/mage/constants/PartnerVariantType.java index 1c1d960f983..ebe057043d8 100644 --- a/Mage/src/main/java/mage/constants/PartnerVariantType.java +++ b/Mage/src/main/java/mage/constants/PartnerVariantType.java @@ -12,6 +12,7 @@ import java.util.stream.Collectors; */ public enum PartnerVariantType { FATHER_AND_SON("Father & son"), + FRIENDS_FOREVER("Friends forever"), SURVIVORS("Survivors"), CHARACTER_SELECT("Character select"); diff --git a/Mage/src/main/java/mage/util/validation/FriendsForeverValidator.java b/Mage/src/main/java/mage/util/validation/FriendsForeverValidator.java deleted file mode 100644 index 48c8afed8cc..00000000000 --- a/Mage/src/main/java/mage/util/validation/FriendsForeverValidator.java +++ /dev/null @@ -1,16 +0,0 @@ -package mage.util.validation; - -import mage.abilities.keyword.FriendsForeverAbility; -import mage.cards.Card; - -/** - * @author TheElk801 - */ -public enum FriendsForeverValidator implements CommanderValidator { - instance; - - @Override - public boolean checkPartner(Card commander1, Card commander2) { - return commander1.getAbilities().containsClass(FriendsForeverAbility.class); - } -} From b760c01b27d8da23616ea9488bc142f23c862232 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:11:17 -0500 Subject: [PATCH 31/91] update cards which have been given the Sorcerer creature type --- Mage.Sets/src/mage/cards/a/AberrantMindSorcerer.java | 1 + Mage.Sets/src/mage/cards/a/ApprenticeSorcerer.java | 1 + Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java | 1 + Mage.Sets/src/mage/cards/c/CapriciousSorcerer.java | 1 + Mage.Sets/src/mage/cards/d/DakmorSorceress.java | 1 + Mage.Sets/src/mage/cards/e/EtheriumHornSorcerer.java | 1 + Mage.Sets/src/mage/cards/g/GempalmSorcerer.java | 1 + Mage.Sets/src/mage/cards/g/GreensleevesMaroSorcerer.java | 1 + Mage.Sets/src/mage/cards/j/JohannApprenticeSorcerer.java | 1 + Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java | 1 + Mage.Sets/src/mage/cards/k/KrovikanSorcerer.java | 1 + Mage.Sets/src/mage/cards/m/MathiseSurgeChanneler.java | 1 + Mage.Sets/src/mage/cards/m/MolimoMaroSorcerer.java | 1 + Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java | 1 + Mage.Sets/src/mage/cards/p/ProdigalSorcerer.java | 1 + Mage.Sets/src/mage/cards/r/RockslideSorcerer.java | 1 + Mage.Sets/src/mage/cards/s/SerendibSorcerer.java | 1 + Mage.Sets/src/mage/cards/s/SightedCasteSorcerer.java | 1 + Mage.Sets/src/mage/cards/s/SilumgarSorcerer.java | 1 + Mage.Sets/src/mage/cards/s/SorcererOfTheFang.java | 1 + Mage.Sets/src/mage/cards/s/SorceressQueen.java | 1 + Mage.Sets/src/mage/cards/v/VulshokSorcerer.java | 1 + Mage.Sets/src/mage/cards/w/WildMagicSorcerer.java | 1 + 23 files changed, 23 insertions(+) diff --git a/Mage.Sets/src/mage/cards/a/AberrantMindSorcerer.java b/Mage.Sets/src/mage/cards/a/AberrantMindSorcerer.java index 8a430e26b1d..3480cbe93c8 100644 --- a/Mage.Sets/src/mage/cards/a/AberrantMindSorcerer.java +++ b/Mage.Sets/src/mage/cards/a/AberrantMindSorcerer.java @@ -30,6 +30,7 @@ public final class AberrantMindSorcerer extends CardImpl { this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ELF); this.subtype.add(SubType.SHAMAN); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(3); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/a/ApprenticeSorcerer.java b/Mage.Sets/src/mage/cards/a/ApprenticeSorcerer.java index 355e39e2a0c..99f4d27cb8d 100644 --- a/Mage.Sets/src/mage/cards/a/ApprenticeSorcerer.java +++ b/Mage.Sets/src/mage/cards/a/ApprenticeSorcerer.java @@ -23,6 +23,7 @@ public final class ApprenticeSorcerer extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java b/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java index ed760c8e1ce..55be51cf241 100644 --- a/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java +++ b/Mage.Sets/src/mage/cards/b/BloodboilSorcerer.java @@ -28,6 +28,7 @@ public final class BloodboilSorcerer extends CardImpl { this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SHAMAN); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/c/CapriciousSorcerer.java b/Mage.Sets/src/mage/cards/c/CapriciousSorcerer.java index 3577a8dfbad..2e6acdda0b7 100644 --- a/Mage.Sets/src/mage/cards/c/CapriciousSorcerer.java +++ b/Mage.Sets/src/mage/cards/c/CapriciousSorcerer.java @@ -23,6 +23,7 @@ public final class CapriciousSorcerer extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/d/DakmorSorceress.java b/Mage.Sets/src/mage/cards/d/DakmorSorceress.java index 465ce86ffeb..e2c8dc4290a 100644 --- a/Mage.Sets/src/mage/cards/d/DakmorSorceress.java +++ b/Mage.Sets/src/mage/cards/d/DakmorSorceress.java @@ -29,6 +29,7 @@ public final class DakmorSorceress extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(0); this.toughness = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/e/EtheriumHornSorcerer.java b/Mage.Sets/src/mage/cards/e/EtheriumHornSorcerer.java index c0158a3a529..47bc522240a 100644 --- a/Mage.Sets/src/mage/cards/e/EtheriumHornSorcerer.java +++ b/Mage.Sets/src/mage/cards/e/EtheriumHornSorcerer.java @@ -23,6 +23,7 @@ public final class EtheriumHornSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}{U}{R}"); this.subtype.add(SubType.MINOTAUR); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/g/GempalmSorcerer.java b/Mage.Sets/src/mage/cards/g/GempalmSorcerer.java index 005d404f73b..94e743d737f 100644 --- a/Mage.Sets/src/mage/cards/g/GempalmSorcerer.java +++ b/Mage.Sets/src/mage/cards/g/GempalmSorcerer.java @@ -33,6 +33,7 @@ public final class GempalmSorcerer extends CardImpl { this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/g/GreensleevesMaroSorcerer.java b/Mage.Sets/src/mage/cards/g/GreensleevesMaroSorcerer.java index 975c347bca0..ea413d93658 100644 --- a/Mage.Sets/src/mage/cards/g/GreensleevesMaroSorcerer.java +++ b/Mage.Sets/src/mage/cards/g/GreensleevesMaroSorcerer.java @@ -31,6 +31,7 @@ public final class GreensleevesMaroSorcerer extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(0); this.toughness = new MageInt(0); diff --git a/Mage.Sets/src/mage/cards/j/JohannApprenticeSorcerer.java b/Mage.Sets/src/mage/cards/j/JohannApprenticeSorcerer.java index 3a0ed3ac701..18d1157bbce 100644 --- a/Mage.Sets/src/mage/cards/j/JohannApprenticeSorcerer.java +++ b/Mage.Sets/src/mage/cards/j/JohannApprenticeSorcerer.java @@ -30,6 +30,7 @@ public final class JohannApprenticeSorcerer extends CardImpl { this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(2); this.toughness = new MageInt(5); diff --git a/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java b/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java index db6f74afe84..08d66fe0aeb 100644 --- a/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java +++ b/Mage.Sets/src/mage/cards/k/KadenaSlinkingSorcerer.java @@ -45,6 +45,7 @@ public final class KadenaSlinkingSorcerer extends CardImpl { this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.SNAKE); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/k/KrovikanSorcerer.java b/Mage.Sets/src/mage/cards/k/KrovikanSorcerer.java index 7f63e901360..fdc3b2beda2 100644 --- a/Mage.Sets/src/mage/cards/k/KrovikanSorcerer.java +++ b/Mage.Sets/src/mage/cards/k/KrovikanSorcerer.java @@ -37,6 +37,7 @@ public final class KrovikanSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/m/MathiseSurgeChanneler.java b/Mage.Sets/src/mage/cards/m/MathiseSurgeChanneler.java index 8afdaa4a4a4..4a48765be32 100644 --- a/Mage.Sets/src/mage/cards/m/MathiseSurgeChanneler.java +++ b/Mage.Sets/src/mage/cards/m/MathiseSurgeChanneler.java @@ -33,6 +33,7 @@ public final class MathiseSurgeChanneler extends CardImpl { this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.ELF); this.subtype.add(SubType.SHAMAN); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/m/MolimoMaroSorcerer.java b/Mage.Sets/src/mage/cards/m/MolimoMaroSorcerer.java index 3b14f5ab75d..6b7b89d8fac 100644 --- a/Mage.Sets/src/mage/cards/m/MolimoMaroSorcerer.java +++ b/Mage.Sets/src/mage/cards/m/MolimoMaroSorcerer.java @@ -28,6 +28,7 @@ public final class MolimoMaroSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}{G}"); this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(0); this.toughness = new MageInt(0); diff --git a/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java b/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java index 5f622dd3c9d..11be85da95b 100644 --- a/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java +++ b/Mage.Sets/src/mage/cards/m/MultaniMaroSorcerer.java @@ -24,6 +24,7 @@ public final class MultaniMaroSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); this.supertype.add(SuperType.LEGENDARY); this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(0); this.toughness = new MageInt(0); diff --git a/Mage.Sets/src/mage/cards/p/ProdigalSorcerer.java b/Mage.Sets/src/mage/cards/p/ProdigalSorcerer.java index e66cba544c6..2e05bc404f2 100644 --- a/Mage.Sets/src/mage/cards/p/ProdigalSorcerer.java +++ b/Mage.Sets/src/mage/cards/p/ProdigalSorcerer.java @@ -23,6 +23,7 @@ public final class ProdigalSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/r/RockslideSorcerer.java b/Mage.Sets/src/mage/cards/r/RockslideSorcerer.java index 347d1ea4503..8c9f8d226dd 100644 --- a/Mage.Sets/src/mage/cards/r/RockslideSorcerer.java +++ b/Mage.Sets/src/mage/cards/r/RockslideSorcerer.java @@ -23,6 +23,7 @@ public final class RockslideSorcerer extends CardImpl { this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(3); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/s/SerendibSorcerer.java b/Mage.Sets/src/mage/cards/s/SerendibSorcerer.java index e52caae46cd..2626eec055b 100644 --- a/Mage.Sets/src/mage/cards/s/SerendibSorcerer.java +++ b/Mage.Sets/src/mage/cards/s/SerendibSorcerer.java @@ -34,6 +34,7 @@ public final class SerendibSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/s/SightedCasteSorcerer.java b/Mage.Sets/src/mage/cards/s/SightedCasteSorcerer.java index ce5b8e69ca7..1f21a79f85b 100644 --- a/Mage.Sets/src/mage/cards/s/SightedCasteSorcerer.java +++ b/Mage.Sets/src/mage/cards/s/SightedCasteSorcerer.java @@ -26,6 +26,7 @@ public final class SightedCasteSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/s/SilumgarSorcerer.java b/Mage.Sets/src/mage/cards/s/SilumgarSorcerer.java index a64153db5bd..961cd69c61f 100644 --- a/Mage.Sets/src/mage/cards/s/SilumgarSorcerer.java +++ b/Mage.Sets/src/mage/cards/s/SilumgarSorcerer.java @@ -26,6 +26,7 @@ public final class SilumgarSorcerer extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(2); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/s/SorcererOfTheFang.java b/Mage.Sets/src/mage/cards/s/SorcererOfTheFang.java index d1868ec7763..735ad2c3a07 100644 --- a/Mage.Sets/src/mage/cards/s/SorcererOfTheFang.java +++ b/Mage.Sets/src/mage/cards/s/SorcererOfTheFang.java @@ -24,6 +24,7 @@ public final class SorcererOfTheFang extends CardImpl { this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(3); diff --git a/Mage.Sets/src/mage/cards/s/SorceressQueen.java b/Mage.Sets/src/mage/cards/s/SorceressQueen.java index 21dacda5a1e..59a127ba4c3 100644 --- a/Mage.Sets/src/mage/cards/s/SorceressQueen.java +++ b/Mage.Sets/src/mage/cards/s/SorceressQueen.java @@ -34,6 +34,7 @@ public final class SorceressQueen extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}{B}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/v/VulshokSorcerer.java b/Mage.Sets/src/mage/cards/v/VulshokSorcerer.java index ca1905cd861..ff1eae8d1de 100644 --- a/Mage.Sets/src/mage/cards/v/VulshokSorcerer.java +++ b/Mage.Sets/src/mage/cards/v/VulshokSorcerer.java @@ -25,6 +25,7 @@ public final class VulshokSorcerer extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}{R}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SHAMAN); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(1); this.toughness = new MageInt(1); diff --git a/Mage.Sets/src/mage/cards/w/WildMagicSorcerer.java b/Mage.Sets/src/mage/cards/w/WildMagicSorcerer.java index dc97b1e7937..55c0da0eedc 100644 --- a/Mage.Sets/src/mage/cards/w/WildMagicSorcerer.java +++ b/Mage.Sets/src/mage/cards/w/WildMagicSorcerer.java @@ -31,6 +31,7 @@ public final class WildMagicSorcerer extends CardImpl { this.subtype.add(SubType.ORC); this.subtype.add(SubType.SHAMAN); + this.subtype.add(SubType.SORCERER); this.power = new MageInt(4); this.toughness = new MageInt(3); From 194afb73723574b4bc93afdea97eac47be261948 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:17:12 -0500 Subject: [PATCH 32/91] [ECL] Implement Boggart Prankster --- .../src/mage/cards/b/BoggartPrankster.java | 51 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 52 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BoggartPrankster.java diff --git a/Mage.Sets/src/mage/cards/b/BoggartPrankster.java b/Mage.Sets/src/mage/cards/b/BoggartPrankster.java new file mode 100644 index 00000000000..75bb33b6a33 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoggartPrankster.java @@ -0,0 +1,51 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BoggartPrankster extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GOBLIN, "attacking Goblin you control"); + + static { + filter.add(AttackingPredicate.instance); + } + + public BoggartPrankster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Whenever you attack, target attacking Goblin you control gets +1/+0 until end of turn. + Ability ability = new AttacksWithCreaturesTriggeredAbility(new BoostTargetEffect(1, 0), 1); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private BoggartPrankster(final BoggartPrankster card) { + super(card); + } + + @Override + public BoggartPrankster copy() { + return new BoggartPrankster(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index ba1bae71347..ef5e7154696 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -55,6 +55,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Boggart Cursecrafter", 206, Rarity.UNCOMMON, mage.cards.b.BoggartCursecrafter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boggart Cursecrafter", 331, Rarity.UNCOMMON, mage.cards.b.BoggartCursecrafter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boggart Mischief", 92, Rarity.UNCOMMON, mage.cards.b.BoggartMischief.class)); + cards.add(new SetCardInfo("Boggart Prankster", 93, Rarity.COMMON, mage.cards.b.BoggartPrankster.class)); cards.add(new SetCardInfo("Bogslither's Embrace", 94, Rarity.COMMON, mage.cards.b.BogslithersEmbrace.class)); cards.add(new SetCardInfo("Boldwyr Aggressor", 125, Rarity.UNCOMMON, mage.cards.b.BoldwyrAggressor.class)); cards.add(new SetCardInfo("Boneclub Berserker", 126, Rarity.COMMON, mage.cards.b.BoneclubBerserker.class)); From 2c1084d310c63b247409ff8f80a4526b52c172a6 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:17:53 -0500 Subject: [PATCH 33/91] [ECL] Implement Boulder Dash --- Mage.Sets/src/mage/cards/b/BoulderDash.java | 46 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BoulderDash.java diff --git a/Mage.Sets/src/mage/cards/b/BoulderDash.java b/Mage.Sets/src/mage/cards/b/BoulderDash.java new file mode 100644 index 00000000000..ae290e9de35 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoulderDash.java @@ -0,0 +1,46 @@ +package mage.cards.b; + +import mage.abilities.effects.common.DamageTargetAndTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterAnyTarget; +import mage.filter.common.FilterPermanentOrPlayer; +import mage.filter.predicate.other.AnotherTargetPredicate; +import mage.target.common.TargetAnyTarget; +import mage.target.common.TargetPermanentOrPlayer; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BoulderDash extends CardImpl { + + private static final FilterPermanentOrPlayer filter2 = new FilterAnyTarget("another target"); + + static { + filter2.getPermanentFilter().add(new AnotherTargetPredicate(2)); + filter2.getPlayerFilter().add(new AnotherTargetPredicate(2)); + } + + public BoulderDash(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}"); + + // Boulder Dash deals 2 damage to any target and 1 damage to any other target. + this.getSpellAbility().addEffect(new DamageTargetAndTargetEffect(2, 1)); + this.getSpellAbility().addTarget(new TargetAnyTarget() + .withChooseHint("to deal 2 damage").setTargetTag(1)); + this.getSpellAbility().addTarget(new TargetPermanentOrPlayer(filter2) + .withChooseHint("to deal 1 damage").setTargetTag(2)); + } + + private BoulderDash(final BoulderDash card) { + super(card); + } + + @Override + public BoulderDash copy() { + return new BoulderDash(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index ef5e7154696..1b77802ebad 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -59,6 +59,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Bogslither's Embrace", 94, Rarity.COMMON, mage.cards.b.BogslithersEmbrace.class)); cards.add(new SetCardInfo("Boldwyr Aggressor", 125, Rarity.UNCOMMON, mage.cards.b.BoldwyrAggressor.class)); cards.add(new SetCardInfo("Boneclub Berserker", 126, Rarity.COMMON, mage.cards.b.BoneclubBerserker.class)); + cards.add(new SetCardInfo("Boulder Dash", 127, Rarity.UNCOMMON, mage.cards.b.BoulderDash.class)); cards.add(new SetCardInfo("Brambleback Brute", 128, Rarity.COMMON, mage.cards.b.BramblebackBrute.class)); cards.add(new SetCardInfo("Brigid's Command", 208, Rarity.RARE, mage.cards.b.BrigidsCommand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Brigid's Command", 332, Rarity.RARE, mage.cards.b.BrigidsCommand.class, NON_FULL_USE_VARIOUS)); From 6c64ccd50579ed4eb62137f390bfc592f3cd2b0e Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:22:55 -0500 Subject: [PATCH 34/91] [ECL] Implement Champion of the Path --- .../src/mage/cards/c/ChampionOfThePath.java | 97 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + .../main/java/mage/constants/BeholdType.java | 1 + 3 files changed, 100 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChampionOfThePath.java diff --git a/Mage.Sets/src/mage/cards/c/ChampionOfThePath.java b/Mage.Sets/src/mage/cards/c/ChampionOfThePath.java new file mode 100644 index 00000000000..543a9bc1b76 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChampionOfThePath.java @@ -0,0 +1,97 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.LeavesBattlefieldTriggeredAbility; +import mage.abilities.costs.common.BeholdAndExileCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnExiledCardToHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.BeholdType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ChampionOfThePath extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.ELEMENTAL, "another Elemental you control"); + + static { + filter.add(AnotherPredicate.instance); + } + + public ChampionOfThePath(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); + this.power = new MageInt(7); + this.toughness = new MageInt(3); + + // As an additional cost to cast this spell, behold an Elemental and exile it. + this.getSpellAbility().addCost(new BeholdAndExileCost(BeholdType.ELEMENTAL)); + + // Whenever another Elemental you control enters, it deals damage equal to its power to each opponent. + this.addAbility(new EntersBattlefieldAllTriggeredAbility(new ChampionOfThePathEffect(), filter)); + + // When this creature leaves the battlefield, return the exiled card to its owner's hand. + this.addAbility(new LeavesBattlefieldTriggeredAbility(new ReturnExiledCardToHandEffect())); + } + + private ChampionOfThePath(final ChampionOfThePath card) { + super(card); + } + + @Override + public ChampionOfThePath copy() { + return new ChampionOfThePath(this); + } +} + +class ChampionOfThePathEffect extends OneShotEffect { + + ChampionOfThePathEffect() { + super(Outcome.Benefit); + staticText = "it deals damage equal to its power to each opponent"; + } + + private ChampionOfThePathEffect(final ChampionOfThePathEffect effect) { + super(effect); + } + + @Override + public ChampionOfThePathEffect copy() { + return new ChampionOfThePathEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) getValue("permanentEnteringBattlefield"); + if (permanent == null) { + return false; + } + int power = permanent.getPower().getValue(); + if (power < 1) { + return false; + } + for (UUID opponentId : game.getOpponents(source.getControllerId())) { + Optional.of(opponentId) + .map(game::getPlayer) + .ifPresent(player -> player.damage(power, permanent.getId(), source, game)); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 1b77802ebad..3a2718f5b50 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -71,6 +71,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Catharsis", 292, Rarity.MYTHIC, mage.cards.c.Catharsis.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Clachan", 353, Rarity.RARE, mage.cards.c.ChampionOfTheClachan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Clachan", 9, Rarity.RARE, mage.cards.c.ChampionOfTheClachan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Champion of the Path", 130, Rarity.RARE, mage.cards.c.ChampionOfThePath.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Champion of the Path", 362, Rarity.RARE, mage.cards.c.ChampionOfThePath.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Weird", 360, Rarity.RARE, mage.cards.c.ChampionOfTheWeird.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champion of the Weird", 95, Rarity.RARE, mage.cards.c.ChampionOfTheWeird.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champions of the Perfect", 171, Rarity.RARE, mage.cards.c.ChampionsOfThePerfect.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/constants/BeholdType.java b/Mage/src/main/java/mage/constants/BeholdType.java index 3e365aea31b..82b57822cec 100644 --- a/Mage/src/main/java/mage/constants/BeholdType.java +++ b/Mage/src/main/java/mage/constants/BeholdType.java @@ -22,6 +22,7 @@ import java.util.UUID; public enum BeholdType { DRAGON(SubType.DRAGON), GOBLIN(SubType.GOBLIN), + ELEMENTAL(SubType.ELEMENTAL), ELF(SubType.ELF), KITHKIN(SubType.KITHKIN), MERFOLK(SubType.MERFOLK); From 664a15a72731ec3cb5d969e924b4ef7286fe994d Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:25:24 -0500 Subject: [PATCH 35/91] [ECL] Implement Changeling Wayfinder --- .../src/mage/cards/c/ChangelingWayfinder.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChangelingWayfinder.java diff --git a/Mage.Sets/src/mage/cards/c/ChangelingWayfinder.java b/Mage.Sets/src/mage/cards/c/ChangelingWayfinder.java new file mode 100644 index 00000000000..b6259b243db --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChangelingWayfinder.java @@ -0,0 +1,45 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.ChangelingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ChangelingWayfinder extends CardImpl { + + public ChangelingWayfinder(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}"); + + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Changeling + this.addAbility(new ChangelingAbility()); + + // When this creature enters, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryPutInHandEffect( + new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true + ), true)); + } + + private ChangelingWayfinder(final ChangelingWayfinder card) { + super(card); + } + + @Override + public ChangelingWayfinder copy() { + return new ChangelingWayfinder(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 3a2718f5b50..56de8449cfc 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -77,6 +77,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Champion of the Weird", 95, Rarity.RARE, mage.cards.c.ChampionOfTheWeird.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champions of the Perfect", 171, Rarity.RARE, mage.cards.c.ChampionsOfThePerfect.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Champions of the Perfect", 365, Rarity.RARE, mage.cards.c.ChampionsOfThePerfect.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Changeling Wayfinder", 1, Rarity.COMMON, mage.cards.c.ChangelingWayfinder.class)); cards.add(new SetCardInfo("Chaos Spewer", 210, Rarity.COMMON, mage.cards.c.ChaosSpewer.class)); cards.add(new SetCardInfo("Chitinous Graspling", 211, Rarity.COMMON, mage.cards.c.ChitinousGraspling.class)); cards.add(new SetCardInfo("Chomping Changeling", 172, Rarity.UNCOMMON, mage.cards.c.ChompingChangeling.class)); From 09f2cceff2c1291e5a40a06807d8611cfa7cf399 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:29:23 -0500 Subject: [PATCH 36/91] [ECL] Implement Cinder Strike --- Mage.Sets/src/mage/cards/c/CinderStrike.java | 40 ++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CinderStrike.java diff --git a/Mage.Sets/src/mage/cards/c/CinderStrike.java b/Mage.Sets/src/mage/cards/c/CinderStrike.java new file mode 100644 index 00000000000..e554396ced1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CinderStrike.java @@ -0,0 +1,40 @@ +package mage.cards.c; + +import mage.abilities.condition.common.BlightedCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.BlightAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CinderStrike extends CardImpl { + + public CinderStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{R}"); + + // As an additional cost to cast this spell, you may blight 1. + this.addAbility(new BlightAbility(1)); + + // Cinder Strike deals 2 damage to target creature. It deals 4 damage to that creature instead if this spell's additional cost was paid. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new DamageTargetEffect(4), new DamageTargetEffect(2), + BlightedCondition.instance, "{this} deals 2 damage to target creature. " + + "It deals 4 damage to that creature instead if this spell's additional cost was paid" + )); + } + + private CinderStrike(final CinderStrike card) { + super(card); + } + + @Override + public CinderStrike copy() { + return new CinderStrike(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 56de8449cfc..786807f8169 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -81,6 +81,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Chaos Spewer", 210, Rarity.COMMON, mage.cards.c.ChaosSpewer.class)); cards.add(new SetCardInfo("Chitinous Graspling", 211, Rarity.COMMON, mage.cards.c.ChitinousGraspling.class)); cards.add(new SetCardInfo("Chomping Changeling", 172, Rarity.UNCOMMON, mage.cards.c.ChompingChangeling.class)); + cards.add(new SetCardInfo("Cinder Strike", 131, Rarity.COMMON, mage.cards.c.CinderStrike.class)); cards.add(new SetCardInfo("Clachan Festival", 10, Rarity.UNCOMMON, mage.cards.c.ClachanFestival.class)); cards.add(new SetCardInfo("Crib Swap", 11, Rarity.UNCOMMON, mage.cards.c.CribSwap.class)); cards.add(new SetCardInfo("Crossroads Watcher", 173, Rarity.COMMON, mage.cards.c.CrossroadsWatcher.class)); From e78806de0816ba564011d874f32baf955e2f5940 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:30:44 -0500 Subject: [PATCH 37/91] [ECL] Implement Feed the Flames --- Mage.Sets/src/mage/cards/f/FeedTheFlames.java | 34 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 35 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FeedTheFlames.java diff --git a/Mage.Sets/src/mage/cards/f/FeedTheFlames.java b/Mage.Sets/src/mage/cards/f/FeedTheFlames.java new file mode 100644 index 00000000000..490f12f43ce --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FeedTheFlames.java @@ -0,0 +1,34 @@ +package mage.cards.f; + +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ExileTargetIfDiesEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FeedTheFlames extends CardImpl { + + public FeedTheFlames(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{R}"); + + // Feed the Flames deals 5 damage to target creature. If that creature would die this turn, exile it instead. + this.getSpellAbility().addEffect(new DamageTargetEffect(5)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new ExileTargetIfDiesEffect()); + } + + private FeedTheFlames(final FeedTheFlames card) { + super(card); + } + + @Override + public FeedTheFlames copy() { + return new FeedTheFlames(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 786807f8169..7c5f2618af4 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -118,6 +118,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Enraged Flamecaster", 135, Rarity.COMMON, mage.cards.e.EnragedFlamecaster.class)); cards.add(new SetCardInfo("Evolving Wilds", 264, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Explosive Prodigy", 136, Rarity.UNCOMMON, mage.cards.e.ExplosiveProdigy.class)); + cards.add(new SetCardInfo("Feed the Flames", 137, Rarity.COMMON, mage.cards.f.FeedTheFlames.class)); cards.add(new SetCardInfo("Feisty Spikeling", 223, Rarity.COMMON, mage.cards.f.FeistySpikeling.class)); cards.add(new SetCardInfo("Figure of Fable", 224, Rarity.RARE, mage.cards.f.FigureOfFable.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Figure of Fable", 372, Rarity.RARE, mage.cards.f.FigureOfFable.class, NON_FULL_USE_VARIOUS)); From 6fa6ecc567dc68bfe161f8f387d03bf91a06ea05 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:32:09 -0500 Subject: [PATCH 38/91] [ECL] Implement Giantfall --- Mage.Sets/src/mage/cards/g/Giantfall.java | 41 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/Giantfall.java diff --git a/Mage.Sets/src/mage/cards/g/Giantfall.java b/Mage.Sets/src/mage/cards/g/Giantfall.java new file mode 100644 index 00000000000..43ca8eb53c6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/Giantfall.java @@ -0,0 +1,41 @@ +package mage.cards.g; + +import mage.abilities.Mode; +import mage.abilities.effects.common.DamageWithPowerFromOneToAnotherTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetArtifactPermanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class Giantfall extends CardImpl { + + public Giantfall(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Choose one -- + // * Target creature you control deals damage equal to its power to target creature an opponent controls. + this.getSpellAbility().addEffect(new DamageWithPowerFromOneToAnotherTargetEffect()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent()); + + // * Destroy target artifact. + this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetArtifactPermanent())); + } + + private Giantfall(final Giantfall card) { + super(card); + } + + @Override + public Giantfall copy() { + return new Giantfall(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 7c5f2618af4..30bd036df5b 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -133,6 +133,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Formidable Speaker", 366, Rarity.RARE, mage.cards.f.FormidableSpeaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gallant Fowlknight", 17, Rarity.COMMON, mage.cards.g.GallantFowlknight.class)); cards.add(new SetCardInfo("Gangly Stompling", 226, Rarity.COMMON, mage.cards.g.GanglyStompling.class)); + cards.add(new SetCardInfo("Giantfall", 141, Rarity.UNCOMMON, mage.cards.g.Giantfall.class)); cards.add(new SetCardInfo("Glamer Gifter", 49, Rarity.UNCOMMON, mage.cards.g.GlamerGifter.class)); cards.add(new SetCardInfo("Glamermite", 50, Rarity.COMMON, mage.cards.g.Glamermite.class)); cards.add(new SetCardInfo("Glister Bairn", 227, Rarity.UNCOMMON, mage.cards.g.GlisterBairn.class)); From 062de4b210b322f3e25cf91afa2f98b61d8c778f Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 12:34:03 -0500 Subject: [PATCH 39/91] [ECL] Implement Keep Out --- Mage.Sets/src/mage/cards/k/KeepOut.java | 48 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 49 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KeepOut.java diff --git a/Mage.Sets/src/mage/cards/k/KeepOut.java b/Mage.Sets/src/mage/cards/k/KeepOut.java new file mode 100644 index 00000000000..f0d58e0d449 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KeepOut.java @@ -0,0 +1,48 @@ +package mage.cards.k; + +import mage.abilities.Mode; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetEnchantmentPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class KeepOut extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("tapped creature"); + + static { + filter.add(TappedPredicate.TAPPED); + } + + public KeepOut(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Choose one -- + // * Keep Out deals 4 damage to target tapped creature. + this.getSpellAbility().addEffect(new DamageTargetEffect(4)); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + + // * Destroy target enchantment. + this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetEnchantmentPermanent())); + } + + private KeepOut(final KeepOut card) { + super(card); + } + + @Override + public KeepOut copy() { + return new KeepOut(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 30bd036df5b..db2f6a055c0 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -167,6 +167,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Island", 270, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island", 275, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Island", 280, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_BFZ_VARIOUS)); + cards.add(new SetCardInfo("Keep Out", 19, Rarity.COMMON, mage.cards.k.KeepOut.class)); cards.add(new SetCardInfo("Kinsbaile Aspirant", 21, Rarity.UNCOMMON, mage.cards.k.KinsbaileAspirant.class)); cards.add(new SetCardInfo("Kinscaer Sentry", 22, Rarity.RARE, mage.cards.k.KinscaerSentry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kinscaer Sentry", 300, Rarity.RARE, mage.cards.k.KinscaerSentry.class, NON_FULL_USE_VARIOUS)); From 23c6b42ee0ae70d06a5d92610ee5847085bed164 Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 14:55:30 -0600 Subject: [PATCH 40/91] [ECC/ECL] Implement Mass of Mysteries, Springleaf Parade, Wickersmith's Tools. Add supporting tokens (#14173) * [ECC] Add Mass of Mysteries * [ECC] Add Springleaf Parade * Add in Tokens from Lorwyn Eclipsed Commander * [ECC] Implement Wickersmith's Tools * Clean up Scarecrow Token --- .../sources/ScryfallImageSupportTokens.java | 15 ++++ .../src/mage/cards/m/MassOfMysteries.java | 68 ++++++++++++++ .../src/mage/cards/s/SpringleafParade.java | 47 ++++++++++ .../src/mage/cards/w/WickersmithsTools.java | 89 +++++++++++++++++++ .../mage/sets/LorwynEclipsedCommander.java | 4 + .../cards/repository/TokenRepository.java | 3 + .../game/permanent/token/ScarecrowToken.java | 28 ++++++ Mage/src/main/resources/tokens-database.txt | 16 ++++ 8 files changed, 270 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MassOfMysteries.java create mode 100644 Mage.Sets/src/mage/cards/s/SpringleafParade.java create mode 100644 Mage.Sets/src/mage/cards/w/WickersmithsTools.java create mode 100644 Mage/src/main/java/mage/game/permanent/token/ScarecrowToken.java diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java index 0362852cb5b..1c312491ec0 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSupportTokens.java @@ -2857,6 +2857,21 @@ public class ScryfallImageSupportTokens { put("TLE/Marit Lage", "https://api.scryfall.com/cards/ttle/1/?format=image"); put("TLE/Soldier", "https://api.scryfall.com/cards/ttle/2?format=image"); + // ECL + put("ECL/Shapeshifter", "https://api.scryfall.com/cards/tecl/1/?format=image"); + + // ECC + put("ECC/Elemental/1", "https://api.scryfall.com/cards/tecc/2?format=image"); + put("ECC/Elemental/2", "https://api.scryfall.com/cards/tecc/9?format=image"); + put("ECC/Elemental/3", "https://api.scryfall.com/cards/tecc/10?format=image"); + put("ECC/Elf Warrior", "https://api.scryfall.com/cards/tecc/4?format=image"); + put("ECC/Plant", "https://api.scryfall.com/cards/tecc/5?format=image"); + put("ECC/Rhino Warrior", "https://api.scryfall.com/cards/tecc/6?format=image"); + put("ECC/Saproling", "https://api.scryfall.com/cards/tecc/7?format=image"); + put("ECC/Scarecrow", "https://api.scryfall.com/cards/tecc/11?format=image"); + put("ECC/Snake", "https://api.scryfall.com/cards/tecc/8?format=image"); + put("ECC/Zombie", "https://api.scryfall.com/cards/tecc/3?format=image"); + // TMT put("TMT/Mutagen", "https://api.scryfall.com/cards/ttmt/9?format=image"); diff --git a/Mage.Sets/src/mage/cards/m/MassOfMysteries.java b/Mage.Sets/src/mage/cards/m/MassOfMysteries.java new file mode 100644 index 00000000000..b7d262a583e --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MassOfMysteries.java @@ -0,0 +1,68 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.target.TargetPermanent; +import mage.abilities.Ability; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.MyriadAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class MassOfMysteries extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledPermanent(SubType.ELEMENTAL, "another target Elemental you control"); + + static { + filter.add(AnotherPredicate.instance); + } + + public MassOfMysteries(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{U}{B}{R}{G}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ELEMENTAL); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // At the beginning of combat on your turn, another target Elemental you control gains Myriad until end of turn. + Ability ability = new BeginningOfCombatTriggeredAbility( + new GainAbilityTargetEffect(new MyriadAbility()) + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + private MassOfMysteries(final MassOfMysteries card) { + super(card); + } + + @Override + public MassOfMysteries copy() { + return new MassOfMysteries(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SpringleafParade.java b/Mage.Sets/src/mage/cards/s/SpringleafParade.java new file mode 100644 index 00000000000..35969b23d78 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpringleafParade.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import java.util.UUID; + +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; +import mage.game.permanent.token.ShapeshifterColorlessToken; + +/** + * + * @author muz + */ +public final class SpringleafParade extends CardImpl { + + public SpringleafParade(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{X}{G}{G}"); + + // When this enchantment enters, create X 1/1 colorless Shapeshifter creature tokens with changeling. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ShapeshifterColorlessToken(), GetXValue.instance) + .setText("create X 1/1 colorless Shapeshifter creature tokens with changeling.") + )); + + // Creature tokens you control have "{T}: Add one mana of any color." + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + new AnyColorManaAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURE_TOKENS) + )); + + } + + private SpringleafParade(final SpringleafParade card) { + super(card); + } + + @Override + public SpringleafParade copy() { + return new SpringleafParade(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WickersmithsTools.java b/Mage.Sets/src/mage/cards/w/WickersmithsTools.java new file mode 100644 index 00000000000..9d59ca6dd24 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WickersmithsTools.java @@ -0,0 +1,89 @@ +package mage.cards.w; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CountersSourceCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.ScarecrowToken; + +/** + * + * @author muz + */ +public final class WickersmithsTools extends CardImpl { + + public WickersmithsTools(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); + + // Whenever one or more -1/-1 counters are put on a creature, put a charge counter on this artifact. + this.addAbility(new WickersmithsToolsTriggeredAbility()); + + // {T}: Add one mana of any color. + this.addAbility(new AnyColorManaAbility()); + + // {5}, {T}, Sacrifice this artifact: Create X tapped 2/2 colorless Scarecrow artifact creature tokens, where X is the number of charge counters on this artifact. + Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new ScarecrowToken(), new CountersSourceCount(CounterType.CHARGE)), new ManaCostsImpl<>("{5}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability); + } + + private WickersmithsTools(final WickersmithsTools card) { + super(card); + } + + @Override + public WickersmithsTools copy() { + return new WickersmithsTools(this); + } +} + +class WickersmithsToolsTriggeredAbility extends TriggeredAbilityImpl { + + WickersmithsToolsTriggeredAbility() { + super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance())); + setTriggerPhrase("Whenever one or more -1/-1 counters are put on a creature, "); + } + + private WickersmithsToolsTriggeredAbility(final WickersmithsToolsTriggeredAbility ability) { + super(ability); + } + + @Override + public WickersmithsToolsTriggeredAbility copy() { + return new WickersmithsToolsTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COUNTERS_ADDED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanentOrLKIBattlefield(event.getTargetId()); + if (permanent == null + || !permanent.isCreature(game) + || !event.getData().equals(CounterType.M1M1.getName()) + || event.getAmount() < 1) { + return false; + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java index e405f373946..4ebab98a92a 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java @@ -105,6 +105,7 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Lamentation", 30, Rarity.RARE, mage.cards.l.Lamentation.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Liliana, Death Wielder", 78, Rarity.MYTHIC, mage.cards.l.LilianaDeathWielder.class)); cards.add(new SetCardInfo("Maelstrom Wanderer", 127, Rarity.RARE, mage.cards.m.MaelstromWanderer.class)); + cards.add(new SetCardInfo("Mass of Mysteries", 3, Rarity.MYTHIC, mage.cards.m.MassOfMysteries.class)); cards.add(new SetCardInfo("Massacre Girl, Known Killer", 79, Rarity.MYTHIC, mage.cards.m.MassacreGirlKnownKiller.class)); cards.add(new SetCardInfo("Midnight Banshee", 80, Rarity.RARE, mage.cards.m.MidnightBanshee.class)); cards.add(new SetCardInfo("Muldrotha, the Gravetide", 128, Rarity.MYTHIC, mage.cards.m.MuldrothaTheGravetide.class)); @@ -154,6 +155,7 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Sol Ring", 57, Rarity.UNCOMMON, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sol Ring", 58, Rarity.UNCOMMON, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Soul Snuffers", 87, Rarity.UNCOMMON, mage.cards.s.SoulSnuffers.class)); + cards.add(new SetCardInfo("Springleaf Parade", 19, Rarity.RARE, mage.cards.s.SpringleafParade.class)); cards.add(new SetCardInfo("Terminate", 134, Rarity.COMMON, mage.cards.t.Terminate.class)); cards.add(new SetCardInfo("Terramorphic Expanse", 169, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class)); cards.add(new SetCardInfo("The Reaper, King No More", 4, Rarity.MYTHIC, mage.cards.t.TheReaperKingNoMore.class)); @@ -173,6 +175,8 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Village Pillagers", 34, Rarity.RARE, mage.cards.v.VillagePillagers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Vraska, Betrayal's Sting", 88, Rarity.MYTHIC, mage.cards.v.VraskaBetrayalsSting.class)); cards.add(new SetCardInfo("Wickerbough Elder", 118, Rarity.COMMON, mage.cards.w.WickerboughElder.class)); + cards.add(new SetCardInfo("Wickersmith's Tools", 21, Rarity.RARE, mage.cards.w.WickersmithsTools.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wickersmith's Tools", 41, Rarity.RARE, mage.cards.w.WickersmithsTools.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Woodland Cemetery", 176, Rarity.RARE, mage.cards.w.WoodlandCemetery.class)); cards.add(new SetCardInfo("Yarok, the Desecrated", 136, Rarity.MYTHIC, mage.cards.y.YarokTheDesecrated.class)); } diff --git a/Mage/src/main/java/mage/cards/repository/TokenRepository.java b/Mage/src/main/java/mage/cards/repository/TokenRepository.java index b2ddaef9cf1..370575eed3a 100644 --- a/Mage/src/main/java/mage/cards/repository/TokenRepository.java +++ b/Mage/src/main/java/mage/cards/repository/TokenRepository.java @@ -274,6 +274,8 @@ public enum TokenRepository { res.add(createXmageToken(XMAGE_IMAGE_NAME_COPY, 14, "https://api.scryfall.com/cards/tspm/1/en?format=image")); res.add(createXmageToken(XMAGE_IMAGE_NAME_COPY, 15, "https://api.scryfall.com/cards/ttla/1/en?format=image")); res.add(createXmageToken(XMAGE_IMAGE_NAME_COPY, 16, "https://api.scryfall.com/cards/ttla/2/en?format=image")); + res.add(createXmageToken(XMAGE_IMAGE_NAME_COPY, 17, "https://api.scryfall.com/cards/tecc/1/en?format=image")); + // City's Blessing // https://scryfall.com/search?q=type%3Atoken+include%3Aextras+unique%3Aprints+City%27s+Blessing+&unique=cards&as=grid&order=name @@ -320,6 +322,7 @@ public enum TokenRepository { res.add(createXmageToken(XMAGE_IMAGE_NAME_THE_MONARCH, 2, "https://api.scryfall.com/cards/tcn2/1/en?format=image")); res.add(createXmageToken(XMAGE_IMAGE_NAME_THE_MONARCH, 3, "https://api.scryfall.com/cards/tltc/15/en?format=image")); res.add(createXmageToken(XMAGE_IMAGE_NAME_THE_MONARCH, 4, "https://api.scryfall.com/cards/tfic/11/en?format=image")); + res.add(createXmageToken(XMAGE_IMAGE_NAME_THE_MONARCH, 5, "https://api.scryfall.com/cards/tecc/12/en?format=image")); // Radiation (for trigger) res.add(createXmageToken(XMAGE_IMAGE_NAME_RADIATION, 1, "https://api.scryfall.com/cards/tpip/22/en?format=image")); diff --git a/Mage/src/main/java/mage/game/permanent/token/ScarecrowToken.java b/Mage/src/main/java/mage/game/permanent/token/ScarecrowToken.java new file mode 100644 index 00000000000..f0692f2ffc1 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/ScarecrowToken.java @@ -0,0 +1,28 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author muz + */ +public final class ScarecrowToken extends TokenImpl { + + public ScarecrowToken() { + super("Scarecrow Token", "2/2 colorless Scarecrow artifact creature token"); + cardType.add(CardType.ARTIFACT); + cardType.add(CardType.CREATURE); + this.subtype.add(SubType.SCARECROW); + power = new MageInt(2); + toughness = new MageInt(2); + } + + private ScarecrowToken(final ScarecrowToken token) { + super(token); + } + + public ScarecrowToken copy() { + return new ScarecrowToken(this); + } +} diff --git a/Mage/src/main/resources/tokens-database.txt b/Mage/src/main/resources/tokens-database.txt index 7e352684134..35b4ba6e72c 100644 --- a/Mage/src/main/resources/tokens-database.txt +++ b/Mage/src/main/resources/tokens-database.txt @@ -2911,7 +2911,23 @@ |Generate|TOK:TLE|Soldier|||SoldierRedToken| # ECL +|Generate|TOK:ECL|Shapeshifter|||ShapeshifterColorlessToken| |Generate|TOK:ECL|Goblin|||BlackAndRedGoblinToken| +|Generate|TOK:ECL|Treasure|||TreasureToken| + +# ECC + +# ECC +|Generate|TOK:ECC|Elemental|1||WhiteElementalToken| +|Generate|TOK:ECC|Elemental|2||OmnathElementalToken| +|Generate|TOK:ECC|Elemental|3||VoiceOfResurgenceToken| +|Generate|TOK:ECC|Elf Warrior|||ElfWarriorToken| +|Generate|TOK:ECC|Plant|||PlantToken| +|Generate|TOK:ECC|Rhino Warrior|||RhinoWarriorToken| +|Generate|TOK:ECC|Saproling|||SaprolingToken| +|Generate|TOK:ECC|Scarecrow|||ScarecrowToken| +|Generate|TOK:ECC|Snake|||DeathtouchSnakeToken| +|Generate|TOK:ECC|Zombie|||ZombieToken| #TMT |Generate|TOK:TMT|Mutagen|||MutagenToken| From 32d1cf3e4324e28fe91fe63f4d58628493092630 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 16:23:34 -0500 Subject: [PATCH 41/91] fix verify failures --- Mage.Sets/src/mage/cards/c/ChaosSpewer.java | 2 +- Mage.Sets/src/mage/cards/g/GanglyStompling.java | 2 +- Mage.Sets/src/mage/cards/h/HovelHurler.java | 5 ++++- .../src/mage/cards/p/PridefulFeastling.java | 2 +- Mage.Sets/src/mage/cards/s/Sear.java | 4 ++-- .../src/mage/cards/t/ThoughtweftLieutenant.java | 17 ++++++++++------- .../java/mage/verify/VerifyCardDataTest.java | 1 + .../effects/keyword/BlightTargetEffect.java | 1 - 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChaosSpewer.java b/Mage.Sets/src/mage/cards/c/ChaosSpewer.java index 8629a211d1d..2cd9e23cc1a 100644 --- a/Mage.Sets/src/mage/cards/c/ChaosSpewer.java +++ b/Mage.Sets/src/mage/cards/c/ChaosSpewer.java @@ -18,7 +18,7 @@ import java.util.UUID; public final class ChaosSpewer extends CardImpl { public ChaosSpewer(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B/R}"); this.subtype.add(SubType.GOBLIN); this.subtype.add(SubType.WARLOCK); diff --git a/Mage.Sets/src/mage/cards/g/GanglyStompling.java b/Mage.Sets/src/mage/cards/g/GanglyStompling.java index 23dadd11a29..0006d4b686f 100644 --- a/Mage.Sets/src/mage/cards/g/GanglyStompling.java +++ b/Mage.Sets/src/mage/cards/g/GanglyStompling.java @@ -16,7 +16,7 @@ import java.util.UUID; public final class GanglyStompling extends CardImpl { public GanglyStompling(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R/G}"); this.subtype.add(SubType.SHAPESHIFTER); this.power = new MageInt(4); diff --git a/Mage.Sets/src/mage/cards/h/HovelHurler.java b/Mage.Sets/src/mage/cards/h/HovelHurler.java index fae4b978de3..316a1d3ed22 100644 --- a/Mage.Sets/src/mage/cards/h/HovelHurler.java +++ b/Mage.Sets/src/mage/cards/h/HovelHurler.java @@ -15,6 +15,8 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; import java.util.UUID; @@ -24,7 +26,7 @@ import java.util.UUID; public final class HovelHurler extends CardImpl { public HovelHurler(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R/W}{R/W}"); this.subtype.add(SubType.GIANT); this.subtype.add(SubType.WARRIOR); @@ -46,6 +48,7 @@ public final class HovelHurler extends CardImpl { ability.addCost(new RemoveCountersSourceCost(1)); ability.addEffect(new GainAbilityTargetEffect(FlyingAbility.getInstance()) .setText("and gains flying until end of turn")); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE_YOU_CONTROL)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/p/PridefulFeastling.java b/Mage.Sets/src/mage/cards/p/PridefulFeastling.java index cd7158ac697..2027510f598 100644 --- a/Mage.Sets/src/mage/cards/p/PridefulFeastling.java +++ b/Mage.Sets/src/mage/cards/p/PridefulFeastling.java @@ -16,7 +16,7 @@ import java.util.UUID; public final class PridefulFeastling extends CardImpl { public PridefulFeastling(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W/B}"); this.subtype.add(SubType.SHAPESHIFTER); this.power = new MageInt(2); diff --git a/Mage.Sets/src/mage/cards/s/Sear.java b/Mage.Sets/src/mage/cards/s/Sear.java index 7a9d26e2435..cea9b5d77aa 100644 --- a/Mage.Sets/src/mage/cards/s/Sear.java +++ b/Mage.Sets/src/mage/cards/s/Sear.java @@ -14,9 +14,9 @@ import java.util.UUID; public final class Sear extends CardImpl { public Sear(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); - // Excavation Explosion deals 4 damage to target creature or planeswalker. + // Sear deals 4 damage to target creature or planeswalker. this.getSpellAbility().addEffect(new DamageTargetEffect(4)); this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker()); } diff --git a/Mage.Sets/src/mage/cards/t/ThoughtweftLieutenant.java b/Mage.Sets/src/mage/cards/t/ThoughtweftLieutenant.java index 5a7bc618c5d..b8b58ed0fa2 100644 --- a/Mage.Sets/src/mage/cards/t/ThoughtweftLieutenant.java +++ b/Mage.Sets/src/mage/cards/t/ThoughtweftLieutenant.java @@ -1,21 +1,21 @@ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.TrampleAbility; -import mage.constants.SubType; -import mage.filter.FilterPermanent; -import mage.target.common.TargetControlledCreaturePermanent; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.UUID; /** - * * @author muz */ public final class ThoughtweftLieutenant extends CardImpl { @@ -32,11 +32,14 @@ public final class ThoughtweftLieutenant extends CardImpl { // Whenever this creature or another Kithkin you control enters, target creature you control gets +1+1 and gains trample until end of turn. Ability ability = new EntersBattlefieldThisOrAnotherTriggeredAbility( - new BoostTargetEffect(1, 1).setText("target creature you control gets +1/+1"), filter, false, true + new BoostTargetEffect(1, 1) + .setText("target creature you control gets +1/+1"), + filter, false, true ); ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance()) - .setText("and gains trample until end of turn")); + .setText("and gains trample until end of turn")); ability.addTarget(new TargetControlledCreaturePermanent()); + this.addAbility(ability); } private ThoughtweftLieutenant(final ThoughtweftLieutenant card) { diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 8db8b3fd823..99b4ed8c4ce 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -176,6 +176,7 @@ public class VerifyCardDataTest { skipListAddName(SKIP_LIST_SUBTYPE, "UGL", "Miss Demeanor"); // uses multiple types as a joke card: Lady, of, Proper, Etiquette skipListAddName(SKIP_LIST_SUBTYPE, "UGL", "Elvish Impersonators"); // subtype is "Elves" pun skipListAddName(SKIP_LIST_SUBTYPE, "UND", "Elvish Impersonators"); + subtypesToIgnore.add("Sorcerer"); // temporary // number // skipListAddName(SKIP_LIST_NUMBER, set, cardName); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/BlightTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/BlightTargetEffect.java index ad8a6e8f364..e16d3927c11 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/BlightTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/BlightTargetEffect.java @@ -17,7 +17,6 @@ public class BlightTargetEffect extends OneShotEffect { public BlightTargetEffect(int amount) { super(Outcome.Detriment); this.amount = amount; - staticText = "blight " + amount; } private BlightTargetEffect(final BlightTargetEffect effect) { From 7bf97179c84f85f213082283523d56ae8721382a Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 15:52:52 -0600 Subject: [PATCH 42/91] [ECL] Implement Mistmeadow Council (#14198) * [ECL] Implement Mistmeadow Council * Clean up cost reduction implementation across a few cards to be consistent --- .../src/mage/cards/a/AcademyJourneymage.java | 16 ++--- Mage.Sets/src/mage/cards/d/DraconicLore.java | 2 +- .../src/mage/cards/m/MistmeadowCouncil.java | 58 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 4 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/m/MistmeadowCouncil.java diff --git a/Mage.Sets/src/mage/cards/a/AcademyJourneymage.java b/Mage.Sets/src/mage/cards/a/AcademyJourneymage.java index dd12271e5c0..1177e5c7336 100644 --- a/Mage.Sets/src/mage/cards/a/AcademyJourneymage.java +++ b/Mage.Sets/src/mage/cards/a/AcademyJourneymage.java @@ -9,16 +9,14 @@ import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; -import mage.filter.StaticFilters; import mage.filter.common.FilterControlledPermanent; import mage.target.TargetPermanent; -import mage.target.common.TargetCreaturePermanent; - import java.util.UUID; import static mage.filter.StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE; @@ -28,11 +26,10 @@ import static mage.filter.StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE; */ public final class AcademyJourneymage extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control a Wizard"); - - static { - filter.add(SubType.WIZARD.getPredicate()); - } + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledPermanent(SubType.WIZARD, "you control a Wizard") + ); + private static final Hint hint = new ConditionHint(condition, "You control a Wizard"); public AcademyJourneymage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); @@ -42,10 +39,9 @@ public final class AcademyJourneymage extends CardImpl { this.toughness = new MageInt(2); // This spell costs {1} less to cast if you control a Wizard. - Condition condition = new PermanentsOnTheBattlefieldCondition(filter); Ability ability = new SimpleStaticAbility(Zone.ALL, new SpellCostReductionSourceEffect(1, condition)); ability.setRuleAtTheTop(true); - ability.addHint(new ConditionHint(condition, "You control a Wizard")); + ability.addHint(hint); this.addAbility(ability); // When Academy Journeymage enters the battlefield, return target creature an opponent controls to its owner's hand. diff --git a/Mage.Sets/src/mage/cards/d/DraconicLore.java b/Mage.Sets/src/mage/cards/d/DraconicLore.java index c0044bb82b7..483df9618e1 100644 --- a/Mage.Sets/src/mage/cards/d/DraconicLore.java +++ b/Mage.Sets/src/mage/cards/d/DraconicLore.java @@ -23,7 +23,7 @@ import java.util.UUID; public final class DraconicLore extends CardImpl { private static final Condition condition = new PermanentsOnTheBattlefieldCondition( - new FilterControlledPermanent(SubType.DRAGON, "you control a Dragon") + new FilterControlledPermanent(SubType.DRAGON, "you control a Dragon") ); private static final Hint hint = new ConditionHint(condition, "You control a Dragon"); diff --git a/Mage.Sets/src/mage/cards/m/MistmeadowCouncil.java b/Mage.Sets/src/mage/cards/m/MistmeadowCouncil.java new file mode 100644 index 00000000000..bc360233d83 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MistmeadowCouncil.java @@ -0,0 +1,58 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class MistmeadowCouncil extends CardImpl { + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledPermanent(SubType.KITHKIN, "you control a Kithkin") + ); + private static final Hint hint = new ConditionHint(condition, "You control a Kithkin"); + + public MistmeadowCouncil(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.ADVISOR); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // This spell costs {1} less to cast if you control a Kithkin. + Ability ability = new SimpleStaticAbility(Zone.ALL, new SpellCostReductionSourceEffect(1, condition)); + ability.setRuleAtTheTop(true); + ability.addHint(hint); + this.addAbility(ability); + + // When this creature enters, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + } + + private MistmeadowCouncil(final MistmeadowCouncil card) { + super(card); + } + + @Override + public MistmeadowCouncil copy() { + return new MistmeadowCouncil(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index db2f6a055c0..bd2d330172b 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -193,6 +193,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Midnight Tilling", 182, Rarity.COMMON, mage.cards.m.MidnightTilling.class)); cards.add(new SetCardInfo("Mirrorform", 308, Rarity.MYTHIC, mage.cards.m.Mirrorform.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mirrorform", 59, Rarity.MYTHIC, mage.cards.m.Mirrorform.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mistmeadow Council", 183, Rarity.COMMON, mage.cards.m.MistmeadowCouncil.class)); cards.add(new SetCardInfo("Moonglove Extractor", 109, Rarity.COMMON, mage.cards.m.MoongloveExtractor.class)); cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Morningtide's Light", 301, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); From 8dd432ac3ed26a679a1fc82ff8fab483dcb1bc46 Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 15:53:29 -0600 Subject: [PATCH 43/91] [ECL] Implement Auntie's Sentence (#14199) --- .../src/mage/cards/a/AuntiesSentence.java | 51 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 52 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AuntiesSentence.java diff --git a/Mage.Sets/src/mage/cards/a/AuntiesSentence.java b/Mage.Sets/src/mage/cards/a/AuntiesSentence.java new file mode 100644 index 00000000000..975d8bef220 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AuntiesSentence.java @@ -0,0 +1,51 @@ +package mage.cards.a; + +import java.util.UUID; + +import mage.abilities.Mode; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.Predicates; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponent; + +/** + * + * @author muz + */ +public final class AuntiesSentence extends CardImpl { + + private static final FilterCard filter = new FilterPermanentCard("a nonland permanent card"); + + static { + filter.add(Predicates.not(CardType.LAND.getPredicate())); + } + + public AuntiesSentence(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + // Choose one -- + // * Target opponent reveals their hand. You choose a nonland permanent card from it. That player discards that card. + this.getSpellAbility().addTarget(new TargetOpponent()); + this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter)); + + // * Target creature gets -2/-2 until end of turn. + Mode mode = new Mode(new BoostTargetEffect(-2, -2)); + mode.addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + } + + private AuntiesSentence(final AuntiesSentence card) { + super(card); + } + + @Override + public AuntiesSentence copy() { + return new AuntiesSentence(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index bd2d330172b..8d5ab6ad16d 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -31,6 +31,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Ashling, Rekindled", 124, Rarity.RARE, mage.cards.a.AshlingRekindled.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ashling, Rekindled", 290, Rarity.RARE, mage.cards.a.AshlingRekindled.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Assert Perfection", 164, Rarity.COMMON, mage.cards.a.AssertPerfection.class)); + cards.add(new SetCardInfo("Auntie's Sentence", 85, Rarity.COMMON, mage.cards.a.AuntiesSentence.class)); cards.add(new SetCardInfo("Aurora Awakener", 165, Rarity.MYTHIC, mage.cards.a.AuroraAwakener.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aurora Awakener", 323, Rarity.MYTHIC, mage.cards.a.AuroraAwakener.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Barbed Bloodletter", 86, Rarity.COMMON, mage.cards.b.BarbedBloodletter.class)); From 9df087ba98e05c66641614499f7c62b958d23d0d Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 16:03:59 -0600 Subject: [PATCH 44/91] [ECL] Implement Flaring Cinder (#14201) * [ECL] Implement Flaring Cinder * Refactor to single OrTriggered ability with static filter --- Mage.Sets/src/mage/cards/f/FlaringCinder.java | 51 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 52 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FlaringCinder.java diff --git a/Mage.Sets/src/mage/cards/f/FlaringCinder.java b/Mage.Sets/src/mage/cards/f/FlaringCinder.java new file mode 100644 index 00000000000..79f0a54c085 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlaringCinder.java @@ -0,0 +1,51 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.meta.OrTriggeredAbility; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class FlaringCinder extends CardImpl { + + public FlaringCinder(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U/R}{U/R}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When this creature enters and whenever you cast a spell with mana value 4 or greater, you may discard a card. If you do, draw a card. + this.addAbility(new OrTriggeredAbility( + Zone.BATTLEFIELD, + new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new DiscardCardCost()), + false, + "When this creature enters and whenever you cast a spell with mana value 4 or greater, ", + new EntersBattlefieldTriggeredAbility(null), + new SpellCastControllerTriggeredAbility(null, StaticFilters.FILTER_SPELL_MV_4_OR_GREATER, true) + )); + } + + private FlaringCinder(final FlaringCinder card) { + super(card); + } + + @Override + public FlaringCinder copy() { + return new FlaringCinder(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 8d5ab6ad16d..c7e343ee1e9 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -126,6 +126,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Flame-Chain Mauler", 138, Rarity.COMMON, mage.cards.f.FlameChainMauler.class)); cards.add(new SetCardInfo("Flamebraider", 139, Rarity.UNCOMMON, mage.cards.f.Flamebraider.class)); cards.add(new SetCardInfo("Flamekin Gildweaver", 140, Rarity.COMMON, mage.cards.f.FlamekinGildweaver.class)); + cards.add(new SetCardInfo("Flaring Cinder", 225, Rarity.COMMON, mage.cards.f.FlaringCinder.class)); cards.add(new SetCardInfo("Flock Impostor", 16, Rarity.UNCOMMON, mage.cards.f.FlockImpostor.class)); cards.add(new SetCardInfo("Forest", 273, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 278, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); From 1c13dfc3befd0da2d6c34c904ce5f2a1376fa795 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Fri, 9 Jan 2026 17:04:35 -0500 Subject: [PATCH 45/91] implement Lava Burst (#14077) Co-authored-by: Steven Knipe --- Mage.Sets/src/mage/cards/l/LavaBurst.java | 86 +++++++++++++++++++ Mage.Sets/src/mage/sets/IceAge.java | 1 + Mage.Sets/src/mage/sets/MastersEditionII.java | 1 + .../redirect/HarmsWayRedirectDamageTest.java | 33 +++++++ .../abilities/effects/ContinuousEffects.java | 4 + 5 files changed, 125 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LavaBurst.java diff --git a/Mage.Sets/src/mage/cards/l/LavaBurst.java b/Mage.Sets/src/mage/cards/l/LavaBurst.java new file mode 100644 index 00000000000..6ec677ba3d8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LavaBurst.java @@ -0,0 +1,86 @@ +package mage.cards.l; + +import mage.abilities.Ability; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.RedirectionEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetAnyTarget; +import mage.util.CardUtil; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * + * @author notgreat + */ +public final class LavaBurst extends CardImpl { + + public LavaBurst(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{R}"); + + + // Lava Burst deals X damage to any target. If Lava Burst would deal damage to a creature, that damage can't be prevented or dealt instead to another creature or player. + this.getSpellAbility().addEffect(new LavaBurstEffect()); + this.getSpellAbility().addTarget(new TargetAnyTarget()); + + } + + private LavaBurst(final LavaBurst card) { + super(card); + } + + @Override + public LavaBurst copy() { + return new LavaBurst(this); + } +} + +class LavaBurstEffect extends OneShotEffect { + + LavaBurstEffect() { + super(Outcome.Damage); + staticText = "{this} deals X damage to any target. If {this} would deal damage to a creature, that damage can't be prevented or dealt instead to another permanent or player."; + } + + private LavaBurstEffect(final LavaBurstEffect effect) { + super(effect); + } + + @Override + public LavaBurstEffect copy() { + return new LavaBurstEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + int damage = CardUtil.getSourceCostsTag(game, source, "X", 0); + if (targetPlayer != null) { + targetPlayer.damage(damage, source.getSourceId(), source, game, false, true); + return true; + } + Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + if (targetPermanent != null) { + if (targetPermanent.isCreature(game)) { + // hack to avoid needing to create a DAMAGE_REDIRECTION event + // Pretend that all possible redirection effects have already been applied + List redirectionEffects = game.getState().getContinuousEffects().getReplacementEffects().stream() + .filter(x -> x instanceof RedirectionEffect).map(Effect::getId).collect(Collectors.toList()); + targetPermanent.damage(damage, source.getSourceId(), source, game, false, false, redirectionEffects); + } else { + targetPermanent.damage(damage, source.getSourceId(), source, game, false, true); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java index c7772fdb108..7e1e245aa16 100644 --- a/Mage.Sets/src/mage/sets/IceAge.java +++ b/Mage.Sets/src/mage/sets/IceAge.java @@ -219,6 +219,7 @@ public final class IceAge extends ExpansionSet { cards.add(new SetCardInfo("Krovikan Vampire", 141, Rarity.UNCOMMON, mage.cards.k.KrovikanVampire.class, RETRO_ART)); cards.add(new SetCardInfo("Land Cap", 357, Rarity.RARE, mage.cards.l.LandCap.class, RETRO_ART)); cards.add(new SetCardInfo("Lapis Lazuli Talisman", 327, Rarity.UNCOMMON, mage.cards.l.LapisLazuliTalisman.class, RETRO_ART)); + cards.add(new SetCardInfo("Lava Burst", 198, Rarity.COMMON, mage.cards.l.LavaBurst.class, RETRO_ART)); cards.add(new SetCardInfo("Lava Tubes", 358, Rarity.RARE, mage.cards.l.LavaTubes.class, RETRO_ART)); cards.add(new SetCardInfo("Legions of Lim-Dul", 142, Rarity.COMMON, mage.cards.l.LegionsOfLimDul.class, RETRO_ART)); cards.add(new SetCardInfo("Leshrac's Rite", 143, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class, RETRO_ART)); diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java index 7666dcbd557..6703daa2423 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionII.java @@ -154,6 +154,7 @@ public final class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Krovikan Sorcerer", 51, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class, RETRO_ART)); cards.add(new SetCardInfo("Krovikan Vampire", 102, Rarity.UNCOMMON, mage.cards.k.KrovikanVampire.class, RETRO_ART)); cards.add(new SetCardInfo("Lat-Nam's Legacy", 52, Rarity.COMMON, mage.cards.l.LatNamsLegacy.class, RETRO_ART)); + cards.add(new SetCardInfo("Lava Burst", 134, Rarity.UNCOMMON, mage.cards.l.LavaBurst.class, RETRO_ART)); cards.add(new SetCardInfo("Leaping Lizard", 171, Rarity.COMMON, mage.cards.l.LeapingLizard.class, RETRO_ART)); cards.add(new SetCardInfo("Lim-Dul's High Guard", 103, Rarity.UNCOMMON, mage.cards.l.LimDulsHighGuard.class, RETRO_ART)); cards.add(new SetCardInfo("Lodestone Bauble", 213, Rarity.RARE, mage.cards.l.LodestoneBauble.class, RETRO_ART)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java index 6114dd3cf37..e2e94557603 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/redirect/HarmsWayRedirectDamageTest.java @@ -30,6 +30,7 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { setChoice(playerB, "Lightning Bolt"); setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); execute(); assertGraveyardCount(playerA, "Lightning Bolt", 1); @@ -57,6 +58,7 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { setChoice(playerA, "Craw Wurm"); setStopAt(2, PhaseStep.END_TURN); + setStrictChooseMode(true); execute(); // only 4 combat damage @@ -91,6 +93,7 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Magma Phoenix"); setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + setStrictChooseMode(true); execute(); assertLife(playerA, 19); // 3 damage from dying Phoenix -> 2 redirected to playerB so playerA gets only 1 damage @@ -122,6 +125,7 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { setChoice(playerB, "Wild Slash"); setStopAt(1, PhaseStep.BEGIN_COMBAT); + setStrictChooseMode(true); execute(); assertGraveyardCount(playerA, "Wild Slash", 1); @@ -132,4 +136,33 @@ public class HarmsWayRedirectDamageTest extends CardTestPlayerBase { assertLife(playerB, 20); } + /** + * Tests redirection doesn't happen vs. Lava Burst on creature, does on player + */ + @Test + public void testNoRedirectLavaBurst() { + addCard(Zone.HAND, playerB, "Harm's Way", 2); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 2); + addCard(Zone.HAND, playerA, "Lava Burst", 2); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 9); + addCard(Zone.BATTLEFIELD, playerB, "Aegis Turtle"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lava Burst", "Aegis Turtle"); + setChoice(playerA, "X=4"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Harm's Way", playerA); + setChoice(playerB, "Lava Burst"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lava Burst", playerB); + setChoice(playerA, "X=3"); + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Harm's Way", playerA); + setChoice(playerB, "Lava Burst"); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + assertLife(playerA, 18); + assertLife(playerB, 19); + assertDamageReceived(playerB, "Aegis Turtle", 4); + + } } diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index a60322ba64a..aeeeadb2a42 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -108,6 +108,10 @@ public class ContinuousEffects implements Serializable { return requirementEffects; } + public List getReplacementEffects() { + return replacementEffects; + } + public List getRestrictionEffects() { return restrictionEffects; } From fb281df55bb1946e3cb29418841974e34b138383 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 16:54:50 -0500 Subject: [PATCH 46/91] [ECL] Implement Evershrike's Gift --- .../src/mage/cards/e/EvershrikesGift.java | 61 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 62 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EvershrikesGift.java diff --git a/Mage.Sets/src/mage/cards/e/EvershrikesGift.java b/Mage.Sets/src/mage/cards/e/EvershrikesGift.java new file mode 100644 index 00000000000..a85f3292fa8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EvershrikesGift.java @@ -0,0 +1,61 @@ +package mage.cards.e; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.BlightCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class EvershrikesGift extends CardImpl { + + public EvershrikesGift(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted creature gets +1/+0 and has flying. + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 0)); + ability.addEffect(new GainAbilityAttachedEffect( + FlyingAbility.getInstance(), AttachmentType.AURA + ).setText("and has flying")); + this.addAbility(ability); + + // {1}{W}, Blight 2: Return this card from your graveyard to your hand. Activate only as a sorcery. + ability = new ActivateAsSorceryActivatedAbility( + Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{1}{W}") + ); + ability.addCost(new BlightCost(2)); + this.addAbility(ability); + } + + private EvershrikesGift(final EvershrikesGift card) { + super(card); + } + + @Override + public EvershrikesGift copy() { + return new EvershrikesGift(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index c7e343ee1e9..9fc52cff389 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -117,6 +117,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Emptiness", 294, Rarity.MYTHIC, mage.cards.e.Emptiness.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Encumbered Reejerey", 14, Rarity.UNCOMMON, mage.cards.e.EncumberedReejerey.class)); cards.add(new SetCardInfo("Enraged Flamecaster", 135, Rarity.COMMON, mage.cards.e.EnragedFlamecaster.class)); + cards.add(new SetCardInfo("Evershrike's Gift", 15, Rarity.UNCOMMON, mage.cards.e.EvershrikesGift.class)); cards.add(new SetCardInfo("Evolving Wilds", 264, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Explosive Prodigy", 136, Rarity.UNCOMMON, mage.cards.e.ExplosiveProdigy.class)); cards.add(new SetCardInfo("Feed the Flames", 137, Rarity.COMMON, mage.cards.f.FeedTheFlames.class)); From 85a11e4fb58c5883162706a54c16c4ec48c8af1d Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 16:58:32 -0500 Subject: [PATCH 47/91] [ECL] Implement Mischievous Sneakling --- .../mage/cards/m/MischievousSneakling.java | 40 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MischievousSneakling.java diff --git a/Mage.Sets/src/mage/cards/m/MischievousSneakling.java b/Mage.Sets/src/mage/cards/m/MischievousSneakling.java new file mode 100644 index 00000000000..d846fc889cd --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MischievousSneakling.java @@ -0,0 +1,40 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.keyword.ChangelingAbility; +import mage.abilities.keyword.FlashAbility; +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 MischievousSneakling extends CardImpl { + + public MischievousSneakling(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U/B}"); + + this.subtype.add(SubType.SHAPESHIFTER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Changeling + this.addAbility(new ChangelingAbility()); + + // Flash + this.addAbility(FlashAbility.getInstance()); + } + + private MischievousSneakling(final MischievousSneakling card) { + super(card); + } + + @Override + public MischievousSneakling copy() { + return new MischievousSneakling(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 9fc52cff389..c9eeda86aa4 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -196,6 +196,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Midnight Tilling", 182, Rarity.COMMON, mage.cards.m.MidnightTilling.class)); cards.add(new SetCardInfo("Mirrorform", 308, Rarity.MYTHIC, mage.cards.m.Mirrorform.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mirrorform", 59, Rarity.MYTHIC, mage.cards.m.Mirrorform.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mischievous Sneakling", 235, Rarity.COMMON, mage.cards.m.MischievousSneakling.class)); cards.add(new SetCardInfo("Mistmeadow Council", 183, Rarity.COMMON, mage.cards.m.MistmeadowCouncil.class)); cards.add(new SetCardInfo("Moonglove Extractor", 109, Rarity.COMMON, mage.cards.m.MoongloveExtractor.class)); cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); From e2c89f9aabc0b8b7437a7d7cf1474ab03e5283b5 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:00:09 -0500 Subject: [PATCH 48/91] [ECL] Implement Moonlit Lamenter --- .../src/mage/cards/m/MoonlitLamenter.java | 54 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MoonlitLamenter.java diff --git a/Mage.Sets/src/mage/cards/m/MoonlitLamenter.java b/Mage.Sets/src/mage/cards/m/MoonlitLamenter.java new file mode 100644 index 00000000000..039f80ab19d --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MoonlitLamenter.java @@ -0,0 +1,54 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MoonlitLamenter extends CardImpl { + + public MoonlitLamenter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.TREEFOLK); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(2); + this.toughness = new MageInt(5); + + // This creature enters with a -1/-1 counter on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(1)), + "with a -1/-1 counter on it" + )); + + // {1}{W}, Remove a counter from this creature: Draw a card. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{1}{W}") + ); + ability.addCost(new RemoveCountersSourceCost(1)); + this.addAbility(ability); + } + + private MoonlitLamenter(final MoonlitLamenter card) { + super(card); + } + + @Override + public MoonlitLamenter copy() { + return new MoonlitLamenter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index c9eeda86aa4..fbc86bbac00 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -199,6 +199,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Mischievous Sneakling", 235, Rarity.COMMON, mage.cards.m.MischievousSneakling.class)); cards.add(new SetCardInfo("Mistmeadow Council", 183, Rarity.COMMON, mage.cards.m.MistmeadowCouncil.class)); cards.add(new SetCardInfo("Moonglove Extractor", 109, Rarity.COMMON, mage.cards.m.MoongloveExtractor.class)); + cards.add(new SetCardInfo("Moonlit Lamenter", 26, Rarity.UNCOMMON, mage.cards.m.MoonlitLamenter.class)); cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Morningtide's Light", 301, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 272, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); From 9369a0c99963522888abb553e3655fc20c611adb Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:03:04 -0500 Subject: [PATCH 49/91] [ECL] Implement Moon-Vigil Adherents --- .../src/mage/cards/m/MoonVigilAdherents.java | 57 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MoonVigilAdherents.java diff --git a/Mage.Sets/src/mage/cards/m/MoonVigilAdherents.java b/Mage.Sets/src/mage/cards/m/MoonVigilAdherents.java new file mode 100644 index 00000000000..1fe34f60ae6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MoonVigilAdherents.java @@ -0,0 +1,57 @@ +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.AdditiveDynamicValue; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MoonVigilAdherents extends CardImpl { + + private static final DynamicValue xValue = new AdditiveDynamicValue( + CreaturesYouControlCount.SINGULAR, new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE) + ); + private static final Hint hint = new ValueHint( + "Creatures you control and creature cards in your graveyard", xValue + ); + + public MoonVigilAdherents(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // This creature gets +1/+1 for each creature you control and each creature card in your graveyard. + this.addAbility(new SimpleStaticAbility(new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield)).addHint(hint)); + } + + private MoonVigilAdherents(final MoonVigilAdherents card) { + super(card); + } + + @Override + public MoonVigilAdherents copy() { + return new MoonVigilAdherents(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index fbc86bbac00..19079f54e98 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -198,6 +198,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Mirrorform", 59, Rarity.MYTHIC, mage.cards.m.Mirrorform.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mischievous Sneakling", 235, Rarity.COMMON, mage.cards.m.MischievousSneakling.class)); cards.add(new SetCardInfo("Mistmeadow Council", 183, Rarity.COMMON, mage.cards.m.MistmeadowCouncil.class)); + cards.add(new SetCardInfo("Moon-Vigil Adherents", 184, Rarity.UNCOMMON, mage.cards.m.MoonVigilAdherents.class)); cards.add(new SetCardInfo("Moonglove Extractor", 109, Rarity.COMMON, mage.cards.m.MoongloveExtractor.class)); cards.add(new SetCardInfo("Moonlit Lamenter", 26, Rarity.UNCOMMON, mage.cards.m.MoonlitLamenter.class)); cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); From 69b4ed896b2024eac90e39e601f2a59c0aba8773 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:06:17 -0500 Subject: [PATCH 50/91] [ECL] Implement Protective Response --- .../src/mage/cards/p/ProtectiveResponse.java | 36 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/ProtectiveResponse.java diff --git a/Mage.Sets/src/mage/cards/p/ProtectiveResponse.java b/Mage.Sets/src/mage/cards/p/ProtectiveResponse.java new file mode 100644 index 00000000000..2fb877dbcbe --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/ProtectiveResponse.java @@ -0,0 +1,36 @@ +package mage.cards.p; + +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetAttackingOrBlockingCreature; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ProtectiveResponse extends CardImpl { + + public ProtectiveResponse(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}"); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // Destroy target attacking or blocking creature. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); + } + + private ProtectiveResponse(final ProtectiveResponse card) { + super(card); + } + + @Override + public ProtectiveResponse copy() { + return new ProtectiveResponse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 19079f54e98..bc63ebfa0cb 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -224,6 +224,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Plains", 274, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Plains", 279, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Prideful Feastling", 238, Rarity.COMMON, mage.cards.p.PridefulFeastling.class)); + cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); cards.add(new SetCardInfo("Rhys, the Evermore", 32, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); From edc5d257888f2b695327edc3d9f07296e0aa7de7 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:08:29 -0500 Subject: [PATCH 51/91] [ECC] update spoiler --- Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java | 3 ++- Utils/mtg-cards-data.txt | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java index 4ebab98a92a..30b8c74bcff 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java @@ -155,7 +155,8 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Sol Ring", 57, Rarity.UNCOMMON, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sol Ring", 58, Rarity.UNCOMMON, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Soul Snuffers", 87, Rarity.UNCOMMON, mage.cards.s.SoulSnuffers.class)); - cards.add(new SetCardInfo("Springleaf Parade", 19, Rarity.RARE, mage.cards.s.SpringleafParade.class)); + cards.add(new SetCardInfo("Springleaf Parade", 19, Rarity.RARE, mage.cards.s.SpringleafParade.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Springleaf Parade", 39, Rarity.RARE, mage.cards.s.SpringleafParade.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Terminate", 134, Rarity.COMMON, mage.cards.t.Terminate.class)); cards.add(new SetCardInfo("Terramorphic Expanse", 169, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class)); cards.add(new SetCardInfo("The Reaper, King No More", 4, Rarity.MYTHIC, mage.cards.t.TheReaperKingNoMore.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 1ca68c977d9..0b04dd31e54 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -61371,7 +61371,7 @@ Invisible Woman|Marvel Super Heroes Commander|1|M|{2}{W}|Legendary Creature - Hu Mister Fantastic|Marvel Super Heroes Commander|2|M|{2}{U}|Legendary Creature - Human Scientist Hero|2|4|Vigilance, reach$At the beginning of combat on your turn, if you've cast a noncreature spell this turn, draw a card.${R}{G}{W}{U}, {T}: Copy target triggered ability you control twice. You may choose new targets for the copies.| Human Torch|Marvel Super Heroes Commander|3|M|{3}{R}|Legendary Creature - Human Hero|3|2|At the beginning of combat on your turn, if you've cast a noncreature spell this turn, Human Torch gains flying, double strike, and haste until end of turn.$Whenever Human Torch attacks, you may pay {R}{G}{W}{U}. If you do, until end of turn, whenever he deals combat damage to an opponent, he deals that much damage to each other opponent.| The Thing|Marvel Super Heroes Commander|4|M|{5}{G}|Legendary Creature - Human Hero|5|5|Trample$At the beginning of combat on your turn, if you've cast a noncreature spell this turn, put four +1/+1 counters on The Thing.$Whenever The Thing attacks, you may pay {R}{G}{W}{U}. When you do, double the number of each kind of counter on any number of target permanents you control.| -Ashling, the Limitless|Lorwyn Eclipsed Commander|1|M|{2}{R}|Legendary Creature - Elemental Sorcerer|2|3|Elemental spells you cast from your hand have evoke {4}.$Whenever you sacrifice a nontoken Elemental, create a token that's a copy of it. The token gains haste until end of turn. At the beginning of your next end step, sacrifice it unless you pay {W}{U}{B}{R}{G}.| +Ashling, the Limitless|Lorwyn Eclipsed Commander|1|M|{2}{R}|Legendary Creature - Elemental Sorcerer|2|3|Elemental permanent spells you cast from your hand gain evoke {4} as you cast them.$Whenever you sacrifice a nontoken Elemental, create a token that's a copy of it. The token gains haste until end of turn. At the beginning of your next end step, sacrifice it unless you pay {W}{U}{B}{R}{G}.| Auntie Ool, Cursewretch|Lorwyn Eclipsed Commander|2|M|{1}{B}{R}{G}|Legendary Creature - Goblin Warlock|4|4|Ward--Blight 2.$Whenever one or more -1/-1 counters are put on a creature, draw a card if you control that creature. If you don't control it, its controller loses 1 life.| Mass of Mysteries|Lorwyn Eclipsed Commander|3|M|{W}{U}{B}{R}{G}|Legendary Creature - Elemental|5|5|First strike, vigilance, trample$At the beginning of combat on your turn, another target Elemental you control gains myriad until end of turn.| The Reaper, King No More|Lorwyn Eclipsed Commander|4|M|{2/B}{2/R}{2/G}|Legendary Artifact Creature - Scarecrow|3|3|When The Reaper enters, put a -1/-1 counter on each of up to two target creatures.$Whenever a creature an opponent controls with a -1/-1 counter on it dies, you may put that card onto the battlefield under your control. Do this only once each turn.| @@ -61389,7 +61389,7 @@ Elemental Spectacle|Lorwyn Eclipsed Commander|15|R|{5}{G}|Sorcery|||Vivid -- Cre Ferrafor, Young Yew|Lorwyn Eclipsed Commander|16|R|{6}{G}|Legendary Creature - Treefolk Druid|4|7|When Ferrafor enters, create a number of 1/1 green Saproling creature tokens equal to the number of counters among creatures target player controls.${T}: Double the number of each kind of counter on target creature.| Jubilation|Lorwyn Eclipsed Commander|17|R|{5}{G}|Creature - Elemental Incarnation|5|5|When this creature enters, creatures you control get +2/+2 and gain trample until end of turn.$Encore {7}{G}{G}| Puca's Covenant|Lorwyn Eclipsed Commander|18|R|{2}{G}|Enchantment|||Whenever a creature you control with a counter on it dies, you may return another target permanent card with mana value less than or equal to the number of counters on that creature from your graveyard to your hand. Do this only once each turn.| -Springleaf Parade|Lorwyn Eclipsed Commander|19|R|{G}{G}|Enchantment|||When this enchantment enters, create X 1/1 colorless Shapeshifter creature tokens with changeling.$Creature tokens you control have "{T}: Add one mana of any color."| +Springleaf Parade|Lorwyn Eclipsed Commander|19|R|{X}{G}{G}|Enchantment|||When this enchantment enters, create X 1/1 colorless Shapeshifter creature tokens with changeling.$Creature tokens you control have "{T}: Add one mana of any color."| Dread Tiller|Lorwyn Eclipsed Commander|20|R|{1}{B}{G}|Artifact Creature - Scarecrow|2|4|When this creature enters, put a -1/-1 counter on target creature.$Whenever a creature with a -1/-1 counter on it dies, you may put a land card from your hand or graveyard onto the battlefield tapped.| Wickersmith's Tools|Lorwyn Eclipsed Commander|21|R|{3}|Artifact|||Whenever one or more -1/-1 counters are put on a creature, put a charge counter on this artifact.${T}: Add one mana of any color.${5}, {T}, Sacrifice this artifact: Create X tapped 2/2 colorless Scarecrow artifact creature tokens, where X is the number of charge counters on this artifact.| Abundant Countryside|Lorwyn Eclipsed Commander|22|R||Land|||{T}: Add {C}.${T}: Add one mana of any color. Spend this mana only to cast a creature spell.${6}, {T}: Create a 1/1 colorless Shapeshifter creature token with changeling.| @@ -61409,7 +61409,7 @@ Elemental Spectacle|Lorwyn Eclipsed Commander|35|R|{5}{G}|Sorcery|||Vivid -- Cre Ferrafor, Young Yew|Lorwyn Eclipsed Commander|36|R|{6}{G}|Legendary Creature - Treefolk Druid|4|7|When Ferrafor enters, create a number of 1/1 green Saproling creature tokens equal to the number of counters among creatures target player controls.${T}: Double the number of each kind of counter on target creature.| Jubilation|Lorwyn Eclipsed Commander|37|R|{5}{G}|Creature - Elemental Incarnation|5|5|When this creature enters, creatures you control get +2/+2 and gain trample until end of turn.$Encore {7}{G}{G}| Puca's Covenant|Lorwyn Eclipsed Commander|38|R|{2}{G}|Enchantment|||Whenever a creature you control with a counter on it dies, you may return another target permanent card with mana value less than or equal to the number of counters on that creature from your graveyard to your hand. Do this only once each turn.| -Springleaf Parade|Lorwyn Eclipsed Commander|39|R|{G}{G}|Enchantment|||When this enchantment enters, create X 1/1 colorless Shapeshifter creature tokens with changeling.$Creature tokens you control have "{T}: Add one mana of any color."| +Springleaf Parade|Lorwyn Eclipsed Commander|39|R|{X}{G}{G}|Enchantment|||When this enchantment enters, create X 1/1 colorless Shapeshifter creature tokens with changeling.$Creature tokens you control have "{T}: Add one mana of any color."| Dread Tiller|Lorwyn Eclipsed Commander|40|R|{1}{B}{G}|Artifact Creature - Scarecrow|2|4|When this creature enters, put a -1/-1 counter on target creature.$Whenever a creature with a -1/-1 counter on it dies, you may put a land card from your hand or graveyard onto the battlefield tapped.| Wickersmith's Tools|Lorwyn Eclipsed Commander|41|R|{3}|Artifact|||Whenever one or more -1/-1 counters are put on a creature, put a charge counter on this artifact.${T}: Add one mana of any color.${5}, {T}, Sacrifice this artifact: Create X tapped 2/2 colorless Scarecrow artifact creature tokens, where X is the number of charge counters on this artifact.| Abundant Countryside|Lorwyn Eclipsed Commander|42|R||Land|||{T}: Add {C}.${T}: Add one mana of any color. Spend this mana only to cast a creature spell.${6}, {T}: Create a 1/1 colorless Shapeshifter creature token with changeling.| From c771736acc8456770860d729b9c6d95cf8d87720 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:37:17 -0500 Subject: [PATCH 52/91] [ECL] Implement Thirst for Identity --- .../src/mage/cards/t/ThirstForIdentity.java | 39 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 40 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/ThirstForIdentity.java diff --git a/Mage.Sets/src/mage/cards/t/ThirstForIdentity.java b/Mage.Sets/src/mage/cards/t/ThirstForIdentity.java new file mode 100644 index 00000000000..05bb66f02ac --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThirstForIdentity.java @@ -0,0 +1,39 @@ +package mage.cards.t; + +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ThirstForIdentity extends CardImpl { + + public ThirstForIdentity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}"); + + // Draw three cards. Then discard two cards unless you discard a creature card. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3)); + this.getSpellAbility().addEffect(new DoIfCostPaid( + null, new DiscardControllerEffect(2), + new DiscardCardCost(StaticFilters.FILTER_CARD_CREATURE) + .setText("discard a creature card instead of discarding two cards") + ).setText("Then discard two cards unless you discard a creature card")); + } + + private ThirstForIdentity(final ThirstForIdentity card) { + super(card); + } + + @Override + public ThirstForIdentity copy() { + return new ThirstForIdentity(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index bc63ebfa0cb..0ec9145c887 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -274,6 +274,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Temple Garden", 351, Rarity.RARE, mage.cards.t.TempleGarden.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Temporal Cleansing", 78, Rarity.COMMON, mage.cards.t.TemporalCleansing.class)); cards.add(new SetCardInfo("Tend the Sprigs", 197, Rarity.COMMON, mage.cards.t.TendTheSprigs.class)); + cards.add(new SetCardInfo("Thirst for Identity", 79, Rarity.UNCOMMON, mage.cards.t.ThirstForIdentity.class)); cards.add(new SetCardInfo("Thoughtweft Charge", 198, Rarity.UNCOMMON, mage.cards.t.ThoughtweftCharge.class)); cards.add(new SetCardInfo("Thoughtweft Imbuer", 38, Rarity.UNCOMMON, mage.cards.t.ThoughtweftImbuer.class)); cards.add(new SetCardInfo("Thoughtweft Lieutenant", 246, Rarity.UNCOMMON, mage.cards.t.ThoughtweftLieutenant.class, NON_FULL_USE_VARIOUS)); From 3d7e7fc500a384da8ebb947dfde34fb530ad7bb1 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:38:15 -0500 Subject: [PATCH 53/91] [ECL] Implement Timid Shieldbearer --- .../src/mage/cards/t/TimidShieldbearer.java | 42 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 43 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TimidShieldbearer.java diff --git a/Mage.Sets/src/mage/cards/t/TimidShieldbearer.java b/Mage.Sets/src/mage/cards/t/TimidShieldbearer.java new file mode 100644 index 00000000000..2a447d80023 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TimidShieldbearer.java @@ -0,0 +1,42 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TimidShieldbearer extends CardImpl { + + public TimidShieldbearer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {4}{W}: Creatures you control get +1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility( + new BoostControlledEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl<>("{4}{W}") + )); + } + + private TimidShieldbearer(final TimidShieldbearer card) { + super(card); + } + + @Override + public TimidShieldbearer copy() { + return new TimidShieldbearer(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 0ec9145c887..82bcc83c391 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -279,6 +279,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Thoughtweft Imbuer", 38, Rarity.UNCOMMON, mage.cards.t.ThoughtweftImbuer.class)); cards.add(new SetCardInfo("Thoughtweft Lieutenant", 246, Rarity.UNCOMMON, mage.cards.t.ThoughtweftLieutenant.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thoughtweft Lieutenant", 343, Rarity.UNCOMMON, mage.cards.t.ThoughtweftLieutenant.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Timid Shieldbearer", 39, Rarity.COMMON, mage.cards.t.TimidShieldbearer.class)); cards.add(new SetCardInfo("Tributary Vaulter", 40, Rarity.COMMON, mage.cards.t.TributaryVaulter.class)); cards.add(new SetCardInfo("Trystan, Callous Cultivator", 199, Rarity.RARE, mage.cards.t.TrystanCallousCultivator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Trystan, Callous Cultivator", 291, Rarity.RARE, mage.cards.t.TrystanCallousCultivator.class, NON_FULL_USE_VARIOUS)); From 45b897d6efd6c9fd98dc6771587dd304b534552b Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:39:48 -0500 Subject: [PATCH 54/91] [ECL] Implement Sting-Slinger --- Mage.Sets/src/mage/cards/s/StingSlinger.java | 48 ++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 49 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/StingSlinger.java diff --git a/Mage.Sets/src/mage/cards/s/StingSlinger.java b/Mage.Sets/src/mage/cards/s/StingSlinger.java new file mode 100644 index 00000000000..17098d16bf1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StingSlinger.java @@ -0,0 +1,48 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.BlightCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class StingSlinger extends CardImpl { + + public StingSlinger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {1}{R}, {T}, Blight 1: This creature deals 2 damage to each opponent. + Ability ability = new SimpleActivatedAbility( + new DamagePlayersEffect(2, TargetController.OPPONENT), new ManaCostsImpl<>("{1}{R}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new BlightCost(1)); + this.addAbility(ability); + } + + private StingSlinger(final StingSlinger card) { + super(card); + } + + @Override + public StingSlinger copy() { + return new StingSlinger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 82bcc83c391..6e3c234ec4b 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -258,6 +258,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Steam Vents", "348b", Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 267, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 348, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sting-Slinger", 161, Rarity.UNCOMMON, mage.cards.s.StingSlinger.class)); cards.add(new SetCardInfo("Stratosoarer", 72, Rarity.COMMON, mage.cards.s.Stratosoarer.class)); cards.add(new SetCardInfo("Summit Sentinel", 73, Rarity.COMMON, mage.cards.s.SummitSentinel.class)); cards.add(new SetCardInfo("Sun-Dappled Celebrant", 37, Rarity.COMMON, mage.cards.s.SunDappledCelebrant.class)); From cdb2b9606448178b0893e5146872f5616bfbc8c0 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:41:56 -0500 Subject: [PATCH 55/91] [ECL] Implement Stoic Grave-Guide --- .../src/mage/cards/s/StoicGroveGuide.java | 47 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 48 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/StoicGroveGuide.java diff --git a/Mage.Sets/src/mage/cards/s/StoicGroveGuide.java b/Mage.Sets/src/mage/cards/s/StoicGroveGuide.java new file mode 100644 index 00000000000..5c2befc0297 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StoicGroveGuide.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.ExileSourceFromGraveCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.permanent.token.BlackGreenElfToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class StoicGroveGuide extends CardImpl { + + public StoicGroveGuide(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B/G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(5); + this.toughness = new MageInt(4); + + // {1}{B/G}, Exile this card from your graveyard: Create a 2/2 black and green Elf creature token. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + Zone.GRAVEYARD, new CreateTokenEffect(new BlackGreenElfToken()), new ManaCostsImpl<>("{1}{B/G}") + ); + ability.addCost(new ExileSourceFromGraveCost()); + this.addAbility(ability); + } + + private StoicGroveGuide(final StoicGroveGuide card) { + super(card); + } + + @Override + public StoicGroveGuide copy() { + return new StoicGroveGuide(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 6e3c234ec4b..604665fbc7e 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -259,6 +259,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Steam Vents", 267, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Steam Vents", 348, Rarity.RARE, mage.cards.s.SteamVents.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sting-Slinger", 161, Rarity.UNCOMMON, mage.cards.s.StingSlinger.class)); + cards.add(new SetCardInfo("Stoic Grove-Guide", 243, Rarity.COMMON, mage.cards.s.StoicGroveGuide.class)); cards.add(new SetCardInfo("Stratosoarer", 72, Rarity.COMMON, mage.cards.s.Stratosoarer.class)); cards.add(new SetCardInfo("Summit Sentinel", 73, Rarity.COMMON, mage.cards.s.SummitSentinel.class)); cards.add(new SetCardInfo("Sun-Dappled Celebrant", 37, Rarity.COMMON, mage.cards.s.SunDappledCelebrant.class)); From c0258803d4ac9cd5fde5ce0fe18f0dcf7f3420f0 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:43:36 -0500 Subject: [PATCH 56/91] [ECL] Implement Riverguard's Reflexes --- .../src/mage/cards/r/RiverguardsReflexes.java | 42 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 43 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RiverguardsReflexes.java diff --git a/Mage.Sets/src/mage/cards/r/RiverguardsReflexes.java b/Mage.Sets/src/mage/cards/r/RiverguardsReflexes.java new file mode 100644 index 00000000000..787bb82c13a --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RiverguardsReflexes.java @@ -0,0 +1,42 @@ +package mage.cards.r; + +import mage.abilities.effects.common.UntapTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RiverguardsReflexes extends CardImpl { + + public RiverguardsReflexes(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Target creature gets +2/+2 and gains first strike until end of turn. Untap it. + this.getSpellAbility().addEffect(new BoostTargetEffect( + 2, 2, Duration.EndOfTurn + ).setText("target creature gets +2/+2")); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect( + FirstStrikeAbility.getInstance(), Duration.EndOfTurn + ).setText("and gains first strike until end of turn")); + this.getSpellAbility().addEffect(new UntapTargetEffect("Untap it")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private RiverguardsReflexes(final RiverguardsReflexes card) { + super(card); + } + + @Override + public RiverguardsReflexes copy() { + return new RiverguardsReflexes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 604665fbc7e..60184e72d73 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -229,6 +229,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); cards.add(new SetCardInfo("Rhys, the Evermore", 32, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rhys, the Evermore", 354, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Riverguard's Reflexes", 33, Rarity.COMMON, mage.cards.r.RiverguardsReflexes.class)); cards.add(new SetCardInfo("Rooftop Percher", 2, Rarity.COMMON, mage.cards.r.RooftopPercher.class)); cards.add(new SetCardInfo("Run Away Together", 67, Rarity.COMMON, mage.cards.r.RunAwayTogether.class)); cards.add(new SetCardInfo("Safewright Cavalry", 191, Rarity.COMMON, mage.cards.s.SafewrightCavalry.class)); From 1f363da37f805f4084fc1ba677823e03005c8f28 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:46:17 -0500 Subject: [PATCH 57/91] [ECL] Implement Reluctant Dounguard --- .../src/mage/cards/r/ReluctantDounguard.java | 55 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/ReluctantDounguard.java diff --git a/Mage.Sets/src/mage/cards/r/ReluctantDounguard.java b/Mage.Sets/src/mage/cards/r/ReluctantDounguard.java new file mode 100644 index 00000000000..aa9b237659e --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReluctantDounguard.java @@ -0,0 +1,55 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class ReluctantDounguard extends CardImpl { + + private static final Condition condition = new SourceHasCounterCondition(CounterType.M1M1); + + public ReluctantDounguard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // This creature enters with two -1/-1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(2)), + "with two -1/-1 counters on it" + )); + + // Whenever another creature you control enters while this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature. + this.addAbility(new EntersBattlefieldAllTriggeredAbility( + new RemoveCounterSourceEffect(CounterType.M1M1.createInstance()), + StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL + ).withTriggerCondition(condition)); + } + + private ReluctantDounguard(final ReluctantDounguard card) { + super(card); + } + + @Override + public ReluctantDounguard copy() { + return new ReluctantDounguard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 60184e72d73..059167f08a9 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -226,6 +226,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Prideful Feastling", 238, Rarity.COMMON, mage.cards.p.PridefulFeastling.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); + cards.add(new SetCardInfo("Reluctant Dounguard", 31, Rarity.COMMON, mage.cards.r.ReluctantDounguard.class)); cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); cards.add(new SetCardInfo("Rhys, the Evermore", 32, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rhys, the Evermore", 354, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); From e7547e97bddf1242e4dc76f9ba420412bfc4cc3b Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:47:19 -0500 Subject: [PATCH 58/91] [ECL] Implement Reckless Ransacking --- .../src/mage/cards/r/RecklessRansacking.java | 35 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 36 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RecklessRansacking.java diff --git a/Mage.Sets/src/mage/cards/r/RecklessRansacking.java b/Mage.Sets/src/mage/cards/r/RecklessRansacking.java new file mode 100644 index 00000000000..4d8e9e8ac12 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RecklessRansacking.java @@ -0,0 +1,35 @@ +package mage.cards.r; + +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.TreasureToken; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RecklessRansacking extends CardImpl { + + public RecklessRansacking(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Target creature gets +3/+2 until end of turn. Create a Treasure token. + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 2)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new CreateTokenEffect(new TreasureToken())); + } + + private RecklessRansacking(final RecklessRansacking card) { + super(card); + } + + @Override + public RecklessRansacking copy() { + return new RecklessRansacking(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 059167f08a9..d8940618ac7 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -226,6 +226,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Prideful Feastling", 238, Rarity.COMMON, mage.cards.p.PridefulFeastling.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); + cards.add(new SetCardInfo("Reckless Ransacking", 152, Rarity.COMMON, mage.cards.r.RecklessRansacking.class)); cards.add(new SetCardInfo("Reluctant Dounguard", 31, Rarity.COMMON, mage.cards.r.ReluctantDounguard.class)); cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); cards.add(new SetCardInfo("Rhys, the Evermore", 32, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); From 0d35307475da6286083ef0f062b15d0e0841a0be Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 17:48:52 -0500 Subject: [PATCH 59/91] [ECL] Implement Nightmare Sower --- .../src/mage/cards/n/NightmareSower.java | 54 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 55 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NightmareSower.java diff --git a/Mage.Sets/src/mage/cards/n/NightmareSower.java b/Mage.Sets/src/mage/cards/n/NightmareSower.java new file mode 100644 index 00000000000..8669d68adbb --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NightmareSower.java @@ -0,0 +1,54 @@ +package mage.cards.n; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.condition.common.OpponentsTurnCondition; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class NightmareSower extends CardImpl { + + public NightmareSower(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.FAERIE); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // Whenever you cast a spell during an opponent's turn, put a -1/-1 counter on up to one target creature. + Ability ability = new SpellCastControllerTriggeredAbility( + new AddCountersTargetEffect(CounterType.M1M1.createInstance()), false + ).withTriggerCondition(OpponentsTurnCondition.instance); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + this.addAbility(ability); + } + + private NightmareSower(final NightmareSower card) { + super(card); + } + + @Override + public NightmareSower copy() { + return new NightmareSower(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index d8940618ac7..c6731bb1f67 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -210,6 +210,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Mutable Explorer", 186, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mutable Explorer", 327, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Nameless Inversion", 113, Rarity.UNCOMMON, mage.cards.n.NamelessInversion.class)); + cards.add(new SetCardInfo("Nightmare Sower", 114, Rarity.UNCOMMON, mage.cards.n.NightmareSower.class)); cards.add(new SetCardInfo("Noggle Robber", 237, Rarity.UNCOMMON, mage.cards.n.NoggleRobber.class)); cards.add(new SetCardInfo("Omni-Changeling", 62, Rarity.UNCOMMON, mage.cards.o.OmniChangeling.class)); cards.add(new SetCardInfo("Overgrown Tomb", "350b", Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); From 4047b64f3439cf922d455dc21ce16237dc0fb74d Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 16:52:16 -0600 Subject: [PATCH 60/91] [ECC] Implement Grave Venerations (#14204) --- .../src/mage/cards/g/GraveVenerations.java | 63 +++++++++++++++++++ .../mage/sets/LorwynEclipsedCommander.java | 2 + 2 files changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GraveVenerations.java diff --git a/Mage.Sets/src/mage/cards/g/GraveVenerations.java b/Mage.Sets/src/mage/cards/g/GraveVenerations.java new file mode 100644 index 00000000000..3508e2171c5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GraveVenerations.java @@ -0,0 +1,63 @@ +package mage.cards.g; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.MonarchIsSourceControllerCondition; +import mage.abilities.effects.common.BecomesMonarchSourceEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.abilities.hint.common.MonarchHint; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author muz + */ +public final class GraveVenerations extends CardImpl { + + public GraveVenerations(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}"); + + // When this enchantment enters, you become the monarch. + this.addAbility(new EntersBattlefieldTriggeredAbility(new BecomesMonarchSourceEffect()).addHint(MonarchHint.instance)); + + // At the beginning of your end step, if you're the monarch, return up to one target creature card from your graveyard to your hand. + Ability monarchAbility = new BeginningOfEndStepTriggeredAbility( + TargetController.YOU, + new ReturnFromGraveyardToHandTargetEffect(), + false, + MonarchIsSourceControllerCondition.instance + ); + monarchAbility.addTarget(new TargetCardInYourGraveyard( + 0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD + )); + this.addAbility(monarchAbility); + + // Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. + Ability diesAbility = new DiesCreatureTriggeredAbility( + new LoseLifeOpponentsEffect(1), false, + StaticFilters.FILTER_CONTROLLED_A_CREATURE + ); + diesAbility.addEffect(new GainLifeEffect(1).concatBy("and")); + this.addAbility(diesAbility); + } + + private GraveVenerations(final GraveVenerations card) { + super(card); + } + + @Override + public GraveVenerations copy() { + return new GraveVenerations(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java index 30b8c74bcff..3ac7aeb2e66 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java @@ -77,6 +77,8 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Glissa Sunslayer", 122, Rarity.RARE, mage.cards.g.GlissaSunslayer.class)); cards.add(new SetCardInfo("Golgari Rot Farm", 151, Rarity.UNCOMMON, mage.cards.g.GolgariRotFarm.class)); cards.add(new SetCardInfo("Grave Titan", 74, Rarity.MYTHIC, mage.cards.g.GraveTitan.class)); + cards.add(new SetCardInfo("Grave Venerations", 29, Rarity.RARE, mage.cards.g.GraveVenerations.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Grave Venerations", 9, Rarity.RARE, mage.cards.g.GraveVenerations.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Greenwarden of Murasa", 110, Rarity.MYTHIC, mage.cards.g.GreenwardenOfMurasa.class)); cards.add(new SetCardInfo("Grim Poppet", 142, Rarity.RARE, mage.cards.g.GrimPoppet.class)); cards.add(new SetCardInfo("Gruul Turf", 152, Rarity.UNCOMMON, mage.cards.g.GruulTurf.class)); From d99eb68b34c3e6431e197159168b59c2091c99be Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 19:53:19 -0600 Subject: [PATCH 61/91] [ECC] Implement Elemental Spectacle (#14205) * [ECC] Implement Elemental Spectacle * Add Ability Word and Hint --- .../src/mage/cards/e/ElementalSpectacle.java | 44 +++++++++++++++++++ .../mage/sets/LorwynEclipsedCommander.java | 2 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/ElementalSpectacle.java diff --git a/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java b/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java new file mode 100644 index 00000000000..8672f19367e --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java @@ -0,0 +1,44 @@ +package mage.cards.e; + +import java.util.UUID; + +import mage.abilities.dynamicvalue.common.ColorsAmongControlledPermanentsCount; +import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.hint.common.DomainHint; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.game.permanent.token.OmnathElementalToken; + +/** + * + * @author muz + */ +public final class ElementalSpectacle extends CardImpl { + + public ElementalSpectacle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{G}"); + + // Vivid -- Create a number of 5/5 red and green Elemental creature tokens equal to the number of colors among permanents you control. Then you gain life equal to the number of creatures you control. + this.getSpellAbility().addEffect(new CreateTokenEffect( + new OmnathElementalToken(), + ColorsAmongControlledPermanentsCount.ALL_PERMANENTS + )); + this.getSpellAbility().addEffect(new GainLifeEffect(CreaturesYouControlCount.PLURAL) + .setText(", then you gain life equal to the number of creatures you control")); + this.getSpellAbility().setAbilityWord(AbilityWord.VIVID); + this.getSpellAbility().addHint(ColorsAmongControlledPermanentsCount.ALL_PERMANENTS.getHint()); + } + + private ElementalSpectacle(final ElementalSpectacle card) { + super(card); + } + + @Override + public ElementalSpectacle copy() { + return new ElementalSpectacle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java index 3ac7aeb2e66..9634de358f3 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java @@ -59,6 +59,8 @@ public final class LorwynEclipsedCommander extends ExpansionSet { cards.add(new SetCardInfo("Dread Tiller", 20, Rarity.RARE, mage.cards.d.DreadTiller.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dread Tiller", 40, Rarity.RARE, mage.cards.d.DreadTiller.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dusk Urchins", 73, Rarity.RARE, mage.cards.d.DuskUrchins.class)); + cards.add(new SetCardInfo("Elemental Spectacle", 15, Rarity.RARE, mage.cards.e.ElementalSpectacle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Elemental Spectacle", 35, Rarity.RARE, mage.cards.e.ElementalSpectacle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Endurance", 51, Rarity.MYTHIC, mage.cards.e.Endurance.class)); cards.add(new SetCardInfo("Everlasting Torment", 121, Rarity.RARE, mage.cards.e.EverlastingTorment.class)); cards.add(new SetCardInfo("Evolution Sage", 105, Rarity.UNCOMMON, mage.cards.e.EvolutionSage.class)); From d4874f9dd3b0aaaa4b238f9909b0db563f5bc20f Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 19:53:41 -0600 Subject: [PATCH 62/91] [ECL] Implement Spiral into Solitude (#14206) --- .../src/mage/cards/s/SpiralIntoSolitude.java | 59 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 60 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SpiralIntoSolitude.java diff --git a/Mage.Sets/src/mage/cards/s/SpiralIntoSolitude.java b/Mage.Sets/src/mage/cards/s/SpiralIntoSolitude.java new file mode 100644 index 00000000000..8bd87f2f7e8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpiralIntoSolitude.java @@ -0,0 +1,59 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.SacrificeCost; +import mage.abilities.costs.common.BlightCost; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.ExileAttachedEffect; +import mage.abilities.effects.common.combat.CantAttackBlockAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class SpiralIntoSolitude extends CardImpl { + + public SpiralIntoSolitude(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted creature can't attack or block. + this.addAbility(new SimpleStaticAbility(new CantAttackBlockAttachedEffect(AttachmentType.AURA))); + + // {1}{W}, Blight 1, Sacrifice this Aura: Exile enchanted creature. + Ability ability = new SimpleActivatedAbility(new ExileAttachedEffect(), new ManaCostsImpl<>("{1}{W}")); + ability.addCost(new SacrificeSourceCost()); + ability.addCost(new BlightCost(1)); + this.addAbility(ability); + } + + private SpiralIntoSolitude(final SpiralIntoSolitude card) { + super(card); + } + + @Override + public SpiralIntoSolitude copy() { + return new SpiralIntoSolitude(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index c6731bb1f67..736b6443162 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -256,6 +256,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Slumbering Walker", 35, Rarity.RARE, mage.cards.s.SlumberingWalker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sourbread Auntie", 158, Rarity.UNCOMMON, mage.cards.s.SourbreadAuntie.class)); cards.add(new SetCardInfo("Spell Snare", 71, Rarity.UNCOMMON, mage.cards.s.SpellSnare.class)); + cards.add(new SetCardInfo("Spiral into Solitude", 36, Rarity.COMMON, mage.cards.s.SpiralIntoSolitude.class)); cards.add(new SetCardInfo("Springleaf Drum", 260, Rarity.UNCOMMON, mage.cards.s.SpringleafDrum.class)); cards.add(new SetCardInfo("Squawkroaster", 160, Rarity.UNCOMMON, mage.cards.s.Squawkroaster.class)); cards.add(new SetCardInfo("Stalactite Dagger", 261, Rarity.COMMON, mage.cards.s.StalactiteDagger.class)); From 7e050e04e10fee4883a1b26aa6405c0f59fbe00c Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 19:54:05 -0600 Subject: [PATCH 63/91] [ECL] Implement Noggle the Mind (#14208) --- Mage.Sets/src/mage/cards/n/NoggleTheMind.java | 55 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/n/NoggleTheMind.java diff --git a/Mage.Sets/src/mage/cards/n/NoggleTheMind.java b/Mage.Sets/src/mage/cards/n/NoggleTheMind.java new file mode 100644 index 00000000000..d68143f73d6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/n/NoggleTheMind.java @@ -0,0 +1,55 @@ +package mage.cards.n; + +import java.util.UUID; +import mage.constants.SubType; +import mage.game.permanent.token.custom.CreatureToken; +import mage.abilities.keyword.FlashAbility; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BecomesCreatureAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author muz + */ +public final class NoggleTheMind extends CardImpl { + + public NoggleTheMind(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + this.subtype.add(SubType.AURA); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted creature loses all abilities and is a colorless Noggle with base power and toughness 1/1. + this.addAbility(new SimpleStaticAbility(new BecomesCreatureAttachedEffect( + new CreatureToken(1, 1, "", SubType.NOGGLE), + "Enchanted creature loses all abilities and is a colorless Noggle with base power and toughness 1/1", + Duration.WhileOnBattlefield, BecomesCreatureAttachedEffect.LoseType.ALL, Outcome.Detriment + ))); + } + + private NoggleTheMind(final NoggleTheMind card) { + super(card); + } + + @Override + public NoggleTheMind copy() { + return new NoggleTheMind(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 736b6443162..6bc9599e0b8 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -212,6 +212,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Nameless Inversion", 113, Rarity.UNCOMMON, mage.cards.n.NamelessInversion.class)); cards.add(new SetCardInfo("Nightmare Sower", 114, Rarity.UNCOMMON, mage.cards.n.NightmareSower.class)); cards.add(new SetCardInfo("Noggle Robber", 237, Rarity.UNCOMMON, mage.cards.n.NoggleRobber.class)); + cards.add(new SetCardInfo("Noggle the Mind", 60, Rarity.UNCOMMON, mage.cards.n.NoggleTheMind.class)); cards.add(new SetCardInfo("Omni-Changeling", 62, Rarity.UNCOMMON, mage.cards.o.OmniChangeling.class)); cards.add(new SetCardInfo("Overgrown Tomb", "350b", Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Overgrown Tomb", 266, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); From 5700ae72592f9c845887df543f5d338660e44dcd Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 19:54:26 -0600 Subject: [PATCH 64/91] [ECL] Implement Rimekin Recluse (#14210) --- .../src/mage/cards/r/RimekinRecluse.java | 43 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 44 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RimekinRecluse.java diff --git a/Mage.Sets/src/mage/cards/r/RimekinRecluse.java b/Mage.Sets/src/mage/cards/r/RimekinRecluse.java new file mode 100644 index 00000000000..5c47fdec4b0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RimekinRecluse.java @@ -0,0 +1,43 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class RimekinRecluse extends CardImpl { + + public RimekinRecluse(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When this creature enters, return up to one other target creature to its owner's hand. + Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect()); + ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_ANOTHER_TARGET_CREATURE)); + this.addAbility(ability); + } + + private RimekinRecluse(final RimekinRecluse card) { + super(card); + } + + @Override + public RimekinRecluse copy() { + return new RimekinRecluse(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 6bc9599e0b8..484db5c7685 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -233,6 +233,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); cards.add(new SetCardInfo("Rhys, the Evermore", 32, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rhys, the Evermore", 354, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rimekin Recluse", 66, Rarity.UNCOMMON, mage.cards.r.RimekinRecluse.class)); cards.add(new SetCardInfo("Riverguard's Reflexes", 33, Rarity.COMMON, mage.cards.r.RiverguardsReflexes.class)); cards.add(new SetCardInfo("Rooftop Percher", 2, Rarity.COMMON, mage.cards.r.RooftopPercher.class)); cards.add(new SetCardInfo("Run Away Together", 67, Rarity.COMMON, mage.cards.r.RunAwayTogether.class)); From 920fde5c464e6fff247605e3711b10d6b81b0493 Mon Sep 17 00:00:00 2001 From: Muz Date: Fri, 9 Jan 2026 20:05:07 -0600 Subject: [PATCH 65/91] [ECL] Implement Firdoch Core (#14196) * [ECL] Implement Firdoch Core * Refactor Soulstone Sanctuary to not use a custom class. --- Mage.Sets/src/mage/cards/f/FirdochCore.java | 52 +++++++++++++++++++ .../src/mage/cards/s/SoulstoneSanctuary.java | 37 ++++--------- Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 3 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/f/FirdochCore.java diff --git a/Mage.Sets/src/mage/cards/f/FirdochCore.java b/Mage.Sets/src/mage/cards/f/FirdochCore.java new file mode 100644 index 00000000000..3b4b1a578fe --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FirdochCore.java @@ -0,0 +1,52 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.constants.SubType; +import mage.game.permanent.token.custom.CreatureToken; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; +import mage.abilities.keyword.ChangelingAbility; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author muz + */ +public final class FirdochCore extends CardImpl { + + public FirdochCore(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.KINDRED, CardType.ARTIFACT}, "{3}"); + + this.subtype.add(SubType.SHAPESHIFTER); + + // Changeling + this.addAbility(new ChangelingAbility()); + + // {T}: Add one mana of any color. + this.addAbility(new AnyColorManaAbility()); + + // {4}: This artifact becomes a 4/4 artifact creature until end of turn. + this.addAbility(new SimpleActivatedAbility( + new BecomesCreatureSourceEffect( + new CreatureToken(4, 4).withType(CardType.ARTIFACT).withSubType(SubType.SHAPESHIFTER), + CardType.ARTIFACT, + Duration.EndOfTurn + ).setText("this artifact becomes a 4/4 artifact creature until end of turn"), + new GenericManaCost(4) + )); + } + + private FirdochCore(final FirdochCore card) { + super(card); + } + + @Override + public FirdochCore copy() { + return new FirdochCore(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SoulstoneSanctuary.java b/Mage.Sets/src/mage/cards/s/SoulstoneSanctuary.java index 3dd2fc68c01..e6c226f0780 100644 --- a/Mage.Sets/src/mage/cards/s/SoulstoneSanctuary.java +++ b/Mage.Sets/src/mage/cards/s/SoulstoneSanctuary.java @@ -1,6 +1,5 @@ package mage.cards.s; -import mage.MageInt; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; @@ -10,8 +9,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.custom.CreatureToken; import java.util.UUID; @@ -23,16 +21,21 @@ public final class SoulstoneSanctuary extends CardImpl { public SoulstoneSanctuary(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); - + // {T}: Add {C}. this.addAbility(new ColorlessManaAbility()); // {4}: This land becomes a 3/3 creature with vigilance and all creature types. It's still a land. this.addAbility(new SimpleActivatedAbility( - new BecomesCreatureSourceEffect(new SoulStoneSanctuaryToken(), CardType.LAND, Duration.WhileOnBattlefield) - .setText("this land becomes a 3/3 creature with vigilance and all creature types. It's still a land"), - new GenericManaCost(4) + new BecomesCreatureSourceEffect( + new CreatureToken(3, 3) + .withAbility(VigilanceAbility.getInstance()) + .withAllCreatureTypes(true), + CardType.LAND, + Duration.WhileOnBattlefield + ).setText("this land becomes a 3/3 creature with vigilance and all creature types. It's still a land"), + new GenericManaCost(4) )); } @@ -45,23 +48,3 @@ public final class SoulstoneSanctuary extends CardImpl { return new SoulstoneSanctuary(this); } } - -class SoulStoneSanctuaryToken extends TokenImpl { - - public SoulStoneSanctuaryToken() { - super("", "3/3 creature with vigilance and all creature types"); - cardType.add(CardType.CREATURE); - subtype.setIsAllCreatureTypes(true); - power = new MageInt(3); - toughness = new MageInt(3); - - this.addAbility(VigilanceAbility.getInstance()); - } - private SoulStoneSanctuaryToken(final SoulStoneSanctuaryToken token) { - super(token); - } - - public SoulStoneSanctuaryToken copy() { - return new SoulStoneSanctuaryToken(this); - } -} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 484db5c7685..62a4b72d361 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -124,6 +124,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Feisty Spikeling", 223, Rarity.COMMON, mage.cards.f.FeistySpikeling.class)); cards.add(new SetCardInfo("Figure of Fable", 224, Rarity.RARE, mage.cards.f.FigureOfFable.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Figure of Fable", 372, Rarity.RARE, mage.cards.f.FigureOfFable.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Firdoch Core", 255, Rarity.COMMON, mage.cards.f.FirdochCore.class)); cards.add(new SetCardInfo("Flame-Chain Mauler", 138, Rarity.COMMON, mage.cards.f.FlameChainMauler.class)); cards.add(new SetCardInfo("Flamebraider", 139, Rarity.UNCOMMON, mage.cards.f.Flamebraider.class)); cards.add(new SetCardInfo("Flamekin Gildweaver", 140, Rarity.COMMON, mage.cards.f.FlamekinGildweaver.class)); From 6e3f83246e302a7d3b0b53c45f25e96b9412b50d Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 21:06:48 -0500 Subject: [PATCH 66/91] [ECL] Implement Ajani, Outland Chaperone --- .../mage/cards/a/AjaniOutlandChaperone.java | 68 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AjaniOutlandChaperone.java diff --git a/Mage.Sets/src/mage/cards/a/AjaniOutlandChaperone.java b/Mage.Sets/src/mage/cards/a/AjaniOutlandChaperone.java new file mode 100644 index 00000000000..f5aadfe9d0d --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AjaniOutlandChaperone.java @@ -0,0 +1,68 @@ +package mage.cards.a; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.dynamicvalue.common.ControllerLifeCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.filter.predicate.mageobject.PermanentPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.permanent.token.KithkinGreenWhiteToken; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AjaniOutlandChaperone extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("tapped creature"); + private static final FilterCard filter2 = new FilterNonlandCard("nonland permanent cards with mana value 3 or less"); + + static { + filter.add(TappedPredicate.TAPPED); + filter2.add(PermanentPredicate.instance); + filter2.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); + } + + public AjaniOutlandChaperone(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{W}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.AJANI); + this.setStartingLoyalty(3); + + // +1: Create a 1/1 green and white Kithkin creature token. + this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new KithkinGreenWhiteToken()), 1)); + + // -2: Ajani deals 4 damage to target tapped creature. + Ability ability = new LoyaltyAbility(new DamageTargetEffect(4), -2); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + + // -8: Look at the top X cards of your library, where X is your life total. You may put any number of nonland permanent cards with mana value 3 or less from among them onto the battlefield. Then shuffle. + this.addAbility(new LoyaltyAbility(new LookLibraryAndPickControllerEffect( + ControllerLifeCount.instance, Integer.MAX_VALUE, + filter2, PutCards.BATTLEFIELD, PutCards.SHUFFLE + ), -8)); + } + + private AjaniOutlandChaperone(final AjaniOutlandChaperone card) { + super(card); + } + + @Override + public AjaniOutlandChaperone copy() { + return new AjaniOutlandChaperone(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 62a4b72d361..ee52803de94 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -24,6 +24,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Abigale, Eloquent First-Year", 368, Rarity.RARE, mage.cards.a.AbigaleEloquentFirstYear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Adept Watershaper", 297, Rarity.RARE, mage.cards.a.AdeptWatershaper.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Adept Watershaper", 3, Rarity.RARE, mage.cards.a.AdeptWatershaper.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ajani, Outland Chaperone", 284, Rarity.MYTHIC, mage.cards.a.AjaniOutlandChaperone.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ajani, Outland Chaperone", 4, Rarity.MYTHIC, mage.cards.a.AjaniOutlandChaperone.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Appeal to Eirdu", 5, Rarity.COMMON, mage.cards.a.AppealToEirdu.class)); cards.add(new SetCardInfo("Aquitect's Defenses", 44, Rarity.COMMON, mage.cards.a.AquitectsDefenses.class)); cards.add(new SetCardInfo("Ashling's Command", 205, Rarity.RARE, mage.cards.a.AshlingsCommand.class, NON_FULL_USE_VARIOUS)); From 67f86b21d9b456d6fbebfc4ba87abf134dce4596 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 21:11:52 -0500 Subject: [PATCH 67/91] [ECL] Implement Creakwood Safewright --- .../src/mage/cards/c/CreakwoodSafewright.java | 66 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 67 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CreakwoodSafewright.java diff --git a/Mage.Sets/src/mage/cards/c/CreakwoodSafewright.java b/Mage.Sets/src/mage/cards/c/CreakwoodSafewright.java new file mode 100644 index 00000000000..541b10075d6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CreakwoodSafewright.java @@ -0,0 +1,66 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CardsInControllerGraveyardCondition; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.RemoveCounterSourceEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterCard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CreakwoodSafewright extends CardImpl { + + private static final Condition condition = new CompoundCondition( + "there is an Elf card in your graveyard and {this} has a -1/-1 counter on it", + new CardsInControllerGraveyardCondition(1, new FilterCard(SubType.ELF)), + new SourceHasCounterCondition(CounterType.M1M1) + ); + private static final Hint hint = new ConditionHint( + new CardsInControllerGraveyardCondition(1, new FilterCard(SubType.ELF)), + "There is an Elf card in your graveyard" + ); + + public CreakwoodSafewright(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // This creature enters with three -1/-1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(3)), + "with three -1/-1 counters on it" + )); + + // At the beginning of your end step, if there is an Elf card in your graveyard and this creature has a -1/-1 counter on it, remove a -1/-1 counter from this creature. + this.addAbility(new BeginningOfEndStepTriggeredAbility( + new RemoveCounterSourceEffect(CounterType.M1M1.createInstance()) + ).withInterveningIf(condition).addHint(hint)); + } + + private CreakwoodSafewright(final CreakwoodSafewright card) { + super(card); + } + + @Override + public CreakwoodSafewright copy() { + return new CreakwoodSafewright(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index ee52803de94..affd93af596 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -86,6 +86,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Chomping Changeling", 172, Rarity.UNCOMMON, mage.cards.c.ChompingChangeling.class)); cards.add(new SetCardInfo("Cinder Strike", 131, Rarity.COMMON, mage.cards.c.CinderStrike.class)); cards.add(new SetCardInfo("Clachan Festival", 10, Rarity.UNCOMMON, mage.cards.c.ClachanFestival.class)); + cards.add(new SetCardInfo("Creakwood Safewright", 96, Rarity.UNCOMMON, mage.cards.c.CreakwoodSafewright.class)); cards.add(new SetCardInfo("Crib Swap", 11, Rarity.UNCOMMON, mage.cards.c.CribSwap.class)); cards.add(new SetCardInfo("Crossroads Watcher", 173, Rarity.COMMON, mage.cards.c.CrossroadsWatcher.class)); cards.add(new SetCardInfo("Darkness Descends", 97, Rarity.UNCOMMON, mage.cards.d.DarknessDescends.class)); From 08967f688ded48adf61195f67984f74a475de859 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 21:15:24 -0500 Subject: [PATCH 68/91] [ECL] Implement Morcant's Eyes --- Mage.Sets/src/mage/cards/m/MorcantsEyes.java | 55 ++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MorcantsEyes.java diff --git a/Mage.Sets/src/mage/cards/m/MorcantsEyes.java b/Mage.Sets/src/mage/cards/m/MorcantsEyes.java new file mode 100644 index 00000000000..d25abc15998 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MorcantsEyes.java @@ -0,0 +1,55 @@ +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.game.permanent.token.BlackGreenElfToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MorcantsEyes extends CardImpl { + + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(new FilterCard(SubType.ELF), null); + private static final Hint hint = new ValueHint("Elf cards in your graveyard", xValue); + + public MorcantsEyes(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.KINDRED, CardType.ENCHANTMENT}, "{1}{G}"); + + this.subtype.add(SubType.ELF); + + // At the beginning of your upkeep, surveil 1. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SurveilEffect(1))); + + // {4}{G}{G}, Sacrifice this enchantment: Create X 2/2 black and green Elf creature tokens, where X is the number of Elf cards in your graveyard. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new CreateTokenEffect(new BlackGreenElfToken(), xValue), new ManaCostsImpl<>("{4}{G}{G}") + ); + ability.addCost(new SacrificeSourceCost()); + this.addAbility(ability.addHint(hint)); + } + + private MorcantsEyes(final MorcantsEyes card) { + super(card); + } + + @Override + public MorcantsEyes copy() { + return new MorcantsEyes(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index affd93af596..8dce90bd03c 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -205,6 +205,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Moon-Vigil Adherents", 184, Rarity.UNCOMMON, mage.cards.m.MoonVigilAdherents.class)); cards.add(new SetCardInfo("Moonglove Extractor", 109, Rarity.COMMON, mage.cards.m.MoongloveExtractor.class)); cards.add(new SetCardInfo("Moonlit Lamenter", 26, Rarity.UNCOMMON, mage.cards.m.MoonlitLamenter.class)); + cards.add(new SetCardInfo("Morcant's Eyes", 185, Rarity.UNCOMMON, mage.cards.m.MorcantsEyes.class)); cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Morningtide's Light", 301, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 272, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); From 4cf9568953fc6e08cd947970580d66c3b581d323 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 9 Jan 2026 21:19:37 -0500 Subject: [PATCH 69/91] [ECL] Implement Prismatic Undercurrents --- .../mage/cards/p/PrismaticUndercurrents.java | 88 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 89 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PrismaticUndercurrents.java diff --git a/Mage.Sets/src/mage/cards/p/PrismaticUndercurrents.java b/Mage.Sets/src/mage/cards/p/PrismaticUndercurrents.java new file mode 100644 index 00000000000..60a3523045e --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PrismaticUndercurrents.java @@ -0,0 +1,88 @@ +package mage.cards.p; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.ColorsAmongControlledPermanentsCount; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.PlayAdditionalLandsControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class PrismaticUndercurrents extends CardImpl { + + public PrismaticUndercurrents(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}"); + + // Vivid -- When this enchantment enters, search your library for up to X basic land cards, where X is the number of colors among permanents you control. Reveal those cards, put them into your hand, then shuffle. + this.addAbility(new EntersBattlefieldTriggeredAbility(new PrismaticUndercurrentsEffect()) + .setAbilityWord(AbilityWord.VIVID) + .addHint(ColorsAmongControlledPermanentsCount.ALL_PERMANENTS.getHint())); + + // You may play an additional land on each of your turns. + this.addAbility(new SimpleStaticAbility( + new PlayAdditionalLandsControllerEffect(1, Duration.WhileOnBattlefield) + )); + } + + private PrismaticUndercurrents(final PrismaticUndercurrents card) { + super(card); + } + + @Override + public PrismaticUndercurrents copy() { + return new PrismaticUndercurrents(this); + } +} + +class PrismaticUndercurrentsEffect extends OneShotEffect { + + PrismaticUndercurrentsEffect() { + super(Outcome.Benefit); + staticText = "search your library for up to X basic land cards, where X is the number of colors " + + "among permanents you control. Reveal those cards, put them into your hand, then shuffle"; + } + + private PrismaticUndercurrentsEffect(final PrismaticUndercurrentsEffect effect) { + super(effect); + } + + @Override + public PrismaticUndercurrentsEffect copy() { + return new PrismaticUndercurrentsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + TargetCardInLibrary target = new TargetCardInLibrary( + 0, + ColorsAmongControlledPermanentsCount + .ALL_PERMANENTS + .calculate(game, source, this), + StaticFilters.FILTER_CARD_BASIC_LANDS + ); + player.searchLibrary(target, source, game); + Cards cards = new CardsImpl(target.getTargets()); + cards.retainZone(Zone.LIBRARY, game); + player.revealCards(source, cards, game); + player.moveCards(cards, Zone.HAND, source, game); + player.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 8dce90bd03c..9b27e999686 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -231,6 +231,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Plains", 274, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Plains", 279, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Prideful Feastling", 238, Rarity.COMMON, mage.cards.p.PridefulFeastling.class)); + cards.add(new SetCardInfo("Prismatic Undercurrents", 189, Rarity.UNCOMMON, mage.cards.p.PrismaticUndercurrents.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); cards.add(new SetCardInfo("Reckless Ransacking", 152, Rarity.COMMON, mage.cards.r.RecklessRansacking.class)); From 33fd5504c9903d8daf5085d14f516af8252a95bb Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:24:00 -0600 Subject: [PATCH 70/91] [ECL] Implement Scarblade's Malice (#14211) --- .../src/mage/cards/s/ScarbladesMalice.java | 46 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ScarbladesMalice.java diff --git a/Mage.Sets/src/mage/cards/s/ScarbladesMalice.java b/Mage.Sets/src/mage/cards/s/ScarbladesMalice.java new file mode 100644 index 00000000000..b0f5a45fa91 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ScarbladesMalice.java @@ -0,0 +1,46 @@ +package mage.cards.s; + +import java.util.UUID; + +import mage.abilities.common.delayed.WhenTargetDiesDelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.BlackGreenElfToken; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author muz + */ +public final class ScarbladesMalice extends CardImpl { + + public ScarbladesMalice(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}"); + + // Target creature you control gains deathtouch and lifelink until end of turn. + // When that creature dies this turn, create a 2/2 black and green Elf creature token. + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance()) + .setText("target creature you control gains deathtouch")); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(LifelinkAbility.getInstance()) + .setText("and lifelink until end of turn")); + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect( + new WhenTargetDiesDelayedTriggeredAbility(new CreateTokenEffect(new BlackGreenElfToken())) + )); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + } + + private ScarbladesMalice(final ScarbladesMalice card) { + super(card); + } + + @Override + public ScarbladesMalice copy() { + return new ScarbladesMalice(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 9b27e999686..b5bceb5dcaa 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -249,6 +249,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Sapling Nursery", 192, Rarity.RARE, mage.cards.s.SaplingNursery.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sapling Nursery", 328, Rarity.RARE, mage.cards.s.SaplingNursery.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Scarblade Scout", 118, Rarity.COMMON, mage.cards.s.ScarbladeScout.class)); + cards.add(new SetCardInfo("Scarblade's Malice", 119, Rarity.COMMON, mage.cards.s.ScarbladesMalice.class)); cards.add(new SetCardInfo("Scuzzback Scrounger", 153, Rarity.RARE, mage.cards.s.ScuzzbackScrounger.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Scuzzback Scrounger", 320, Rarity.RARE, mage.cards.s.ScuzzbackScrounger.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sear", 154, Rarity.UNCOMMON, mage.cards.s.Sear.class, NON_FULL_USE_VARIOUS)); From caf632cbc4f8202a609ca97ce9b3d927b4a9cb2a Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:25:04 -0600 Subject: [PATCH 71/91] [ECL] Implement Bristlebane Outrider (#14212) --- .../src/mage/cards/b/BristlebaneOutrider.java | 107 ++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 108 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BristlebaneOutrider.java diff --git a/Mage.Sets/src/mage/cards/b/BristlebaneOutrider.java b/Mage.Sets/src/mage/cards/b/BristlebaneOutrider.java new file mode 100644 index 00000000000..0ddbd6c2fa3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BristlebaneOutrider.java @@ -0,0 +1,107 @@ +package mage.cards.b; + +import java.util.*; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.DauntAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.watchers.Watcher; + +/** + * + * @author muz + */ +public final class BristlebaneOutrider extends CardImpl { + + public BristlebaneOutrider(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add(SubType.KITHKIN); + this.subtype.add(SubType.KNIGHT); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // This creature can't be blocked by creatures with power 2 or less. + this.addAbility(new DauntAbility()); + + // As long as another creature entered the battlefield under your control this turn, this creature gets +2/+0. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new BoostSourceEffect(2, 0, Duration.WhileOnBattlefield), + BristlebaneOutriderCondition.instance, "as long as another creature entered the battlefield under your control this turn, this creature gets +2/+0." + )), new BristlebaneOutriderWatcher()); + + } + + private BristlebaneOutrider(final BristlebaneOutrider card) { + super(card); + } + + @Override + public BristlebaneOutrider copy() { + return new BristlebaneOutrider(this); + } +} + +enum BristlebaneOutriderCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + return BristlebaneOutriderWatcher.checkPlayer(source, game); + } +} + +class BristlebaneOutriderWatcher extends Watcher { + + private final Map> creatureMap = new HashMap<>(); + private static final Set emptySet = Collections.unmodifiableSet(new HashSet<>()); + + BristlebaneOutriderWatcher() { + super(WatcherScope.GAME); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { + return; + } + Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget(); + if (permanent == null) { + return; + } + if (permanent.isCreature(game)) { + creatureMap + .computeIfAbsent(permanent.getControllerId(), x -> new HashSet<>()) + .add(new MageObjectReference(permanent, game)); + } + } + + @Override + public void reset() { + super.reset(); + creatureMap.clear(); + } + + static boolean checkPlayer(Ability source, Game game) { + BristlebaneOutriderWatcher watcher = game.getState().getWatcher(BristlebaneOutriderWatcher.class); + return watcher + .creatureMap + .getOrDefault(source.getControllerId(), emptySet) + .stream() + .anyMatch(mor -> !mor.refersTo(source.getSourceObject(game), game)); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index b5bceb5dcaa..2b731d4f652 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -68,6 +68,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Brigid's Command", 332, Rarity.RARE, mage.cards.b.BrigidsCommand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bristlebane Battler", 168, Rarity.RARE, mage.cards.b.BristlebaneBattler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bristlebane Battler", 325, Rarity.RARE, mage.cards.b.BristlebaneBattler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bristlebane Outrider", 169, Rarity.UNCOMMON, mage.cards.b.BristlebaneOutrider.class)); cards.add(new SetCardInfo("Burdened Stoneback", 8, Rarity.UNCOMMON, mage.cards.b.BurdenedStoneback.class)); cards.add(new SetCardInfo("Burning Curiosity", 129, Rarity.COMMON, mage.cards.b.BurningCuriosity.class)); cards.add(new SetCardInfo("Catharsis", 209, Rarity.MYTHIC, mage.cards.c.Catharsis.class, NON_FULL_USE_VARIOUS)); From 44b6ec4d1c10f964f11252f4bab4c46f14fd9323 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:26:42 -0600 Subject: [PATCH 72/91] [ECL] Implement Pummeler for Hire (#14213) --- .../src/mage/cards/p/PummelerForHire.java | 60 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 61 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PummelerForHire.java diff --git a/Mage.Sets/src/mage/cards/p/PummelerForHire.java b/Mage.Sets/src/mage/cards/p/PummelerForHire.java new file mode 100644 index 00000000000..1a50bdc93ab --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PummelerForHire.java @@ -0,0 +1,60 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.keyword.ReachAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GreatestAmongPermanentsValue; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.hint.Hint; +import mage.abilities.keyword.WardAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class PummelerForHire extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.GIANT, "Giants you control"); + static final GreatestAmongPermanentsValue xValue = new GreatestAmongPermanentsValue(GreatestAmongPermanentsValue.Quality.Power, filter); + private static final Hint hint = xValue.getHint(); + + public PummelerForHire(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add(SubType.GIANT); + this.subtype.add(SubType.MERCENARY); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // Ward {2} + this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + + // When this creature enters, you gain X life, where X is the greatest power among Giants you control. + EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(xValue)); + ability.addHint(hint); + this.addAbility(ability); + } + + private PummelerForHire(final PummelerForHire card) { + super(card); + } + + @Override + public PummelerForHire copy() { + return new PummelerForHire(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 2b731d4f652..75a676d5bf6 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -235,6 +235,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Prismatic Undercurrents", 189, Rarity.UNCOMMON, mage.cards.p.PrismaticUndercurrents.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); + cards.add(new SetCardInfo("Pummeler for Hire", 190, Rarity.UNCOMMON, mage.cards.p.PummelerForHire.class)); cards.add(new SetCardInfo("Reckless Ransacking", 152, Rarity.COMMON, mage.cards.r.RecklessRansacking.class)); cards.add(new SetCardInfo("Reluctant Dounguard", 31, Rarity.COMMON, mage.cards.r.ReluctantDounguard.class)); cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); From 20a9a48c87195bd7ab9319d507c5f1133f6973a8 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:27:55 -0600 Subject: [PATCH 73/91] [ECL] Implement Morcant's Loyalist (#14214) --- .../src/mage/cards/m/MorcantsLoyalist.java | 56 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java diff --git a/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java b/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java new file mode 100644 index 00000000000..154d1796915 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java @@ -0,0 +1,56 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesSourceTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCardInYourGraveyard; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author muz + */ +public final class MorcantsLoyalist extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.ELF, "Elves"); + private static final FilterCard filter2 = new FilterCard(SubType.ELF, "another target Elf card from your graveyard"); + + + public MorcantsLoyalist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Other Elves you control get +1/+1. + this.addAbility(new SimpleStaticAbility(new BoostControlledEffect( + 1, 1, Duration.WhileOnBattlefield, filter, true + ))); + + // When this creature dies, return another target Elf card from your graveyard to your hand. + Ability ability = new DiesSourceTriggeredAbility(new ReturnFromGraveyardToHandTargetEffect()); + ability.addTarget(new TargetCardInYourGraveyard(filter2)); + this.addAbility(ability); + } + + private MorcantsLoyalist(final MorcantsLoyalist card) { + super(card); + } + + @Override + public MorcantsLoyalist copy() { + return new MorcantsLoyalist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 75a676d5bf6..20fd5695cfd 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -207,6 +207,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Moonglove Extractor", 109, Rarity.COMMON, mage.cards.m.MoongloveExtractor.class)); cards.add(new SetCardInfo("Moonlit Lamenter", 26, Rarity.UNCOMMON, mage.cards.m.MoonlitLamenter.class)); cards.add(new SetCardInfo("Morcant's Eyes", 185, Rarity.UNCOMMON, mage.cards.m.MorcantsEyes.class)); + cards.add(new SetCardInfo("Morcant's Loyalist", 236, Rarity.UNCOMMON, mage.cards.m.MorcantsLoyalist.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Morcant's Loyalist", 341, Rarity.UNCOMMON, mage.cards.m.MorcantsLoyalist.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Morningtide's Light", 301, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 272, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); From 36792373f0c6ac34f7c79bfc92097dca2ef70199 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:29:23 -0600 Subject: [PATCH 74/91] [ECL] Implement Reaping Willow (#14215) Co-authored-by: Evan Kranzler --- Mage.Sets/src/mage/cards/r/ReapingWillow.java | 68 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 69 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/ReapingWillow.java diff --git a/Mage.Sets/src/mage/cards/r/ReapingWillow.java b/Mage.Sets/src/mage/cards/r/ReapingWillow.java new file mode 100644 index 00000000000..39cfd095bd7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReapingWillow.java @@ -0,0 +1,68 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; + +/** + * + * @author muz + */ +public final class ReapingWillow extends CardImpl { + + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card with mana value 3 or less from your graveyard"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); + } + + public ReapingWillow(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W/B}{W/B}{W/B}"); + + this.subtype.add(SubType.TREEFOLK); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(3); + this.toughness = new MageInt(6); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // This creature enters with two -1/-1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(2)), + "with two -1/-1 counters on it" + )); + + // {1}{W/B}, Remove two counters from this creature: Return target creature card with mana value 3 or less from your graveyard to the battlefield. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), new ManaCostsImpl<>("{1}{W/B}")); + ability.addCost(new RemoveCountersSourceCost(2)); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(ability); + } + + private ReapingWillow(final ReapingWillow card) { + super(card); + } + + @Override + public ReapingWillow copy() { + return new ReapingWillow(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 20fd5695cfd..52c0ee1e7db 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -237,6 +237,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Prismatic Undercurrents", 189, Rarity.UNCOMMON, mage.cards.p.PrismaticUndercurrents.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); + cards.add(new SetCardInfo("Reaping Willow", 240, Rarity.UNCOMMON, mage.cards.r.ReapingWillow.class)); cards.add(new SetCardInfo("Pummeler for Hire", 190, Rarity.UNCOMMON, mage.cards.p.PummelerForHire.class)); cards.add(new SetCardInfo("Reckless Ransacking", 152, Rarity.COMMON, mage.cards.r.RecklessRansacking.class)); cards.add(new SetCardInfo("Reluctant Dounguard", 31, Rarity.COMMON, mage.cards.r.ReluctantDounguard.class)); From eecf8db199c21a49adfae81efd359a673e9ca073 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:37:02 -0600 Subject: [PATCH 75/91] [ECL] Implement Sygg's Command (#14217) --- .../src/mage/cards/s/SavageAlliance.java | 2 - Mage.Sets/src/mage/cards/s/SyggsCommand.java | 103 ++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 3 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/s/SyggsCommand.java diff --git a/Mage.Sets/src/mage/cards/s/SavageAlliance.java b/Mage.Sets/src/mage/cards/s/SavageAlliance.java index 5f262f47e58..0010eefd63b 100644 --- a/Mage.Sets/src/mage/cards/s/SavageAlliance.java +++ b/Mage.Sets/src/mage/cards/s/SavageAlliance.java @@ -24,8 +24,6 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetCreaturePermanent; - import java.util.List; import java.util.UUID; diff --git a/Mage.Sets/src/mage/cards/s/SyggsCommand.java b/Mage.Sets/src/mage/cards/s/SyggsCommand.java new file mode 100644 index 00000000000..06c4bbce475 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SyggsCommand.java @@ -0,0 +1,103 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.DrawCardTargetEffect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.LifelinkAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; + +/** + * + * @author muz + */ +public final class SyggsCommand extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(SubType.MERFOLK); + + public SyggsCommand(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.KINDRED, CardType.SORCERY}, "{1}{W}{U}"); + + this.subtype.add(SubType.MERFOLK); + + // Choose two -- + this.getSpellAbility().getModes().setMinModes(2); + this.getSpellAbility().getModes().setMaxModes(2); + + // * Create a token that's a copy of target Merfolk you control. + this.getSpellAbility().addEffect(new CreateTokenCopyTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + + // * Creatures target player controls gain lifelink until end of turn. + this.getSpellAbility().addMode(new Mode(new SyggsCommandGainLifelinkEffect()).addTarget(new TargetPlayer())); + + // * Target player draws a card. + this.getSpellAbility().addMode(new Mode(new DrawCardTargetEffect(1)).addTarget(new TargetPlayer())); + + // * Tap target creature. Put a stun counter on it. + Mode mode = new Mode(new TapTargetEffect()); + mode.addEffect(new AddCountersTargetEffect(CounterType.STUN.createInstance()).withTargetDescription("it")); + mode.addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addMode(mode); + } + + private SyggsCommand(final SyggsCommand card) { + super(card); + } + + @Override + public SyggsCommand copy() { + return new SyggsCommand(this); + } +} + +class SyggsCommandGainLifelinkEffect extends OneShotEffect { + + SyggsCommandGainLifelinkEffect() { + super(Outcome.AddAbility); + staticText = "Creatures target player controls gain lifelink until end of turn"; + } + + private SyggsCommandGainLifelinkEffect(final SyggsCommandGainLifelinkEffect effect) { + super(effect); + } + + @Override + public SyggsCommandGainLifelinkEffect copy() { + return new SyggsCommandGainLifelinkEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (player != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate((player.getId()))); + ContinuousEffect effect = new GainAbilityAllEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, filter); + game.addEffect(effect, source); + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 52c0ee1e7db..93abd7a9f2b 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -287,6 +287,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Swamp", 276, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Swamp", 281, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Swat Away", 75, Rarity.UNCOMMON, mage.cards.s.SwatAway.class)); + cards.add(new SetCardInfo("Sygg's Command", 244, Rarity.RARE, mage.cards.s.SyggsCommand.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sygg's Command", 342, Rarity.RARE, mage.cards.s.SyggsCommand.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sygg, Wanderwine Wisdom", 288, Rarity.RARE, mage.cards.s.SyggWanderwineWisdom.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sygg, Wanderwine Wisdom", 76, Rarity.RARE, mage.cards.s.SyggWanderwineWisdom.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tanufel Rimespeaker", 77, Rarity.UNCOMMON, mage.cards.t.TanufelRimespeaker.class)); From 909f9d601d8873b64d505cd6f3ac7231edd3fbf0 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:38:03 -0600 Subject: [PATCH 76/91] [ECL] Implement Gilt Leaf's Embrace (#14219) --- .../src/mage/cards/g/GiltLeafsEmbrace.java | 66 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 67 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GiltLeafsEmbrace.java diff --git a/Mage.Sets/src/mage/cards/g/GiltLeafsEmbrace.java b/Mage.Sets/src/mage/cards/g/GiltLeafsEmbrace.java new file mode 100644 index 00000000000..4ceb4d4fb64 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GiltLeafsEmbrace.java @@ -0,0 +1,66 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.constants.SubType; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author muz + */ +public final class GiltLeafsEmbrace extends CardImpl { + + public GiltLeafsEmbrace(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}"); + + this.subtype.add(SubType.AURA); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // When this Aura enters, enchanted creature gains trample and indestructible until end of turn. + EntersBattlefieldTriggeredAbility ability = new EntersBattlefieldTriggeredAbility( + new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA, Duration.EndOfTurn) + .setText("enchanted creature gains trample") + ); + ability.addEffect( + new GainAbilityAttachedEffect(IndestructibleAbility.getInstance(), AttachmentType.AURA, Duration.EndOfTurn) + .setText("and indestructible until end of turn") + ); + this.addAbility(ability); + + // Enchanted creature gets +2/+0. + this.addAbility(new SimpleStaticAbility(new BoostEnchantedEffect(2, 0))); + } + + private GiltLeafsEmbrace(final GiltLeafsEmbrace card) { + super(card); + } + + @Override + public GiltLeafsEmbrace copy() { + return new GiltLeafsEmbrace(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 93abd7a9f2b..69246e75df7 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -142,6 +142,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Gallant Fowlknight", 17, Rarity.COMMON, mage.cards.g.GallantFowlknight.class)); cards.add(new SetCardInfo("Gangly Stompling", 226, Rarity.COMMON, mage.cards.g.GanglyStompling.class)); cards.add(new SetCardInfo("Giantfall", 141, Rarity.UNCOMMON, mage.cards.g.Giantfall.class)); + cards.add(new SetCardInfo("Gilt-Leaf's Embrace", 177, Rarity.COMMON, mage.cards.g.GiltLeafsEmbrace.class)); cards.add(new SetCardInfo("Glamer Gifter", 49, Rarity.UNCOMMON, mage.cards.g.GlamerGifter.class)); cards.add(new SetCardInfo("Glamermite", 50, Rarity.COMMON, mage.cards.g.Glamermite.class)); cards.add(new SetCardInfo("Glister Bairn", 227, Rarity.UNCOMMON, mage.cards.g.GlisterBairn.class)); From 763d975f18b50411005905f2e11f65c1495ad9e4 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:39:18 -0600 Subject: [PATCH 77/91] [ECL] Illusion Spinners (#14221) * Reference and clean up Paradise Druid * [ECL] Implement Illusion Spinners --- .../src/mage/cards/i/IllusionSpinners.java | 65 +++++++++++++++++++ Mage.Sets/src/mage/cards/p/ParadiseDruid.java | 11 ++-- Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 3 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/i/IllusionSpinners.java diff --git a/Mage.Sets/src/mage/cards/i/IllusionSpinners.java b/Mage.Sets/src/mage/cards/i/IllusionSpinners.java new file mode 100644 index 00000000000..6d49b8c66b0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IllusionSpinners.java @@ -0,0 +1,65 @@ +package mage.cards.i; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +import mage.abilities.common.CastAsThoughItHadFlashIfConditionAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.condition.common.SourceTappedCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HexproofAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author muz + */ +public final class IllusionSpinners extends CardImpl { + + private static final Condition condition = new PermanentsOnTheBattlefieldCondition( + new FilterControlledPermanent(SubType.FAERIE, "you control a Faerie") + ); + + public IllusionSpinners(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}"); + + this.subtype.add(SubType.FAERIE); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // You may cast this spell as though it had flash if you control a Faerie. + this.addAbility(new CastAsThoughItHadFlashIfConditionAbility( + condition, "you may cast this spell as though it had flash if you control a Faerie" + )); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // This creature has hexproof as long as it's untapped. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new GainAbilitySourceEffect( + HexproofAbility.getInstance(), + Duration.WhileOnBattlefield + ), SourceTappedCondition.UNTAPPED, + "{this} has hexproof as long as it's untapped" + ))); + } + + private IllusionSpinners(final IllusionSpinners card) { + super(card); + } + + @Override + public IllusionSpinners copy() { + return new IllusionSpinners(this); + } +} diff --git a/Mage.Sets/src/mage/cards/p/ParadiseDruid.java b/Mage.Sets/src/mage/cards/p/ParadiseDruid.java index 13f1531bd90..633c42d6259 100644 --- a/Mage.Sets/src/mage/cards/p/ParadiseDruid.java +++ b/Mage.Sets/src/mage/cards/p/ParadiseDruid.java @@ -2,7 +2,6 @@ package mage.cards.p; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.InvertCondition; import mage.abilities.condition.common.SourceTappedCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; @@ -31,11 +30,11 @@ public final class ParadiseDruid extends CardImpl { // Paradise Druid has hexproof as long as it's untapped. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( - new GainAbilitySourceEffect( - HexproofAbility.getInstance(), - Duration.WhileOnBattlefield - ), SourceTappedCondition.UNTAPPED, - "{this} has hexproof as long as it's untapped" + new GainAbilitySourceEffect( + HexproofAbility.getInstance(), + Duration.WhileOnBattlefield + ), SourceTappedCondition.UNTAPPED, + "{this} has hexproof as long as it's untapped" ))); // {T}: Add one mana of any color. diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 69246e75df7..dca99900d05 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -170,6 +170,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("High Perfect Morcant", 229, Rarity.RARE, mage.cards.h.HighPerfectMorcant.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("High Perfect Morcant", 373, Rarity.RARE, mage.cards.h.HighPerfectMorcant.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hovel Hurler", 230, Rarity.UNCOMMON, mage.cards.h.HovelHurler.class)); + cards.add(new SetCardInfo("Illusion Spinners", 55, Rarity.UNCOMMON, mage.cards.i.IllusionSpinners.class)); cards.add(new SetCardInfo("Impolite Entrance", 146, Rarity.UNCOMMON, mage.cards.i.ImpoliteEntrance.class)); cards.add(new SetCardInfo("Iron-Shield Elf", 108, Rarity.UNCOMMON, mage.cards.i.IronShieldElf.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Iron-Shield Elf", 404, Rarity.UNCOMMON, mage.cards.i.IronShieldElf.class, NON_FULL_USE_VARIOUS)); From 345eda08a55f07260ac3bb49ae7b5919ce630bf0 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:42:26 -0600 Subject: [PATCH 78/91] [ECL] Implement Gathering Stone (#14222) --- .../src/mage/cards/g/GatheringStone.java | 112 ++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 113 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GatheringStone.java diff --git a/Mage.Sets/src/mage/cards/g/GatheringStone.java b/Mage.Sets/src/mage/cards/g/GatheringStone.java new file mode 100644 index 00000000000..868f9170cad --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GatheringStone.java @@ -0,0 +1,112 @@ +package mage.cards.g; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.cost.SpellsCostReductionAllOfChosenSubtypeEffect; +import mage.abilities.meta.OrTriggeredAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author muz + */ +public final class GatheringStone extends CardImpl { + + public GatheringStone(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}"); + + // As this artifact enters, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility( + new ChooseCreatureTypeEffect(Outcome.Benefit) + )); + + // Spells you cast of the chosen type cost {1} less to cast. + this.addAbility(new SimpleStaticAbility( + new SpellsCostReductionAllOfChosenSubtypeEffect( + new FilterCreatureCard("Creature spells you cast of the chosen type"), 1, true + ) + )); + + // When this artifact enters and at the beginning of your upkeep, look at the top card of your library. + // If it's a card of the chosen type, you may reveal it and put it into your hand. + // If you don't put the card into your hand, you may put it into your graveyard. + this.addAbility(new OrTriggeredAbility( + Zone.BATTLEFIELD, + new GatheringStoneEffect(), + false, + "When this artifact enters and at the beginning of your upkeep, ", + new EntersBattlefieldTriggeredAbility(null), + new BeginningOfUpkeepTriggeredAbility(null) + )); + } + + private GatheringStone(final GatheringStone card) { + super(card); + } + + @Override + public GatheringStone copy() { + return new GatheringStone(this); + } +} + +class GatheringStoneEffect extends OneShotEffect { + + GatheringStoneEffect() { + super(Outcome.Benefit); + staticText = "look at the top card of your library. " + + "If it's a card of the chosen type, you may reveal it and put it into your hand. " + + "If you don't put the card into your hand, you may put it into your graveyard"; + } + + private GatheringStoneEffect(final GatheringStoneEffect effect) { + super(effect); + } + + @Override + public GatheringStoneEffect copy() { + return new GatheringStoneEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Card topCard = controller.getLibrary().getFromTop(game); + if (topCard == null) { + return false; + } + SubType subtype = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); + controller.lookAtCards("Top card of library", topCard, game); + if (topCard.hasSubtype(subtype, game)) { + if (controller.chooseUse(Outcome.DrawCard, "Reveal " + topCard.getName() + " and put it into your hand?", source, game)) { + controller.revealCards(source, new CardsImpl(topCard), game); + controller.moveCards(topCard, Zone.HAND, source, game); + return true; + } + } + if (controller.chooseUse(Outcome.Neutral, "Put " + topCard.getName() + " into your graveyard?", source, game)) { + controller.moveCards(topCard, Zone.GRAVEYARD, source, game); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index dca99900d05..e33331f38d0 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -141,6 +141,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Formidable Speaker", 366, Rarity.RARE, mage.cards.f.FormidableSpeaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gallant Fowlknight", 17, Rarity.COMMON, mage.cards.g.GallantFowlknight.class)); cards.add(new SetCardInfo("Gangly Stompling", 226, Rarity.COMMON, mage.cards.g.GanglyStompling.class)); + cards.add(new SetCardInfo("Gathering Stone", 257, Rarity.UNCOMMON, mage.cards.g.GatheringStone.class)); cards.add(new SetCardInfo("Giantfall", 141, Rarity.UNCOMMON, mage.cards.g.Giantfall.class)); cards.add(new SetCardInfo("Gilt-Leaf's Embrace", 177, Rarity.COMMON, mage.cards.g.GiltLeafsEmbrace.class)); cards.add(new SetCardInfo("Glamer Gifter", 49, Rarity.UNCOMMON, mage.cards.g.GlamerGifter.class)); From 14f79aeda954b26f2833fbb4d686ffa7ba46943b Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:45:39 -0600 Subject: [PATCH 79/91] [ECL] Implement Wanderbrine Trapper (#14224) --- .../src/mage/cards/w/WanderbrineTrapper.java | 61 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 62 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WanderbrineTrapper.java diff --git a/Mage.Sets/src/mage/cards/w/WanderbrineTrapper.java b/Mage.Sets/src/mage/cards/w/WanderbrineTrapper.java new file mode 100644 index 00000000000..aa16bcd1e4b --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WanderbrineTrapper.java @@ -0,0 +1,61 @@ +package mage.cards.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.TapTargetEffect; +import mage.constants.SubType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class WanderbrineTrapper extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another untapped creature you control"); + + static { + filter.add(AnotherPredicate.instance); + filter.add(TappedPredicate.UNTAPPED); + } + + public WanderbrineTrapper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add(SubType.MERFOLK); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // {1}, {T}, Tap another untapped creature you control: Tap target creature an opponent controls. + Ability ability = new SimpleActivatedAbility( + new TapTargetEffect(), new ManaCostsImpl<>("{1}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new TapTargetCost(new TargetControlledPermanent(filter))); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + } + + private WanderbrineTrapper(final WanderbrineTrapper card) { + super(card); + } + + @Override + public WanderbrineTrapper copy() { + return new WanderbrineTrapper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index e33331f38d0..105e86e6a24 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -321,6 +321,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Virulent Emissary", 406, Rarity.UNCOMMON, mage.cards.v.VirulentEmissary.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Voracious Tome-Skimmer", 250, Rarity.UNCOMMON, mage.cards.v.VoraciousTomeSkimmer.class)); cards.add(new SetCardInfo("Wanderbrine Preacher", 41, Rarity.COMMON, mage.cards.w.WanderbrinePreacher.class)); + cards.add(new SetCardInfo("Wanderbrine Trapper", 42, Rarity.UNCOMMON, mage.cards.w.WanderbrineTrapper.class)); cards.add(new SetCardInfo("Wanderwine Distracter", 82, Rarity.COMMON, mage.cards.w.WanderwineDistracter.class)); cards.add(new SetCardInfo("Warren Torchmaster", 163, Rarity.UNCOMMON, mage.cards.w.WarrenTorchmaster.class)); cards.add(new SetCardInfo("Wary Farmer", 251, Rarity.COMMON, mage.cards.w.WaryFarmer.class)); From 87432700f59bd1a1be4c6cd41337fa648f7e2ce6 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:46:09 -0600 Subject: [PATCH 80/91] Morcant's Loyalist should not be able to target itself in the graveyard (#14235) --- Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java b/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java index 154d1796915..0fcc37e4bb2 100644 --- a/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java +++ b/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java @@ -10,6 +10,7 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.constants.SubType; import mage.filter.FilterCard; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; import mage.target.common.TargetCardInYourGraveyard; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -25,6 +26,9 @@ public final class MorcantsLoyalist extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.ELF, "Elves"); private static final FilterCard filter2 = new FilterCard(SubType.ELF, "another target Elf card from your graveyard"); + static { + filter2.add(AnotherPredicate.instance); + } public MorcantsLoyalist(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}"); From cdcb0afaccbe917d5edf7feff11db0f36059c42d Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:46:39 -0600 Subject: [PATCH 81/91] [ECL] Implement Twinflame Travelers (#14225) --- .../src/mage/cards/t/TwinflameTravelers.java | 98 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 100 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TwinflameTravelers.java diff --git a/Mage.Sets/src/mage/cards/t/TwinflameTravelers.java b/Mage.Sets/src/mage/cards/t/TwinflameTravelers.java new file mode 100644 index 00000000000..be8e87c40b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TwinflameTravelers.java @@ -0,0 +1,98 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.util.CardUtil; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; + +/** + * + * @author muz + */ +public final class TwinflameTravelers extends CardImpl { + + public TwinflameTravelers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{R}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // If a triggered ability of another Elemental you control triggers, it triggers an additional time. + this.addAbility(new SimpleStaticAbility(new TwinflameTravelersReplacementEffect())); + } + + private TwinflameTravelers(final TwinflameTravelers card) { + super(card); + } + + @Override + public TwinflameTravelers copy() { + return new TwinflameTravelers(this); + } +} + +class TwinflameTravelersReplacementEffect extends ReplacementEffectImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(AnotherPredicate.instance); + } + + TwinflameTravelersReplacementEffect() { + super(Duration.WhileOnBattlefield, Outcome.Benefit); + staticText = "If a triggered ability of another Elemental you control triggers, " + + "it triggers an additional time"; + } + + private TwinflameTravelersReplacementEffect(final TwinflameTravelersReplacementEffect effect) { + super(effect); + } + + @Override + public TwinflameTravelersReplacementEffect copy() { + return new TwinflameTravelersReplacementEffect(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 (!source.isControlledBy(event.getPlayerId())) { + return false; + } + Permanent permanentSource = game.getPermanentOrLKIBattlefield(event.getSourceId()); + return permanentSource != null + && filter.match(permanentSource, source.getControllerId(), source, game) + && permanentSource.hasSubtype(SubType.ELEMENTAL, game); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(CardUtil.overflowInc(event.getAmount(), 1)); + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 105e86e6a24..e4b9e41d249 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -310,6 +310,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Trystan, Callous Cultivator", 199, Rarity.RARE, mage.cards.t.TrystanCallousCultivator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Trystan, Callous Cultivator", 291, Rarity.RARE, mage.cards.t.TrystanCallousCultivator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tweeze", 162, Rarity.COMMON, mage.cards.t.Tweeze.class)); + cards.add(new SetCardInfo("Twinflame Travelers", 248, Rarity.UNCOMMON, mage.cards.t.TwinflameTravelers.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Twinflame Travelers", 345, Rarity.UNCOMMON, mage.cards.t.TwinflameTravelers.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Unbury", 123, Rarity.UNCOMMON, mage.cards.u.Unbury.class)); cards.add(new SetCardInfo("Unexpected Assistance", 80, Rarity.COMMON, mage.cards.u.UnexpectedAssistance.class)); cards.add(new SetCardInfo("Unforgiving Aim", 200, Rarity.COMMON, mage.cards.u.UnforgivingAim.class)); From e51275392da6c22c7aa6019531d81e0e95e2695e Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:56:36 -0600 Subject: [PATCH 82/91] [ECL] Implement Pyrrhic Strike (#14229) Co-authored-by: Evan Kranzler --- Mage.Sets/src/mage/cards/p/PyrrhicStrike.java | 61 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 62 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PyrrhicStrike.java diff --git a/Mage.Sets/src/mage/cards/p/PyrrhicStrike.java b/Mage.Sets/src/mage/cards/p/PyrrhicStrike.java new file mode 100644 index 00000000000..2d710dd4099 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PyrrhicStrike.java @@ -0,0 +1,61 @@ +package mage.cards.p; + +import java.util.UUID; + +import mage.abilities.Mode; +import mage.abilities.condition.common.BlightedCondition; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.BlightAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author muz + */ +public final class PyrrhicStrike extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature with mana value 3 or greater"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.OR_GREATER, 3)); + } + + public PyrrhicStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}"); + + // As an additional cost to cast this spell, you may blight 2. + this.addAbility(new BlightAbility(2)); + + // Choose one. If this spell's additional cost was paid, choose both instead. + this.getSpellAbility().getModes().setChooseText( + "Choose one. If this spell's additional cost was paid, choose both instead." + ); + this.getSpellAbility().getModes().setMoreCondition(2, BlightedCondition.instance); + + // * Destroy target artifact or enchantment. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); + + // * Destroy target creature with mana value 3 or greater. + Mode mode = new Mode(new DestroyTargetEffect()); + mode.addTarget(new TargetPermanent(filter)); + this.getSpellAbility().addMode(mode); + } + + private PyrrhicStrike(final PyrrhicStrike card) { + super(card); + } + + @Override + public PyrrhicStrike copy() { + return new PyrrhicStrike(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index e4b9e41d249..f03c7f87c50 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -240,6 +240,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Prismatic Undercurrents", 189, Rarity.UNCOMMON, mage.cards.p.PrismaticUndercurrents.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); + cards.add(new SetCardInfo("Pyrrhic Strike", 30, Rarity.UNCOMMON, mage.cards.p.PyrrhicStrike.class)); cards.add(new SetCardInfo("Reaping Willow", 240, Rarity.UNCOMMON, mage.cards.r.ReapingWillow.class)); cards.add(new SetCardInfo("Pummeler for Hire", 190, Rarity.UNCOMMON, mage.cards.p.PummelerForHire.class)); cards.add(new SetCardInfo("Reckless Ransacking", 152, Rarity.COMMON, mage.cards.r.RecklessRansacking.class)); From e729ae20903e5c9f65fbc3be2cd678ff336a8c2d Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 12:57:47 -0600 Subject: [PATCH 83/91] [ECL] Implement Prismabasher (#14230) * Reference Elemental Spectacle and remove unused import * [ECL] Implement Prismabasher --- .../src/mage/cards/e/ElementalSpectacle.java | 1 - Mage.Sets/src/mage/cards/p/Prismabasher.java | 55 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/p/Prismabasher.java diff --git a/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java b/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java index 8672f19367e..3d1d0e729c2 100644 --- a/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java +++ b/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java @@ -6,7 +6,6 @@ import mage.abilities.dynamicvalue.common.ColorsAmongControlledPermanentsCount; import mage.abilities.dynamicvalue.common.CreaturesYouControlCount; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GainLifeEffect; -import mage.abilities.hint.common.DomainHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AbilityWord; diff --git a/Mage.Sets/src/mage/cards/p/Prismabasher.java b/Mage.Sets/src/mage/cards/p/Prismabasher.java new file mode 100644 index 00000000000..fde277b0794 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/Prismabasher.java @@ -0,0 +1,55 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.targetadjustment.TargetsCountAdjuster; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.ColorsAmongControlledPermanentsCount; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class Prismabasher extends CardImpl { + + public Prismabasher(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); + + this.subtype.add(SubType.ELEMENTAL); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Vivid -- When this creature enters, up to X target creatures you control get +X/+X until end of turn, where X is the number of colors among permanents you control. + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostTargetEffect( + ColorsAmongControlledPermanentsCount.ALL_PERMANENTS, + ColorsAmongControlledPermanentsCount.ALL_PERMANENTS + ).setText("up to X target creatures you control get +X/+X until end of turn, " + + "where X is the number of colors among permanents you control") + ); + ability.addTarget(new TargetControlledCreaturePermanent(0, 0)); + ability.setTargetAdjuster(new TargetsCountAdjuster(ColorsAmongControlledPermanentsCount.ALL_PERMANENTS)); + this.addAbility(ability.setAbilityWord(AbilityWord.VIVID).addHint(ColorsAmongControlledPermanentsCount.ALL_PERMANENTS.getHint())); + } + + private Prismabasher(final Prismabasher card) { + super(card); + } + + @Override + public Prismabasher copy() { + return new Prismabasher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index f03c7f87c50..55f0ecfa330 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -237,6 +237,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Plains", 274, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Plains", 279, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Prideful Feastling", 238, Rarity.COMMON, mage.cards.p.PridefulFeastling.class)); + cards.add(new SetCardInfo("Prismabasher", 188, Rarity.UNCOMMON, mage.cards.p.Prismabasher.class)); cards.add(new SetCardInfo("Prismatic Undercurrents", 189, Rarity.UNCOMMON, mage.cards.p.PrismaticUndercurrents.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); From b7e50bdcb6be82f53681fd6f7d393f5a8c4ed3db Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 13:02:45 -0600 Subject: [PATCH 84/91] [ECL] Implement Glen Elendra Guardian (#14233) --- .../src/mage/cards/g/GlenElendraArchmage.java | 1 - .../src/mage/cards/g/GlenElendraGuardian.java | 65 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 4 ++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/g/GlenElendraGuardian.java diff --git a/Mage.Sets/src/mage/cards/g/GlenElendraArchmage.java b/Mage.Sets/src/mage/cards/g/GlenElendraArchmage.java index e44f43ff50d..5add7cc5af4 100644 --- a/Mage.Sets/src/mage/cards/g/GlenElendraArchmage.java +++ b/Mage.Sets/src/mage/cards/g/GlenElendraArchmage.java @@ -14,7 +14,6 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.StaticFilters; import mage.target.TargetSpell; diff --git a/Mage.Sets/src/mage/cards/g/GlenElendraGuardian.java b/Mage.Sets/src/mage/cards/g/GlenElendraGuardian.java new file mode 100644 index 00000000000..7b2972850ef --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GlenElendraGuardian.java @@ -0,0 +1,65 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.TargetSpell; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.DrawCardTargetControllerEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class GlenElendraGuardian extends CardImpl { + + public GlenElendraGuardian(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.FAERIE); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // This creature enters with a -1/-1 counter on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.M1M1.createInstance(1)), + "with a -1/-1 counter on it" + )); + + // {1}{U}, Remove a counter from this creature: Counter target noncreature spell. Its controller draws a card. + Ability ability = new SimpleActivatedAbility(new CounterTargetEffect(), new ManaCostsImpl<>("{1}{U}")); + ability.addCost(new RemoveCountersSourceCost(1)); + ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_NON_CREATURE)); + ability.addEffect(new DrawCardTargetControllerEffect(1)); + this.addAbility(ability); + } + + private GlenElendraGuardian(final GlenElendraGuardian card) { + super(card); + } + + @Override + public GlenElendraGuardian copy() { + return new GlenElendraGuardian(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 55f0ecfa330..38af3acd03e 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -146,6 +146,10 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Gilt-Leaf's Embrace", 177, Rarity.COMMON, mage.cards.g.GiltLeafsEmbrace.class)); cards.add(new SetCardInfo("Glamer Gifter", 49, Rarity.UNCOMMON, mage.cards.g.GlamerGifter.class)); cards.add(new SetCardInfo("Glamermite", 50, Rarity.COMMON, mage.cards.g.Glamermite.class)); + cards.add(new SetCardInfo("Glen Elendra Guardian", 305, Rarity.RARE, mage.cards.g.GlenElendraGuardian.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Glen Elendra Guardian", 383, Rarity.MYTHIC, mage.cards.g.GlenElendraGuardian.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Glen Elendra Guardian", 393, Rarity.MYTHIC, mage.cards.g.GlenElendraGuardian.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Glen Elendra Guardian", 51, Rarity.RARE, mage.cards.g.GlenElendraGuardian.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Glister Bairn", 227, Rarity.UNCOMMON, mage.cards.g.GlisterBairn.class)); cards.add(new SetCardInfo("Gnarlbark Elm", 103, Rarity.UNCOMMON, mage.cards.g.GnarlbarkElm.class)); cards.add(new SetCardInfo("Goatnap", 142, Rarity.UNCOMMON, mage.cards.g.Goatnap.class)); From fef211489892eb8cc6d092237fd7a38e7f890ec6 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 13:10:12 -0600 Subject: [PATCH 85/91] [ECL] Implement Raiding Schemes (#14218) Co-authored-by: Evan Kranzler --- .../src/mage/cards/r/RaidingSchemes.java | 79 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 81 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RaidingSchemes.java diff --git a/Mage.Sets/src/mage/cards/r/RaidingSchemes.java b/Mage.Sets/src/mage/cards/r/RaidingSchemes.java new file mode 100644 index 00000000000..ed0b0b0bf1d --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RaidingSchemes.java @@ -0,0 +1,79 @@ +package mage.cards.r; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.keyword.ConspireAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; + +/** + * + * @author muz + */ +public final class RaidingSchemes extends CardImpl { + + public RaidingSchemes(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}{G}"); + + // Each noncreature spell you cast has conspire. + this.addAbility(new SimpleStaticAbility(new GainConspireEffect())); + } + + private RaidingSchemes(final RaidingSchemes card) { + super(card); + } + + @Override + public RaidingSchemes copy() { + return new RaidingSchemes(this); + } +} + +class GainConspireEffect extends ContinuousEffectImpl { + + private final ConspireAbility conspireAbility; + + public GainConspireEffect() { + super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + staticText = "Each noncreature spell you cast has conspire. (As you cast the spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose new targets for the copy.)"; + this.conspireAbility = new ConspireAbility(ConspireAbility.ConspireTargets.MORE); + } + + private GainConspireEffect(final GainConspireEffect effect) { + super(effect); + this.conspireAbility = effect.conspireAbility; + } + + @Override + public GainConspireEffect copy() { + return new GainConspireEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (StackObject stackObject : game.getStack()) { + // only spells cast, so no copies of spells + if (!(stackObject instanceof Spell) || stackObject.isCopy() + || !stackObject.isControlledBy(source.getControllerId())) { + continue; + } + Spell spell = (Spell) stackObject; + if (StaticFilters.FILTER_SPELL_NON_CREATURE.match(stackObject, game)) { + game.getState().addOtherAbility(spell.getCard(), conspireAbility.setAddedById(source.getSourceId())); + } + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 38af3acd03e..938a753e8f6 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -245,6 +245,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Prismatic Undercurrents", 189, Rarity.UNCOMMON, mage.cards.p.PrismaticUndercurrents.class)); cards.add(new SetCardInfo("Protective Response", 29, Rarity.UNCOMMON, mage.cards.p.ProtectiveResponse.class)); cards.add(new SetCardInfo("Puca's Eye", 259, Rarity.UNCOMMON, mage.cards.p.PucasEye.class)); + cards.add(new SetCardInfo("Raiding Schemes", 239, Rarity.RARE, mage.cards.r.RaidingSchemes.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Raiding Schemes", 377, Rarity.RARE, mage.cards.r.RaidingSchemes.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pyrrhic Strike", 30, Rarity.UNCOMMON, mage.cards.p.PyrrhicStrike.class)); cards.add(new SetCardInfo("Reaping Willow", 240, Rarity.UNCOMMON, mage.cards.r.ReapingWillow.class)); cards.add(new SetCardInfo("Pummeler for Hire", 190, Rarity.UNCOMMON, mage.cards.p.PummelerForHire.class)); From 44a9c2722b1c7eb916d05e71766237ec20b0f660 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 16:12:22 -0600 Subject: [PATCH 86/91] [ECL] Implement Soulbright Seeker (#14226) --- .../src/mage/cards/s/SoulbrightSeeker.java | 70 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SoulbrightSeeker.java diff --git a/Mage.Sets/src/mage/cards/s/SoulbrightSeeker.java b/Mage.Sets/src/mage/cards/s/SoulbrightSeeker.java new file mode 100644 index 00000000000..beb0962f081 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SoulbrightSeeker.java @@ -0,0 +1,70 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.OrCost; +import mage.abilities.costs.common.BeholdCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.IfAbilityHasResolvedXTimesEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.hint.common.AbilityResolutionCountHint; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.SubType; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.watchers.common.AbilityResolvedWatcher; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.BeholdType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; + +/** + * + * @author muz + */ +public final class SoulbrightSeeker extends CardImpl { + + public SoulbrightSeeker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); + + this.subtype.add(SubType.ELEMENTAL); + this.subtype.add(SubType.SORCERER); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // As an additional cost to cast this spell, behold an Elemental or pay {2}. + this.getSpellAbility().addCost(new OrCost("behold an Elemental or pay {2}", + new BeholdCost(BeholdType.ELEMENTAL), + new GenericManaCost(2) + )); + + // {R}: Target creature you control gains trample until end of turn. If this is the third time this ability has resolved this turn, add {R}{R}{R}{R}. + Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect( + TrampleAbility.getInstance(), Duration.EndOfTurn + ), new ManaCostsImpl<>("{R}")); + ability.addEffect( + new IfAbilityHasResolvedXTimesEffect( + Outcome.PutManaInPool, 3, new BasicManaEffect(Mana.RedMana(4)) + ).setText("If this is the third time this ability has resolved this turn, add {R}{R}{R}{R}") + ); + ability.addTarget(new TargetControlledCreaturePermanent()); + ability.addHint(AbilityResolutionCountHint.instance); + this.addAbility(ability, new AbilityResolvedWatcher()); + } + + private SoulbrightSeeker(final SoulbrightSeeker card) { + super(card); + } + + @Override + public SoulbrightSeeker copy() { + return new SoulbrightSeeker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 938a753e8f6..385a00b2dd6 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -279,6 +279,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Sizzling Changeling", 155, Rarity.UNCOMMON, mage.cards.s.SizzlingChangeling.class)); cards.add(new SetCardInfo("Slumbering Walker", 302, Rarity.RARE, mage.cards.s.SlumberingWalker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Slumbering Walker", 35, Rarity.RARE, mage.cards.s.SlumberingWalker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Soulbright Seeker", 157, Rarity.UNCOMMON, mage.cards.s.SoulbrightSeeker.class)); cards.add(new SetCardInfo("Sourbread Auntie", 158, Rarity.UNCOMMON, mage.cards.s.SourbreadAuntie.class)); cards.add(new SetCardInfo("Spell Snare", 71, Rarity.UNCOMMON, mage.cards.s.SpellSnare.class)); cards.add(new SetCardInfo("Spiral into Solitude", 36, Rarity.COMMON, mage.cards.s.SpiralIntoSolitude.class)); From ed3305cf5933662b57501a6073c6d575dbbbfe49 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 16:14:14 -0600 Subject: [PATCH 87/91] [ECL] Implement Selfless Safewright (#14227) * Update gen-card.pl to take all command line args as a space-seperated card name to remove need for quoting or escaping * [ECL] Implement Selfless Safewright --- .../src/mage/cards/s/SelflessSafewright.java | 115 ++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 4 + Utils/gen-card.pl | 2 +- 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/s/SelflessSafewright.java diff --git a/Mage.Sets/src/mage/cards/s/SelflessSafewright.java b/Mage.Sets/src/mage/cards/s/SelflessSafewright.java new file mode 100644 index 00000000000..24f651fe182 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SelflessSafewright.java @@ -0,0 +1,115 @@ +package mage.cards.s; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import mage.MageInt; +import mage.MageObject; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTargets; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.Choice; +import mage.choices.ChoiceCreatureType; +import mage.constants.CardType; +import mage.constants.Outcome; + +/** + * + * @author muz + */ +public final class SelflessSafewright extends CardImpl { + + public SelflessSafewright(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // When this creature enters, choose a creature type. Other permanents you control of that type gain hexproof and indestructible until end of turn. + this.addAbility(new AsEntersBattlefieldAbility(new SelflessSafewrightEffect())); + } + + private SelflessSafewright(final SelflessSafewright card) { + super(card); + } + + @Override + public SelflessSafewright copy() { + return new SelflessSafewright(this); + } +} + +class SelflessSafewrightEffect extends OneShotEffect { + + SelflessSafewrightEffect() { + super(Outcome.Benefit); + staticText = "choose a creature type. Other permanents you control of that type gain hexproof and indestructible until end of turn"; + } + + private SelflessSafewrightEffect(final SelflessSafewrightEffect effect) { + super(effect); + } + + @Override + public SelflessSafewrightEffect copy() { + return new SelflessSafewrightEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Choice choice = new ChoiceCreatureType(game, source); + controller.choose(outcome, choice, game); + SubType subType = SubType.byDescription(choice.getChoiceKey()); + if (subType == null) { + return false; + } + game.informPlayers(controller.getLogName() + " chooses " + subType); + List permanents = game + .getBattlefield() + .getActivePermanents( + StaticFilters.FILTER_OTHER_CONTROLLED_PERMANENTS, + source.getControllerId(), source, game + ).stream() + .filter(permanent -> permanent.hasSubtype(subType, game)) + .collect(Collectors.toList()); + if (permanents.isEmpty()) { + return false; + } + + game.addEffect(new GainAbilityTargetEffect( + HexproofAbility.getInstance() + ).setTargetPointer(new FixedTargets(permanents, game)), source); + + game.addEffect(new GainAbilityTargetEffect( + IndestructibleAbility.getInstance() + ).setTargetPointer(new FixedTargets(permanents, game)), source); + + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 385a00b2dd6..21d124427a9 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -270,6 +270,10 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Scuzzback Scrounger", 320, Rarity.RARE, mage.cards.s.ScuzzbackScrounger.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sear", 154, Rarity.UNCOMMON, mage.cards.s.Sear.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sear", 405, Rarity.UNCOMMON, mage.cards.s.Sear.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Selfless Safewright", 193, Rarity.RARE, mage.cards.s.SelflessSafewright.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Selfless Safewright", 367, Rarity.RARE, mage.cards.s.SelflessSafewright.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Selfless Safewright", 391, Rarity.MYTHIC, mage.cards.s.SelflessSafewright.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Selfless Safewright", 401, Rarity.MYTHIC, mage.cards.s.SelflessSafewright.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Shimmercreep", 120, Rarity.UNCOMMON, mage.cards.s.Shimmercreep.class)); cards.add(new SetCardInfo("Shinestriker", 68, Rarity.UNCOMMON, mage.cards.s.Shinestriker.class)); cards.add(new SetCardInfo("Shore Lurker", 34, Rarity.COMMON, mage.cards.s.ShoreLurker.class)); diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl index 7dfe18852cc..4d5a504dcf6 100755 --- a/Utils/gen-card.pl +++ b/Utils/gen-card.pl @@ -90,7 +90,7 @@ $raritiesConversion{'Special'} = 'SPECIAL'; $raritiesConversion{'Bonus'} = 'BONUS'; # Get card name -my $cardName = $ARGV[0]; +my $cardName = join ' ', @ARGV; if (!$cardName) { print 'Enter a card name: '; $cardName = ; From d61dc0bb63ce5d1f3edb90daf5faad480394de5b Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 16:14:43 -0600 Subject: [PATCH 88/91] [ECL] Implement Rimefire Torque (#14228) --- .../src/mage/cards/r/RimefireTorque.java | 68 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RimefireTorque.java diff --git a/Mage.Sets/src/mage/cards/r/RimefireTorque.java b/Mage.Sets/src/mage/cards/r/RimefireTorque.java new file mode 100644 index 00000000000..9b2e8bc9f5a --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RimefireTorque.java @@ -0,0 +1,68 @@ +package mage.cards.r; + +import java.util.UUID; + +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.CopyNextSpellDelayedTriggeredAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; + +/** + * + * @author muz + */ +public final class RimefireTorque extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("a permanent you control of the chosen type"); + + static { + filter.add(ChosenSubtypePredicate.TRUE); + } + + public RimefireTorque(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}"); + + // As this artifact enters, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.Benefit))); + + // Whenever a permanent you control of the chosen type enters, put a charge counter on this artifact. + this.addAbility( + new EntersBattlefieldAllTriggeredAbility( + Zone.BATTLEFIELD, + new AddCountersSourceEffect(CounterType.CHARGE.createInstance()), + filter, + false + ) + ); + + // {T}, Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it. You may choose new targets for the copy. + SimpleActivatedAbility ability = new SimpleActivatedAbility( + new CreateDelayedTriggeredAbilityEffect(new CopyNextSpellDelayedTriggeredAbility()), + new RemoveCountersSourceCost(CounterType.CHARGE.createInstance(3)) + ); + ability.addCost(new TapSourceCost()); + this.addAbility(ability); + } + + private RimefireTorque(final RimefireTorque card) { + super(card); + } + + @Override + public RimefireTorque copy() { + return new RimefireTorque(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 21d124427a9..dee4bd2e8e0 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -255,6 +255,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Requiting Hex", 116, Rarity.UNCOMMON, mage.cards.r.RequitingHex.class)); cards.add(new SetCardInfo("Rhys, the Evermore", 32, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rhys, the Evermore", 354, Rarity.RARE, mage.cards.r.RhysTheEvermore.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rimefire Torque", 358, Rarity.RARE, mage.cards.r.RimefireTorque.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rimefire Torque", 65, Rarity.RARE, mage.cards.r.RimefireTorque.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rimekin Recluse", 66, Rarity.UNCOMMON, mage.cards.r.RimekinRecluse.class)); cards.add(new SetCardInfo("Riverguard's Reflexes", 33, Rarity.COMMON, mage.cards.r.RiverguardsReflexes.class)); cards.add(new SetCardInfo("Rooftop Percher", 2, Rarity.COMMON, mage.cards.r.RooftopPercher.class)); From 15df981ebeb590be601d4fcd9ab61846c5e92588 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 16:16:57 -0600 Subject: [PATCH 89/91] [ECL] Implement Gloom Ripper (#14232) --- Mage.Sets/src/mage/cards/g/GloomRipper.java | 76 +++++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 78 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GloomRipper.java diff --git a/Mage.Sets/src/mage/cards/g/GloomRipper.java b/Mage.Sets/src/mage/cards/g/GloomRipper.java new file mode 100644 index 00000000000..0a696c89117 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GloomRipper.java @@ -0,0 +1,76 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.AdditiveDynamicValue; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.dynamicvalue.common.SignInversionDynamicValue; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetOpponentsCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author muz + */ +public final class GloomRipper extends CardImpl { + + private static final FilterPermanent creatureFilter = new FilterControlledPermanent(SubType.ELF, "Elves you control"); + private static final FilterCard cardFilter = new FilterCard(SubType.ELF, "Elf cards"); + + private static final DynamicValue xValuePos = new AdditiveDynamicValue( + new PermanentsOnBattlefieldCount(creatureFilter), + new CardsInControllerGraveyardCount(cardFilter) + ); + private static final DynamicValue xValueNeg = new SignInversionDynamicValue(xValuePos); + + private static final Hint hint = new ValueHint("Elves you control plus the number of Elf cards in your graveyard", xValuePos); + + public GloomRipper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When this creature enters, target creature you control gets +X/+0 until end of turn and up to one target creature an opponent controls gets -0/-X until end of turn, where X is the number of Elves you control plus the number of Elf cards in your graveyard. + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostTargetEffect(xValuePos, StaticValue.get(0)) + .setText("until end of turn, target creature you control gets +X/+0") + ); + ability.addTarget(new TargetControlledCreaturePermanent()); + ability.addEffect( + new BoostTargetEffect(StaticValue.get(0), xValueNeg) + .setText("and up to one target creature an opponent controls gets -0/-X, where X is the number of Elves you control plus the number of Elf cards in your graveyard") + .setTargetPointer(new SecondTargetPointer()) + ); + ability.addTarget(new TargetOpponentsCreaturePermanent(0, 1)); + this.addAbility(ability.addHint(hint)); + } + + private GloomRipper(final GloomRipper card) { + super(card); + } + + @Override + public GloomRipper copy() { + return new GloomRipper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index dee4bd2e8e0..27df90dc2e0 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -151,6 +151,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Glen Elendra Guardian", 393, Rarity.MYTHIC, mage.cards.g.GlenElendraGuardian.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Glen Elendra Guardian", 51, Rarity.RARE, mage.cards.g.GlenElendraGuardian.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Glister Bairn", 227, Rarity.UNCOMMON, mage.cards.g.GlisterBairn.class)); + cards.add(new SetCardInfo("Gloom Ripper", 102, Rarity.RARE, mage.cards.g.GloomRipper.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gloom Ripper", 312, Rarity.RARE, mage.cards.g.GloomRipper.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gnarlbark Elm", 103, Rarity.UNCOMMON, mage.cards.g.GnarlbarkElm.class)); cards.add(new SetCardInfo("Goatnap", 142, Rarity.UNCOMMON, mage.cards.g.Goatnap.class)); cards.add(new SetCardInfo("Goldmeadow Nomad", 18, Rarity.COMMON, mage.cards.g.GoldmeadowNomad.class)); From 8357278f2d68e838b1755d8284078231b23801e6 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sat, 10 Jan 2026 17:20:22 -0500 Subject: [PATCH 90/91] [ECL] Implement Lys Alana Dignitary --- .../src/mage/cards/l/LysAlanaDignitary.java | 62 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 1 + 2 files changed, 63 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LysAlanaDignitary.java diff --git a/Mage.Sets/src/mage/cards/l/LysAlanaDignitary.java b/Mage.Sets/src/mage/cards/l/LysAlanaDignitary.java new file mode 100644 index 00000000000..a6096da6d60 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LysAlanaDignitary.java @@ -0,0 +1,62 @@ +package mage.cards.l; + +import mage.MageInt; +import mage.Mana; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.CardsInControllerGraveyardCondition; +import mage.abilities.costs.OrCost; +import mage.abilities.costs.common.BeholdCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.mana.BasicManaEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.mana.ActivateIfConditionManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.BeholdType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class LysAlanaDignitary extends CardImpl { + + private static final Condition condition + = new CardsInControllerGraveyardCondition(1, new FilterCard(SubType.ELF)); + private static final Hint hint = new ConditionHint(condition, "There is an Elf card in your graveyard"); + + public LysAlanaDignitary(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.ADVISOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // As an additional cost to cast this spell, behold an Elf or pay {2}. + this.getSpellAbility().addCost(new OrCost( + "behold an Elf or pay {2}", + new BeholdCost(BeholdType.ELF), new GenericManaCost(2) + )); + + // {T}: Add {G}{G}. Activate only if there is an Elf card in your graveyard. + this.addAbility(new ActivateIfConditionManaAbility( + Zone.BATTLEFIELD, new BasicManaEffect(Mana.GreenMana(2)), new TapSourceCost(), condition + ).addHint(hint)); + } + + private LysAlanaDignitary(final LysAlanaDignitary card) { + super(card); + } + + @Override + public LysAlanaDignitary copy() { + return new LysAlanaDignitary(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index 27df90dc2e0..e3f5972d341 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -201,6 +201,7 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Loch Mare", 57, Rarity.MYTHIC, mage.cards.l.LochMare.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lofty Dreams", 58, Rarity.UNCOMMON, mage.cards.l.LoftyDreams.class)); cards.add(new SetCardInfo("Luminollusk", 179, Rarity.UNCOMMON, mage.cards.l.Luminollusk.class)); + cards.add(new SetCardInfo("Lys Alana Dignitary", 180, Rarity.UNCOMMON, mage.cards.l.LysAlanaDignitary.class)); cards.add(new SetCardInfo("Lys Alana Informant", 181, Rarity.COMMON, mage.cards.l.LysAlanaInformant.class)); cards.add(new SetCardInfo("Meek Attack", 151, Rarity.MYTHIC, mage.cards.m.MeekAttack.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Meek Attack", 319, Rarity.MYTHIC, mage.cards.m.MeekAttack.class, NON_FULL_USE_VARIOUS)); From b54c9f47a2ccdc23ede164388dd1e54decb9a256 Mon Sep 17 00:00:00 2001 From: Muz Date: Sat, 10 Jan 2026 18:33:18 -0600 Subject: [PATCH 91/91] [ECL] Implement Chronicle of Victory (#14223) --- .../src/mage/cards/c/ChronicleOfVictory.java | 83 +++++++++++++++++++ Mage.Sets/src/mage/sets/LorwynEclipsed.java | 2 + 2 files changed, 85 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChronicleOfVictory.java diff --git a/Mage.Sets/src/mage/cards/c/ChronicleOfVictory.java b/Mage.Sets/src/mage/cards/c/ChronicleOfVictory.java new file mode 100644 index 00000000000..12c9dcb9c50 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChronicleOfVictory.java @@ -0,0 +1,83 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.filter.FilterSpell; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostAllOfChosenSubtypeEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllOfChosenSubtypeEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; + +/** + * + * @author muz + */ +public final class ChronicleOfVictory extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control of the chosen type"); + private static final FilterSpell filterSpell = new FilterSpell("a spell of the chosen type"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + filterSpell.add(ChosenSubtypePredicate.TRUE); + } + + public ChronicleOfVictory(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{6}"); + + this.supertype.add(SuperType.LEGENDARY); + + // As Chronicle of Victory enters, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); + + // Creatures you control of the chosen type get +2/+2 and have first strike and trample. + SimpleStaticAbility buffAbility = new SimpleStaticAbility(new BoostAllOfChosenSubtypeEffect( + 2, 2, Duration.WhileOnBattlefield, filter, false + ).setText("creatures you control of the chosen type get +2/+2")); + buffAbility.addEffect( + new GainAbilityAllOfChosenSubtypeEffect( + FirstStrikeAbility.getInstance(), + Duration.WhileOnBattlefield, + StaticFilters.FILTER_PERMANENT_CREATURES_CONTROLLED + ).setText("and have first strike") + ); + buffAbility.addEffect( + new GainAbilityAllOfChosenSubtypeEffect( + TrampleAbility.getInstance(), + Duration.WhileOnBattlefield, + StaticFilters.FILTER_PERMANENT_CREATURES_CONTROLLED + ).setText("and trample") + ); + this.addAbility(buffAbility); + + // Whenever you cast a spell of the chosen type, draw a card. + this.addAbility( + new SpellCastControllerTriggeredAbility( + new DrawCardSourceControllerEffect(1), filterSpell, false + ) + ); + } + + private ChronicleOfVictory(final ChronicleOfVictory card) { + super(card); + } + + @Override + public ChronicleOfVictory copy() { + return new ChronicleOfVictory(this); + } +} diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index e3f5972d341..55de934936c 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -85,6 +85,8 @@ public final class LorwynEclipsed extends ExpansionSet { cards.add(new SetCardInfo("Chaos Spewer", 210, Rarity.COMMON, mage.cards.c.ChaosSpewer.class)); cards.add(new SetCardInfo("Chitinous Graspling", 211, Rarity.COMMON, mage.cards.c.ChitinousGraspling.class)); cards.add(new SetCardInfo("Chomping Changeling", 172, Rarity.UNCOMMON, mage.cards.c.ChompingChangeling.class)); + cards.add(new SetCardInfo("Chronicle of Victory", 253, Rarity.MYTHIC, mage.cards.c.ChronicleOfVictory.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chronicle of Victory", 346, Rarity.MYTHIC, mage.cards.c.ChronicleOfVictory.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cinder Strike", 131, Rarity.COMMON, mage.cards.c.CinderStrike.class)); cards.add(new SetCardInfo("Clachan Festival", 10, Rarity.UNCOMMON, mage.cards.c.ClachanFestival.class)); cards.add(new SetCardInfo("Creakwood Safewright", 96, Rarity.UNCOMMON, mage.cards.c.CreakwoodSafewright.class));