Merge origin/master

This commit is contained in:
USER 2019-09-07 09:45:28 +08:00
commit f081f8f41d
47 changed files with 1920 additions and 88 deletions

View file

@ -0,0 +1,79 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostAllEffect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AbilityPredicate;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.permanent.token.FaerieToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AlelaArtfulProvocateur extends CardImpl {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("creatures you control with flying");
private static final FilterSpell filter2 = new FilterSpell("an artifact or enchantment spell");
static {
filter.add(new AbilityPredicate(FlyingAbility.class));
filter.add(new ControllerPredicate(TargetController.YOU));
filter2.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.ENCHANTMENT)
));
}
public AlelaArtfulProvocateur(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}{B}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.FAERIE);
this.subtype.add(SubType.WARLOCK);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Deathtouch
this.addAbility(DeathtouchAbility.getInstance());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
// Other creatures you control with flying get +1/+0.
this.addAbility(new SimpleStaticAbility(new BoostAllEffect(
1, 0, Duration.WhileOnBattlefield, filter, true
)));
// Whenever you cast an artifact or enchantment spell, create a 1/1 blue Faerie creature token with flying.
this.addAbility(new SpellCastControllerTriggeredAbility(
new CreateTokenEffect(new FaerieToken()), filter2, false
));
}
private AlelaArtfulProvocateur(final AlelaArtfulProvocateur card) {
super(card);
}
@Override
public AlelaArtfulProvocateur copy() {
return new AlelaArtfulProvocateur(this);
}
}

View file

@ -0,0 +1,61 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AllThatGlitters extends CardImpl {
private static final FilterPermanent filter = new FilterArtifactOrEnchantmentPermanent();
static {
filter.add(new ControllerPredicate(TargetController.YOU));
}
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter);
public AllThatGlitters(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));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
// Enchanted creature gets +1/+1 for each artifact and/or enchantment you control.
this.addAbility(new SimpleStaticAbility(new BoostEnchantedEffect(
xValue, xValue, Duration.WhileOnBattlefield
).setText("enchanted creature gets +1/+1 for each artifact and/or enchantment you control")));
}
private AllThatGlitters(final AllThatGlitters card) {
super(card);
}
@Override
public AllThatGlitters copy() {
return new AllThatGlitters(this);
}
}
// someBODY

View file

@ -0,0 +1,54 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterArtifactOrEnchantmentCard;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class ArcanistsOwl extends CardImpl {
private static final FilterCard filter = new FilterArtifactOrEnchantmentCard();
public ArcanistsOwl(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{W/U}{W/U}{W/U}{W/U}");
this.subtype.add(SubType.BIRD);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Flying
this.addAbility(FlyingAbility.getInstance());
// When Arcanist's Owl enters the battlefield, look at the top four cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
this.getSpellAbility().addEffect(
new LookLibraryAndPickControllerEffect(
new StaticValue(4), false, new StaticValue(1), filter,
Zone.LIBRARY, false, true, false, Zone.HAND,
true, false, false
).setBackInRandomOrder(true).setText("Look at the top four cards of your library. " +
"You may reveal an artifact or enchantment from among them and put it into your hand. " +
"Put the rest on the bottom of your library in a random order.")
);
}
private ArcanistsOwl(final ArcanistsOwl card) {
super(card);
}
@Override
public ArcanistsOwl copy() {
return new ArcanistsOwl(this);
}
}

View file

@ -1,6 +1,7 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
@ -32,10 +33,15 @@ public final class AvacynsCollar extends CardImpl {
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +1/+0 and has vigilance.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.EQUIPMENT)));
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 0));
ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(), AttachmentType.EQUIPMENT).setText("and has vigilance")
);
this.addAbility(ability);
// Whenever equipped creature dies, if it was a Human, create a 1/1 white Spirit creature token with flying.
this.addAbility(new AvacynsCollarTriggeredAbility());
// Equip {2}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2)));
}

View file

@ -5,7 +5,7 @@ import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.game.permanent.token.custom.FoodToken;
import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;

View file

@ -0,0 +1,49 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BelleOfTheBrawl extends CardImpl {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent(SubType.KNIGHT, "Knights");
public BelleOfTheBrawl(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
// Menace
this.addAbility(new MenaceAbility());
// Whenever Belle of the Brawl attacks, other Knights you control get +1/+0 until end of turn.
this.addAbility(new AttacksTriggeredAbility(new BoostControlledEffect(
1, 0, Duration.EndOfTurn, filter, true
), false));
}
private BelleOfTheBrawl(final BelleOfTheBrawl card) {
super(card);
}
@Override
public BelleOfTheBrawl copy() {
return new BelleOfTheBrawl(this);
}
}

View file

@ -2,6 +2,8 @@
package mage.cards.b;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
@ -23,8 +25,13 @@ public final class BlightSickle extends CardImpl {
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +1/+0 and has wither.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(WitherAbility.getInstance(), AttachmentType.EQUIPMENT)));
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 0));
ability.addEffect(new GainAbilityAttachedEffect(
WitherAbility.getInstance(), AttachmentType.EQUIPMENT).setText("and has wither")
);
this.addAbility(ability);
// Equip {2}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(2)));
}

View file

@ -4,8 +4,8 @@ import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.combat.AttacksIfAbleAttachedEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.cards.CardImpl;
@ -17,8 +17,6 @@ import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
import static mage.constants.Outcome.Benefit;
/**
* @author TheElk801
*/
@ -39,7 +37,10 @@ public final class BloodthirstyBlade extends CardImpl {
// {1}: Attach Bloodthirsty Blade to target creature an opponent controls. Active this ability only any time you could cast a sorcery.
ability = new ActivateAsSorceryActivatedAbility(
Zone.BATTLEFIELD, new BloodthirstyBladeEffect(), new GenericManaCost(1)
Zone.BATTLEFIELD,
new AttachEffect(
Outcome.Benefit, "Attach {this} to target creature an opponent controls"
), new GenericManaCost(1)
);
ability.addTarget(new TargetOpponentsCreaturePermanent());
this.addAbility(ability);
@ -86,30 +87,3 @@ class BloodthirstyBladeAttackEffect extends RestrictionEffect {
return !defenderId.equals(source.getControllerId());
}
}
class BloodthirstyBladeEffect extends OneShotEffect {
BloodthirstyBladeEffect() {
super(Benefit);
staticText = "attach {this} to target creature an opponent controls";
}
private BloodthirstyBladeEffect(final BloodthirstyBladeEffect effect) {
super(effect);
}
@Override
public BloodthirstyBladeEffect copy() {
return new BloodthirstyBladeEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent == null) {
return false;
}
permanent.attachTo(source.getFirstTarget(), game);
return true;
}
}

View file

@ -0,0 +1,55 @@
package mage.cards.c;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.UntapTargetEffect;
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.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CorridorMonitor extends CardImpl {
private static final FilterPermanent filter
= new FilterControlledPermanent("artifact or creature you control");
static {
filter.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.CREATURE)
));
}
public CorridorMonitor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{U}");
this.subtype.add(SubType.CONSTRUCT);
this.power = new MageInt(1);
this.toughness = new MageInt(4);
// When Corridor Monitor enters the battlefield, untap target artifact or creature you control.
Ability ability = new EntersBattlefieldTriggeredAbility(new UntapTargetEffect());
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
private CorridorMonitor(final CorridorMonitor card) {
super(card);
}
@Override
public CorridorMonitor copy() {
return new CorridorMonitor(this);
}
}

View file

@ -31,6 +31,7 @@ public final class CrystalSlipper extends CardImpl {
ability.addEffect(new GainAbilityAttachedEffect(
HasteAbility.getInstance(), AttachmentType.EQUIPMENT).setText("and has haste")
);
this.addAbility(ability);
// Equip {1}
this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(1)));

View file

@ -0,0 +1,49 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.condition.common.AdamantCondition;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.watchers.common.ManaSpentToCastWatcher;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EmberethPaladin extends CardImpl {
public EmberethPaladin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(4);
this.toughness = new MageInt(1);
// Haste
this.addAbility(HasteAbility.getInstance());
// Adamant If at least three red mana was spent to cast this spell, Embereth Paladin enters the battlefield with a +1/+1 counter on it.
this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, AdamantCondition.RED,
"<br><i>Adamant</i> &mdash; If at least three red mana was spent to cast this spell, " +
"{this} enters the battlefield with a +1/+1 counter on it.", ""
), new ManaSpentToCastWatcher());
}
private EmberethPaladin(final EmberethPaladin card) {
super(card);
}
@Override
public EmberethPaladin copy() {
return new EmberethPaladin(this);
}
}

View file

@ -0,0 +1,40 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.AdventureCard;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetArtifactPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EmberethShieldbreaker extends AdventureCard {
public EmberethShieldbreaker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.SORCERY}, "{1}{R}", "Battle Display", "{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Battle Display
// Destroy target artifact.
this.getAdventureSpellAbility().addEffect(new DestroyTargetEffect());
this.getAdventureSpellAbility().addTarget(new TargetArtifactPermanent());
}
private EmberethShieldbreaker(final EmberethShieldbreaker card) {
super(card);
}
@Override
public EmberethShieldbreaker copy() {
return new EmberethShieldbreaker(this);
}
}

View file

@ -0,0 +1,61 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MyTurnCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.OpponentsCount;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EmberethSkyblazer extends CardImpl {
public EmberethSkyblazer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
// As long as it's your turn, Embereth Skyblazer has flying.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(FlyingAbility.getInstance(), Duration.WhileOnBattlefield),
MyTurnCondition.instance, "As long as it's your turn, {this} has flying."
)));
// Whenever Embereth Skyblazer attacks, you may pay {2}{R}. If you do, creatures you control get +X/+0 until end of turn, where X is the number of opponents you have.
this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
new BoostControlledEffect(
OpponentsCount.instance, StaticValue.getZeroValue(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENT_CREATURE, false, true
).setText("creatures you control get +X/+0 until end of turn, where X is the number of opponents you have"),
new ManaCostsImpl("{2}{R}")
), false));
}
private EmberethSkyblazer(final EmberethSkyblazer card) {
super(card);
}
@Override
public EmberethSkyblazer copy() {
return new EmberethSkyblazer(this);
}
}

View file

@ -0,0 +1,82 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility;
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.game.Game;
import mage.players.Player;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @author TheElk801
*/
public final class EyeCollector extends CardImpl {
public EyeCollector(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
this.subtype.add(SubType.FAERIE);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever Eye Collector deals combat damage to a player, each player puts the top card of their library into their graveyard.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new EyeCollectorEffect(), false));
}
private EyeCollector(final EyeCollector card) {
super(card);
}
@Override
public EyeCollector copy() {
return new EyeCollector(this);
}
}
class EyeCollectorEffect extends OneShotEffect {
EyeCollectorEffect() {
super(Outcome.Benefit);
staticText = "each player puts the top card of their library into their graveyard";
}
private EyeCollectorEffect(final EyeCollectorEffect effect) {
super(effect);
}
@Override
public EyeCollectorEffect copy() {
return new EyeCollectorEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
return controller.moveCards(new CardsImpl(game.getState()
.getPlayersInRange(controller.getId(), game)
.stream()
.map(game::getPlayer)
.filter(player -> player != null)
.map(Player::getLibrary)
.map(library -> library.getFromTop(game))
.collect(Collectors.toSet())
), Zone.GRAVEYARD, source, game);
}
}

View file

@ -0,0 +1,47 @@
package mage.cards.f;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.permanent.token.FaerieToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FaerieFormation extends CardImpl {
public FaerieFormation(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}");
this.subtype.add(SubType.FAERIE);
this.power = new MageInt(5);
this.toughness = new MageInt(4);
// Flying
this.addAbility(FlyingAbility.getInstance());
// {3}{U}: Create a 1/1 blue Faerie creature token with flying. Draw a card.
Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new FaerieToken()), new ManaCostsImpl("{3}{U}"));
ability.addEffect(new DrawCardSourceControllerEffect(1).setText("Draw a card"));
this.addAbility(ability);
}
private FaerieFormation(final FaerieFormation card) {
super(card);
}
@Override
public FaerieFormation copy() {
return new FaerieFormation(this);
}
}

View file

@ -0,0 +1,113 @@
package mage.cards.f;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.SendOptionUsedEventEffect;
import mage.cards.AdventureCard;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.token.BearToken;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FlaxenIntruder extends AdventureCard {
public FlaxenIntruder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.SORCERY}, "{G}", "Welcome Home", "{5}{G}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.BERSERKER);
this.power = new MageInt(1);
this.toughness = new MageInt(2);
// Whenever Flaxen Intruder deals combat damage to a player, you may sacrifice it. When you do, destroy target artifact or enchantment.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new DoIfCostPaid(
new FlaxenIntruderCreateReflexiveTriggerEffect(), new SacrificeSourceCost()
).setText("you may sacrifice it. When you do, destroy target artifact or enchantment."), false));
// Welcome Home
// Create three 2/2 green Bear creature tokens.
this.getAdventureSpellAbility().addEffect(new CreateTokenEffect(new BearToken(), 3));
}
private FlaxenIntruder(final FlaxenIntruder card) {
super(card);
}
@Override
public FlaxenIntruder copy() {
return new FlaxenIntruder(this);
}
}
class FlaxenIntruderCreateReflexiveTriggerEffect extends OneShotEffect {
FlaxenIntruderCreateReflexiveTriggerEffect() {
super(Outcome.Benefit);
}
private FlaxenIntruderCreateReflexiveTriggerEffect(final FlaxenIntruderCreateReflexiveTriggerEffect effect) {
super(effect);
}
@Override
public FlaxenIntruderCreateReflexiveTriggerEffect copy() {
return new FlaxenIntruderCreateReflexiveTriggerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
game.addDelayedTriggeredAbility(new FlaxenIntruderReflexiveTriggeredAbility(), source);
return new SendOptionUsedEventEffect().apply(game, source);
}
}
class FlaxenIntruderReflexiveTriggeredAbility extends DelayedTriggeredAbility {
FlaxenIntruderReflexiveTriggeredAbility() {
super(new DestroyTargetEffect(), Duration.OneUse, true);
this.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
}
private FlaxenIntruderReflexiveTriggeredAbility(final FlaxenIntruderReflexiveTriggeredAbility ability) {
super(ability);
}
@Override
public FlaxenIntruderReflexiveTriggeredAbility copy() {
return new FlaxenIntruderReflexiveTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.OPTION_USED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return event.getPlayerId().equals(this.getControllerId())
&& event.getSourceId().equals(this.getSourceId());
}
@Override
public String getRule() {
return "When you do, destroy target artifact or enchantment.";
}
}

View file

@ -0,0 +1,44 @@
package mage.cards.f;
import mage.MageInt;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.cards.AdventureCard;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FoulmireKnight extends AdventureCard {
public FoulmireKnight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.INSTANT}, "{B}", "Profane Insight", "{2}{B}");
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Deathtouch
this.addAbility(DeathtouchAbility.getInstance());
// Profane Insight
// You draw a card and you lose 1 life.
this.getAdventureSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).setText("You draw a card and"));
this.getAdventureSpellAbility().addEffect(new LoseLifeSourceControllerEffect(1));
}
private FoulmireKnight(final FoulmireKnight card) {
super(card);
}
@Override
public FoulmireKnight copy() {
return new FoulmireKnight(this);
}
}

View file

@ -0,0 +1,54 @@
package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.game.command.emblems.GarrukCursedHuntsmanEmblem;
import mage.game.permanent.token.GarrukCursedHuntsmanToken;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GarrukCursedHuntsman extends CardImpl {
public GarrukCursedHuntsman(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{B}{G}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.GARRUK);
this.addAbility(new PlaneswalkerEntersWithLoyaltyCountersAbility(5));
// 0: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."
this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new GarrukCursedHuntsmanToken(), 2), 0));
// 3: Destroy target creature. Draw a card.
Ability ability = new LoyaltyAbility(new DestroyTargetEffect(), -3);
ability.addEffect(new DrawCardSourceControllerEffect(1).setText("Draw a card"));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
// 6: You get an emblem with "Creatures you control get +3/+3 and have trample."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new GarrukCursedHuntsmanEmblem()), -6));
}
private GarrukCursedHuntsman(final GarrukCursedHuntsman card) {
super(card);
}
@Override
public GarrukCursedHuntsman copy() {
return new GarrukCursedHuntsman(this);
}
}

View file

@ -18,13 +18,12 @@ import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.permanent.token.custom.FoodToken;
import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
*
* @author jmharmon
*/

View file

@ -0,0 +1,71 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.dynamicvalue.common.OpponentsCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
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.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GluttonousTroll extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledPermanent("another nonland permanent");
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
filter.add(AnotherPredicate.instance);
}
public GluttonousTroll(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{G}");
this.subtype.add(SubType.TROLL);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Trample
this.addAbility(TrampleAbility.getInstance());
// When Gluttonous Troll enters the battlefield, create a number of Food tokens equal to the number of opponents you have.
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(
new FoodToken(), OpponentsCount.instance
).setText("create a number of Food tokens equal to the number of opponents you have")));
// {1}{G}, Sacrifice another nonland permanent: Gluttonous Troll gets +2/+2 until end of turn.
Ability ability = new SimpleActivatedAbility(
new BoostSourceEffect(2, 2, Duration.EndOfTurn), new ManaCostsImpl("{1}{G}")
);
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
}
private GluttonousTroll(final GluttonousTroll card) {
super(card);
}
@Override
public GluttonousTroll copy() {
return new GluttonousTroll(this);
}
}

View file

@ -0,0 +1,45 @@
package mage.cards.i;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
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 mage.filter.common.FilterCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class InspiringVeteran extends CardImpl {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent(SubType.KNIGHT, "Knights");
public InspiringVeteran(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Other Knights you control get +1/+1.
this.addAbility(new SimpleStaticAbility(
new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter)
));
}
private InspiringVeteran(final InspiringVeteran card) {
super(card);
}
@Override
public InspiringVeteran copy() {
return new InspiringVeteran(this);
}
}

View file

@ -2,6 +2,8 @@
package mage.cards.k;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
@ -22,8 +24,14 @@ public final class Kitesail extends CardImpl {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
this.subtype.add(SubType.EQUIPMENT);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.EQUIPMENT)));
// Equipped creature gets +1/+0 and has flying.
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 0));
ability.addEffect(new GainAbilityAttachedEffect(
FlyingAbility.getInstance(), AttachmentType.EQUIPMENT).setText("and has flying")
);
this.addAbility(ability);
// Equip {2}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(2)));
}

View file

@ -0,0 +1,88 @@
package mage.cards.l;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.AdventureCard;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.filter.predicate.mageobject.ToughnessPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.HumanToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class LovestruckBeast extends AdventureCard {
public LovestruckBeast(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.SORCERY}, "{2}{G}", "Heart's Desire", "{G}");
this.subtype.add(SubType.BEAST);
this.subtype.add(SubType.NOBLE);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
// Lovestruck Beast can't attack unless you control a 1/1 creature.
this.addAbility(new SimpleStaticAbility(new LovestruckBeastEffect()));
// Heart's Desire
// Create a 1/1 white Human creature token.
this.getAdventureSpellAbility().addEffect(new CreateTokenEffect(new HumanToken()));
}
private LovestruckBeast(final LovestruckBeast card) {
super(card);
}
@Override
public LovestruckBeast copy() {
return new LovestruckBeast(this);
}
}
class LovestruckBeastEffect extends RestrictionEffect {
private static final FilterPermanent filter = new FilterCreaturePermanent();
static {
filter.add(new PowerPredicate(ComparisonType.EQUAL_TO, 1));
filter.add(new ToughnessPredicate(ComparisonType.EQUAL_TO, 1));
}
LovestruckBeastEffect() {
super(Duration.WhileOnBattlefield);
staticText = "{this} can't attack unless you control a 1/1 creature";
}
private LovestruckBeastEffect(final LovestruckBeastEffect effect) {
super(effect);
}
@Override
public LovestruckBeastEffect copy() {
return new LovestruckBeastEffect(this);
}
@Override
public boolean canAttack(Game game, boolean canUseChooseDialogs) {
return false;
}
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent.getId().equals(source.getSourceId())
&& game.getBattlefield().countAll(filter, source.getControllerId(), game) <= 0;
}
}

View file

@ -0,0 +1,60 @@
package mage.cards.m;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
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 MaceOfTheValiant extends CardImpl {
private static final DynamicValue xValue = new CountersSourceCount(CounterType.CHARGE);
public MaceOfTheValiant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{W}");
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +1/+1 for each charge counter on Mace of the Valiant and has vigilance.
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(xValue, xValue));
ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(), AttachmentType.EQUIPMENT
).setText("and has vigilance"));
this.addAbility(ability);
// Whenever a creature enters the battlefield under your control, put a charge counter on Mace of the Valiant.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
new AddCountersSourceEffect(CounterType.CHARGE.createInstance()),
StaticFilters.FILTER_PERMANENT_A_CREATURE
));
// Equip {3}
this.addAbility(new EquipAbility(3));
}
private MaceOfTheValiant(final MaceOfTheValiant card) {
super(card);
}
@Override
public MaceOfTheValiant copy() {
return new MaceOfTheValiant(this);
}
}

View file

@ -0,0 +1,49 @@
package mage.cards.o;
import mage.MageInt;
import mage.abilities.common.CantBlockAbility;
import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.AdventureCard;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class OrderOfMidnight extends AdventureCard {
public OrderOfMidnight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.SORCERY}, "{1}{B}","Alter Fate", "{1}{B}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Order of Midnight can't block.
this.addAbility(new CantBlockAbility());
// Alter Fate
// Return target creature card from your graveyard to your hand.
this.getAdventureSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect());
this.getAdventureSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
}
private OrderOfMidnight(final OrderOfMidnight card) {
super(card);
}
@Override
public OrderOfMidnight copy() {
return new OrderOfMidnight(this);
}
}

View file

@ -144,6 +144,6 @@ class RayamiFirstOfTheFallenReplacementEffect extends ReplacementEffectImpl {
ZoneChangeEvent zce = (ZoneChangeEvent) event;
return zce.isDiesEvent()
&& zce.getTarget().isCreature()
&& zce.getTarget() instanceof PermanentToken;
&& !(zce.getTarget() instanceof PermanentToken);
}
}

View file

@ -0,0 +1,42 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.AdventureCard;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RosethornAcolyte extends AdventureCard {
public RosethornAcolyte(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, new CardType[]{CardType.SORCERY}, "{2}{G}", "Seasonal Ritual", "{G}");
this.subtype.add(SubType.ELF);
this.subtype.add(SubType.DRUID);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// {T}: Add one mana of any color.
this.addAbility(new AnyColorManaAbility());
// Seasonal Ritual
// Add one mana of any color.
this.getAdventureSpellAbility().addEffect(new AddManaOfAnyColorEffect());
}
private RosethornAcolyte(final RosethornAcolyte card) {
super(card);
}
@Override
public RosethornAcolyte copy() {
return new RosethornAcolyte(this);
}
}

View file

@ -0,0 +1,52 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.FoodToken;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SavvyHunter extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.FOOD, "Foods");
public SavvyHunter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Whenever Savvy Hunter attacks or blocks, create a Food token.
this.addAbility(new AttacksOrBlocksTriggeredAbility(new CreateTokenEffect(new FoodToken()), false));
// Sacrifice two Foods: Draw a card.
this.addAbility(new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1),
new SacrificeTargetCost(new TargetControlledPermanent(2, filter))
));
}
private SavvyHunter(final SavvyHunter card) {
super(card);
}
@Override
public SavvyHunter copy() {
return new SavvyHunter(this);
}
}

View file

@ -0,0 +1,76 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
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.ComparisonType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledArtifactPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TappedPredicate;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class ShimmerDragon extends CardImpl {
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT, ComparisonType.MORE_THAN, 3
);
private static final FilterControlledPermanent filter
= new FilterControlledArtifactPermanent("untapped artifacts you control");
static {
filter.add(Predicates.not(TappedPredicate.instance));
}
public ShimmerDragon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{U}");
this.subtype.add(SubType.DRAGON);
this.power = new MageInt(5);
this.toughness = new MageInt(6);
// Flying
this.addAbility(FlyingAbility.getInstance());
// As long as you control four or more artifacts, Shimmer Dragon has hexproof.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(
HexproofAbility.getInstance(), Duration.WhileOnBattlefield
), condition, "as long as you control four or more artifacts, {this} has hexproof"
)));
// Tap two untapped artifacts you control: Draw a card.
this.addAbility(new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1),
new TapTargetCost(new TargetControlledPermanent(2, filter))
));
}
private ShimmerDragon(final ShimmerDragon card) {
super(card);
}
@Override
public ShimmerDragon copy() {
return new ShimmerDragon(this);
}
}

View file

@ -0,0 +1,55 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostSourceWhileControlsEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterEnchantmentPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class Shinechaser extends CardImpl {
private static final FilterPermanent filter = new FilterEnchantmentPermanent("an enchantment");
public Shinechaser(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{U}");
this.subtype.add(SubType.FAERIE);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// Shinechaser gets +1/+1 as long as you control an artifact.
this.addAbility(new SimpleStaticAbility(
new BoostSourceWhileControlsEffect(StaticFilters.FILTER_PERMANENT_ARTIFACT_AN, 1, 1)
));
// Shinechaser gets +1/+1 as long as you control an enchantment.
this.addAbility(new SimpleStaticAbility(new BoostSourceWhileControlsEffect(filter, 1, 1)));
}
private Shinechaser(final Shinechaser card) {
super(card);
}
@Override
public Shinechaser copy() {
return new Shinechaser(this);
}
}

View file

@ -0,0 +1,65 @@
package mage.cards.s;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.FlashAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Outcome;
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 ShiningArmor extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.KNIGHT);
public ShiningArmor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{W}");
this.subtype.add(SubType.EQUIPMENT);
// Flash
this.addAbility(FlashAbility.getInstance());
// When Shining Armor enters the battlefield, attach it to target Knight you control.
Ability ability = new EntersBattlefieldTriggeredAbility(
new AttachEffect(Outcome.Benefit, "attach it to target Knight you control")
);
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
// Equipped creature gets +0/+2 and has vigilance.
ability = new SimpleStaticAbility(new BoostEquippedEffect(0, 2));
ability.addEffect(new GainAbilityAttachedEffect(
VigilanceAbility.getInstance(), AttachmentType.EQUIPMENT
).setText("and has vigilance"));
this.addAbility(ability);
// Equip {3}
this.addAbility(new EquipAbility(3));
}
private ShiningArmor(final ShiningArmor card) {
super(card);
}
@Override
public ShiningArmor copy() {
return new ShiningArmor(this);
}
}

View file

@ -0,0 +1,49 @@
package mage.cards.s;
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.DestroyTargetEffect;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
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 mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SteelbaneHydra extends CardImpl {
public SteelbaneHydra(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{G}");
this.subtype.add(SubType.TURTLE);
this.subtype.add(SubType.HYDRA);
// Steelbane Hydra enters the battlefield with X +1/+1 counters on it.
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())));
// {2}{G}, Remove a +1/+1 counter from Steelbane Hydra: Destroy target artifact or enchantment.
Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new ManaCostsImpl("{2}{G}"));
ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance(1)));
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
this.addAbility(ability);
}
private SteelbaneHydra(final SteelbaneHydra card) {
super(card);
}
@Override
public SteelbaneHydra copy() {
return new SteelbaneHydra(this);
}
}

View file

@ -0,0 +1,37 @@
package mage.cards.t;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.SacrificeAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.FoodToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TasteOfDeath extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("creatures");
public TasteOfDeath(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}{B}");
// Each player sacrifices three creatures. You create three Food tokens.
this.getSpellAbility().addEffect(new SacrificeAllEffect(3, filter));
this.getSpellAbility().addEffect(new CreateTokenEffect(new FoodToken(), 3).concatBy("You"));
}
private TasteOfDeath(final TasteOfDeath card) {
super(card);
}
@Override
public TasteOfDeath copy() {
return new TasteOfDeath(this);
}
}

View file

@ -0,0 +1,104 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.FilterSpell;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SupertypePredicate;
import mage.game.Game;
import mage.game.permanent.token.KnightToken;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TheCircleOfLoyalty extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a legendary spell");
static {
filter.add(new SupertypePredicate(SuperType.LEGENDARY));
}
public TheCircleOfLoyalty(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}{W}{W}");
this.addSuperType(SuperType.LEGENDARY);
// This spell costs {1} less to cast for each Knight you control.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new TheCircleOfLoyaltyCostReductionEffect()));
// Creatures you control get +1/+1.
this.addAbility(new SimpleStaticAbility(
new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield)
));
// Whenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance.
this.addAbility(new SpellCastControllerTriggeredAbility(
new CreateTokenEffect(new KnightToken()), filter, false
));
// {3}{W}, {T}: Create a 2/2 white Knight creature token with vigilance.
Ability ability = new SimpleActivatedAbility(
new CreateTokenEffect(new KnightToken()), new ManaCostsImpl("{3}{W}")
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);
}
private TheCircleOfLoyalty(final TheCircleOfLoyalty card) {
super(card);
}
@Override
public TheCircleOfLoyalty copy() {
return new TheCircleOfLoyalty(this);
}
}
class TheCircleOfLoyaltyCostReductionEffect extends CostModificationEffectImpl {
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.KNIGHT);
TheCircleOfLoyaltyCostReductionEffect() {
super(Duration.WhileOnStack, Outcome.Benefit, CostModificationType.REDUCE_COST);
staticText = "This spell costs {1} less to cast for each Knight you control";
}
private TheCircleOfLoyaltyCostReductionEffect(final TheCircleOfLoyaltyCostReductionEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
int reductionAmount = game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game);
CardUtil.reduceCost(abilityToModify, reductionAmount);
return true;
}
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
return abilityToModify instanceof SpellAbility
&& abilityToModify.getSourceId().equals(source.getSourceId())
&& game.getCard(abilityToModify.getSourceId()) != null;
}
@Override
public TheCircleOfLoyaltyCostReductionEffect copy() {
return new TheCircleOfLoyaltyCostReductionEffect(this);
}
}

View file

@ -0,0 +1,62 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldOrAttacksAllTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
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.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.permanent.CommanderPredicate;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TomeOfLegends extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("your commander");
static {
filter.add(CommanderPredicate.instance);
}
public TomeOfLegends(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
// Tome of Legends enters the battlefield with a page counter on it.
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(
CounterType.PAGE.createInstance()
), "with a page counter on it"));
// Whenever your commander enters the battlefield or attacks, put a page counter on Tome of Legends.
this.addAbility(new EntersBattlefieldOrAttacksAllTriggeredAbility(
new AddCountersSourceEffect(CounterType.PAGE.createInstance()), filter
));
// {1}, {T}, Remove a page counter from Tome of Legends: Draw a card.
Ability ability = new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1), new GenericManaCost(1)
);
ability.addCost(new TapSourceCost());
ability.addCost(new RemoveCountersSourceCost(CounterType.PAGE.createInstance()));
this.addAbility(ability);
}
private TomeOfLegends(final TomeOfLegends card) {
super(card);
}
@Override
public TomeOfLegends copy() {
return new TomeOfLegends(this);
}
}

View file

@ -3,6 +3,8 @@
package mage.cards.v;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
@ -26,9 +28,16 @@ public final class ViridianClaw extends CardImpl {
public ViridianClaw (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
this.subtype.add(SubType.EQUIPMENT);
// Equipped creature gets +1/+0 and has first strike.
Ability ability = new SimpleStaticAbility(new BoostEquippedEffect(1, 0));
ability.addEffect(new GainAbilityAttachedEffect(
FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT).setText("and has first strike")
);
this.addAbility(ability);
// Equip {1}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(1)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEquippedEffect(1, 0)));
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FirstStrikeAbility.getInstance(), AttachmentType.EQUIPMENT)));
}
public ViridianClaw (final ViridianClaw card) {

View file

@ -1,14 +1,16 @@
package mage.cards.w;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.keyword.DefenderAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.permanent.token.TokenImpl;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
@ -30,8 +32,7 @@ public final class WishfulMerfolk extends CardImpl {
this.addAbility(DefenderAbility.getInstance());
// {1}{U}: Wishful Merfolk loses defender and becomes a Human until end of turn.
//this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WishfulMerfolkEffect(), new ManaCostsImpl("{1}{U}")));
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new WishfulMerfolkToken(), "", Duration.EndOfTurn), new ManaCostsImpl("{1}{U}")));
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WishfulMerfolkEffect(), new ManaCostsImpl("{1}{U}")));
}
public WishfulMerfolk(final WishfulMerfolk card) {
@ -44,22 +45,52 @@ public final class WishfulMerfolk extends CardImpl {
}
}
class WishfulMerfolkToken extends TokenImpl {
class WishfulMerfolkEffect extends ContinuousEffectImpl {
public WishfulMerfolkToken() {
super("Wishful Merfolk", "");
this.cardType.add(CardType.CREATURE);
this.subtype.add(SubType.HUMAN);
this.color.setBlue(true);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
public WishfulMerfolkEffect() {
super(Duration.EndOfTurn, Outcome.AddAbility);
staticText = "{this} loses defender and becomes a Human until end of turn";
}
public WishfulMerfolkToken(final WishfulMerfolkToken token) {
super(token);
public WishfulMerfolkEffect(final WishfulMerfolkEffect effect) {
super(effect);
}
public WishfulMerfolkToken copy() {
return new WishfulMerfolkToken(this);
@Override
public WishfulMerfolkEffect copy() {
return new WishfulMerfolkEffect(this);
}
@Override
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
switch (layer) {
case AbilityAddingRemovingEffects_6:
if (sublayer == SubLayer.NA) {
permanent.getAbilities().removeIf(entry -> entry.getId().equals(DefenderAbility.getInstance().getId()));
}
break;
case TypeChangingEffects_4:
if (permanent.getSubtype(game).contains(SubType.MERFOLK)) {
permanent.getSubtype(game).clear();
permanent.getSubtype(game).add(SubType.HUMAN);
}
break;
}
return true;
}
return false;
}
@Override
public boolean apply(Game game, Ability source) {
return false;
}
@Override
public boolean hasLayer(Layer layer) {
return layer == Layer.AbilityAddingRemovingEffects_6
|| layer == Layer.TypeChangingEffects_4;
}
}

View file

@ -1,5 +1,6 @@
package mage.sets;
import mage.cards.AdventureCard;
import mage.cards.ExpansionSet;
import mage.constants.Rarity;
import mage.constants.SetType;
@ -27,22 +28,55 @@ public final class ThroneOfEldraine extends ExpansionSet {
this.ratioBoosterMythic = 8;
this.maxCardNumberInBooster = 269; // unconfirmed for now
cards.add(new SetCardInfo("Alela, Artful Provocateur", 324, Rarity.MYTHIC, mage.cards.a.AlelaArtfulProvocateur.class));
cards.add(new SetCardInfo("All That Glitters", 2, Rarity.UNCOMMON, mage.cards.a.AllThatGlitters.class));
cards.add(new SetCardInfo("Arcane Signet", 331, Rarity.COMMON, mage.cards.a.ArcaneSignet.class));
cards.add(new SetCardInfo("Arcanist's Owl", 206, Rarity.UNCOMMON, mage.cards.a.ArcanistsOwl.class));
cards.add(new SetCardInfo("Bake into a Pie", 76, Rarity.COMMON, mage.cards.b.BakeIntoAPie.class));
cards.add(new SetCardInfo("Belle of the Brawl", 78, Rarity.UNCOMMON, mage.cards.b.BelleOfTheBrawl.class));
cards.add(new SetCardInfo("Chittering Witch", 319, Rarity.RARE, mage.cards.c.ChitteringWitch.class));
cards.add(new SetCardInfo("Chulane, Teller of Tales", 326, Rarity.MYTHIC, mage.cards.c.ChulaneTellerOfTales.class));
cards.add(new SetCardInfo("Command Tower", 333, Rarity.COMMON, mage.cards.c.CommandTower.class));
cards.add(new SetCardInfo("Corridor Monitor", 41, Rarity.COMMON, mage.cards.c.CorridorMonitor.class));
cards.add(new SetCardInfo("Crystal Slipper", 119, Rarity.COMMON, mage.cards.c.CrystalSlipper.class));
cards.add(new SetCardInfo("Embereth Paladin", 121, Rarity.COMMON, mage.cards.e.EmberethPaladin.class));
cards.add(new SetCardInfo("Embereth Shieldbreaker", 122, Rarity.UNCOMMON, mage.cards.e.EmberethShieldbreaker.class));
cards.add(new SetCardInfo("Embereth Skyblazer", 321, Rarity.RARE, mage.cards.e.EmberethSkyblazer.class));
cards.add(new SetCardInfo("Eye Collector", 86, Rarity.COMMON, mage.cards.e.EyeCollector.class));
cards.add(new SetCardInfo("Faerie Formation", 316, Rarity.RARE, mage.cards.f.FaerieFormation.class));
cards.add(new SetCardInfo("Fireborn Knight", 210, Rarity.UNCOMMON, mage.cards.f.FirebornKnight.class));
cards.add(new SetCardInfo("Flaxen Intruder", 155, Rarity.UNCOMMON, mage.cards.f.FlaxenIntruder.class));
cards.add(new SetCardInfo("Foulmire Knight", 90, Rarity.UNCOMMON, mage.cards.f.FoulmireKnight.class));
cards.add(new SetCardInfo("Garruk, Cursed Huntsman", 191, Rarity.MYTHIC, mage.cards.g.GarrukCursedHuntsman.class));
cards.add(new SetCardInfo("Gilded Goose", 160, Rarity.RARE, mage.cards.g.GildedGoose.class));
cards.add(new SetCardInfo("Gluttonous Troll", 327, Rarity.RARE, mage.cards.g.GluttonousTroll.class));
cards.add(new SetCardInfo("Golden Egg", 220, Rarity.COMMON, mage.cards.g.GoldenEgg.class));
cards.add(new SetCardInfo("Heraldic Banner", 222, Rarity.UNCOMMON, mage.cards.h.HeraldicBanner.class));
cards.add(new SetCardInfo("Inspiring Veteran", 194, Rarity.UNCOMMON, mage.cards.i.InspiringVeteran.class));
cards.add(new SetCardInfo("Lovestruck Beast", 165, Rarity.RARE, mage.cards.l.LovestruckBeast.class));
cards.add(new SetCardInfo("Mace of the Valiant", 314, Rarity.RARE, mage.cards.m.MaceOfTheValiant.class));
cards.add(new SetCardInfo("Maraleaf Pixie", 196, Rarity.UNCOMMON, mage.cards.m.MaraleafPixie.class));
cards.add(new SetCardInfo("Rankle, Master of Pranks", 356, Rarity.MYTHIC, mage.cards.r.RankleMasterOfPranks.class));
cards.add(new SetCardInfo("Order of Midnight", 99, Rarity.UNCOMMON, mage.cards.o.OrderOfMidnight.class));
cards.add(new SetCardInfo("Rankle, Master of Pranks", 101, Rarity.MYTHIC, mage.cards.r.RankleMasterOfPranks.class));
cards.add(new SetCardInfo("Rosethorn Acolyte", 174, Rarity.COMMON, mage.cards.r.RosethornAcolyte.class));
cards.add(new SetCardInfo("Run Away Together", 62, Rarity.COMMON, mage.cards.r.RunAwayTogether.class));
cards.add(new SetCardInfo("Savvy Hunter", 200, Rarity.UNCOMMON, mage.cards.s.SavvyHunter.class));
cards.add(new SetCardInfo("Shimmer Dragon", 317, Rarity.RARE, mage.cards.s.ShimmerDragon.class));
cards.add(new SetCardInfo("Shinechaser", 201, Rarity.UNCOMMON, mage.cards.s.Shinechaser.class));
cards.add(new SetCardInfo("Shining Armor", 29, Rarity.COMMON, mage.cards.s.ShiningArmor.class));
cards.add(new SetCardInfo("Silverflame Ritual", 30, Rarity.COMMON, mage.cards.s.SilverflameRitual.class));
cards.add(new SetCardInfo("Slaying Fire", 143, Rarity.COMMON, mage.cards.s.SlayingFire.class));
cards.add(new SetCardInfo("Slaying Fire", 143, Rarity.UNCOMMON, mage.cards.s.SlayingFire.class));
cards.add(new SetCardInfo("Steelbane Hydra", 322, Rarity.RARE, mage.cards.s.SteelbaneHydra.class));
cards.add(new SetCardInfo("Taste of Death", 320, Rarity.RARE, mage.cards.t.TasteOfDeath.class));
cards.add(new SetCardInfo("The Circle of Loyalty", 9, Rarity.MYTHIC, mage.cards.t.TheCircleOfLoyalty.class));
cards.add(new SetCardInfo("Thornwood Falls", 313, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class));
cards.add(new SetCardInfo("Tome Raider", 68, Rarity.COMMON, mage.cards.t.TomeRaider.class));
cards.add(new SetCardInfo("Tome of Legends", 332, Rarity.RARE, mage.cards.t.TomeOfLegends.class));
cards.add(new SetCardInfo("Wind-Scarred Crag", 308, Rarity.COMMON, mage.cards.w.WindScarredCrag.class));
cards.add(new SetCardInfo("Wishful Merfolk", 73, Rarity.COMMON, mage.cards.w.WishfulMerfolk.class));
cards.add(new SetCardInfo("Witching Well", 74, Rarity.COMMON, mage.cards.w.WitchingWell.class));
// This is here to prevent the incomplete adventure implementation from causing problems and will be removed
cards.removeIf(setCardInfo -> AdventureCard.class.isAssignableFrom(setCardInfo.getCardClass()));
}
}

View file

@ -0,0 +1,26 @@
package mage.cards;
import mage.abilities.SpellAbility;
import mage.constants.CardType;
import java.util.UUID;
/**
* @author TheElk801
*/
public abstract class AdventureCard extends CardImpl {
protected SpellAbility adventureSpellAbility = new SpellAbility(null, null);
public AdventureCard(UUID ownerId, CardSetInfo setInfo, CardType[] typesLeft, CardType[] typesRight, String costsLeft, String adventureName, String costsRight) {
super(ownerId, setInfo, typesLeft, costsLeft);
}
public AdventureCard(AdventureCard card) {
super(card);
}
public SpellAbility getAdventureSpellAbility() {
return adventureSpellAbility;
}
}

View file

@ -14,7 +14,8 @@ public enum SpellAbilityType {
SPLIT_LEFT("LeftSplit SpellAbility"),
SPLIT_RIGHT("RightSplit SpellAbility"),
MODE("Mode SpellAbility"),
SPLICE("Spliced SpellAbility");
SPLICE("Spliced SpellAbility"),
ADVENTURE("Adventure SpellAbility");
private final String text;

View file

@ -240,6 +240,7 @@ public enum SubType {
NIGHTMARE("Nightmare", SubTypeSet.CreatureType),
NIGHTSTALKER("Nightstalker", SubTypeSet.CreatureType),
NINJA("Ninja", SubTypeSet.CreatureType),
NOBLE("Noble", SubTypeSet.CreatureType),
NOGGLE("Noggle", SubTypeSet.CreatureType),
NOMAD("Nomad", SubTypeSet.CreatureType),
NYMPH("Nymph", SubTypeSet.CreatureType),

View file

@ -1,8 +1,3 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.filter.predicate.permanent;
import mage.filter.predicate.Predicate;

View file

@ -0,0 +1,37 @@
package mage.game.command.emblems;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.constants.Duration;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.command.Emblem;
/**
* @author TheElk801
*/
public final class GarrukCursedHuntsmanEmblem extends Emblem {
// -6: You get an emblem with "Creatures you control get +3/+3 and have trample."
public GarrukCursedHuntsmanEmblem() {
this.setName("Emblem Garruk");
this.setExpansionSetCodeForImage("ELD");
Ability ability = new SimpleStaticAbility(
Zone.COMMAND,
new BoostControlledEffect(
3, 3, Duration.EndOfGame,
StaticFilters.FILTER_PERMANENT_CREATURES,
false
).setText("creatures you control get +3/+3")
);
ability.addEffect(new GainAbilityControlledEffect(
TrampleAbility.getInstance(),
Duration.EndOfGame,
StaticFilters.FILTER_PERMANENT_CREATURES
).setText("and have trample"));
this.getAbilities().add(ability);
}
}

View file

@ -1,4 +1,4 @@
package mage.game.permanent.token.custom;
package mage.game.permanent.token;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@ -9,14 +9,12 @@ import mage.abilities.effects.common.GainLifeEffect;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.permanent.token.TokenImpl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* @author jmharmon
*/

View file

@ -0,0 +1,39 @@
package mage.game.permanent.token;
import mage.MageInt;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersAllEffect;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
/**
* @author TheElk801
*/
public final class GarrukCursedHuntsmanToken extends TokenImpl {
private static final FilterPermanent filter
= new FilterControlledPermanent(SubType.GARRUK, "Garruk you control");
public GarrukCursedHuntsmanToken() {
super("Wolf", "2/2 black and green Wolf creature token with \"When this creature dies, put a loyalty counter on each Garruk you control.\"");
cardType.add(CardType.CREATURE);
color.setBlack(true);
color.setGreen(true);
subtype.add(SubType.WOLF);
power = new MageInt(2);
toughness = new MageInt(2);
this.addAbility(new DiesTriggeredAbility(new AddCountersAllEffect(CounterType.LOYALTY.createInstance(), filter)));
}
public GarrukCursedHuntsmanToken(final GarrukCursedHuntsmanToken token) {
super(token);
}
public GarrukCursedHuntsmanToken copy() {
return new GarrukCursedHuntsmanToken(this);
}
}

View file

@ -5,21 +5,24 @@ import mage.filter.common.FilterControlledPermanent;
import mage.target.TargetPermanent;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class TargetControlledPermanent extends TargetPermanent {
public TargetControlledPermanent() {
this(1, 1, StaticFilters.FILTER_CONTROLLED_PERMANENT, false);
this(1);
}
public TargetControlledPermanent(int numTargets) {
this(numTargets, numTargets, StaticFilters.FILTER_CONTROLLED_PERMANENT, false);
this(numTargets, StaticFilters.FILTER_CONTROLLED_PERMANENT);
}
public TargetControlledPermanent(FilterControlledPermanent filter) {
this(1, 1, filter, false);
this(1, filter);
}
public TargetControlledPermanent(int numTargets, FilterControlledPermanent filter) {
this(numTargets, numTargets, filter, false);
}
public TargetControlledPermanent(int minNumTargets, int maxNumTargets, FilterControlledPermanent filter, boolean notTarget) {

View file

@ -35993,47 +35993,70 @@ Island|Commander 2019|291|C||Basic Land - Island|||({T}: Add {U}.)|
Swamp|Commander 2019|294|C||Basic Land - Swamp|||({T}: Add {B}.)|
Mountain|Commander 2019|297|C||Basic Land - Mountain|||({T}: Add {R}.)|
Forest|Commander 2019|300|C||Basic Land - Forest|||({T}: Add {G}.)|
Silverflame Ritual|Throne of Eldraine|30|C|{3}{W}|Sorcery|||Put a +1/+1 counter on each creature you control.$Adamant — If at least three white mana was spent to cast this spell, creatures you controol gain vigilance until end of turn.|
All That Glitters|Throne of Eldraine|2|U|{1}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +1/+1 for each artifact and/or enchantment you control.|
The Circle of Loyalty|Throne of Eldraine|9|M|{4}{W}{W}|Legendary Artifact|||This spell costs {1} less to cast for each Knight you control.$Creatures you control get +1/+1.$Whenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance.${3}{W}, {T}: Create a 2/2 white Knight creature token with vigilance.|
Shining Armor|Throne of Eldraine|29|C|{1}{W}|Artifact - Equipment|||Flash$When Shining Armor enters the battlefield, attach it to target Knight you control.$Equipped creature gets +0/+2 and has vigilance.$Equip {3}|
Silverflame Ritual|Throne of Eldraine|30|C|{3}{W}|Sorcery|||Put a +1/+1 counter on each creature you control.$Adamant — If at least three white mana was spent to cast this spell, creatures you control gain vigilance until end of turn.|
Animating Faerie|Throne of Eldraine|38|U|{2}{U}|Creature - Faerie|2|2|Flying|
Bring to Life|Throne of Eldraine|38|U|{2}{U}|Sorcery - Adventure|2|2|Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it.|
Corridor Monitor|Throne of Eldraine|41|C|{1}{U}|Artifact Creature - Construct|1|4|When Corridor Monitor enters the battlefield, untap target artifact or creature you control.|
Faerie Vandal|Throne of Eldraine|45|U|{1}{U}|Creature - Faerie Rogue|1|2|Flash$Flying$Whenever you draw your second card each turn, put a +1/+1 counter on Faerie Vandal.|
Frogify|Throne of Eldraine|47|U|{1}{U}|Enchantment - Aura|||Enchant creature$Enchanted creature loses all abilities and is a blue Frog creature with base power and toughness 1/1.|
Midnight Clock|Throne of Eldraine|54|R|{2}{U}|Artifact|||{T}: Add {U}.${2}{U}: Put an hour counter on Midnight Clock.$At the beginning of each upkeep, put an hour counter on Midnight Clock.$When the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock.|
Run Away Together|Throne of Eldraine|62|C|{1}{U}|Instant|||Choose two target creatures controlled by different players. Return those creatures to their owners' hands.|
Tome Raider|Throne of Eldraine|68|C|{2}{U}|Creature - Faerie|1|1|Flying$When Tome Raider enters the battlefield, draw a card.|
Wishful Merfolk|Throne of Eldraine|73|C|{1}{U}|Creature - Merfolk|3|2|Defender${1}{U}: Wishful Merfolk loses defender and becomes a Human until end of turn.|
Witching Well|Throne of Eldraine|74|C|{U}|Artifact|||When Witching Well enters the battlefield, scry 2.${3}{U}, Sacrifice Witching Well: Draw two cards.|
Bake into a Pie|Throne of Eldraine|76|C|{2}{B}{B}|Instant|||Destroy target creature. Create a Food token.|
Belle of the Brawl|Throne of Eldraine|78|U|{2}{B}|Creature - Human Knight|3|2|Menace$Whenever Belle of the Brawl attacks, other Knights you control get +1/+0 until end of turn.|
Eye Collector|Throne of Eldraine|86|C|{B}|Creature - Faerie|1|1|Flying$Whenever Eye Collector deals combat damage to a player, each player puts the top card of their library into their graveyard.|
Foulmire Knight|Throne of Eldraine|90|U|{B}|Creature - Zombie Knight|1|1|Deathtouch|
Profane Insight|Throne of Eldraine|90|U|{2}{B}|Instant - Adventure|1|1|You draw a card and you lose 1 life.|
Alter Fate|Throne of Eldraine|99|U|{1}{B}|Sorcery - Adventure|2|2|Return target creature card from your graveyard to your hand.|
Order of Midnight|Throne of Eldraine|99|U|{1}{B}|Creature - Human Knight|2|2|Flying$Order of Midnight can't block.|
Piper of the Swarm|Throne of Eldraine|100|R|{1}{B}|Creature - Human Warlock|1|3|Rats you control have menace.${1}{B}, {T}: Create a 1/1 black Rat creature token.${2}{B}{B}, {T}, Sacrifice three Rats: Gain control of target creature.|
Rankle, Master of Pranks|Throne of Eldraine|101|M|{2}{B}{B}|Legendary Creature - Faerie Rogue|3|3|Flying, haste$Whenever Rankle, Master of Pranks deals combat damage to a player, choose any number —$• Each player discards a card.$• Each player loses 1 life and draws a card.$• Each player sacrifices a creature.|
Curry Favor|Throne of Eldraine|105|C|{B}|Sorcery - Adventure|2|1|You gain X life and each opponent loses X life, where X is the number of Knights you control.|
Smitten Swordmaster|Throne of Eldraine|105|C|{1}{B}|Creature - Human Knight|2|1|Lifelink|
Syr Konrad, the Grim|Throne of Eldraine|107|U|{3}{B}{B}|Legendary Creature - Human Knight|5|4|Whenever another creature dies, or a creature card is put into a graveyard from anywhere other than the battlefield, or a creature card leaves your graveyard, Syr Konrad, the Grim deals 1 damage to each opponent.${1}{B}: Each player puts the top card of their library into their graveyard.|
Crystal Slipper|Throne of Eldraine|119|C|{1}{R}|Artifact - Equipment|||Equipped creature gets +1/+0 and has haste.$Equip {1}|
Embereth Paladin|Throne of Eldraine|121|C|{3}{R}|Creature - Human Knight|4|1|Haste$Adamant — If at least three red mana was spent to cast this spell, Embereth Paladin enters the battlefield with a +1/+1 counter on it.|
Slaying Fire|Throne of Eldraine|143|C|{2}{R}|Instant|||Slaying Fire deals 3 damage to any target.$Adamant — If at least three red mana was spent to cast this spell, it deals 4 damage instead.|
Battle Display|Throne of Eldraine|122|U|{R}|Sorcery - Adventure|2|1|Destroy target artifact.|
Embereth Shieldbreaker|Throne of Eldraine|122|U|{1}{R}|Creature - Human Knight|2|1||
Slaying Fire|Throne of Eldraine|143|U|{2}{R}|Instant|||Slaying Fire deals 3 damage to any target.$Adamant — If at least three red mana was spent to cast this spell, it deals 4 damage instead.|
Beanstalk Giant|Throne of Eldraine|149|U|{6}{G}|Creature - Giant|*|*|Beanstalk Giant's power and toughness are each equal to the number of lands you control.|
Fertile Footsteps|Throne of Eldraine|149|U|{2}{G}|Sorcery - Adventure|*|*|Search your library for a basic land card, put it onto the battlefield, then shuffle your library.|
Flaxen Intruder|Throne of Eldraine|155|U|{G}|Creature - Human Berserker|1|2|Whenever Flaxen Intruder deals combat damage to a player, you may sacrifice it. When you do, destroy target artifact or enchantment.|
Welcome Home|Throne of Eldraine|155|U|{5}{G}{G}|Sorcery - Adventure|1|2|Create three 2/2 green Bear creature tokens.|
Gilded Goose|Throne of Eldraine|160|R|{G}|Creature - Bird|0|2|Flying$When Gilded Goose enters the battlefield, create a Food token.${1}{G}, {T}: Create a Food token.${T}, Sacrifice a Food: Add one mana of any color.|
Keeper of Fables|Throne of Eldraine|163|U|{3}{G}{G}|Creature - Cat|4|5|Whenever one or more non-Human creatures you control deal combat damage to a player, draw a card.|
Heart's Desire|Throne of Eldraine|165|R|{G}|Sorcery - Adventure|5|5|Create a 1/1 white Human creature token.|
Lovestruck Beast|Throne of Eldraine|165|R|{2}{G}|Creature - Beast Noble|5|5|Lovestruck Beast can't attack unless you control a 1/1 creature.|
Rosethorn Acolyte|Throne of Eldraine|174|C|{2}{G}|Creature - Elf Druid|2|3|{T}: Add one mana of any color.|
Seasonal Ritual|Throne of Eldraine|174|C|{G}|Sorcery - Adventure|2|3|Add one mana of any color.|
Garruk, Cursed Huntsman|Throne of Eldraine|191|M|{4}{B}{G}|Legendary Planeswalker - Garruk|5|0: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."$3: Destroy target creature. Draw a card.$6: You get an emblem with "Creatures you control get +3/+3 and have trample."|
Inspiring Veteran|Throne of Eldraine|194|U|{R}{W}|Creature - Human Knight|2|2|Other Knights you control get +1/+1.|
Maraleaf Pixie|Throne of Eldraine|196|U|{G}{U}|Creature - Faerie|2|2|Flying${T}: Add {G} or {U}.|
Oko, Thief of Crowns|Throne of Eldraine|197|M|{1}{G}{U}|Legendary Planeswalker - Oko|4|+2: Create a Food token.$+1: Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3.$5: Exchange control of target artifact or creature you control and target creature an opponent controls with power 3 or less.|
Savvy Hunter|Throne of Eldraine|200|U|{1}{B}{G}|Creature - Human Warrior|3|3|Whenever Savvy Hunter attacks or blocks, create a Food token.$Sacrifice two Foods: Draw a card.|
Shinechaser|Throne of Eldraine|201|U|{1}{W}{U}|Creature - Faerie|1|1|Flying, vigilance$Shinechaser gets +1/+1 as long as you control an artifact.$Shinechaser gets +1/+1 as long as you control an enchantment.|
Steelclaw Lance|Throne of Eldraine|202|U|{B}{R}|Artifact - Equipment|||Equipped creature gets +2/+2.$Equip Knight {1}$Equip {3}|
Wintermoor Commander|Throne of Eldraine|205|U|{W}{B}|Creature - Human Knight|2|*|Deathtouch$Wintermoor Commander's toughness is equal to the number of Knights you control.$Whenever Wintermoor Commander attacks, another target Knight you control gains indestructible until end of turn.|
Arcanist's Owl|Throne of Eldraine|206|U|{W/U}{W/U}{W/U}{W/U}|Artifact Creature - Bird|3|3|Flying$When Arcanist's Owl enters the battlefield, look at the top four cards of your library. You may reveal an artifact or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.|
Fireborn Knight|Throne of Eldraine|210|U|{R/W}{R/W}{R/W}{R/W}|Creature - Human Knight|2|3|Double strike${R/W}{R/W}{R/W}{R/W}: Fireborn Knight gets +1/+1 until end of turn.|
Golden Egg|Throne of Eldraine|220|C|{2}|Artifact - Food|||When Golden Egg enters the battlefield, draw a card.${1}, {T}: Sacrifice Golden Egg: Add one mana of any color.${2}, {T}, Sacrifice Golden Egg: You gain 3 life.|
Heraldic Banner|Throne of Eldraine|222|U|{3}|Artifact|||As Heraldic Banner enters the battlefield, choose a color.$Creatures you control of the chosen color get +1/+0.${T}: Add one mana of the chosen color.|
Tournament Grounds|Throne of Eldraine|248|U||Land|||{T}: Add {C}.${T}: Add {R}, {W}, or {B}. Spend this mana only to cast a Knight or Equipment spell.|
Witch's Cottage|Throne of Eldraine|249|C||Land - Swamp|||({T}: Add {B}.)$Witch's Cottage enters the battlefield tapped unless you control three or more other Swamps.$When Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library.|
Garruk, Cursed Huntsman|Throne of Eldraine|270|M|{4}{B}{G}|Legendary Planeswalker - Garruk|5|0: Create two 2/2 black and green Wolf creature tokens with "When this creature dies, put a loyalty counter on each Garruk you control."$3: Destroy target creature. Draw a card.$6: You get an emblem with "Creatures you control get +3/+3 and have trample."|
Battle Display|Throne of Eldraine|292|U|{R}|Sorcery - Adventure|2|1|Destroy target artifact.|
Embereth Shieldbreaker|Throne of Eldraine|292|U|{1}{R}|Creature - Human Knight|2|1||
Flaxen Intruder|Throne of Eldraine|297|U|{G}|Creature - Human Berserker|1|2|Whenever Flaxen Intruder deals combat damage to a player, you may sacrifice it. When you do, destroy target artifact or enchantment.|
Welcome Home|Throne of Eldraine|297|U|{5}{G}{G}|Sorcery - Adventure|1|2|Create three 2/2 green Bear creature tokens.|
Heart's Desire|Throne of Eldraine|299|R|{G}|Sorcery - Adventure|5|5|Create a 1/1 white Human creature token.|
Lovestruck Beast|Throne of Eldraine|299|R|{2}{G}|Creature - Beast Noble|5|5|Lovestruck Beast can't attack unless you control a 1/1 creature.|
Wind-Scarred Crag|Throne of Eldraine|308|C||Land|||Wind-Scarred Crag enters the battlefield tapped.$When Wind-Scarred Crag enters the battlefield, you gain 1 life.${T}: Add {R} or {W}.|
Thornwood Falls|Throne of Eldraine|313|C||Land|||Thornwood Falls enters the battlefield tapped.$When Thornwood Falls enters the battlefield, you gain 1 life.${T}: Add {G} or {U}.|
Mace of the Valiant|Throne of Eldraine|314|R|{2}{W}|Artifact - Equipment|||Equipped creature gets +1/+1 for each charge counter on Mace of the Valiant and has vigilance.$Whenever a creature enters the battlefield under your control, put a charge counter on Mace of the Valiant.$Equip {3}|
Silverwing Squadron|Throne of Eldraine|315|R|{5}{W}|Creature - Human Knight|*|*|Flying, vigilance$Silverwing Squadron's power and toughness are each equal to the number of creatures you control.$Whenever Silverwing Squadron attacks, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you have.|
Faerie Formation|Throne of Eldraine|316|R|{4}{U}|Creature - Faerie|5|4|Flying${3}{U}: Create a 1/1 blue Faerie creature token with flying. Draw a card.|
Shimmer Dragon|Throne of Eldraine|317|R|{4}{U}{U}|Creature - Dragon|5|6|Flying$As long as you control four or more artifacts, Shimmer Dragon has hexproof.$Tap two untapped artifacts you control: Draw a card.|
Workshop Elders|Throne of Eldraine|318|R|{6}{U}|Creature - Human Artificer|4|4|Artifact creatures you control have flying.$At the beginning of combat on your turn, you may have target noncreature artifact you control become a 0/0 artifact creature. If you do, put four +1/+1 counters on it.|
Chittering Witch|Throne of Eldraine|319|R|{3}{B}|Creature - Human Warlock|2|2|When Chittering Witch enters the battlefield, create a number of 1/1 black Rat creature tokens equal to the number of opponents you have.${1}{B}, Sacrifice a creature: Target creature gets -2/-2 until end of turn.|
Taste of Death|Throne of Eldraine|320|R|{4}{B}{B}|Sorcery|||Each player sacrifices three creatures. You create three Food tokens.|
Embereth Skyblazer|Throne of Eldraine|321|R|{3}{R}|Creature - Human Knight|4|3|As long as it's your turn, Embereth Skyblazer has flying.$Whenever Embereth Skyblazer attacks, you may pay {2}{R}. If you do, creatures you control get +X/+0 until end of turn, where X is the number of opponents you have.|
Steelbane Hydra|Throne of Eldraine|322|R|{X}{G}{G}|Creature - Turtle Hydra|||Steelbane Hydra enters the battlefield with X +1/+1 counters on it.${2}{G}, Remove a +1/+1 counter from Steelbane Hydra: Destroy target artifact or enchantment.|
Thorn Mammoth|Throne of Eldraine|323|R|{5}{G}{G}|Creature - Elephant|6|6|Trample$Whenever Thorn Mammoth or another creature enters the battlefield under your control, Thorn Mammoth fights up to one target creature you don't control.|
@ -36041,12 +36064,9 @@ Alela, Artful Provocateur|Throne of Eldraine|324|M|{1}{W}{U}{B}|Legendary Creatu
Banish into Fable|Throne of Eldraine|325|R|{4}{W}{U}|Instant|||When you cast this spell from your hand, copy it if you control an artifact, then copy it if you control an enchantment. You may choose new targets for the copies.$Return target nonland permanent to its owner's hand. You create a 2/2 white Knight creature token with vigilance.|
Chulane, Teller of Tales|Throne of Eldraine|326|M|{2}{G}{W}{U}|Legendary Creature - Human Druid|2|4|Vigilance$Whenever you cast a creature spell, draw a card, then you may put a land card from your hand onto the battlefield.${3}, {T}: Return target creature you control to its owner's hand.|
Gluttonous Troll|Throne of Eldraine|327|R|{2}{B}{G}|Creature - Troll|3|3|Trample$When Gluttonous Troll enters the battlefield, create a number of Food tokens equal to the number of opponents you have.${1}{G}, Sacrifice another nonland permanent: Gluttonous Troll gets +2/+2 until end of turn.|
Knight's Charge|Throne of Eldraine|328|R|{1}{W}{B}|Enchantment|||Whenever a Knight you control attacks, each opponent loses 1 life and you gain 1 life.${6}{W}{B}, Sacrifice Knight's Charge: Return all Knight creature cards from your graveyard to the battlefield.|
Knights' Charge|Throne of Eldraine|328|R|{1}{W}{B}|Enchantment|||Whenever a Knight you control attacks, each opponent loses 1 life and you gain 1 life.${6}{W}{B}, Sacrifice Knights' Charge: Return all Knight creature cards from your graveyard to the battlefield.|
Korvold, Fae-Cursed King|Throne of Eldraine|329|M|{2}{B}{R}{G}|Legendary Creature - Dragon Noble|4|4|Flying$Whenever Korvold, Fae-Cursed King enters the battlefield or attacks, sacrifice another permanent.$Whenever you sacrifice a permanent, put a +1/+1 counter on Korvold and draw a card.|
Syr Gwyn, Hero of Ashenvale|Throne of Eldraine|330|M|{3}{R}{W}{B}|Legendary Creature - Human Knight|5|5|Vigilance, menace$Whenever an equipped creature you control attacks, you draw a card and you lose 1 life.$Equipment you control have equip Knight {0}.|
Arcane Signet|Throne of Eldraine|331|C|{2}|Artifact|||{T}: Add one mana of any color in your commander's color identity.|
Tome of Legends|Throne of Eldraine|332|R|{2}|Artifact|||Tome of Legends enters the battlefield with a page counter on it.$Whenever your commander enters the battlefield or attacks, put a page counter on Tome of Legends.${1}, {T}, Remove a page counter from Tome of Legends: Draw a card.|
The Circle of Loyalty|Throne of Eldraine|336|M|{4}{W}{W}|Legendary Artifact|||This spell costs {1} less to cast for each Knight you control.$Creatures you control get +1/+1.$Whenever you cast a legendary spell, create a 2/2 white Knight creature token with vigilance.${3}{W}, {T}: Create a 2/2 white Knight creature token with vigilance.|
Midnight Clock|Throne of Eldraine|346|R|{2}{U}|Artifact|||{T}: Add {U}.${2}{U}: Put an hour counter on Midnight Clock.$At the beginning of each upkeep, put an hour counter on Midnight Clock.$When the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock.|
Piper of the Swarm|Throne of Eldraine|355|R|{1}{B}|Creature - Human Warlock|1|3|Rats you control have menace.${1}{B}, {T}: Create a 1/1 black Rat creature token.${2}{B}{B}, {T}, Sacrifice three Rats: Gain control of target creature.|
Rankle, Master of Pranks|Throne of Eldraine|356|M|{2}{B}{B}|Legendary Creature - Faerie Rogue|3|3|Flying, haste$Whenever Rankle, Master of Pranks deals combat damage to a player, choose any number —$• Each player discards a card.$• Each player loses 1 life and draws a card.$• Each player sacrifices a creature.|
Command Tower|Throne of Eldraine|333|C||Land|||{T}: Add one mana of any color in your commander's color identity.|