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.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/cards/b/BramblebackBrute.java b/Mage.Sets/src/mage/cards/b/BramblebackBrute.java new file mode 100644 index 00000000000..a58b043920f --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BramblebackBrute.java @@ -0,0 +1,55 @@ +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.Duration; +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(Duration.EndOfTurn), 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/cards/e/ElementalSpectacle.java b/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java new file mode 100644 index 00000000000..3d1d0e729c2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ElementalSpectacle.java @@ -0,0 +1,43 @@ +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.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/cards/m/MorcantsLoyalist.java b/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java new file mode 100644 index 00000000000..0fcc37e4bb2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MorcantsLoyalist.java @@ -0,0 +1,60 @@ +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.filter.predicate.mageobject.AnotherPredicate; +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"); + + static { + filter2.add(AnotherPredicate.instance); + } + + 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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"; 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/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.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/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/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/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/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/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/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.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/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); 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/LorwynEclipsed.java b/Mage.Sets/src/mage/sets/LorwynEclipsed.java index f3d695adb93..55de934936c 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsed.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsed.java @@ -22,6 +22,10 @@ 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("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)); @@ -29,12 +33,15 @@ 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)); 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)); 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)); @@ -48,25 +55,41 @@ 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("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)); + 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)); 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)); + 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)); 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)); + 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)); 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)); @@ -74,6 +97,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)); @@ -81,31 +106,55 @@ 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 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("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)); 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("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)); + 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)); + 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, 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)); 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)); + 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("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)); @@ -130,13 +179,17 @@ 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)); 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("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)); 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)); @@ -150,6 +203,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)); @@ -159,17 +213,27 @@ 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("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("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)); - 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)); 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)); cards.add(new SetCardInfo("Overgrown Tomb", 350, Rarity.RARE, mage.cards.o.OvergrownTomb.class, NON_FULL_USE_VARIOUS)); @@ -179,44 +243,75 @@ 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("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)); + 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)); + 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)); 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)); 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)); 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)); 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)); - 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)); 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)); 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)); + 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)); 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'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)); @@ -225,14 +320,19 @@ 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)); 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)); 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)); cards.add(new SetCardInfo("Unwelcome Sprite", 81, Rarity.UNCOMMON, mage.cards.u.UnwelcomeSprite.class)); @@ -243,8 +343,10 @@ 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)); 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)); diff --git a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java index ad79b5a2a4c..9634de358f3 100644 --- a/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java +++ b/Mage.Sets/src/mage/sets/LorwynEclipsedCommander.java @@ -56,7 +56,11 @@ 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("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)); @@ -75,6 +79,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)); @@ -103,6 +109,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)); @@ -152,6 +159,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, 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)); @@ -171,6 +180,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.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.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/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; } 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(); } } 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) { 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/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/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); 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/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/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); - } -} 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| 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 = ; diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 8a6e39e344c..0b04dd31e54 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -60818,7 +60818,10 @@ 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.| 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,71 +60833,97 @@ 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.| +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.| +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.| +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.| 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,27 +60932,39 @@ 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.| +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.| 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.| +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.| @@ -60934,11 +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.| @@ -60954,18 +61000,25 @@ 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.| +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.| @@ -60974,17 +61027,27 @@ 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.| 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}| +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.| +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}| +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| @@ -60996,12 +61059,20 @@ 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| +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.| +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.| @@ -61009,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.| @@ -61035,6 +61108,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 +61123,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,13 +61160,23 @@ 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.| +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.| 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.| +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.| @@ -61098,36 +61192,47 @@ 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.| 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.| 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.| @@ -61266,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.| @@ -61284,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.| @@ -61304,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.|