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 e0abefff53d..22248d13b6c 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 @@ -2587,7 +2587,33 @@ public class ScryfallImageSupportTokens { put("INR/Zombie/3", "https://api.scryfall.com/cards/tinr/11/en?format=image"); // DFT + put("DFT/Cat", "https://api.scryfall.com/cards/tdft/2/en?format=image"); put("DFT/Emblem Chandra", "https://api.scryfall.com/cards/tdft/13/en?format=image"); + put("DFT/Dinosaur Dragon", "https://api.scryfall.com/cards/tdft/4/en?format=image"); + put("DFT/Elephant", "https://api.scryfall.com/cards/tdft/6/en?format=image"); + put("DFT/Goblin", "https://api.scryfall.com/cards/tdft/5/en?format=image"); + put("DFT/Insect", "https://api.scryfall.com/cards/tdft/7/en?format=image"); + put("DFT/Pilot", "https://api.scryfall.com/cards/tdft/1/en?format=image"); + put("DFT/Servo", "https://api.scryfall.com/cards/tdft/8/en?format=image"); + put("DFT/Thopter/1", "https://api.scryfall.com/cards/tdft/9/en?format=image"); + put("DFT/Thopter/2", "https://api.scryfall.com/cards/tdft/10/en?format=image"); + put("DFT/Treasure", "https://api.scryfall.com/cards/tdft/11/en?format=image"); + put("DFT/Vehicle", "https://api.scryfall.com/cards/tdft/12/en?format=image"); + put("DFT/Zombie", "https://api.scryfall.com/cards/tdft/3/en?format=image"); + + // DTC + put("DRC/Beast/1", "https://api.scryfall.com/cards/tdrc/10/en?format=image"); + put("DRC/Beast/2", "https://api.scryfall.com/cards/tdrc/11/en?format=image"); + put("DRC/Construct", "https://api.scryfall.com/cards/tdrc/12/en?format=image"); + put("DRC/Golem/1", "https://api.scryfall.com/cards/tdrc/13/en?format=image"); + put("DRC/Golem/2", "https://api.scryfall.com/cards/tdrc/14/en?format=image"); + put("DRC/Golem/3", "https://api.scryfall.com/cards/tdrc/15/en?format=image"); + put("DRC/Nalaar Aetherjet", "https://api.scryfall.com/cards/tdrc/16/en?format=image"); + put("DRC/Shapeshifter", "https://api.scryfall.com/cards/tdrc/4/en?format=image"); + put("DRC/Zombie/1", "https://api.scryfall.com/cards/tdrc/3/en?format=image"); + put("DRC/Zombie/2", "https://api.scryfall.com/cards/tdrc/7/en?format=image"); + put("DRC/Zombie Army", "https://api.scryfall.com/cards/tdrc/8/en?format=image"); + put("DRC/Zombie Warrior", "https://api.scryfall.com/cards/tdrc/9/en?format=image"); // generate supported sets supportedSets.clear(); diff --git a/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java b/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java index 4c35ce005dd..26a5957c02f 100644 --- a/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java +++ b/Mage.Sets/src/mage/cards/a/AbuelosAwakening.java @@ -93,6 +93,7 @@ class AbuelosAwakeningContinuousEffect extends ContinuousEffectImpl { AbuelosAwakeningContinuousEffect() { super(Duration.Custom, Outcome.Neutral); staticText = "It's a 1/1 Spirit creature with flying in addition to its other types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private AbuelosAwakeningContinuousEffect(final AbuelosAwakeningContinuousEffect effect) { diff --git a/Mage.Sets/src/mage/cards/a/AegisSculptor.java b/Mage.Sets/src/mage/cards/a/AegisSculptor.java new file mode 100644 index 00000000000..9e9d9302f35 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AegisSculptor.java @@ -0,0 +1,54 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.WardAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AegisSculptor extends CardImpl { + + public AegisSculptor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Ward {2} + this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + + // At the beginning of your upkeep, you may exile two cards from your graveyard. If you do, put a +1/+1 counter on this creature. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new ExileFromGraveCost(new TargetCardInYourGraveyard(2)) + ))); + } + + private AegisSculptor(final AegisSculptor card) { + super(card); + } + + @Override + public AegisSculptor copy() { + return new AegisSculptor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AgentOfKotis.java b/Mage.Sets/src/mage/cards/a/AgentOfKotis.java new file mode 100644 index 00000000000..185970c3989 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AgentOfKotis.java @@ -0,0 +1,38 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.RenewAbility; +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 AgentOfKotis extends CardImpl { + + public AgentOfKotis(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Renew -- {3}{U}, Exile this card from your graveyard: Put two +1/+1 counters on target creature. Activate only as a sorcery. + this.addAbility(new RenewAbility("{3}{U}", CounterType.P1P1.createInstance(2))); + } + + private AgentOfKotis(final AgentOfKotis card) { + super(card); + } + + @Override + public AgentOfKotis copy() { + return new AgentOfKotis(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/AlacrianArmory.java b/Mage.Sets/src/mage/cards/a/AlacrianArmory.java index 7f0f5f5286c..efece7d0c13 100644 --- a/Mage.Sets/src/mage/cards/a/AlacrianArmory.java +++ b/Mage.Sets/src/mage/cards/a/AlacrianArmory.java @@ -3,15 +3,12 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.CrewSaddleIncreasedPowerAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.EndTurnEffect; import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.CrewAbility; import mage.abilities.keyword.SaddleAbility; import mage.abilities.keyword.VigilanceAbility; import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; @@ -25,12 +22,9 @@ import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.filter.predicate.permanent.SaddledSourceThisTurnPredicate; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -100,18 +94,10 @@ class AlacrianArmoryAnimateEffect extends OneShotEffect { return false; } if (target.hasSubtype(SubType.MOUNT, game)) { - target.getAbilities().stream().filter( - ability -> ability instanceof SaddleAbility) - .findFirst() - .ifPresent(ability -> game.fireEvent(GameEvent.getEvent( - GameEvent.EventType.MOUNT_SADDLED, - ability.getSourceId(), - ability, source.getControllerId())) - ); + SaddleAbility.applySaddle(target, game); } if (target.hasSubtype(SubType.VEHICLE, game)) { - game.addEffect(new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.CREATURE, CardType.ARTIFACT) - .setTargetPointer(new FixedTarget(target, game)), source); + game.addEffect(new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.CREATURE, CardType.ARTIFACT), source); } return true; } diff --git a/Mage.Sets/src/mage/cards/a/AnafenzaUnyieldingLineage.java b/Mage.Sets/src/mage/cards/a/AnafenzaUnyieldingLineage.java new file mode 100644 index 00000000000..fb921218f6d --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AnafenzaUnyieldingLineage.java @@ -0,0 +1,62 @@ +package mage.cards.a; + +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.keyword.EndureSourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.permanent.TokenPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AnafenzaUnyieldingLineage extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent("another nontoken creature you control"); + + static { + filter.add(AnotherPredicate.instance); + filter.add(TokenPredicate.FALSE); + } + + public AnafenzaUnyieldingLineage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.SPIRIT); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // First strike + this.addAbility(FirstStrikeAbility.getInstance()); + + // Whenever another nontoken creature you control dies, Anafenza endures 2. + this.addAbility(new DiesCreatureTriggeredAbility( + new EndureSourceEffect(2, "{this}"), true, filter + )); + } + + private AnafenzaUnyieldingLineage(final AnafenzaUnyieldingLineage card) { + super(card); + } + + @Override + public AnafenzaUnyieldingLineage copy() { + return new AnafenzaUnyieldingLineage(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/ArlinnTheMoonsFury.java b/Mage.Sets/src/mage/cards/a/ArlinnTheMoonsFury.java index 614001b4479..bc906251947 100644 --- a/Mage.Sets/src/mage/cards/a/ArlinnTheMoonsFury.java +++ b/Mage.Sets/src/mage/cards/a/ArlinnTheMoonsFury.java @@ -59,6 +59,7 @@ class ArlinnTheMoonsFuryEffect extends ContinuousEffectImpl { ArlinnTheMoonsFuryEffect() { super(Duration.EndOfTurn, Outcome.Benefit); staticText = "until end of turn, {this} becomes a 5/5 Werewolf creature with trample, indestructible, and haste"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private ArlinnTheMoonsFuryEffect(final ArlinnTheMoonsFuryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/a/AuroralProcession.java b/Mage.Sets/src/mage/cards/a/AuroralProcession.java new file mode 100644 index 00000000000..1eb09d7e501 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AuroralProcession.java @@ -0,0 +1,32 @@ +package mage.cards.a; + +import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class AuroralProcession extends CardImpl { + + public AuroralProcession(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}{U}"); + + // Return target card from your graveyard to your hand. + this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect()); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard()); + } + + private AuroralProcession(final AuroralProcession card) { + super(card); + } + + @Override + public AuroralProcession copy() { + return new AuroralProcession(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BearerOfGlory.java b/Mage.Sets/src/mage/cards/b/BearerOfGlory.java new file mode 100644 index 00000000000..583884933cd --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BearerOfGlory.java @@ -0,0 +1,53 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +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.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +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 BearerOfGlory extends CardImpl { + + public BearerOfGlory(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // 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." + ))); + + // {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 BearerOfGlory(final BearerOfGlory card) { + super(card); + } + + @Override + public BearerOfGlory copy() { + return new BearerOfGlory(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BoneCairnButcher.java b/Mage.Sets/src/mage/cards/b/BoneCairnButcher.java new file mode 100644 index 00000000000..d09ca7fb501 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoneCairnButcher.java @@ -0,0 +1,55 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.MobilizeAbility; +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.predicate.permanent.AttackingPredicate; +import mage.filter.predicate.permanent.TokenPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BoneCairnButcher extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("attacking tokens"); + + static { + filter.add(AttackingPredicate.instance); + filter.add(TokenPredicate.TRUE); + } + + public BoneCairnButcher(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{B}"); + + this.subtype.add(SubType.DEMON); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Mobilize 2 + this.addAbility(new MobilizeAbility(2)); + + // Attacking tokens you control have deathtouch. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + DeathtouchAbility.getInstance(), Duration.WhileOnBattlefield, filter + ))); + } + + private BoneCairnButcher(final BoneCairnButcher card) { + super(card); + } + + @Override + public BoneCairnButcher copy() { + return new BoneCairnButcher(this); + } +} diff --git a/Mage.Sets/src/mage/cards/b/BoulderbornDragon.java b/Mage.Sets/src/mage/cards/b/BoulderbornDragon.java new file mode 100644 index 00000000000..90bbab25ec1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BoulderbornDragon.java @@ -0,0 +1,45 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.keyword.SurveilEffect; +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 java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BoulderbornDragon extends CardImpl { + + public BoulderbornDragon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Whenever this creature attacks, surveil 1. + this.addAbility(new AttacksTriggeredAbility(new SurveilEffect(1))); + } + + private BoulderbornDragon(final BoulderbornDragon card) { + super(card); + } + + @Override + public BoulderbornDragon copy() { + return new BoulderbornDragon(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CalderaPyremaw.java b/Mage.Sets/src/mage/cards/c/CalderaPyremaw.java new file mode 100644 index 00000000000..022349fef66 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CalderaPyremaw.java @@ -0,0 +1,54 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.common.TargetOpponent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CalderaPyremaw extends CardImpl { + + public CalderaPyremaw(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever you cast an instant or sorcery spell, put a +1/+1 counter on this creature. Then this creature deals damage equal to its power to target opponent. + Ability ability = new SpellCastControllerTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false + ); + ability.addEffect(new DamageTargetEffect(SourcePermanentPowerValue.NOT_NEGATIVE) + .setText("Then this creature deals damage equal to its power to target opponent")); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + private CalderaPyremaw(final CalderaPyremaw card) { + super(card); + } + + @Override + public CalderaPyremaw copy() { + return new CalderaPyremaw(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CallForthTheTempest.java b/Mage.Sets/src/mage/cards/c/CallForthTheTempest.java index 20b1a339f07..a50a1bf4d3c 100644 --- a/Mage.Sets/src/mage/cards/c/CallForthTheTempest.java +++ b/Mage.Sets/src/mage/cards/c/CallForthTheTempest.java @@ -12,6 +12,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; import mage.game.Game; +import mage.game.stack.Spell; import mage.watchers.common.SpellsCastWatcher; import java.util.UUID; @@ -21,7 +22,7 @@ import java.util.UUID; */ public final class CallForthTheTempest extends CardImpl { - private static Hint hint = new ValueHint("Total mana value of other spells you've cast this turn", CallForthTheTempestDynamicValue.instance); + private static final Hint hint = new ValueHint("Total mana value of other spells you've cast this turn", CallForthTheTempestDynamicValue.instance); public CallForthTheTempest(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{5}{R}{R}{R}"); @@ -36,7 +37,7 @@ public final class CallForthTheTempest extends CardImpl { this.getSpellAbility().addEffect(new DamageAllEffect( CallForthTheTempestDynamicValue.instance, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE - )); + ).setText("{this} deals damage to each creature your opponents control equal to the total mana value of other spells you've cast this turn")); this.getSpellAbility().addHint(hint); } @@ -64,7 +65,7 @@ enum CallForthTheTempestDynamicValue implements DynamicValue { .getSpellsCastThisTurn(sourceAbility.getControllerId()) .stream() .filter(s -> s != null && !s.getSourceId().equals(sourceAbility.getSourceId())) - .mapToInt(s -> s.getManaValue()) + .mapToInt(Spell::getManaValue) .sum(); } @@ -82,4 +83,4 @@ enum CallForthTheTempestDynamicValue implements DynamicValue { public String getMessage() { return "total mana value of other spells you've cast this turn"; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/c/CausticExhale.java b/Mage.Sets/src/mage/cards/c/CausticExhale.java new file mode 100644 index 00000000000..e98d0568b03 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CausticExhale.java @@ -0,0 +1,41 @@ +package mage.cards.c; + +import mage.abilities.costs.OrCost; +import mage.abilities.costs.common.BeholdDragonCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +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 CausticExhale extends CardImpl { + + public CausticExhale(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B}"); + + // As an additional cost to cast this spell, behold a Dragon or pay {1}. + this.getSpellAbility().addCost(new OrCost( + "behold a Dragon or pay {1}", + new BeholdDragonCost(), new GenericManaCost(1) + )); + + // Target creature gets -3/-3 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(-3, -3)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + private CausticExhale(final CausticExhale card) { + super(card); + } + + @Override + public CausticExhale copy() { + return new CausticExhale(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CelesRuneKnight.java b/Mage.Sets/src/mage/cards/c/CelesRuneKnight.java new file mode 100644 index 00000000000..746d854fa3a --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CelesRuneKnight.java @@ -0,0 +1,121 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldOneOrMoreTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; + +/** + * @author balazskristof + */ +public final class CelesRuneKnight extends CardImpl { + + public CelesRuneKnight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WIZARD); + this.subtype.add(SubType.KNIGHT); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When Celes enters, discard any number of cards, then draw that many cards plus one. + this.addAbility(new EntersBattlefieldTriggeredAbility(new CelesRuneKnightEffect())); + + // Whenever one or more other creatures you control enter, if one or more of them entered from a graveyard or was cast from a graveyard, put a +1/+1 counter on each creature you control. + this.addAbility(new CelesRuneKnightTriggeredAbility()); + } + + private CelesRuneKnight(final CelesRuneKnight card) { + super(card); + } + + @Override + public CelesRuneKnight copy() { + return new CelesRuneKnight(this); + } +} + +class CelesRuneKnightEffect extends OneShotEffect { + + CelesRuneKnightEffect() { + super(Outcome.DrawCard); + staticText = "discard any number of cards, then draw that many cards plus one"; + } + + private CelesRuneKnightEffect(final CelesRuneKnightEffect effect) { + super(effect); + } + + @Override + public CelesRuneKnightEffect copy() { + return new CelesRuneKnightEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + int discarded = player.discard(0, Integer.MAX_VALUE, false, source, game).size(); + game.processAction(); + player.drawCards(discarded + 1, source, game); + return true; + } +} + +class CelesRuneKnightTriggeredAbility extends EntersBattlefieldOneOrMoreTriggeredAbility { + + CelesRuneKnightTriggeredAbility() { + super(new AddCountersAllEffect(CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE), StaticFilters.FILTER_OTHER_CONTROLLED_CREATURES, TargetController.YOU); + setTriggerPhrase("Whenever one or more other creatures you control enter, " + + "if one or more of them entered from a graveyard or was cast from a graveyard, "); + } + + private CelesRuneKnightTriggeredAbility(final CelesRuneKnightTriggeredAbility ability) { + super(ability); + } + + @Override + public CelesRuneKnightTriggeredAbility copy() { + return new CelesRuneKnightTriggeredAbility(this); + } + + @Override + public boolean checkEvent(ZoneChangeEvent event, Game game) { + if (super.checkEvent(event, game)) { + Zone fromZone = event.getFromZone(); + if (fromZone == Zone.GRAVEYARD) { + return true; + } + if (fromZone == Zone.STACK) { + Permanent permanent = event.getTarget(); + Spell spell = game.getSpellOrLKIStack(permanent.getId()); + if (spell != null && spell.getFromZone() == Zone.GRAVEYARD) { + return true; + } + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/c/ChimericCoils.java b/Mage.Sets/src/mage/cards/c/ChimericCoils.java index 34efa55d955..764a0b4ac98 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericCoils.java +++ b/Mage.Sets/src/mage/cards/c/ChimericCoils.java @@ -24,7 +24,7 @@ public final class ChimericCoils extends CardImpl { public ChimericCoils(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); - // {X}{1}: Chimeric Coils becomes an X/X Construct artifact creature. Sacrifice it at the beginning of thhe next end step. + // {X}{1}: Chimeric Coils becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. Ability ability = new SimpleActivatedAbility(new ChimericCoilsEffect(), new ManaCostsImpl<>("{X}{1}")); ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new SacrificeSourceEffect()))); this.addAbility(ability); @@ -45,6 +45,7 @@ class ChimericCoilsEffect extends ContinuousEffectImpl { ChimericCoilsEffect() { super(Duration.Custom, Outcome.BecomeCreature); staticText = "{this} becomes an X/X Construct artifact creature"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private ChimericCoilsEffect(final ChimericCoilsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/ChimericStaff.java b/Mage.Sets/src/mage/cards/c/ChimericStaff.java index 1cc20dc76dc..ac323495b8f 100644 --- a/Mage.Sets/src/mage/cards/c/ChimericStaff.java +++ b/Mage.Sets/src/mage/cards/c/ChimericStaff.java @@ -40,6 +40,7 @@ class ChimericStaffEffect extends ContinuousEffectImpl { ChimericStaffEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "{this} becomes an X/X Construct artifact creature until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private ChimericStaffEffect(final ChimericStaffEffect effect) { diff --git a/Mage.Sets/src/mage/cards/c/CoriMountainStalwart.java b/Mage.Sets/src/mage/cards/c/CoriMountainStalwart.java new file mode 100644 index 00000000000..e348bde62db --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CoriMountainStalwart.java @@ -0,0 +1,43 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.FlurryAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.GainLifeEffect; +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 CoriMountainStalwart extends CardImpl { + + public CoriMountainStalwart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.MONK); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flurry -- Whenever you cast your second spell each turn, this creature deals 2 damage to each opponent and you gain 2 life. + Ability ability = new FlurryAbility(new DamagePlayersEffect(2, TargetController.OPPONENT)); + ability.addEffect(new GainLifeEffect(2).concatBy("and")); + this.addAbility(ability); + } + + private CoriMountainStalwart(final CoriMountainStalwart card) { + super(card); + } + + @Override + public CoriMountainStalwart copy() { + return new CoriMountainStalwart(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CruelTruths.java b/Mage.Sets/src/mage/cards/c/CruelTruths.java new file mode 100644 index 00000000000..d2434e39a1f --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CruelTruths.java @@ -0,0 +1,34 @@ +package mage.cards.c; + +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class CruelTruths extends CardImpl { + + public CruelTruths(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{B}"); + + // Surveil 2, then draw two cards. You lose 2 life. + this.getSpellAbility().addEffect(new SurveilEffect(2)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2).concatBy(", then")); + this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(2)); + } + + private CruelTruths(final CruelTruths card) { + super(card); + } + + @Override + public CruelTruths copy() { + return new CruelTruths(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CyberdriveAwakener.java b/Mage.Sets/src/mage/cards/c/CyberdriveAwakener.java index 76632b7468f..469c5c7e081 100644 --- a/Mage.Sets/src/mage/cards/c/CyberdriveAwakener.java +++ b/Mage.Sets/src/mage/cards/c/CyberdriveAwakener.java @@ -70,6 +70,7 @@ class CyberdriveAwakenerEffect extends ContinuousEffectImpl { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "until end of turn, each noncreature artifact you control " + "becomes an artifact creature with base power and toughness 4/4"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private CyberdriveAwakenerEffect(final CyberdriveAwakenerEffect effect) { diff --git a/Mage.Sets/src/mage/cards/d/DalkovanPackbeasts.java b/Mage.Sets/src/mage/cards/d/DalkovanPackbeasts.java new file mode 100644 index 00000000000..8f35926cc5f --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DalkovanPackbeasts.java @@ -0,0 +1,40 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.keyword.MobilizeAbility; +import mage.abilities.keyword.VigilanceAbility; +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 DalkovanPackbeasts extends CardImpl { + + public DalkovanPackbeasts(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.OX); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Mobilize 3 + this.addAbility(new MobilizeAbility(3)); + } + + private DalkovanPackbeasts(final DalkovanPackbeasts card) { + super(card); + } + + @Override + public DalkovanPackbeasts copy() { + return new DalkovanPackbeasts(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DevotedDuelist.java b/Mage.Sets/src/mage/cards/d/DevotedDuelist.java new file mode 100644 index 00000000000..f3edd0aeea7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DevotedDuelist.java @@ -0,0 +1,43 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.common.FlurryAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.keyword.HasteAbility; +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 DevotedDuelist extends CardImpl { + + public DevotedDuelist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.MONK); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Flurry -- Whenever you cast your second spell each turn, this creature deals 1 damage to each opponent. + this.addAbility(new FlurryAbility(new DamagePlayersEffect(1, TargetController.OPPONENT))); + } + + private DevotedDuelist(final DevotedDuelist card) { + super(card); + } + + @Override + public DevotedDuelist copy() { + return new DevotedDuelist(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/Dracogenesis.java b/Mage.Sets/src/mage/cards/d/Dracogenesis.java new file mode 100644 index 00000000000..b322cac4cb1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Dracogenesis.java @@ -0,0 +1,41 @@ +package mage.cards.d; + +import java.util.UUID; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.CastFromHandWithoutPayingManaCostEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; + +/** + * @author balazskristof + */ +public final class Dracogenesis extends CardImpl { + + public static final FilterCard filter = new FilterCard("Dragon spells"); + + static { + filter.add(Predicates.not(CardType.LAND.getPredicate())); + filter.add(SubType.DRAGON.getPredicate()); + } + + public Dracogenesis(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{6}{R}{R}"); + + // You may cast Dragon spells without paying their mana costs. + this.addAbility(new SimpleStaticAbility(new CastFromHandWithoutPayingManaCostEffect(filter, false))); + } + + private Dracogenesis(final Dracogenesis card) { + super(card); + } + + @Override + public Dracogenesis copy() { + return new Dracogenesis(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonbackAssault.java b/Mage.Sets/src/mage/cards/d/DragonbackAssault.java new file mode 100644 index 00000000000..b36e36afa97 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonbackAssault.java @@ -0,0 +1,40 @@ +package mage.cards.d; + +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.LandfallAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DamageAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.game.permanent.token.DragonToken; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DragonbackAssault extends CardImpl { + + public DragonbackAssault(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{G}{U}{R}"); + + // When this enchantment enters, it deals 3 damage to each creature and each planeswalker. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DamageAllEffect( + 3, StaticFilters.FILTER_PERMANENT_CREATURE_OR_PLANESWALKER + ).setText("it deals 3 damage to each creature and each planeswalker"))); + + // Landfall -- Whenever a land you control enters, create a 4/4 red Dragon creature token with flying. + this.addAbility(new LandfallAbility(new CreateTokenEffect(new DragonToken()))); + } + + private DragonbackAssault(final DragonbackAssault card) { + super(card); + } + + @Override + public DragonbackAssault copy() { + return new DragonbackAssault(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DragonbackLancer.java b/Mage.Sets/src/mage/cards/d/DragonbackLancer.java new file mode 100644 index 00000000000..30d8b413213 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DragonbackLancer.java @@ -0,0 +1,40 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.MobilizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * @author balazskristof + */ +public final class DragonbackLancer extends CardImpl { + + public DragonbackLancer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Mobilize 1 + this.addAbility(new MobilizeAbility(1)); + } + + private DragonbackLancer(final DragonbackLancer card) { + super(card); + } + + @Override + public DragonbackLancer copy() { + return new DragonbackLancer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DusyutEarthcarver.java b/Mage.Sets/src/mage/cards/d/DusyutEarthcarver.java new file mode 100644 index 00000000000..bd2a15c7b7d --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DusyutEarthcarver.java @@ -0,0 +1,42 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.keyword.EndureSourceEffect; +import mage.abilities.keyword.ReachAbility; +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 DusyutEarthcarver extends CardImpl { + + public DusyutEarthcarver(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}"); + + this.subtype.add(SubType.ELEPHANT); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // When this creature enters, it endures 3. + this.addAbility(new EntersBattlefieldTriggeredAbility(new EndureSourceEffect(3))); + } + + private DusyutEarthcarver(final DusyutEarthcarver card) { + super(card); + } + + @Override + public DusyutEarthcarver copy() { + return new DusyutEarthcarver(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/EccentricApprentice.java b/Mage.Sets/src/mage/cards/e/EccentricApprentice.java index bafd1e10fd5..ebd24d9c3e4 100644 --- a/Mage.Sets/src/mage/cards/e/EccentricApprentice.java +++ b/Mage.Sets/src/mage/cards/e/EccentricApprentice.java @@ -87,7 +87,7 @@ class EccentricApprenticeEffect extends ContinuousEffectImpl { switch (layer) { case TypeChangingEffects_4: permanent.removeAllCreatureTypes(game); - permanent.removeSubType(game, SubType.BIRD); + permanent.addSubType(game, SubType.BIRD); return true; case AbilityAddingRemovingEffects_6: permanent.addAbility(FlyingAbility.getInstance(), source.getSourceId(), game); diff --git a/Mage.Sets/src/mage/cards/e/EquilibriumAdept.java b/Mage.Sets/src/mage/cards/e/EquilibriumAdept.java new file mode 100644 index 00000000000..586a1fa31ec --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EquilibriumAdept.java @@ -0,0 +1,45 @@ +package mage.cards.e; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.FlurryAbility; +import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +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 EquilibriumAdept extends CardImpl { + + public EquilibriumAdept(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.DOG); + this.subtype.add(SubType.MONK); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // When this creature enters, exile the top card of your library. Until the end of your next turn, you may play that card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ExileTopXMayPlayUntilEffect(1, Duration.UntilEndOfYourNextTurn))); + + // Flurry -- Whenever you cast your second spell each turn, this creature gains double strike until end of turn. + this.addAbility(new FlurryAbility(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn))); + } + + private EquilibriumAdept(final EquilibriumAdept card) { + super(card); + } + + @Override + public EquilibriumAdept copy() { + return new EquilibriumAdept(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/EverythingamajigC.java b/Mage.Sets/src/mage/cards/e/EverythingamajigC.java index e38c629f950..52e90c7f894 100644 --- a/Mage.Sets/src/mage/cards/e/EverythingamajigC.java +++ b/Mage.Sets/src/mage/cards/e/EverythingamajigC.java @@ -130,6 +130,7 @@ class ChimericStaffEffect extends ContinuousEffectImpl { ChimericStaffEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "{this} becomes an X/X Construct artifact creature until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private ChimericStaffEffect(final ChimericStaffEffect effect) { diff --git a/Mage.Sets/src/mage/cards/f/FangkeepersFamiliar.java b/Mage.Sets/src/mage/cards/f/FangkeepersFamiliar.java new file mode 100644 index 00000000000..8f850e3732d --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FangkeepersFamiliar.java @@ -0,0 +1,58 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.abilities.keyword.FlashAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.TargetSpell; +import mage.target.common.TargetEnchantmentPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FangkeepersFamiliar extends CardImpl { + + public FangkeepersFamiliar(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}{U}"); + + this.subtype.add(SubType.SNAKE); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // When this creature enters, choose one -- + // * You gain 3 life and surveil 3. + Ability ability = new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)); + ability.addEffect(new SurveilEffect(3).concatBy("and")); + + // * Destroy target enchantment. + ability.addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetEnchantmentPermanent())); + + // * Counter target creature spell. + ability.addMode(new Mode(new CounterTargetEffect()).addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_CREATURE))); + this.addAbility(ability); + } + + private FangkeepersFamiliar(final FangkeepersFamiliar card) { + super(card); + } + + @Override + public FangkeepersFamiliar copy() { + return new FangkeepersFamiliar(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FortressKinGuard.java b/Mage.Sets/src/mage/cards/f/FortressKinGuard.java new file mode 100644 index 00000000000..5b6431b258e --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FortressKinGuard.java @@ -0,0 +1,38 @@ +package mage.cards.f; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.keyword.EndureSourceEffect; +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 FortressKinGuard extends CardImpl { + + public FortressKinGuard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.DOG); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When this creature enters, it endures 1. + this.addAbility(new EntersBattlefieldTriggeredAbility(new EndureSourceEffect(1))); + } + + private FortressKinGuard(final FortressKinGuard card) { + super(card); + } + + @Override + public FortressKinGuard copy() { + return new FortressKinGuard(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FreshStart.java b/Mage.Sets/src/mage/cards/f/FreshStart.java new file mode 100644 index 00000000000..220dc359fbc --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FreshStart.java @@ -0,0 +1,54 @@ +package mage.cards.f; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.LoseAllAbilitiesAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FlashAbility; +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.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class FreshStart extends CardImpl { + + public FreshStart(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 gets -5/-0 and loses all abilities. + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(-5, 0)); + ability.addEffect(new LoseAllAbilitiesAttachedEffect(AttachmentType.AURA).setText("and loses all abilities")); + this.addAbility(ability); + } + + private FreshStart(final FreshStart card) { + super(card); + } + + @Override + public FreshStart copy() { + return new FreshStart(this); + } +} diff --git a/Mage.Sets/src/mage/cards/f/FullThrottle.java b/Mage.Sets/src/mage/cards/f/FullThrottle.java new file mode 100644 index 00000000000..99feea84526 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FullThrottle.java @@ -0,0 +1,80 @@ +package mage.cards.f; + +import java.util.UUID; + +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.condition.OrCondition; +import mage.abilities.condition.common.IsPhaseCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AttackedThisTurnPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.turn.Turn; + +/** + * + * @author Jmlundeen + */ +public final class FullThrottle extends CardImpl { + + public FullThrottle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{R}{R}"); + + + // After this main phase, there are two additional combat phases. + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new AdditionalCombatPhaseEffect(2), + new OrCondition(new IsPhaseCondition(TurnPhase.PRECOMBAT_MAIN), new IsPhaseCondition(TurnPhase.POSTCOMBAT_MAIN)), + "After this main phase, there are two additional combat phases." + )); + // At the beginning of each combat this turn, untap all creatures that attacked this turn. + DelayedTriggeredAbility ability = new FullThrottleTriggeredAbility(); + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(ability).concatBy("
")); + } + + private FullThrottle(final FullThrottle card) { + super(card); + } + + @Override + public FullThrottle copy() { + return new FullThrottle(this); + } +} + +class FullThrottleTriggeredAbility extends DelayedTriggeredAbility { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures that attacked this turn"); + + static { + filter.add(AttackedThisTurnPredicate.instance); + } + public FullThrottleTriggeredAbility() { + super(new UntapAllEffect(filter), Duration.EndOfTurn, false); + setTriggerPhrase("At the beginning of each combat this turn, "); + } + + private FullThrottleTriggeredAbility(final FullThrottleTriggeredAbility ability) { + super(ability); + } + + @Override + public FullThrottleTriggeredAbility copy() { + return new FullThrottleTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.COMBAT_PHASE_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Turn turn = game.getState().getTurn(); + return turn.getPhase().getType() == TurnPhase.COMBAT; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GontiNightMinister.java b/Mage.Sets/src/mage/cards/g/GontiNightMinister.java new file mode 100644 index 00000000000..365c57648ff --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GontiNightMinister.java @@ -0,0 +1,166 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenTargetEffect; +import mage.abilities.effects.common.asthought.MayLookAtTargetCardEffect; +import mage.cards.Card; +import mage.constants.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.TreasureToken; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * + * @author Jmlundeen + */ +public final class GontiNightMinister extends CardImpl { + + public GontiNightMinister(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.AETHERBORN); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // Whenever a player casts a spell they don't own, that player creates a Treasure token. + this.addAbility(new GontiSpellTriggeredAbility()); + // Whenever a creature deals combat damage to one of your opponents, its controller looks at the top card of that opponent's library and exiles it face down. They may play that card for as long as it remains exiled. Mana of any type can be spent to cast a spell this way. + this.addAbility(new GontiTriggeredAbility()); + } + + private GontiNightMinister(final GontiNightMinister card) { + super(card); + } + + @Override + public GontiNightMinister copy() { + return new GontiNightMinister(this); + } +} + +class GontiSpellTriggeredAbility extends TriggeredAbilityImpl { + + public GontiSpellTriggeredAbility() { + super(Zone.BATTLEFIELD, new CreateTokenTargetEffect(new TreasureToken()), false); + setTriggerPhrase("Whenever a player casts a spell they don't own, "); + } + + private GontiSpellTriggeredAbility(final GontiSpellTriggeredAbility ability) { + super(ability); + } + + @Override + public GontiSpellTriggeredAbility copy() { + return new GontiSpellTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Player player = game.getPlayer(event.getPlayerId()); + Spell spell = game.getSpell(event.getTargetId()); + if (player != null && spell != null && !player.getId().equals(spell.getOwnerId())) { + getEffects().setTargetPointer(new FixedTarget(player.getId())); + return true; + } + return false; + } +} + +class GontiTriggeredAbility extends TriggeredAbilityImpl { + + public GontiTriggeredAbility() { + super(Zone.BATTLEFIELD, new GontiExileEffect(), false); + setTriggerPhrase("Whenever a creature deals combat damage to one of your opponents, "); + } + + private GontiTriggeredAbility(final GontiTriggeredAbility ability) { + super(ability); + } + + @Override + public GontiTriggeredAbility copy() { + return new GontiTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DamagedEvent damagedEvent = (DamagedEvent) event; + if (damagedEvent.isCombatDamage() && game.getOpponents(controllerId).contains(damagedEvent.getTargetId())) { + Permanent permanent = game.getPermanentOrLKIBattlefield(damagedEvent.getSourceId()); + if (permanent != null && permanent.isCreature(game)) { + getEffects().setTargetPointer(new FixedTarget(damagedEvent.getTargetId())); + this.getEffects().setValue("controllerId", permanent.getControllerId()); + return true; + } + } + return false; + } +} + +class GontiExileEffect extends OneShotEffect { + + GontiExileEffect() { + super(Outcome.Exile); + staticText = "its controller looks at the top card of that opponent's library and exiles it face down." + + " They may play that card for as long as it remains exiled. " + + "Mana of any type can be spent to cast a spell this way."; + } + + private GontiExileEffect(final GontiExileEffect effect) { + super(effect); + } + + @Override + public GontiExileEffect copy() { + return new GontiExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetOpponent = game.getPlayer(getTargetPointer().getFirst(game, source)); + Player controller = game.getPlayer((UUID) source.getEffects().get(0).getValue("controllerId")); + if (targetOpponent == null || controller == null ) { + return false; + } + Card card = targetOpponent.getLibrary().getFromTop(game); + if (card == null) { + return false; + } + UUID exileZoneId = CardUtil.getExileZoneId(game, controller.getId(), source.getSourceObjectZoneChangeCounter()); + String exileName = CardUtil.getSourceName(game, source) + " - " + controller.getName(); + if (controller.moveCardsToExile(card, source, game, false, exileZoneId, exileName)) { + card.setFaceDown(true, game); + CardUtil.makeCardPlayable(game, source, card, false, Duration.Custom, true, controller.getId(), null); + } + ContinuousEffect effect = new MayLookAtTargetCardEffect(controller.getId()); + effect.setTargetPointer(new FixedTarget(card.getId())); + game.addEffect(effect, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/g/GrandMasterOfFlowers.java b/Mage.Sets/src/mage/cards/g/GrandMasterOfFlowers.java index d7cd6b7743a..5cd17023d38 100644 --- a/Mage.Sets/src/mage/cards/g/GrandMasterOfFlowers.java +++ b/Mage.Sets/src/mage/cards/g/GrandMasterOfFlowers.java @@ -81,6 +81,7 @@ class GrandMasterOfFlowersEffect extends ContinuousEffectImpl { super(Duration.WhileOnBattlefield, Outcome.Benefit); staticText = "as long as {this} has seven or more loyalty counters on him, " + "he's a 7/7 Dragon God creature with flying and indestructible"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private GrandMasterOfFlowersEffect(final GrandMasterOfFlowersEffect effect) { diff --git a/Mage.Sets/src/mage/cards/g/GristTheHungerTide.java b/Mage.Sets/src/mage/cards/g/GristTheHungerTide.java index 2c22115dba2..452bd588ee3 100644 --- a/Mage.Sets/src/mage/cards/g/GristTheHungerTide.java +++ b/Mage.Sets/src/mage/cards/g/GristTheHungerTide.java @@ -91,6 +91,7 @@ class GristTheHungerTideTypeEffect extends ContinuousEffectImpl { super(Duration.Custom, Outcome.Benefit); staticText = "as long as {this} isn't on the battlefield, " + "it's a 1/1 Insect creature in addition to its other types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private GristTheHungerTideTypeEffect(final GristTheHungerTideTypeEffect effect) { diff --git a/Mage.Sets/src/mage/cards/g/GuidelightMatrix.java b/Mage.Sets/src/mage/cards/g/GuidelightMatrix.java new file mode 100644 index 00000000000..542728b3e39 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GuidelightMatrix.java @@ -0,0 +1,66 @@ +package mage.cards.g; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CompositeCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.SaddleTargetMountEffect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +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.target.TargetPermanent; + +/** + * + * @author Jmlundeen + */ +public final class GuidelightMatrix extends CardImpl { + + private static final FilterControlledPermanent mountFilter = new FilterControlledPermanent("Mount you control"); + private static final FilterControlledPermanent vehicleFilter = new FilterControlledPermanent("Vehicle you control"); + + static { + mountFilter.add(SubType.MOUNT.getPredicate()); + vehicleFilter.add(SubType.VEHICLE.getPredicate()); + } + + public GuidelightMatrix(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + + // When this artifact enters, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + // {2}, {T}: Target Mount you control becomes saddled until end of turn. Activate only as a sorcery. + Ability saddledAbility = new ActivateAsSorceryActivatedAbility(new SaddleTargetMountEffect(), new ManaCostsImpl<>("{2}")); + saddledAbility.addCost(new TapSourceCost()); + saddledAbility.addTarget(new TargetPermanent(mountFilter)); + this.addAbility(saddledAbility); + // {2}, {T}: Target Vehicle you control becomes an artifact creature until end of turn. + Ability animateVehicleAbility = new SimpleActivatedAbility( + new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE) + .setText("Target Vehicle you control becomes an artifact creature until end of turn."), + new ManaCostsImpl<>("{2}")); + animateVehicleAbility.addCost(new TapSourceCost()); + animateVehicleAbility.addTarget(new TargetPermanent(vehicleFilter)); + this.addAbility(animateVehicleAbility); + } + + private GuidelightMatrix(final GuidelightMatrix card) { + super(card); + } + + @Override + public GuidelightMatrix copy() { + return new GuidelightMatrix(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HalsinEmeraldArchdruid.java b/Mage.Sets/src/mage/cards/h/HalsinEmeraldArchdruid.java index 28627014685..612927e11e7 100644 --- a/Mage.Sets/src/mage/cards/h/HalsinEmeraldArchdruid.java +++ b/Mage.Sets/src/mage/cards/h/HalsinEmeraldArchdruid.java @@ -63,6 +63,7 @@ class HalsinEmeraldArchdruidEffect extends ContinuousEffectImpl { super(Duration.EndOfTurn, Outcome.Benefit); staticText = "until end of turn, target token you control becomes a green Bear creature " + "with base power and toughness 4/4 in addition to its other colors and types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private HalsinEmeraldArchdruidEffect(final HalsinEmeraldArchdruidEffect effect) { diff --git a/Mage.Sets/src/mage/cards/h/HashatonScarabsFist.java b/Mage.Sets/src/mage/cards/h/HashatonScarabsFist.java new file mode 100644 index 00000000000..0423996ec28 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HashatonScarabsFist.java @@ -0,0 +1,118 @@ +package mage.cards.h; + +import java.util.Optional; +import java.util.UUID; + +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.DiscardCardControllerTriggeredAbility; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.hint.StaticHint; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +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.targetpointer.FixedTarget; + +/** + * @author sobiech + */ +public final class HashatonScarabsFist extends CardImpl { + + public HashatonScarabsFist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Whenever you discard a creature card, you may pay {2}{U}. If you do, create a tapped token that's a copy of that card, except it's a 4/4 black Zombie. + final Ability ability = new DiscardCardControllerTriggeredAbility( + new DoIfCostPaid(new HashatonScarabsFistEffect(), new ManaCostsImpl<>("{2}{U}")) + .withChooseHint(new HashatonScarabsFistHint()), + false, StaticFilters.FILTER_CARD_CREATURE_A + ); + this.addAbility(ability); + } + + private HashatonScarabsFist(final HashatonScarabsFist card) { + super(card); + } + + @Override + public HashatonScarabsFist copy() { + return new HashatonScarabsFist(this); + } +} + +class HashatonScarabsFistHint extends StaticHint { + + public HashatonScarabsFistHint() { + super(""); + } + + @Override + public String getText(Game game, Ability source) { + if (source.getEffects().isEmpty()) { + return ""; + } + for (Effect effect : source.getEffects()) { + Card discardedCard = (Card) effect.getValue("discardedCard"); + if (discardedCard != null) { + return "Discarded card: " + discardedCard.getName(); + } + } + return ""; + } +} + +class HashatonScarabsFistEffect extends OneShotEffect { + + HashatonScarabsFistEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "create a tapped token that`s a copy of that card, except it`s a 4/4 black Zombie"; + } + + private HashatonScarabsFistEffect(OneShotEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + + return Optional.ofNullable(this.values.get("discardedCard")) + .map(CardImpl.class::cast) + .filter(CardImpl::isCreature) + //create a tapped token that's a copy of that card, except it's a 4/4 black Zombie. + .map(card -> new CreateTokenCopyTargetEffect(null, null, false, 1, + true, false, null, 4, 4, false) + .setOnlyColor(ObjectColor.BLACK) + .setOnlySubType(SubType.ZOMBIE) + .setTargetPointer(new FixedTarget(card, game)) + .apply(game, source) + ) + .orElse(false); + } + + @Override + public HashatonScarabsFistEffect copy() { + return new HashatonScarabsFistEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HellishSideswipe.java b/Mage.Sets/src/mage/cards/h/HellishSideswipe.java new file mode 100644 index 00000000000..8fa1358db45 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HellishSideswipe.java @@ -0,0 +1,57 @@ +package mage.cards.h; + +import java.util.UUID; + +import mage.abilities.condition.common.SacrificedPermanentCondition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +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.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.predicate.Predicates; +import mage.target.TargetPermanent; + +/** + * + * @author Jmlundeen + */ +public final class HellishSideswipe extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("creature or Vehicle"); + + static { + filter.add(Predicates.or( + CardType.CREATURE.getPredicate(), + SubType.VEHICLE.getPredicate() + )); + } + + public HellishSideswipe(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); + + + // As an additional cost to cast this spell, sacrifice an artifact or creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE)); + // Destroy target creature or Vehicle. If the sacrificed permanent was a Vehicle, draw a card. + this.getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target creature or Vehicle")); + this.getSpellAbility().addEffect(new ConditionalOneShotEffect( + new DrawCardSourceControllerEffect(1), + new SacrificedPermanentCondition(new FilterPermanent(SubType.VEHICLE, "permanent was a Vehicle")) + )); + this.getSpellAbility().addTarget(new TargetPermanent(filter)); + } + + private HellishSideswipe(final HellishSideswipe card) { + super(card); + } + + @Override + public HellishSideswipe copy() { + return new HellishSideswipe(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HeritageReclamation.java b/Mage.Sets/src/mage/cards/h/HeritageReclamation.java new file mode 100644 index 00000000000..ec49a79cba0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HeritageReclamation.java @@ -0,0 +1,47 @@ +package mage.cards.h; + +import mage.abilities.Mode; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetArtifactPermanent; +import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetEnchantmentPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class HeritageReclamation extends CardImpl { + + public HeritageReclamation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); + + // Choose one -- + // * Destroy target artifact. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetArtifactPermanent()); + + // * Destroy target enchantment. + this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()) + .addTarget(new TargetEnchantmentPermanent())); + + // * Exile up to one target card from a graveyard. Draw a card. + this.getSpellAbility().addMode(new Mode(new ExileTargetEffect()) + .addEffect(new DrawCardSourceControllerEffect(1)) + .addTarget(new TargetCardInGraveyard(0, 1))); + } + + private HeritageReclamation(final HeritageReclamation card) { + super(card); + } + + @Override + public HeritageReclamation copy() { + return new HeritageReclamation(this); + } +} diff --git a/Mage.Sets/src/mage/cards/i/IdolOfFalseGods.java b/Mage.Sets/src/mage/cards/i/IdolOfFalseGods.java index f12a8b43132..41b7c396d5c 100644 --- a/Mage.Sets/src/mage/cards/i/IdolOfFalseGods.java +++ b/Mage.Sets/src/mage/cards/i/IdolOfFalseGods.java @@ -72,6 +72,7 @@ class IdolOfFalseGodsEffect extends ContinuousEffectImpl { super(Duration.WhileOnBattlefield, Outcome.Benefit); staticText = "as long as {this} has eight or more +1/+1 counters on it, " + "it's a 0/0 creature in addition to its other types and it has annihilator 2"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private IdolOfFalseGodsEffect(final IdolOfFalseGodsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/j/JadeCastSentinel.java b/Mage.Sets/src/mage/cards/j/JadeCastSentinel.java new file mode 100644 index 00000000000..4220ce03f36 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JadeCastSentinel.java @@ -0,0 +1,49 @@ +package mage.cards.j; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.PutOnLibraryTargetEffect; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.target.common.TargetCardInGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class JadeCastSentinel extends CardImpl { + + public JadeCastSentinel(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + + this.subtype.add(SubType.APE); + this.subtype.add(SubType.SNAKE); + this.power = new MageInt(1); + this.toughness = new MageInt(5); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // {2}, {T}: Put target card from a graveyard on the bottom of its owner's library. + Ability ability = new SimpleActivatedAbility(new PutOnLibraryTargetEffect(false), new GenericManaCost(2)); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCardInGraveyard()); + this.addAbility(ability); + } + + private JadeCastSentinel(final JadeCastSentinel card) { + super(card); + } + + @Override + public JadeCastSentinel copy() { + return new JadeCastSentinel(this); + } +} diff --git a/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java b/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java index ba29f49f494..40e446df128 100644 --- a/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java +++ b/Mage.Sets/src/mage/cards/k/KarnSilverGolem.java @@ -60,6 +60,7 @@ class KarnSilverGolemEffect extends ContinuousEffectImpl { KarnSilverGolemEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "Target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private KarnSilverGolemEffect(final KarnSilverGolemEffect effect) { diff --git a/Mage.Sets/src/mage/cards/k/KarnTheGreatCreator.java b/Mage.Sets/src/mage/cards/k/KarnTheGreatCreator.java index 596de41eced..52e6b54ffac 100644 --- a/Mage.Sets/src/mage/cards/k/KarnTheGreatCreator.java +++ b/Mage.Sets/src/mage/cards/k/KarnTheGreatCreator.java @@ -96,6 +96,7 @@ class KarnTheGreatCreatorAnimateEffect extends ContinuousEffectImpl { super(Duration.UntilYourNextTurn, Outcome.BecomeCreature); staticText = "Until your next turn, up to one target noncreature artifact becomes " + "an artifact creature with power and toughness each equal to its mana value."; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private KarnTheGreatCreatorAnimateEffect(final KarnTheGreatCreatorAnimateEffect effect) { diff --git a/Mage.Sets/src/mage/cards/k/KarnsTouch.java b/Mage.Sets/src/mage/cards/k/KarnsTouch.java index 221ca5c1724..ba10ee299a5 100644 --- a/Mage.Sets/src/mage/cards/k/KarnsTouch.java +++ b/Mage.Sets/src/mage/cards/k/KarnsTouch.java @@ -6,11 +6,7 @@ import mage.abilities.Ability; import mage.abilities.effects.ContinuousEffectImpl; 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.constants.*; import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.Predicates; import mage.game.Game; @@ -52,6 +48,7 @@ class KarnsTouchEffect extends ContinuousEffectImpl { KarnsTouchEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "Target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private KarnsTouchEffect(final KarnsTouchEffect effect) { diff --git a/Mage.Sets/src/mage/cards/k/KinTreeInvocation.java b/Mage.Sets/src/mage/cards/k/KinTreeInvocation.java index 39b6825ae78..4803e5b4672 100644 --- a/Mage.Sets/src/mage/cards/k/KinTreeInvocation.java +++ b/Mage.Sets/src/mage/cards/k/KinTreeInvocation.java @@ -3,18 +3,16 @@ package mage.cards.k; import java.util.UUID; -import mage.MageInt; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.SubType; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.TokenImpl; +import mage.game.permanent.token.SpiritWarriorToken; import mage.game.permanent.token.Token; /** @@ -72,29 +70,3 @@ class KinTreeInvocationCreateTokenEffect extends OneShotEffect { } } - -class SpiritWarriorToken extends TokenImpl { - - public SpiritWarriorToken() { - this(1); - } - - public SpiritWarriorToken(int x) { - super("Spirit Warrior Token", "X/X black and green Spirit Warrior creature token, where X is the greatest toughness among creatures you control"); - this.cardType.add(CardType.CREATURE); - this.subtype.add(SubType.SPIRIT); - this.subtype.add(SubType.WARRIOR); - this.color.setBlack(true); - this.color.setGreen(true); - this.power = new MageInt(x); - this.toughness = new MageInt(x); - } - - private SpiritWarriorToken(final SpiritWarriorToken token) { - super(token); - } - - public SpiritWarriorToken copy() { - return new SpiritWarriorToken(this); - } -} diff --git a/Mage.Sets/src/mage/cards/k/KolodinTriumphCaster.java b/Mage.Sets/src/mage/cards/k/KolodinTriumphCaster.java new file mode 100644 index 00000000000..dd4b4110415 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KolodinTriumphCaster.java @@ -0,0 +1,68 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.SaddleTargetMountEffect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HasteAbility; +import mage.constants.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; + +/** + * + * @author Jmlundeen + */ +public final class KolodinTriumphCaster extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent("Mounts and Vehicles you control"); + private static final FilterControlledPermanent mountFilter = new FilterControlledPermanent("Mount"); + private static final FilterControlledPermanent vehicleFilter = new FilterControlledPermanent("Vehicle"); + static { + filter.add(Predicates.or( + SubType.MOUNT.getPredicate(), + SubType.VEHICLE.getPredicate() + )); + mountFilter.add(SubType.MOUNT.getPredicate()); + vehicleFilter.add(SubType.VEHICLE.getPredicate()); + } + + public KolodinTriumphCaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.PILOT); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Mounts and Vehicles you control have haste. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new GainAbilityControlledEffect(HasteAbility.getInstance(), + Duration.WhileOnBattlefield, filter))); + // Whenever a Mount you control enters, it becomes saddled until end of turn. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new SaddleTargetMountEffect("it becomes saddled until end of turn"), + mountFilter)); + // Whenever a Vehicle you control enters, it becomes an artifact creature until end of turn. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new AddCardTypeTargetEffect( + Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE) + .setText("it becomes an artifact creature until end of turn"), vehicleFilter) + ); + } + + private KolodinTriumphCaster(final KolodinTriumphCaster card) { + super(card); + } + + @Override + public KolodinTriumphCaster copy() { + return new KolodinTriumphCaster(this); + } +} diff --git a/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java b/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java index 572d395df98..63a7026988e 100644 --- a/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java +++ b/Mage.Sets/src/mage/cards/l/LiegeOfTheTangle.java @@ -62,6 +62,7 @@ class LiegeOfTheTangleEffect extends ContinuousEffectImpl { LiegeOfTheTangleEffect() { super(Duration.EndOfGame, Outcome.BecomeCreature); staticText = "each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private LiegeOfTheTangleEffect(final LiegeOfTheTangleEffect effect) { diff --git a/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java b/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java new file mode 100644 index 00000000000..68b5d63384f --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LostMonarchOfIfnir.java @@ -0,0 +1,170 @@ +package mage.cards.l; + +import java.util.Optional; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.MillCardsControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.triggers.BeginningOfSecondMainTriggeredAbility; +import mage.cards.Card; +import mage.constants.*; +import mage.abilities.keyword.AfflictAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.DamagedEvent; +import mage.game.events.DamagedPlayerEvent; +import mage.game.events.GameEvent; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInYourGraveyard; +import mage.watchers.Watcher; + +/** + * @author sobiech + */ +public final class LostMonarchOfIfnir extends CardImpl { + private final static Hint hint = new ConditionHint(LostMonarchOfIfnirCondition.instance, "Player was dealt combat damage by a Zombie this turn"); + + private final static FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.ZOMBIE, "Zombies"); + + public LostMonarchOfIfnir(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.NOBLE); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Afflict 3 + this.addAbility(new AfflictAbility(3)); + + // Other Zombies you control have afflict 3. + this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( + new AfflictAbility(3), + Duration.WhileOnBattlefield, + filter, + true + ))); + + final TriggeredAbility ability = new BeginningOfSecondMainTriggeredAbility( + Zone.BATTLEFIELD, + TargetController.YOU, + new LostMonarchOfIfnirEffect(), + false + ); + ability.addHint(hint); + + // At the beginning of your second main phase, if a player was dealt combat damage by a Zombie this turn, mill three cards, then you may return a creature card from your graveyard to your hand. + this.addAbility(new ConditionalInterveningIfTriggeredAbility( + ability, + LostMonarchOfIfnirCondition.instance, + "at the beginning of your second main phase, " + + "if a player was dealt combat damage by a Zombie this turn, " + + "mill three cards, then you may return a creature card from your graveyard to your hand" + ), new LostMonarchOfIfnirWatcher()); + } + + private LostMonarchOfIfnir(final LostMonarchOfIfnir card) { + super(card); + } + + @Override + public LostMonarchOfIfnir copy() { + return new LostMonarchOfIfnir(this); + } +} + +class LostMonarchOfIfnirEffect extends OneShotEffect { + private static final FilterCard filter = new FilterCreatureCard(); + + LostMonarchOfIfnirEffect() { + super(Outcome.Benefit); + } + private LostMonarchOfIfnirEffect(OneShotEffect effect){ + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + new MillCardsControllerEffect(3).apply(game, source); + + final TargetCard target = new TargetCardInYourGraveyard(0, 1, filter, true); + final Player player = game.getPlayer(source.getControllerId()); + + if (player == null) { + return false; + } + + if (!player.choose(Outcome.ReturnToHand, target, source, game)) { + return true; + } + + final Card card = game.getCard(target.getFirstTarget()); + if (card == null) { + return true; + } + + player.moveCards(card, Zone.HAND, source, game); + + return true; + } + + @Override + public LostMonarchOfIfnirEffect copy() { + return new LostMonarchOfIfnirEffect(this); + } +} + +enum LostMonarchOfIfnirCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + final LostMonarchOfIfnirWatcher watcher = game.getState().getWatcher(LostMonarchOfIfnirWatcher.class); + return watcher != null && watcher.wasDealtDamage(); + } +} + +class LostMonarchOfIfnirWatcher extends Watcher { + private boolean dealtDamage; //by a zombie this turn + + LostMonarchOfIfnirWatcher() { + super(WatcherScope.GAME); + this.dealtDamage = false; + } + + @Override + public void watch(GameEvent event, Game game) { + Optional.of(event) + .filter(e -> e.getType() == GameEvent.EventType.DAMAGED_PLAYER) + .filter(e -> e instanceof DamagedPlayerEvent) + .map(DamagedPlayerEvent.class::cast) + .filter(DamagedEvent::isCombatDamage) + .map(damagedPlayerEvent -> game.getPermanentOrLKIBattlefield(event.getSourceId())) + .filter(permanent -> permanent.hasSubtype(SubType.ZOMBIE, game)) + .ifPresent(ignored -> this.dealtDamage = true); + } + + @Override + public void reset() { + super.reset(); + this.dealtDamage = false; + } + + boolean wasDealtDamage() { + return this.dealtDamage; + } +} + diff --git a/Mage.Sets/src/mage/cards/l/LuxiorGiadasGift.java b/Mage.Sets/src/mage/cards/l/LuxiorGiadasGift.java index a155d828c3b..b0349bd6470 100644 --- a/Mage.Sets/src/mage/cards/l/LuxiorGiadasGift.java +++ b/Mage.Sets/src/mage/cards/l/LuxiorGiadasGift.java @@ -98,6 +98,7 @@ class LuxiorGiadasGiftEffect extends ContinuousEffectImpl { LuxiorGiadasGiftEffect() { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); staticText = "equipped permanent isn't a planeswalker and is a creature in addition to its other types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private LuxiorGiadasGiftEffect(final LuxiorGiadasGiftEffect effect) { diff --git a/Mage.Sets/src/mage/cards/m/MajesticMetamorphosis.java b/Mage.Sets/src/mage/cards/m/MajesticMetamorphosis.java index bc03754a22b..54c21da2d7c 100644 --- a/Mage.Sets/src/mage/cards/m/MajesticMetamorphosis.java +++ b/Mage.Sets/src/mage/cards/m/MajesticMetamorphosis.java @@ -46,6 +46,7 @@ class MajesticMetamorphosisEffect extends ContinuousEffectImpl { super(Duration.EndOfTurn, Outcome.Benefit); staticText = "until end of turn, target artifact or creature becomes " + "a 4/4 Angel artifact creature and gains flying"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private MajesticMetamorphosisEffect(final MajesticMetamorphosisEffect effect) { diff --git a/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java b/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java index 6c22ed486b9..117e184df0b 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java @@ -50,6 +50,8 @@ class MarchOfTheMachinesEffect extends ContinuousEffectImpl { super(Duration.WhileOnBattlefield, Outcome.BecomeCreature); staticText = "Each noncreature artifact is an artifact creature with power and toughness each equal to its mana value"; dependendToTypes.add(DependencyType.ArtifactAddingRemoving); + + dependencyTypes.add(DependencyType.BecomeCreature); } private MarchOfTheMachinesEffect(final MarchOfTheMachinesEffect effect) { diff --git a/Mage.Sets/src/mage/cards/m/MimeoplasmReveredOne.java b/Mage.Sets/src/mage/cards/m/MimeoplasmReveredOne.java new file mode 100644 index 00000000000..30eec216119 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MimeoplasmReveredOne.java @@ -0,0 +1,169 @@ +package mage.cards.m; + +import java.util.UUID; + +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CopyEffect; +import mage.cards.*; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentCard; +import mage.players.Player; +import mage.target.common.TargetCardInExile; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetadjustment.TargetAdjuster; +import mage.util.CardUtil; +import mage.util.functions.CopyApplier; + +/** + * + * @author Jmlundeen + */ +public final class MimeoplasmReveredOne extends CardImpl { + + public MimeoplasmReveredOne(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{B}{G}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.OOZE); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // As Mimeoplasm enters, exile up to X creature cards from your graveyard. It enters with three +1/+1 counters on it for each creature card exiled this way. + this.addAbility(new AsEntersBattlefieldAbility(new MimeoplasmReveredOneEntersEffect())); + // {2}: Mimeoplasm becomes a copy of target creature card exiled with it, except it's 0/0 and has this ability. + Ability ability2 = new SimpleActivatedAbility(new MimeoplasmReveredOneEffect(), new ManaCostsImpl<>("{2}")); + ability2.setTargetAdjuster(MimeoPlasmReveredOneTargetAdjuster.instance); + this.addAbility(ability2); + } + + private MimeoplasmReveredOne(final MimeoplasmReveredOne card) { + super(card); + } + + @Override + public MimeoplasmReveredOne copy() { + return new MimeoplasmReveredOne(this); + } +} + +enum MimeoPlasmReveredOneTargetAdjuster implements TargetAdjuster { + + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + ability.getTargets().clear(); + ability.addTarget(new TargetCardInExile(StaticFilters.FILTER_CARD_CREATURES, CardUtil.getExileZoneId(game, ability, -1))); + } +} + +class MimeoplasmReveredOneEntersEffect extends OneShotEffect { + + MimeoplasmReveredOneEntersEffect() { + super(Outcome.Benefit); + staticText = "exile up to X creature cards from your graveyard. " + + "It enters with three +1/+1 counters on it for each creature card exiled this way"; + } + + private MimeoplasmReveredOneEntersEffect(final MimeoplasmReveredOneEntersEffect effect) { + super(effect); + } + + @Override + public MimeoplasmReveredOneEntersEffect copy() { + return new MimeoplasmReveredOneEntersEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent mimeoplasm = game.getPermanentEntering(source.getSourceId()); + if (controller == null || controller.getGraveyard().isEmpty() || mimeoplasm == null) { + return false; + } + int xValue = CardUtil.getSourceCostsTag(game, source, "X", 0); + if (xValue == 0) { + return false; + } + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(0, xValue, StaticFilters.FILTER_CARD_CREATURES); + target.withNotTarget(true); + if (!controller.chooseTarget(Outcome.Exile, target, source, game)) { + return false; + } + Cards cards = new CardsImpl(); + for (UUID targetId : target.getTargets()) { + cards.add(controller.getGraveyard().get(targetId, game)); + } + int zcc = CardUtil.getActualSourceObjectZoneChangeCounter(game, source); + UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), zcc); + if (!controller.moveCardsToExile(cards.getCards(game), source, game, true, + exileId, CardUtil.getSourceName(game, source))) { + return false; + } + int counters = cards.count(StaticFilters.FILTER_CARD_CREATURE, game) * 3; + mimeoplasm.addCounters(CounterType.P1P1.createInstance(counters), controller.getId(), source, game); + return true; + } +} + +class MimeoplasmReveredOneEffect extends OneShotEffect { + + public MimeoplasmReveredOneEffect() { + super(Outcome.Benefit); + this.staticText = "{this} becomes a copy of target creature card exiled with it, except it's 0/0 and has this ability."; + } + + public MimeoplasmReveredOneEffect(final MimeoplasmReveredOneEffect effect) { + super(effect); + } + + @Override + public MimeoplasmReveredOneEffect copy() { + return new MimeoplasmReveredOneEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent mimeoplasm = game.getPermanent(source.getSourceId()); + if (controller == null || mimeoplasm == null) { + return false; + } + Card chosen = game.getCard(getTargetPointer().getFirst(game, source)); + if (chosen == null) { + return false; + } + Permanent newBluePrint = new PermanentCard(chosen, source.getControllerId(), game); + newBluePrint.assignNewId(); + CopyApplier applier = new MimeoPlasmReveredOneCopyApplier(); + applier.apply(game, newBluePrint, source, mimeoplasm.getId()); + CopyEffect copyEffect = new CopyEffect(Duration.Custom, newBluePrint, mimeoplasm.getId()); + copyEffect.setApplier(applier); + copyEffect.init(source.copy(), game); + game.addEffect(copyEffect, source); + return true; + } +} + +class MimeoPlasmReveredOneCopyApplier extends CopyApplier { + + @Override + public boolean apply(Game game, MageObject blueprint, Ability source, UUID targetObjectId) { + Ability ability = new SimpleActivatedAbility(new MimeoplasmReveredOneEffect(), new ManaCostsImpl<>("{2}")); + ability.setTargetAdjuster(MimeoPlasmReveredOneTargetAdjuster.instance); + blueprint.getPower().setModifiedBaseValue(0); + blueprint.getToughness().setModifiedBaseValue(0); + blueprint.getAbilities().add(ability); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/o/OkoThiefOfCrowns.java b/Mage.Sets/src/mage/cards/o/OkoThiefOfCrowns.java index 0540947b704..e874e0cf00a 100644 --- a/Mage.Sets/src/mage/cards/o/OkoThiefOfCrowns.java +++ b/Mage.Sets/src/mage/cards/o/OkoThiefOfCrowns.java @@ -72,6 +72,7 @@ class OkoThiefOfCrownsEffect extends ContinuousEffectImpl { super(Duration.Custom, Outcome.Benefit); staticText = "target artifact or creature loses all abilities " + "and becomes a green Elk creature with base power and toughness 3/3"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private OkoThiefOfCrownsEffect(final OkoThiefOfCrownsEffect effect) { diff --git a/Mage.Sets/src/mage/cards/p/PeriBrown.java b/Mage.Sets/src/mage/cards/p/PeriBrown.java new file mode 100644 index 00000000000..169c360912e --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PeriBrown.java @@ -0,0 +1,117 @@ +package mage.cards.p; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.abilities.keyword.DoctorsCompanionAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.WatcherScope; +import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * @author xenohedron + */ +public final class PeriBrown extends CardImpl { + + private static final String rule = "The first historic spell you cast each turn has convoke. " + + "(Your creatures can help cast it. Each creature you tap while casting it pays for {1} " + + "or one mana of that creature's color.)"; + private static final FilterNonlandCard filter = new FilterNonlandCard("the first historic spell you cast each turn"); + static { + filter.add(PeriBrownFirstHistoricCastSpellPredicate.instance); + } + + public PeriBrown(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // The first historic spell you cast each turn has convoke. + this.addAbility(new SimpleStaticAbility( + new GainAbilityControlledSpellsEffect(new ConvokeAbility(), filter).setText(rule)), + new PeriBrownHistoricSpellWatcher() + ); + + // Doctor's companion + this.addAbility(DoctorsCompanionAbility.getInstance()); + + } + + private PeriBrown(final PeriBrown card) { + super(card); + } + + @Override + public PeriBrown copy() { + return new PeriBrown(this); + } +} + +class PeriBrownHistoricSpellWatcher extends Watcher { + + // Based on Conduit of Ruin + + private final Map historicSpells; // player id -> number + + public PeriBrownHistoricSpellWatcher() { + super(WatcherScope.GAME); + historicSpells = new HashMap<>(); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.SPELL_CAST) { + Spell spell = (Spell) game.getObject(event.getTargetId()); + if (spell != null && spell.isHistoric(game)) { + historicSpells.put(event.getPlayerId(), historicSpellsCastThisTurn(event.getPlayerId()) + 1); + } + } + } + + public int historicSpellsCastThisTurn(UUID playerId) { + return historicSpells.getOrDefault(playerId, 0); + } + + @Override + public void reset() { + super.reset(); + historicSpells.clear(); + } +} + +enum PeriBrownFirstHistoricCastSpellPredicate implements ObjectSourcePlayerPredicate { + instance; + + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + if (input.getObject() != null && input.getObject().isHistoric(game)) { + PeriBrownHistoricSpellWatcher watcher = game.getState().getWatcher(PeriBrownHistoricSpellWatcher.class); + return watcher != null && watcher.historicSpellsCastThisTurn(input.getPlayerId()) == 0; + } + return false; + } + + @Override + public String toString() { + return "The first historic spell you cast each turn"; + } +} diff --git a/Mage.Sets/src/mage/cards/p/PiaNalaarChiefMechanic.java b/Mage.Sets/src/mage/cards/p/PiaNalaarChiefMechanic.java new file mode 100644 index 00000000000..02b816c6268 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PiaNalaarChiefMechanic.java @@ -0,0 +1,98 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.OneOrMoreCombatDamagePlayerTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.constants.*; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.token.NalaarAetherjetToken; +import mage.game.permanent.token.Token; +import mage.players.Player; + +/** + * + * @author Jmlundeen + */ +public final class PiaNalaarChiefMechanic extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("artifact creatures you control"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } + + public PiaNalaarChiefMechanic(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{U}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ARTIFICER); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Whenever one or more artifact creatures you control deal combat damage to a player, you get {E}{E}. + this.addAbility(new OneOrMoreCombatDamagePlayerTriggeredAbility( + new GetEnergyCountersControllerEffect(2), filter) + ); + + // At the beginning of your end step, you may pay one or more {E}. If you do, create an X/X colorless Vehicle artifact token named Nalaar Aetherjet with flying and crew 2, where X is the amount of {E} spent this way. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new PiaNalaarChiefMechanicEffect(), true)); + } + + private PiaNalaarChiefMechanic(final PiaNalaarChiefMechanic card) { + super(card); + } + + @Override + public PiaNalaarChiefMechanic copy() { + return new PiaNalaarChiefMechanic(this); + } +} + +class PiaNalaarChiefMechanicEffect extends OneShotEffect { + + public PiaNalaarChiefMechanicEffect() { + super(Outcome.Benefit); + staticText = "you may pay one or more {E}. If you do, create an X/X colorless Vehicle artifact token " + + "named Nalaar Aetherjet with flying and crew 2, where X is the amount of {E} spent this way"; + } + + public PiaNalaarChiefMechanicEffect(final PiaNalaarChiefMechanicEffect effect) { + super(effect); + } + + @Override + public PiaNalaarChiefMechanicEffect copy() { + return new PiaNalaarChiefMechanicEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + int energyToPay = controller.getAmount(1, controller.getCountersCount(CounterType.ENERGY), + "Pay 1 or more {E}", game); + if (energyToPay == 0) { + return true; + } + Cost cost = new PayEnergyCost(energyToPay); + if (cost.pay(source, game, source, controller.getId(), true)) { + Token token = new NalaarAetherjetToken(energyToPay); + token.putOntoBattlefield(1, game, source); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/q/QarsiRevenant.java b/Mage.Sets/src/mage/cards/q/QarsiRevenant.java new file mode 100644 index 00000000000..0386db198e8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/q/QarsiRevenant.java @@ -0,0 +1,54 @@ +package mage.cards.q; + +import mage.MageInt; +import mage.abilities.common.RenewAbility; +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.CardType; +import mage.constants.SubType; +import mage.counters.CounterType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class QarsiRevenant extends CardImpl { + + public QarsiRevenant(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}"); + + this.subtype.add(SubType.VAMPIRE); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // Lifelink + this.addAbility(LifelinkAbility.getInstance()); + + // Renew -- {2}{B}, Exile this card from your graveyard: Put a flying counter, a deathtouch counter, and a lifelink counter on target creature. Activate only as a sorcery. + this.addAbility(new RenewAbility( + "{2}{B}", + CounterType.FLYING.createInstance(), + CounterType.DEATHTOUCH.createInstance(), + CounterType.LIFELINK.createInstance() + )); + } + + private QarsiRevenant(final QarsiRevenant card) { + super(card); + } + + @Override + public QarsiRevenant copy() { + return new QarsiRevenant(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RakshasasBargain.java b/Mage.Sets/src/mage/cards/r/RakshasasBargain.java new file mode 100644 index 00000000000..4e29e88273b --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RakshasasBargain.java @@ -0,0 +1,33 @@ +package mage.cards.r; + +import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.PutCards; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RakshasasBargain extends CardImpl { + + public RakshasasBargain(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2/B}{2/G}{2/U}"); + + // Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard. + this.getSpellAbility().addEffect(new LookLibraryAndPickControllerEffect( + 4, 2, PutCards.HAND, PutCards.GRAVEYARD + )); + } + + private RakshasasBargain(final RakshasasBargain card) { + super(card); + } + + @Override + public RakshasasBargain copy() { + return new RakshasasBargain(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RampagingAetherhood.java b/Mage.Sets/src/mage/cards/r/RampagingAetherhood.java new file mode 100644 index 00000000000..d8c9f5710f7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RampagingAetherhood.java @@ -0,0 +1,99 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.abilities.keyword.TrampleAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.keyword.WardAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author Jmlundeen + */ +public final class RampagingAetherhood extends CardImpl { + + private static final String energyText = "you get an amount of {E} equal to this creature's power."; + + public RampagingAetherhood(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add(SubType.SNAKE); + this.subtype.add(SubType.HYDRA); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Ward {2} + this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"))); + + // At the beginning of your upkeep, you get an amount of {E} equal to this creature's power. Then you may pay one or more {E}. If you do, put that many +1/+1 counters on this creature. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new RampagingAetherhoodEffect())); + } + + private RampagingAetherhood(final RampagingAetherhood card) { + super(card); + } + + @Override + public RampagingAetherhood copy() { + return new RampagingAetherhood(this); + } +} + +class RampagingAetherhoodEffect extends OneShotEffect { + + public RampagingAetherhoodEffect() { + super(Outcome.Benefit); + this.staticText = "you get an amount of {E} equal to this creature's power. " + + "Then you may pay one or more {E}. If you do, put that many +1/+1 counters on this creature."; + } + + public RampagingAetherhoodEffect(final RampagingAetherhoodEffect effect) { + super(effect); + } + + @Override + public RampagingAetherhoodEffect copy() { + return new RampagingAetherhoodEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (permanent == null || controller == null) { + return false; + } + int amount = permanent.getPower().getValue(); + controller.addCounters(CounterType.ENERGY.createInstance(amount), source.getControllerId(), source, game); + int totalEnergy = controller.getCountersCount(CounterType.ENERGY); + if (totalEnergy > 0) { + if (controller.chooseUse(Outcome.Benefit, "Pay one or more {E}? Put that many +1/+1 counters on this creature", source, game)) { + int energyToPay = controller.getAmount(1, totalEnergy, "Pay one or more {E}", game); + Cost cost = new PayEnergyCost(energyToPay); + if (cost.pay(source, game, source, controller.getId(), true)) { + new AddCountersSourceEffect(CounterType.P1P1.createInstance(energyToPay), true).apply(game, source); + return true; + } + } + } + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/ReigningVictor.java b/Mage.Sets/src/mage/cards/r/ReigningVictor.java new file mode 100644 index 00000000000..25fbefef225 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/ReigningVictor.java @@ -0,0 +1,49 @@ +package mage.cards.r; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.MobilizeAbility; +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 ReigningVictor extends CardImpl { + + public ReigningVictor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2/R}{2/W}{2/B}"); + + this.subtype.add(SubType.ORC); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Mobilize 1 + this.addAbility(new MobilizeAbility(1)); + + // When this creature enters, target creature gets +1/+0 and gains indestructible until end of turn. + Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(1, 0).setText("target creature gets +1/+0")); + ability.addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance()).setText("and gains indestructible until end of turn")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + private ReigningVictor(final ReigningVictor card) { + super(card); + } + + @Override + public ReigningVictor copy() { + return new ReigningVictor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RelicsRoar.java b/Mage.Sets/src/mage/cards/r/RelicsRoar.java index d2ab7421a4a..f7533e4076f 100644 --- a/Mage.Sets/src/mage/cards/r/RelicsRoar.java +++ b/Mage.Sets/src/mage/cards/r/RelicsRoar.java @@ -41,6 +41,7 @@ class RelicsRoarEffect extends ContinuousEffectImpl { super(Duration.EndOfTurn, Outcome.Benefit); staticText = "until end of turn, target artifact or creature becomes a Dinosaur artifact creature " + "with base power and toughness 4/3 in addition to its other types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private RelicsRoarEffect(final RelicsRoarEffect effect) { diff --git a/Mage.Sets/src/mage/cards/r/RenewedSolidarity.java b/Mage.Sets/src/mage/cards/r/RenewedSolidarity.java new file mode 100644 index 00000000000..b1d9d2929fa --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RenewedSolidarity.java @@ -0,0 +1,101 @@ +package mage.cards.r; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.continuous.BoostAllOfChosenSubtypeEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.EnteredThisTurnPredicate; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author Jmlundeen + */ +public final class RenewedSolidarity extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures you control of the chosen type"); + + static { + filter.add(TargetController.YOU.getControllerPredicate()); + } + + public RenewedSolidarity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + + + // As this enchantment enters, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.BoostCreature))); + + // Creatures you control of the chosen type get +1/+0. + this.addAbility(new SimpleStaticAbility(new BoostAllOfChosenSubtypeEffect(1, 0, Duration.WhileOnBattlefield, filter, false))); + + // At the beginning of your end step, for each token you control of the chosen type that entered this turn, create a token that's a copy of it. + this.addAbility(new BeginningOfEndStepTriggeredAbility(new RenewedSolidarityEffect())); + } + + private RenewedSolidarity(final RenewedSolidarity card) { + super(card); + } + + @Override + public RenewedSolidarity copy() { + return new RenewedSolidarity(this); + } +} + +class RenewedSolidarityEffect extends OneShotEffect { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(); + + static { + filter.add(TokenPredicate.TRUE); + filter.add(EnteredThisTurnPredicate.instance); + } + + public RenewedSolidarityEffect() { + super(Outcome.Benefit); + this.staticText = "for each token you control of the chosen type that entered this turn, create a token that's a copy of it"; + } + + public RenewedSolidarityEffect(final RenewedSolidarityEffect effect) { + super(effect); + } + + @Override + public RenewedSolidarityEffect copy() { + return new RenewedSolidarityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + SubType subType = ChooseCreatureTypeEffect.getChosenCreatureType(source.getSourceId(), game); + List tokens = game.getBattlefield() + .getActivePermanents(filter, source.getControllerId(), source, game) + .stream() + .filter(permanent -> permanent.hasSubtype(subType, game)) + .collect(Collectors.toList()); + boolean result = false; + for (Permanent token : tokens) { + result |= new CreateTokenCopyTargetEffect() + .setTargetPointer(new FixedTarget(token, game)) + .apply(game, source); + } + return result; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/r/RingingStrikeMastery.java b/Mage.Sets/src/mage/cards/r/RingingStrikeMastery.java new file mode 100644 index 00000000000..011e40f08aa --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RingingStrikeMastery.java @@ -0,0 +1,60 @@ +package mage.cards.r; + +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.abilities.effects.common.UntapSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +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.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RingingStrikeMastery extends CardImpl { + + public RingingStrikeMastery(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{U}"); + + 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)); + + // When this Aura enters, tap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); + + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(new DontUntapInControllersUntapStepEnchantedEffect())); + + // Enchanted creature has "{5}: Untap this creature." + this.addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(new SimpleActivatedAbility( + new UntapSourceEffect().setText("untap this creature"), new GenericManaCost(5) + ), AttachmentType.AURA))); + } + + private RingingStrikeMastery(final RingingStrikeMastery card) { + super(card); + } + + @Override + public RingingStrikeMastery copy() { + return new RingingStrikeMastery(this); + } +} diff --git a/Mage.Sets/src/mage/cards/r/RoilingDragonstorm.java b/Mage.Sets/src/mage/cards/r/RoilingDragonstorm.java new file mode 100644 index 00000000000..f1f88f8a5e8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RoilingDragonstorm.java @@ -0,0 +1,40 @@ +package mage.cards.r; + +import java.util.UUID; + +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DrawDiscardControllerEffect; +import mage.abilities.effects.common.ReturnToHandSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; + +/** + * @author balazskristof + */ +public final class RoilingDragonstorm extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.DRAGON, "a Dragon"); + + public RoilingDragonstorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + // When this enchantment enters, draw two cards, then discard a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawDiscardControllerEffect(2, 1))); + + // When a Dragon you control enters, return this enchantment to its owner's hand. + this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new ReturnToHandSourceEffect(), filter)); + } + + private RoilingDragonstorm(final RoilingDragonstorm card) { + super(card); + } + + @Override + public RoilingDragonstorm copy() { + return new RoilingDragonstorm(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SaheeliRadiantCreator.java b/Mage.Sets/src/mage/cards/s/SaheeliRadiantCreator.java new file mode 100644 index 00000000000..970968117af --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SaheeliRadiantCreator.java @@ -0,0 +1,108 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.common.delayed.ReflexiveTriggeredAbility; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.DoWhenCostPaid; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterSpell; +import mage.filter.StaticFilters; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author Jmlundeen + */ +public final class SaheeliRadiantCreator extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("Artificer or artifact spell"); + + static { + filter.add(Predicates.or( + SubType.ARTIFICER.getPredicate(), + CardType.ARTIFACT.getPredicate()) + ); + } + + public SaheeliRadiantCreator(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{U}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ARTIFICER); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Whenever you cast an Artificer or artifact spell, you get {E}. + Ability ability = new SpellCastControllerTriggeredAbility( + new GetEnergyCountersControllerEffect(1), + filter, false); + this.addAbility(ability); + + // At the beginning of combat on your turn, you may pay {E}{E}{E}. When you do, create a token that's a copy of target permanent you control, except it's a 5/5 artifact creature in addition to its other types and has haste. Sacrifice it at the beginning of the next end step. + ReflexiveTriggeredAbility reflexiveAbility = new ReflexiveTriggeredAbility( + new SaheeliRadiantCreatorCopyEffect(), false + ); + reflexiveAbility.addTarget(new TargetPermanent(StaticFilters.FILTER_CONTROLLED_A_PERMANENT)); + Ability combatTriggeredAbility = new BeginningOfCombatTriggeredAbility( + new DoWhenCostPaid(reflexiveAbility, new PayEnergyCost(3), + "Pay {E}{E}{E}?") + ); + this.addAbility(combatTriggeredAbility); + } + + private SaheeliRadiantCreator(final SaheeliRadiantCreator card) { + super(card); + } + + @Override + public SaheeliRadiantCreator copy() { + return new SaheeliRadiantCreator(this); + } +} + +class SaheeliRadiantCreatorCopyEffect extends OneShotEffect { + + public SaheeliRadiantCreatorCopyEffect() { + super(Outcome.Copy); + staticText = "create a token that's a copy of target permanent you control, " + + "except it's a 5/5 artifact creature in addition to its other types and has haste. " + + "Sacrifice it at the beginning of the next end step."; + } + + public SaheeliRadiantCreatorCopyEffect(final SaheeliRadiantCreatorCopyEffect effect) { + super(effect); + } + + @Override + public SaheeliRadiantCreatorCopyEffect copy() { + return new SaheeliRadiantCreatorCopyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(null, CardType.CREATURE, + true, 1, false, false, null, + 5, 5, false); + effect.setBecomesArtifact(true); + effect.setTargetPointer(new FixedTarget(source.getFirstTarget())); + effect.apply(game, source); + effect.sacrificeTokensCreatedAtNextEndStep(game, source); + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java index 6d0217c0109..dc07a0a5276 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java @@ -65,6 +65,7 @@ class SarkhanTheDragonspeakerEffect extends ContinuousEffectImpl { SarkhanTheDragonspeakerEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "Until end of turn, {this} becomes a legendary 4/4 red Dragon creature with flying, indestructible, and haste."; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private SarkhanTheDragonspeakerEffect(final SarkhanTheDragonspeakerEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java b/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java index 88ba634a00e..d5003fdd51b 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheMasterless.java @@ -91,6 +91,7 @@ class SarkhanTheMasterlessBecomeDragonEffect extends ContinuousEffectImpl { SarkhanTheMasterlessBecomeDragonEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "Until end of turn, each planeswalker you control becomes a 4/4 red Dragon creature and gains flying."; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private SarkhanTheMasterlessBecomeDragonEffect(final SarkhanTheMasterlessBecomeDragonEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/SarkhansResolve.java b/Mage.Sets/src/mage/cards/s/SarkhansResolve.java new file mode 100644 index 00000000000..6447331e66d --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SarkhansResolve.java @@ -0,0 +1,49 @@ +package mage.cards.s; + +import mage.abilities.Mode; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.FlyingAbility; +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.mageobject.AbilityPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SarkhansResolve extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature with flying"); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public SarkhansResolve(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); + + // Choose one -- + // * Target creature gets +3/+3 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // * Destroy target creature with flying. + this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetPermanent(filter))); + } + + private SarkhansResolve(final SarkhansResolve card) { + super(card); + } + + @Override + public SarkhansResolve copy() { + return new SarkhansResolve(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SephirothPlanetsHeir.java b/Mage.Sets/src/mage/cards/s/SephirothPlanetsHeir.java new file mode 100644 index 00000000000..ed13eaef94c --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SephirothPlanetsHeir.java @@ -0,0 +1,58 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * @author balazskristof + */ +public final class SephirothPlanetsHeir extends CardImpl { + + public SephirothPlanetsHeir(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{B}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.AVATAR); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When Sephiroth enters, creatures your opponents control get -2/-2 until end of turn. + this.addAbility(new EntersBattlefieldTriggeredAbility(new BoostAllEffect( + -2, -2, Duration.EndOfTurn, StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURES, false + ))); + + // Whenever a creature an opponent controls dies, put a +1/+1 counter on Sephiroth. + this.addAbility(new DiesCreatureTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + false, StaticFilters.FILTER_OPPONENTS_PERMANENT_A_CREATURE + )); + } + + private SephirothPlanetsHeir(final SephirothPlanetsHeir card) { + super(card); + } + + @Override + public SephirothPlanetsHeir copy() { + return new SephirothPlanetsHeir(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/ShockBrigade.java b/Mage.Sets/src/mage/cards/s/ShockBrigade.java new file mode 100644 index 00000000000..4004fa0df1f --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShockBrigade.java @@ -0,0 +1,41 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.keyword.MenaceAbility; +import mage.abilities.keyword.MobilizeAbility; +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 ShockBrigade extends CardImpl { + + public ShockBrigade(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Menace + this.addAbility(new MenaceAbility()); + + // Mobilize 1 + this.addAbility(new MobilizeAbility(1)); + } + + private ShockBrigade(final ShockBrigade card) { + super(card); + } + + @Override + public ShockBrigade copy() { + return new ShockBrigade(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SinSpirasPunishment.java b/Mage.Sets/src/mage/cards/s/SinSpirasPunishment.java new file mode 100644 index 00000000000..be4a1814e7f --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SinSpirasPunishment.java @@ -0,0 +1,97 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; +import mage.util.RandomUtil; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; + +/** + * @author balazskristof + */ +public final class SinSpirasPunishment extends CardImpl { + + public SinSpirasPunishment(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{G}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.LEVIATHAN); + this.subtype.add(SubType.AVATAR); + this.power = new MageInt(7); + this.toughness = new MageInt(7); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Sin enters or attacks, exile a permanent card from your graveyard at random, then create a tapped token that's a copy of that card. If the exiled card is a land card, repeat this process. + this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new SinSpirasPunishmentEffect())); + } + + private SinSpirasPunishment(final SinSpirasPunishment card) { + super(card); + } + + @Override + public SinSpirasPunishment copy() { + return new SinSpirasPunishment(this); + } +} + +class SinSpirasPunishmentEffect extends OneShotEffect { + + SinSpirasPunishmentEffect() { + super(Outcome.Exile); + staticText = "exile a permanent card from your graveyard at random, then create a tapped token that's a copy of that card." + + " If the exiled card is a land card, repeat this process"; + } + + private SinSpirasPunishmentEffect(final SinSpirasPunishmentEffect effect) { + super(effect); + } + + @Override + public SinSpirasPunishmentEffect copy() { + return new SinSpirasPunishmentEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + boolean repeat = true; + while (repeat) { + // Exile a permanent card from your graveyard at random + Card card = RandomUtil.randomFromCollection(player.getGraveyard().getCards(StaticFilters.FILTER_CARD_PERMANENT, game)); + if (card == null) { + return true; + } + player.moveCards(card, Zone.EXILED, source, game); + game.processAction(); + // Then create a tapped token that's a copy of that card + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(source.getControllerId(), null, false, 1, true, false); + effect.setTargetPointer(new FixedTarget(card, game)); + effect.apply(game, source); + game.processAction(); + // If the exiled card is a land card, repeat this process + repeat = card.getCardType(game).contains(CardType.LAND); + } + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/SlumberingTora.java b/Mage.Sets/src/mage/cards/s/SlumberingTora.java index 42aac02ba0a..adfa6f3e726 100644 --- a/Mage.Sets/src/mage/cards/s/SlumberingTora.java +++ b/Mage.Sets/src/mage/cards/s/SlumberingTora.java @@ -57,6 +57,7 @@ class SlumberingToraEffect extends ContinuousEffectImpl { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "{this} becomes an X/X Cat artifact creature until end of turn, " + "where X is the discarded card's mana value"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private SlumberingToraEffect(final SlumberingToraEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/SparkRupture.java b/Mage.Sets/src/mage/cards/s/SparkRupture.java index c98094d5f72..094a29a1275 100644 --- a/Mage.Sets/src/mage/cards/s/SparkRupture.java +++ b/Mage.Sets/src/mage/cards/s/SparkRupture.java @@ -54,6 +54,7 @@ class SparkRuptureEffect extends ContinuousEffectImpl { super(Duration.WhileOnBattlefield, Outcome.Detriment); staticText = "each planeswalker with one or more loyalty counters on it loses all abilities " + "and is a creature with power and toughness each equal to the number of loyalty counters on it"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private SparkRuptureEffect(final SparkRuptureEffect effect) { diff --git a/Mage.Sets/src/mage/cards/s/StormplainDetainment.java b/Mage.Sets/src/mage/cards/s/StormplainDetainment.java new file mode 100644 index 00000000000..ae31ae79e73 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StormplainDetainment.java @@ -0,0 +1,36 @@ +package mage.cards.s; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.ExileUntilSourceLeavesEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; + +/** + * @author balazskristof + */ +public final class StormplainDetainment extends CardImpl { + + public StormplainDetainment(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); + + // When this enchantment enters, exile target nonland permanent an opponent controls until this enchantment leaves the battlefield. + Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect()); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_NON_LAND)); + this.addAbility(ability); + } + + private StormplainDetainment(final StormplainDetainment card) { + super(card); + } + + @Override + public StormplainDetainment copy() { + return new StormplainDetainment(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SummitIntimidator.java b/Mage.Sets/src/mage/cards/s/SummitIntimidator.java new file mode 100644 index 00000000000..1ba61c15914 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SummitIntimidator.java @@ -0,0 +1,46 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SummitIntimidator extends CardImpl { + + public SummitIntimidator(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.YETI); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // When this creature enters, target creature can't block this turn. + Ability ability = new EntersBattlefieldTriggeredAbility(new CantBlockTargetEffect(Duration.EndOfTurn)); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + private SummitIntimidator(final SummitIntimidator card) { + super(card); + } + + @Override + public SummitIntimidator copy() { + return new SummitIntimidator(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SydriGalvanicGenius.java b/Mage.Sets/src/mage/cards/s/SydriGalvanicGenius.java index 6cba8effd37..a3640fce2bf 100644 --- a/Mage.Sets/src/mage/cards/s/SydriGalvanicGenius.java +++ b/Mage.Sets/src/mage/cards/s/SydriGalvanicGenius.java @@ -73,6 +73,7 @@ class SydriGalvanicGeniusEffect extends ContinuousEffectImpl { SydriGalvanicGeniusEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "Target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private SydriGalvanicGeniusEffect(final SydriGalvanicGeniusEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TangletroveKelp.java b/Mage.Sets/src/mage/cards/t/TangletroveKelp.java index 86149e4d04f..bd222c006f0 100644 --- a/Mage.Sets/src/mage/cards/t/TangletroveKelp.java +++ b/Mage.Sets/src/mage/cards/t/TangletroveKelp.java @@ -60,6 +60,7 @@ class TangletroveKelpEffect extends ContinuousEffectImpl { TangletroveKelpEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "other Clues you control become 6/6 Plant creatures in addition to their other types until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TangletroveKelpEffect(final TangletroveKelpEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TempestHawk.java b/Mage.Sets/src/mage/cards/t/TempestHawk.java new file mode 100644 index 00000000000..2344e2b2c23 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TempestHawk.java @@ -0,0 +1,59 @@ +package mage.cards.t; + +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.common.TargetCardInLibrary; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TempestHawk extends CardImpl { + + private static final FilterCard filter = new FilterCard("a card named Tempest Hawk"); + + static { + filter.add(new NamePredicate("Tempest Hawk")); + } + + public TempestHawk(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.BIRD); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever this creature deals combat damage to a player, you may search your library for a card named Tempest Hawk, reveal it, put it into your hand, then shuffle. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), true + )); + + // A deck can have any number of cards named Tempest Hawk. + this.addAbility(new SimpleStaticAbility( + new InfoEffect("a deck can have any number of cards named Tempest Hawk") + )); + } + + private TempestHawk(final TempestHawk card) { + super(card); + } + + @Override + public TempestHawk copy() { + return new TempestHawk(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TempestTechnique.java b/Mage.Sets/src/mage/cards/t/TempestTechnique.java new file mode 100644 index 00000000000..1d5ee5c3704 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TempestTechnique.java @@ -0,0 +1,58 @@ +package mage.cards.t; + +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.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.StormAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class TempestTechnique extends CardImpl { + + private static final DynamicValue xValue + = new PermanentsOnBattlefieldCount(StaticFilters.FILTER_CONTROLLED_PERMANENT_ENCHANTMENT, 1); + private static final Hint hint = new ValueHint("Enchantments you control", xValue); + + public TempestTechnique(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + + this.subtype.add(SubType.AURA); + + // Storm + this.addAbility(new StormAbility()); + + // Enchant creature you control + TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted creature gets +1/+1 for each enchantment you control. + this.addAbility(new SimpleStaticAbility(new BoostEnchantedEffect(xValue, xValue)).addHint(hint)); + } + + private TempestTechnique(final TempestTechnique card) { + super(card); + } + + @Override + public TempestTechnique copy() { + return new TempestTechnique(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TerritorialAetherkite.java b/Mage.Sets/src/mage/cards/t/TerritorialAetherkite.java new file mode 100644 index 00000000000..d2fb3427d5a --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TerritorialAetherkite.java @@ -0,0 +1,99 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author Jmlundeen + */ +public final class TerritorialAetherkite extends CardImpl { + + public TerritorialAetherkite(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{R}"); + + this.subtype.add(SubType.CAT); + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(6); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // When this creature enters, you get {E}{E}. Then you may pay one or more {E}. When you do, this creature deals that much damage to each other creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TerritorialAetherkiteEffect())); + } + + private TerritorialAetherkite(final TerritorialAetherkite card) { + super(card); + } + + @Override + public TerritorialAetherkite copy() { + return new TerritorialAetherkite(this); + } +} + +class TerritorialAetherkiteEffect extends OneShotEffect { + + TerritorialAetherkiteEffect() { + super(Outcome.Benefit); + this.staticText = "you get {E}{E}. Then you may pay one or more {E}. " + + "When you do, this creature deals that much damage to each other creature"; + } + + TerritorialAetherkiteEffect(final TerritorialAetherkiteEffect effect) { + super(effect); + } + + @Override + public TerritorialAetherkiteEffect copy() { + return new TerritorialAetherkiteEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent aetherkite = game.getPermanent(source.getSourceId()); + if (controller == null || aetherkite == null) { + return false; + } + new GetEnergyCountersControllerEffect(2).apply(game, source); + int energyToPay = controller.getAmount(0, controller.getCountersCount(CounterType.ENERGY), + "Pay any amount of {E}", game); + if (energyToPay == 0) { + return true; + } + Cost cost = new PayEnergyCost(energyToPay); + if (!cost.pay(source, game, source, source.getControllerId(), true)) { + return false; + } + FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature"); + filter.add(AnotherPredicate.instance); + new DamageAllEffect(energyToPay, filter).apply(game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java b/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java index 524cec21d69..defd76cd1fc 100644 --- a/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java +++ b/Mage.Sets/src/mage/cards/t/TestamentOfFaith.java @@ -51,6 +51,7 @@ class TestamentOfFaithEffect extends ContinuousEffectImpl { TestamentOfFaithEffect() { super(Duration.EndOfTurn, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.BecomeCreature); staticText = " Wall creature"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TestamentOfFaithEffect(final TestamentOfFaithEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TezzeretBetrayerOfFlesh.java b/Mage.Sets/src/mage/cards/t/TezzeretBetrayerOfFlesh.java index 5ff979b1150..4f0ad18a8ef 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretBetrayerOfFlesh.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretBetrayerOfFlesh.java @@ -144,6 +144,7 @@ class TezzeretBetrayerOfFleshTypeEffect extends ContinuousEffectImpl { super(Duration.Custom, Outcome.BecomeCreature); staticText = "target artifact becomes an artifact creature. " + "If it isn't a Vehicle, it has base power and toughness 4/4"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TezzeretBetrayerOfFleshTypeEffect(final TezzeretBetrayerOfFleshTypeEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java b/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java index 8ac4fc2e510..8ae9ad4f28e 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretTheSeeker.java @@ -103,6 +103,7 @@ class TezzeretTheSeekerEffect3 extends ContinuousEffectImpl { public TezzeretTheSeekerEffect3() { super(Duration.EndOfTurn, Outcome.BecomeCreature); this.staticText = "Artifacts you control become artifact creatures with base power and toughness 5/5 until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TezzeretTheSeekerEffect3(final TezzeretTheSeekerEffect3 effect) { diff --git a/Mage.Sets/src/mage/cards/t/TheAetherspark.java b/Mage.Sets/src/mage/cards/t/TheAetherspark.java index 1ede8353291..6d1b78e4e24 100644 --- a/Mage.Sets/src/mage/cards/t/TheAetherspark.java +++ b/Mage.Sets/src/mage/cards/t/TheAetherspark.java @@ -61,7 +61,7 @@ public final class TheAetherspark extends CardImpl { ), 1); ability.addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()) .setText("put a +1/+1 counter on that creature")); - ability.addTarget(new TargetControlledCreaturePermanent()); + ability.addTarget(new TargetControlledCreaturePermanent(0, 1)); this.addAbility(ability); // -5: Draw two cards. diff --git a/Mage.Sets/src/mage/cards/t/TheAntiquitiesWar.java b/Mage.Sets/src/mage/cards/t/TheAntiquitiesWar.java index e0aed6c05d3..0a20c783203 100644 --- a/Mage.Sets/src/mage/cards/t/TheAntiquitiesWar.java +++ b/Mage.Sets/src/mage/cards/t/TheAntiquitiesWar.java @@ -54,6 +54,7 @@ class TheAntiquitiesWarEffect extends ContinuousEffectImpl { TheAntiquitiesWarEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); this.staticText = "Artifacts you control become artifact creatures with base power and toughness 5/5 until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TheAntiquitiesWarEffect(final TheAntiquitiesWarEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TheBlackstaffOfWaterdeep.java b/Mage.Sets/src/mage/cards/t/TheBlackstaffOfWaterdeep.java index f5fcee867d4..86e25c0d386 100644 --- a/Mage.Sets/src/mage/cards/t/TheBlackstaffOfWaterdeep.java +++ b/Mage.Sets/src/mage/cards/t/TheBlackstaffOfWaterdeep.java @@ -65,6 +65,7 @@ class TheBlackstaffOfWaterdeepEffect extends ContinuousEffectImpl { super(Duration.Custom, Outcome.Benefit); staticText = "another target nontoken artifact you control becomes " + "a 4/4 artifact creature for as long as {this} remains tapped"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TheBlackstaffOfWaterdeepEffect(final TheBlackstaffOfWaterdeepEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TitaniasSong.java b/Mage.Sets/src/mage/cards/t/TitaniasSong.java index a9306e863f8..16d174eee52 100644 --- a/Mage.Sets/src/mage/cards/t/TitaniasSong.java +++ b/Mage.Sets/src/mage/cards/t/TitaniasSong.java @@ -10,12 +10,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousEffectImpl; 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.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.Predicates; import mage.game.Game; @@ -56,6 +51,7 @@ class TitaniasSongEffect extends ContinuousEffectImpl { public TitaniasSongEffect(Duration duration) { super(duration, Outcome.BecomeCreature); staticText = "Each noncreature artifact loses its abilities and is an artifact creature with power and toughness each equal to its mana value"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TitaniasSongEffect(final TitaniasSongEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/Toymaker.java b/Mage.Sets/src/mage/cards/t/Toymaker.java index 2dd8bd47339..985b8881f19 100644 --- a/Mage.Sets/src/mage/cards/t/Toymaker.java +++ b/Mage.Sets/src/mage/cards/t/Toymaker.java @@ -11,13 +11,7 @@ import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.ContinuousEffectImpl; 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.constants.SubType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.Predicates; import mage.game.Game; @@ -66,6 +60,7 @@ class ToymakerEffect extends ContinuousEffectImpl { ToymakerEffect() { super(Duration.EndOfTurn, Outcome.BecomeCreature); staticText = "Target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private ToymakerEffect(final ToymakerEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TuneUp.java b/Mage.Sets/src/mage/cards/t/TuneUp.java index eebcef11ae2..c76ba069c0d 100644 --- a/Mage.Sets/src/mage/cards/t/TuneUp.java +++ b/Mage.Sets/src/mage/cards/t/TuneUp.java @@ -3,14 +3,11 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; -import mage.abilities.effects.common.ReturnFromYourGraveyardToBattlefieldAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; +import mage.constants.*; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; @@ -42,11 +39,12 @@ public final class TuneUp extends CardImpl { } } -class TuneUpEffect extends OneShotEffect { +class TuneUpEffect extends ContinuousEffectImpl { TuneUpEffect() { - super(Outcome.BecomeCreature); + super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); this.staticText = "If it's a Vehicle, it becomes an artifact creature"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private TuneUpEffect(final TuneUpEffect effect) { diff --git a/Mage.Sets/src/mage/cards/u/UndergrowthLeopard.java b/Mage.Sets/src/mage/cards/u/UndergrowthLeopard.java new file mode 100644 index 00000000000..94a14fb3528 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UndergrowthLeopard.java @@ -0,0 +1,49 @@ +package mage.cards.u; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.target.TargetPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UndergrowthLeopard extends CardImpl { + + public UndergrowthLeopard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.CAT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // {1}, Sacrifice this creature: Destroy target artifact or enchantment. + Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new GenericManaCost(1)); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT)); + this.addAbility(ability); + } + + private UndergrowthLeopard(final UndergrowthLeopard card) { + super(card); + } + + @Override + public UndergrowthLeopard copy() { + return new UndergrowthLeopard(this); + } +} diff --git a/Mage.Sets/src/mage/cards/u/UnrootedAncestor.java b/Mage.Sets/src/mage/cards/u/UnrootedAncestor.java new file mode 100644 index 00000000000..6fe55bc5982 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnrootedAncestor.java @@ -0,0 +1,54 @@ +package mage.cards.u; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.TapSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlashAbility; +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.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class UnrootedAncestor extends CardImpl { + + public UnrootedAncestor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.SPIRIT); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // {1}, Sacrifice another creature: This creature gains indestructible until end of turn. Tap it. + Ability ability = new SimpleActivatedAbility(new GainAbilitySourceEffect( + IndestructibleAbility.getInstance(), Duration.EndOfTurn + ), new GenericManaCost(1)); + ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_ANOTHER_CREATURE)); + ability.addEffect(new TapSourceEffect().setText("tap it")); + this.addAbility(ability); + } + + private UnrootedAncestor(final UnrootedAncestor card) { + super(card); + } + + @Override + public UnrootedAncestor copy() { + return new UnrootedAncestor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VeiledSentry.java b/Mage.Sets/src/mage/cards/v/VeiledSentry.java index b541b5abc15..47e1dafc782 100644 --- a/Mage.Sets/src/mage/cards/v/VeiledSentry.java +++ b/Mage.Sets/src/mage/cards/v/VeiledSentry.java @@ -51,6 +51,7 @@ class VeiledSentryEffect extends ContinuousEffectImpl { public VeiledSentryEffect() { super(Duration.Custom, Outcome.BecomeCreature); staticText = "{this} becomes an Illusion creature with power and toughness equal to that spell's mana value"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private VeiledSentryEffect(final VeiledSentryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/v/VeneratedStormsinger.java b/Mage.Sets/src/mage/cards/v/VeneratedStormsinger.java new file mode 100644 index 00000000000..de740c8a306 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VeneratedStormsinger.java @@ -0,0 +1,50 @@ +package mage.cards.v; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesThisOrAnotherTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.keyword.MobilizeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class VeneratedStormsinger extends CardImpl { + + public VeneratedStormsinger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.ORC); + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Mobilize 1 + this.addAbility(new MobilizeAbility(1)); + + // Whenever this creature or another creature you control dies, each opponent loses 1 life and you gain 1 life. + Ability ability = new DiesThisOrAnotherTriggeredAbility( + new LoseLifeOpponentsEffect(1), false, + StaticFilters.FILTER_CONTROLLED_CREATURE + ); + ability.addEffect(new GainLifeEffect(1).concatBy("and")); + this.addAbility(ability); + } + + private VeneratedStormsinger(final VeneratedStormsinger card) { + super(card); + } + + @Override + public VeneratedStormsinger copy() { + return new VeneratedStormsinger(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VoiceOfVictory.java b/Mage.Sets/src/mage/cards/v/VoiceOfVictory.java new file mode 100644 index 00000000000..f026112bdaf --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VoiceOfVictory.java @@ -0,0 +1,41 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.ruleModifying.CantCastDuringYourTurnEffect; +import mage.abilities.keyword.MobilizeAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * @author balazskristof + */ +public final class VoiceOfVictory extends CardImpl { + + public VoiceOfVictory(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.BARD); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Mobilize 2 + this.addAbility(new MobilizeAbility(2)); + + // Your opponents can't cast spells during your turn. + this.addAbility(new SimpleStaticAbility(new CantCastDuringYourTurnEffect())); + } + + private VoiceOfVictory(final VoiceOfVictory card) { + super(card); + } + + @Override + public VoiceOfVictory copy() { + return new VoiceOfVictory(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WatcherOfTheWayside.java b/Mage.Sets/src/mage/cards/w/WatcherOfTheWayside.java new file mode 100644 index 00000000000..a4698b64586 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WatcherOfTheWayside.java @@ -0,0 +1,43 @@ +package mage.cards.w; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.MillCardsTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.target.TargetPlayer; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class WatcherOfTheWayside extends CardImpl { + + public WatcherOfTheWayside(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + + this.subtype.add(SubType.GOLEM); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When this creature enters, target player mills two cards. You gain 2 life. + Ability ability = new EntersBattlefieldTriggeredAbility(new MillCardsTargetEffect(2)); + ability.addEffect(new GainLifeEffect(2)); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + private WatcherOfTheWayside(final WatcherOfTheWayside card) { + super(card); + } + + @Override + public WatcherOfTheWayside copy() { + return new WatcherOfTheWayside(this); + } +} diff --git a/Mage.Sets/src/mage/cards/w/WeatherlightCompleated.java b/Mage.Sets/src/mage/cards/w/WeatherlightCompleated.java index 430dd73e943..31381654dd5 100644 --- a/Mage.Sets/src/mage/cards/w/WeatherlightCompleated.java +++ b/Mage.Sets/src/mage/cards/w/WeatherlightCompleated.java @@ -71,6 +71,7 @@ class WeatherlightCompleatedEffect extends ContinuousEffectImpl { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); staticText = "as long as {this} has four or more phyresis counters on it, " + "it's a Phyrexian creature in addition to its other types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private WeatherlightCompleatedEffect(final WeatherlightCompleatedEffect effect) { diff --git a/Mage.Sets/src/mage/cards/w/WeepingAngel.java b/Mage.Sets/src/mage/cards/w/WeepingAngel.java index 3aedf42ed7c..45623b0f5ea 100644 --- a/Mage.Sets/src/mage/cards/w/WeepingAngel.java +++ b/Mage.Sets/src/mage/cards/w/WeepingAngel.java @@ -69,6 +69,7 @@ class WeepingAngelMarbleizeEffect extends ContinuousEffectImpl { WeepingAngelMarbleizeEffect() { super(Duration.EndOfTurn, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Detriment); staticText = "{this} isn't a creature until end of turn."; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private WeepingAngelMarbleizeEffect(final WeepingAngelMarbleizeEffect effect) { diff --git a/Mage.Sets/src/mage/cards/x/XenicPoltergeist.java b/Mage.Sets/src/mage/cards/x/XenicPoltergeist.java index 20e9949ff7c..90e0f410a77 100644 --- a/Mage.Sets/src/mage/cards/x/XenicPoltergeist.java +++ b/Mage.Sets/src/mage/cards/x/XenicPoltergeist.java @@ -9,14 +9,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.ContinuousEffectImpl; 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.PhaseStep; -import mage.constants.SubLayer; -import mage.constants.SubType; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.common.FilterArtifactPermanent; import mage.filter.predicate.Predicates; import mage.game.Game; @@ -69,6 +62,7 @@ class XenicPoltergeistEffect extends ContinuousEffectImpl { public XenicPoltergeistEffect() { super(Duration.Custom, Outcome.BecomeCreature); staticText = "Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private XenicPoltergeistEffect(final XenicPoltergeistEffect effect) { diff --git a/Mage.Sets/src/mage/cards/x/Xenograft.java b/Mage.Sets/src/mage/cards/x/Xenograft.java index 372c4cf5a4a..f8141eedb81 100644 --- a/Mage.Sets/src/mage/cards/x/Xenograft.java +++ b/Mage.Sets/src/mage/cards/x/Xenograft.java @@ -45,6 +45,7 @@ class XenograftAddSubtypeEffect extends ContinuousEffectImpl { XenograftAddSubtypeEffect() { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); staticText = "Each creature you control is the chosen type in addition to its other types"; + this.dependendToTypes.add(DependencyType.BecomeCreature); } private XenograftAddSubtypeEffect(final XenograftAddSubtypeEffect effect) { diff --git a/Mage.Sets/src/mage/cards/z/ZurEternalSchemer.java b/Mage.Sets/src/mage/cards/z/ZurEternalSchemer.java index 7840ec91610..c25729cc55a 100644 --- a/Mage.Sets/src/mage/cards/z/ZurEternalSchemer.java +++ b/Mage.Sets/src/mage/cards/z/ZurEternalSchemer.java @@ -79,6 +79,7 @@ class ZurEternalSchemerEffect extends ContinuousEffectImpl { super(Duration.EndOfGame, Outcome.BecomeCreature); staticText = "Target non-Aura enchantment you control becomes a creature in addition to its other types " + "and has base power and base toughness each equal to its mana value."; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private ZurEternalSchemerEffect(final ZurEternalSchemerEffect effect) { diff --git a/Mage.Sets/src/mage/sets/Aetherdrift.java b/Mage.Sets/src/mage/sets/Aetherdrift.java index c02b0043b70..2ee9386e3c4 100644 --- a/Mage.Sets/src/mage/sets/Aetherdrift.java +++ b/Mage.Sets/src/mage/sets/Aetherdrift.java @@ -21,92 +21,149 @@ public final class Aetherdrift extends ExpansionSet { this.enablePlayBooster(Integer.MAX_VALUE); - cards.add(new SetCardInfo("Aatchik, Emerald Radian", 187, Rarity.RARE, mage.cards.a.AatchikEmeraldRadian.class)); + cards.add(new SetCardInfo("Aatchik, Emerald Radian", 187, Rarity.RARE, mage.cards.a.AatchikEmeraldRadian.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aatchik, Emerald Radian", 360, Rarity.RARE, mage.cards.a.AatchikEmeraldRadian.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aatchik, Emerald Radian", 473, Rarity.RARE, mage.cards.a.AatchikEmeraldRadian.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Adrenaline Jockey", 112, Rarity.UNCOMMON, mage.cards.a.AdrenalineJockey.class)); cards.add(new SetCardInfo("Aether Syphon", 38, Rarity.UNCOMMON, mage.cards.a.AetherSyphon.class)); cards.add(new SetCardInfo("Aetherjacket", 230, Rarity.COMMON, mage.cards.a.Aetherjacket.class)); - cards.add(new SetCardInfo("Afterburner Expert", 150, Rarity.RARE, mage.cards.a.AfterburnerExpert.class)); - cards.add(new SetCardInfo("Agonasaur Rex", 151, Rarity.RARE, mage.cards.a.AgonasaurRex.class)); - cards.add(new SetCardInfo("Air Response Unit", 1, Rarity.UNCOMMON, mage.cards.a.AirResponseUnit.class)); + cards.add(new SetCardInfo("Afterburner Expert", 150, Rarity.RARE, mage.cards.a.AfterburnerExpert.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Afterburner Expert", 387, Rarity.RARE, mage.cards.a.AfterburnerExpert.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Afterburner Expert", 464, Rarity.RARE, mage.cards.a.AfterburnerExpert.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Agonasaur Rex", 151, Rarity.RARE, mage.cards.a.AgonasaurRex.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Agonasaur Rex", 343, Rarity.RARE, mage.cards.a.AgonasaurRex.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Agonasaur Rex", 465, Rarity.RARE, mage.cards.a.AgonasaurRex.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Agonasaur Rex", 542, Rarity.RARE, mage.cards.a.AgonasaurRex.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Air Response Unit", 1, Rarity.UNCOMMON, mage.cards.a.AirResponseUnit.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Air Response Unit", 292, Rarity.UNCOMMON, mage.cards.a.AirResponseUnit.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Alacrian Armory", 2, Rarity.UNCOMMON, mage.cards.a.AlacrianArmory.class)); cards.add(new SetCardInfo("Alacrian Jaguar", 152, Rarity.COMMON, mage.cards.a.AlacrianJaguar.class)); - cards.add(new SetCardInfo("Amonkhet Raceway", 248, Rarity.UNCOMMON, mage.cards.a.AmonkhetRaceway.class)); + cards.add(new SetCardInfo("Amonkhet Raceway", 248, Rarity.UNCOMMON, mage.cards.a.AmonkhetRaceway.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Amonkhet Raceway", 424, Rarity.UNCOMMON, mage.cards.a.AmonkhetRaceway.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ancient Vendetta", 75, Rarity.UNCOMMON, mage.cards.a.AncientVendetta.class)); - cards.add(new SetCardInfo("Apocalypse Runner", 188, Rarity.UNCOMMON, mage.cards.a.ApocalypseRunner.class)); + cards.add(new SetCardInfo("Apocalypse Runner", 188, Rarity.UNCOMMON, mage.cards.a.ApocalypseRunner.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Apocalypse Runner", 319, Rarity.UNCOMMON, mage.cards.a.ApocalypseRunner.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Autarch Mammoth", 153, Rarity.UNCOMMON, mage.cards.a.AutarchMammoth.class)); - cards.add(new SetCardInfo("Avishkar Raceway", 249, Rarity.COMMON, mage.cards.a.AvishkarRaceway.class)); + cards.add(new SetCardInfo("Avishkar Raceway", 249, Rarity.COMMON, mage.cards.a.AvishkarRaceway.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Avishkar Raceway", 425, Rarity.COMMON, mage.cards.a.AvishkarRaceway.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Back on Track", 76, Rarity.UNCOMMON, mage.cards.b.BackOnTrack.class)); - cards.add(new SetCardInfo("Basri, Tomorrow's Champion", 3, Rarity.RARE, mage.cards.b.BasriTomorrowsChampion.class)); + cards.add(new SetCardInfo("Basri, Tomorrow's Champion", 3, Rarity.RARE, mage.cards.b.BasriTomorrowsChampion.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basri, Tomorrow's Champion", 355, Rarity.RARE, mage.cards.b.BasriTomorrowsChampion.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Basri, Tomorrow's Champion", 427, Rarity.RARE, mage.cards.b.BasriTomorrowsChampion.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Beastrider Vanguard", 154, Rarity.COMMON, mage.cards.b.BeastriderVanguard.class)); cards.add(new SetCardInfo("Bestow Greatness", 155, Rarity.COMMON, mage.cards.b.BestowGreatness.class)); - cards.add(new SetCardInfo("Bleachbone Verge", 250, Rarity.RARE, mage.cards.b.BleachboneVerge.class)); + cards.add(new SetCardInfo("Bleachbone Verge", 250, Rarity.RARE, mage.cards.b.BleachboneVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bleachbone Verge", 371, Rarity.RARE, mage.cards.b.BleachboneVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bleachbone Verge", 501, Rarity.RARE, mage.cards.b.BleachboneVerge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bloodfell Caves", 251, Rarity.COMMON, mage.cards.b.BloodfellCaves.class)); - cards.add(new SetCardInfo("Bloodghast", 77, Rarity.RARE, mage.cards.b.Bloodghast.class)); + cards.add(new SetCardInfo("Bloodghast", 77, Rarity.RARE, mage.cards.b.Bloodghast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bloodghast", 337, Rarity.RARE, mage.cards.b.Bloodghast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bloodghast", 445, Rarity.RARE, mage.cards.b.Bloodghast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bloodghast", 536, Rarity.RARE, mage.cards.b.Bloodghast.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Blossoming Sands", 252, Rarity.COMMON, mage.cards.b.BlossomingSands.class)); + cards.add(new SetCardInfo("Boom Scholar", 189, Rarity.UNCOMMON, mage.cards.b.BoomScholar.class)); cards.add(new SetCardInfo("Boommobile", 113, Rarity.RARE, mage.cards.b.Boommobile.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boommobile", 310, Rarity.RARE, mage.cards.b.Boommobile.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boommobile", 454, Rarity.RARE, mage.cards.b.Boommobile.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Boommobile", 526, Rarity.RARE, mage.cards.b.Boommobile.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Boom Scholar", 189, Rarity.UNCOMMON, mage.cards.b.BoomScholar.class)); - cards.add(new SetCardInfo("Boosted Sloop", 190, Rarity.UNCOMMON, mage.cards.b.BoostedSloop.class)); + cards.add(new SetCardInfo("Boosted Sloop", 190, Rarity.UNCOMMON, mage.cards.b.BoostedSloop.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Boosted Sloop", 320, Rarity.UNCOMMON, mage.cards.b.BoostedSloop.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Bounce Off", 39, Rarity.COMMON, mage.cards.b.BounceOff.class)); cards.add(new SetCardInfo("Brightfield Glider", 4, Rarity.COMMON, mage.cards.b.BrightfieldGlider.class)); cards.add(new SetCardInfo("Brightfield Mustang", 5, Rarity.COMMON, mage.cards.b.BrightfieldMustang.class)); - cards.add(new SetCardInfo("Brightglass Gearhulk", 191, Rarity.MYTHIC, mage.cards.b.BrightglassGearhulk.class)); - cards.add(new SetCardInfo("Broadcast Rambler", 6, Rarity.COMMON, mage.cards.b.BroadcastRambler.class)); + cards.add(new SetCardInfo("Brightglass Gearhulk", 191, Rarity.MYTHIC, mage.cards.b.BrightglassGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brightglass Gearhulk", 348, Rarity.MYTHIC, mage.cards.b.BrightglassGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brightglass Gearhulk", 474, Rarity.MYTHIC, mage.cards.b.BrightglassGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Brightglass Gearhulk", 547, Rarity.MYTHIC, mage.cards.b.BrightglassGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Broadcast Rambler", 6, Rarity.COMMON, mage.cards.b.BroadcastRambler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Broadcast Rambler", 293, Rarity.COMMON, mage.cards.b.BroadcastRambler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Broadside Barrage", 192, Rarity.UNCOMMON, mage.cards.b.BroadsideBarrage.class)); cards.add(new SetCardInfo("Broken Wings", 156, Rarity.COMMON, mage.cards.b.BrokenWings.class)); cards.add(new SetCardInfo("Broodheart Engine", 193, Rarity.UNCOMMON, mage.cards.b.BroodheartEngine.class)); - cards.add(new SetCardInfo("Bulwark Ox", 7, Rarity.RARE, mage.cards.b.BulwarkOx.class)); - cards.add(new SetCardInfo("Burner Rocket", 114, Rarity.COMMON, mage.cards.b.BurnerRocket.class)); - cards.add(new SetCardInfo("Burnout Bashtronaut", 115, Rarity.RARE, mage.cards.b.BurnoutBashtronaut.class)); + cards.add(new SetCardInfo("Bulwark Ox", 7, Rarity.RARE, mage.cards.b.BulwarkOx.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bulwark Ox", 333, Rarity.RARE, mage.cards.b.BulwarkOx.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bulwark Ox", 428, Rarity.RARE, mage.cards.b.BulwarkOx.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Bulwark Ox", 532, Rarity.RARE, mage.cards.b.BulwarkOx.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Burner Rocket", 114, Rarity.COMMON, mage.cards.b.BurnerRocket.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Burner Rocket", 311, Rarity.COMMON, mage.cards.b.BurnerRocket.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Burnout Bashtronaut", 115, Rarity.RARE, mage.cards.b.BurnoutBashtronaut.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Burnout Bashtronaut", 340, Rarity.RARE, mage.cards.b.BurnoutBashtronaut.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Burnout Bashtronaut", 455, Rarity.RARE, mage.cards.b.BurnoutBashtronaut.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Burnout Bashtronaut", 539, Rarity.RARE, mage.cards.b.BurnoutBashtronaut.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Caelorna, Coral Tyrant", 40, Rarity.UNCOMMON, mage.cards.c.CaelornaCoralTyrant.class)); cards.add(new SetCardInfo("Camera Launcher", 232, Rarity.COMMON, mage.cards.c.CameraLauncher.class)); + cards.add(new SetCardInfo("Canyon Vaulter", 8, Rarity.UNCOMMON, mage.cards.c.CanyonVaulter.class)); cards.add(new SetCardInfo("Captain Howler, Sea Scourge", 194, Rarity.RARE, mage.cards.c.CaptainHowlerSeaScourge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Captain Howler, Sea Scourge", 361, Rarity.RARE, mage.cards.c.CaptainHowlerSeaScourge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Captain Howler, Sea Scourge", 475, Rarity.RARE, mage.cards.c.CaptainHowlerSeaScourge.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Canyon Vaulter", 8, Rarity.UNCOMMON, mage.cards.c.CanyonVaulter.class)); - cards.add(new SetCardInfo("Caradora, Heart of Alacria", 195, Rarity.RARE, mage.cards.c.CaradoraHeartOfAlacria.class)); - cards.add(new SetCardInfo("Carrion Cruiser", 78, Rarity.UNCOMMON, mage.cards.c.CarrionCruiser.class)); - cards.add(new SetCardInfo("Chandra, Spark Hunter", 116, Rarity.MYTHIC, mage.cards.c.ChandraSparkHunter.class)); + cards.add(new SetCardInfo("Caradora, Heart of Alacria", 195, Rarity.RARE, mage.cards.c.CaradoraHeartOfAlacria.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Caradora, Heart of Alacria", 362, Rarity.RARE, mage.cards.c.CaradoraHeartOfAlacria.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Caradora, Heart of Alacria", 476, Rarity.RARE, mage.cards.c.CaradoraHeartOfAlacria.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Carrion Cruiser", 78, Rarity.UNCOMMON, mage.cards.c.CarrionCruiser.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Carrion Cruiser", 305, Rarity.UNCOMMON, mage.cards.c.CarrionCruiser.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chandra, Spark Hunter", 116, Rarity.MYTHIC, mage.cards.c.ChandraSparkHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chandra, Spark Hunter", 401, Rarity.MYTHIC, mage.cards.c.ChandraSparkHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chandra, Spark Hunter", 411, Rarity.MYTHIC, mage.cards.c.ChandraSparkHunter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Chandra, Spark Hunter", 456, Rarity.MYTHIC, mage.cards.c.ChandraSparkHunter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Chitin Gravestalker", 79, Rarity.COMMON, mage.cards.c.ChitinGravestalker.class)); - cards.add(new SetCardInfo("Clamorous Ironclad", 117, Rarity.COMMON, mage.cards.c.ClamorousIronclad.class)); + cards.add(new SetCardInfo("Clamorous Ironclad", 117, Rarity.COMMON, mage.cards.c.ClamorousIronclad.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Clamorous Ironclad", 312, Rarity.COMMON, mage.cards.c.ClamorousIronclad.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloudspire Captain", 9, Rarity.UNCOMMON, mage.cards.c.CloudspireCaptain.class)); cards.add(new SetCardInfo("Cloudspire Coordinator", 196, Rarity.UNCOMMON, mage.cards.c.CloudspireCoordinator.class)); - cards.add(new SetCardInfo("Cloudspire Skycycle", 197, Rarity.UNCOMMON, mage.cards.c.CloudspireSkycycle.class)); + cards.add(new SetCardInfo("Cloudspire Skycycle", 197, Rarity.UNCOMMON, mage.cards.c.CloudspireSkycycle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cloudspire Skycycle", 321, Rarity.UNCOMMON, mage.cards.c.CloudspireSkycycle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Coalstoke Gearhulk", 198, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Coalstoke Gearhulk", 349, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Coalstoke Gearhulk", 477, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Coalstoke Gearhulk", 548, Rarity.MYTHIC, mage.cards.c.CoalstokeGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Collision Course", 10, Rarity.COMMON, mage.cards.c.CollisionCourse.class)); - cards.add(new SetCardInfo("Count on Luck", 118, Rarity.RARE, mage.cards.c.CountOnLuck.class)); + cards.add(new SetCardInfo("Count on Luck", 118, Rarity.RARE, mage.cards.c.CountOnLuck.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Count on Luck", 385, Rarity.RARE, mage.cards.c.CountOnLuck.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Count on Luck", 457, Rarity.RARE, mage.cards.c.CountOnLuck.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Country Roads", 253, Rarity.UNCOMMON, mage.cards.c.CountryRoads.class)); cards.add(new SetCardInfo("Crash and Burn", 119, Rarity.COMMON, mage.cards.c.CrashAndBurn.class)); - cards.add(new SetCardInfo("Cryptcaller Chariot", 80, Rarity.RARE, mage.cards.c.CryptcallerChariot.class)); + cards.add(new SetCardInfo("Cryptcaller Chariot", 80, Rarity.RARE, mage.cards.c.CryptcallerChariot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cryptcaller Chariot", 306, Rarity.RARE, mage.cards.c.CryptcallerChariot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cryptcaller Chariot", 446, Rarity.RARE, mage.cards.c.CryptcallerChariot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Cryptcaller Chariot", 523, Rarity.RARE, mage.cards.c.CryptcallerChariot.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cursecloth Wrappings", 81, Rarity.RARE, mage.cards.c.CurseclothWrappings.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cursecloth Wrappings", 383, Rarity.RARE, mage.cards.c.CurseclothWrappings.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cursecloth Wrappings", 400, Rarity.MYTHIC, mage.cards.c.CurseclothWrappings.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cursecloth Wrappings", 410, Rarity.MYTHIC, mage.cards.c.CurseclothWrappings.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cursecloth Wrappings", 447, Rarity.RARE, mage.cards.c.CurseclothWrappings.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Daretti, Rocketeer Engineer", 120, Rarity.RARE, mage.cards.d.DarettiRocketeerEngineer.class)); + cards.add(new SetCardInfo("Daretti, Rocketeer Engineer", 120, Rarity.RARE, mage.cards.d.DarettiRocketeerEngineer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Daretti, Rocketeer Engineer", 358, Rarity.RARE, mage.cards.d.DarettiRocketeerEngineer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Daretti, Rocketeer Engineer", 458, Rarity.RARE, mage.cards.d.DarettiRocketeerEngineer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Daring Mechanic", 11, Rarity.COMMON, mage.cards.d.DaringMechanic.class)); cards.add(new SetCardInfo("Deathless Pilot", 82, Rarity.COMMON, mage.cards.d.DeathlessPilot.class)); - cards.add(new SetCardInfo("Debris Beetle", 199, Rarity.RARE, mage.cards.d.DebrisBeetle.class)); + cards.add(new SetCardInfo("Debris Beetle", 199, Rarity.RARE, mage.cards.d.DebrisBeetle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Debris Beetle", 322, Rarity.RARE, mage.cards.d.DebrisBeetle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Debris Beetle", 478, Rarity.RARE, mage.cards.d.DebrisBeetle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Debris Beetle", 530, Rarity.RARE, mage.cards.d.DebrisBeetle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Defend the Rider", 157, Rarity.UNCOMMON, mage.cards.d.DefendTheRider.class)); cards.add(new SetCardInfo("Demonic Junker", 83, Rarity.RARE, mage.cards.d.DemonicJunker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Demonic Junker", 307, Rarity.RARE, mage.cards.d.DemonicJunker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Demonic Junker", 448, Rarity.RARE, mage.cards.d.DemonicJunker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Demonic Junker", 524, Rarity.RARE, mage.cards.d.DemonicJunker.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Detention Chariot", 12, Rarity.UNCOMMON, mage.cards.d.DetentionChariot.class)); + cards.add(new SetCardInfo("Detention Chariot", 12, Rarity.UNCOMMON, mage.cards.d.DetentionChariot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Detention Chariot", 294, Rarity.UNCOMMON, mage.cards.d.DetentionChariot.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dismal Backwater", 254, Rarity.COMMON, mage.cards.d.DismalBackwater.class)); - cards.add(new SetCardInfo("District Mascot", 158, Rarity.RARE, mage.cards.d.DistrictMascot.class)); + cards.add(new SetCardInfo("District Mascot", 158, Rarity.RARE, mage.cards.d.DistrictMascot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("District Mascot", 344, Rarity.RARE, mage.cards.d.DistrictMascot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("District Mascot", 466, Rarity.RARE, mage.cards.d.DistrictMascot.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("District Mascot", 543, Rarity.RARE, mage.cards.d.DistrictMascot.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Diversion Unit", 41, Rarity.UNCOMMON, mage.cards.d.DiversionUnit.class)); - cards.add(new SetCardInfo("Draconautics Engineer", 121, Rarity.RARE, mage.cards.d.DraconauticsEngineer.class)); + cards.add(new SetCardInfo("Draconautics Engineer", 121, Rarity.RARE, mage.cards.d.DraconauticsEngineer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Draconautics Engineer", 341, Rarity.RARE, mage.cards.d.DraconauticsEngineer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Draconautics Engineer", 459, Rarity.RARE, mage.cards.d.DraconauticsEngineer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Draconautics Engineer", 540, Rarity.RARE, mage.cards.d.DraconauticsEngineer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dracosaur Auxiliary", 122, Rarity.UNCOMMON, mage.cards.d.DracosaurAuxiliary.class)); cards.add(new SetCardInfo("Dredger's Insight", 159, Rarity.UNCOMMON, mage.cards.d.DredgersInsight.class)); - cards.add(new SetCardInfo("Dune Drifter", 200, Rarity.UNCOMMON, mage.cards.d.DuneDrifter.class)); + cards.add(new SetCardInfo("Dune Drifter", 200, Rarity.UNCOMMON, mage.cards.d.DuneDrifter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Dune Drifter", 323, Rarity.UNCOMMON, mage.cards.d.DuneDrifter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Dynamite Diver", 123, Rarity.COMMON, mage.cards.d.DynamiteDiver.class)); - cards.add(new SetCardInfo("Earthrumbler", 160, Rarity.UNCOMMON, mage.cards.e.Earthrumbler.class)); + cards.add(new SetCardInfo("Earthrumbler", 160, Rarity.UNCOMMON, mage.cards.e.Earthrumbler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Earthrumbler", 315, Rarity.UNCOMMON, mage.cards.e.Earthrumbler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Elvish Refueler", 161, Rarity.UNCOMMON, mage.cards.e.ElvishRefueler.class)); cards.add(new SetCardInfo("Embalmed Ascendant", 201, Rarity.UNCOMMON, mage.cards.e.EmbalmedAscendant.class)); cards.add(new SetCardInfo("Endrider Catalyzer", 124, Rarity.COMMON, mage.cards.e.EndriderCatalyzer.class)); @@ -119,42 +176,84 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Explosive Getaway", 479, Rarity.RARE, mage.cards.e.ExplosiveGetaway.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fang Guardian", 162, Rarity.UNCOMMON, mage.cards.f.FangGuardian.class)); cards.add(new SetCardInfo("Fang-Druid Summoner", 163, Rarity.UNCOMMON, mage.cards.f.FangDruidSummoner.class)); - cards.add(new SetCardInfo("Far Fortune, End Boss", 203, Rarity.RARE, mage.cards.f.FarFortuneEndBoss.class)); - cards.add(new SetCardInfo("Fearless Swashbuckler", 204, Rarity.RARE, mage.cards.f.FearlessSwashbuckler.class)); + cards.add(new SetCardInfo("Far Fortune, End Boss", 203, Rarity.RARE, mage.cards.f.FarFortuneEndBoss.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Far Fortune, End Boss", 363, Rarity.RARE, mage.cards.f.FarFortuneEndBoss.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Far Fortune, End Boss", 480, Rarity.RARE, mage.cards.f.FarFortuneEndBoss.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fearless Swashbuckler", 204, Rarity.RARE, mage.cards.f.FearlessSwashbuckler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fearless Swashbuckler", 346, Rarity.RARE, mage.cards.f.FearlessSwashbuckler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fearless Swashbuckler", 481, Rarity.RARE, mage.cards.f.FearlessSwashbuckler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fearless Swashbuckler", 545, Rarity.RARE, mage.cards.f.FearlessSwashbuckler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Flood the Engine", 42, Rarity.COMMON, mage.cards.f.FloodTheEngine.class)); + cards.add(new SetCardInfo("Forest", 276, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Forest", 289, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 290, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 291, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 511, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 516, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Foul Roads", 255, Rarity.UNCOMMON, mage.cards.f.FoulRoads.class)); cards.add(new SetCardInfo("Fuel the Flames", 126, Rarity.UNCOMMON, mage.cards.f.FuelTheFlames.class)); + cards.add(new SetCardInfo("Full Throttle", 127, Rarity.RARE, mage.cards.f.FullThrottle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Full Throttle", 386, Rarity.RARE, mage.cards.f.FullThrottle.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Full Throttle", 460, Rarity.RARE, mage.cards.f.FullThrottle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gallant Strike", 13, Rarity.UNCOMMON, mage.cards.g.GallantStrike.class)); - cards.add(new SetCardInfo("Gas Guzzler", 85, Rarity.RARE, mage.cards.g.GasGuzzler.class)); + cards.add(new SetCardInfo("Gas Guzzler", 85, Rarity.RARE, mage.cards.g.GasGuzzler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gas Guzzler", 338, Rarity.RARE, mage.cards.g.GasGuzzler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gas Guzzler", 449, Rarity.RARE, mage.cards.g.GasGuzzler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gas Guzzler", 537, Rarity.RARE, mage.cards.g.GasGuzzler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gastal Blockbuster", 128, Rarity.COMMON, mage.cards.g.GastalBlockbuster.class)); - cards.add(new SetCardInfo("Gastal Raider", 86, Rarity.UNCOMMON, mage.cards.g.GastalRaider.class)); - cards.add(new SetCardInfo("Gastal Thrillroller", 129, Rarity.RARE, mage.cards.g.GastalThrillroller.class)); + cards.add(new SetCardInfo("Gastal Raider", 86, Rarity.UNCOMMON, mage.cards.g.GastalRaider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gastal Raider", 418, Rarity.UNCOMMON, mage.cards.g.GastalRaider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gastal Thrillroller", 129, Rarity.RARE, mage.cards.g.GastalThrillroller.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gastal Thrillroller", 313, Rarity.RARE, mage.cards.g.GastalThrillroller.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gastal Thrillroller", 461, Rarity.RARE, mage.cards.g.GastalThrillroller.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gastal Thrillroller", 527, Rarity.RARE, mage.cards.g.GastalThrillroller.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Gastal Thrillseeker", 205, Rarity.UNCOMMON, mage.cards.g.GastalThrillseeker.class)); cards.add(new SetCardInfo("Gearseeker Serpent", 43, Rarity.COMMON, mage.cards.g.GearseekerSerpent.class)); cards.add(new SetCardInfo("Gilded Ghoda", 130, Rarity.COMMON, mage.cards.g.GildedGhoda.class)); cards.add(new SetCardInfo("Glitch Ghost Surveyor", 44, Rarity.COMMON, mage.cards.g.GlitchGhostSurveyor.class)); cards.add(new SetCardInfo("Gloryheath Lynx", 14, Rarity.UNCOMMON, mage.cards.g.GloryheathLynx.class)); cards.add(new SetCardInfo("Goblin Surveyor", 131, Rarity.COMMON, mage.cards.g.GoblinSurveyor.class)); + cards.add(new SetCardInfo("Gonti, Night Minister", 87, Rarity.RARE, mage.cards.g.GontiNightMinister.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gonti, Night Minister", 357, Rarity.RARE, mage.cards.g.GontiNightMinister.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Gonti, Night Minister", 450, Rarity.RARE, mage.cards.g.GontiNightMinister.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Greasewrench Goblin", 132, Rarity.UNCOMMON, mage.cards.g.GreasewrenchGoblin.class)); cards.add(new SetCardInfo("Greenbelt Guardian", 164, Rarity.UNCOMMON, mage.cards.g.GreenbeltGuardian.class)); cards.add(new SetCardInfo("Grim Bauble", 88, Rarity.COMMON, mage.cards.g.GrimBauble.class)); cards.add(new SetCardInfo("Grim Javelineer", 89, Rarity.COMMON, mage.cards.g.GrimJavelineer.class)); - cards.add(new SetCardInfo("Guardian Sunmare", 15, Rarity.RARE, mage.cards.g.GuardianSunmare.class)); + cards.add(new SetCardInfo("Guardian Sunmare", 15, Rarity.RARE, mage.cards.g.GuardianSunmare.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Guardian Sunmare", 334, Rarity.RARE, mage.cards.g.GuardianSunmare.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Guardian Sunmare", 429, Rarity.RARE, mage.cards.g.GuardianSunmare.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Guardian Sunmare", 533, Rarity.RARE, mage.cards.g.GuardianSunmare.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Guidelight Matrix", 233, Rarity.COMMON, mage.cards.g.GuidelightMatrix.class)); cards.add(new SetCardInfo("Guidelight Optimizer", 45, Rarity.COMMON, mage.cards.g.GuidelightOptimizer.class)); - cards.add(new SetCardInfo("Guidelight Pathmaker", 206, Rarity.UNCOMMON, mage.cards.g.GuidelightPathmaker.class)); + cards.add(new SetCardInfo("Guidelight Pathmaker", 206, Rarity.UNCOMMON, mage.cards.g.GuidelightPathmaker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Guidelight Pathmaker", 324, Rarity.UNCOMMON, mage.cards.g.GuidelightPathmaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Guidelight Synergist", 16, Rarity.UNCOMMON, mage.cards.g.GuidelightSynergist.class)); cards.add(new SetCardInfo("Haunt the Network", 207, Rarity.UNCOMMON, mage.cards.h.HauntTheNetwork.class)); - cards.add(new SetCardInfo("Haunted Hellride", 208, Rarity.UNCOMMON, mage.cards.h.HauntedHellride.class)); + cards.add(new SetCardInfo("Haunted Hellride", 208, Rarity.UNCOMMON, mage.cards.h.HauntedHellride.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Haunted Hellride", 325, Rarity.UNCOMMON, mage.cards.h.HauntedHellride.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Hazard of the Dunes", 165, Rarity.COMMON, mage.cards.h.HazardOfTheDunes.class)); - cards.add(new SetCardInfo("Hazoret, Godseeker", 133, Rarity.MYTHIC, mage.cards.h.HazoretGodseeker.class)); + cards.add(new SetCardInfo("Hazoret, Godseeker", 133, Rarity.MYTHIC, mage.cards.h.HazoretGodseeker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hazoret, Godseeker", 347, Rarity.MYTHIC, mage.cards.h.HazoretGodseeker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hazoret, Godseeker", 462, Rarity.MYTHIC, mage.cards.h.HazoretGodseeker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hazoret, Godseeker", 546, Rarity.MYTHIC, mage.cards.h.HazoretGodseeker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hellish Sideswipe", 90, Rarity.UNCOMMON, mage.cards.h.HellishSideswipe.class)); cards.add(new SetCardInfo("Hour of Victory", 91, Rarity.UNCOMMON, mage.cards.h.HourOfVictory.class)); cards.add(new SetCardInfo("Howler's Heavy", 46, Rarity.COMMON, mage.cards.h.HowlersHeavy.class)); - cards.add(new SetCardInfo("Howlsquad Heavy", 134, Rarity.RARE, mage.cards.h.HowlsquadHeavy.class)); - cards.add(new SetCardInfo("Hulldrifter", 47, Rarity.COMMON, mage.cards.h.Hulldrifter.class)); + cards.add(new SetCardInfo("Howlsquad Heavy", 134, Rarity.RARE, mage.cards.h.HowlsquadHeavy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Howlsquad Heavy", 342, Rarity.RARE, mage.cards.h.HowlsquadHeavy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Howlsquad Heavy", 463, Rarity.RARE, mage.cards.h.HowlsquadHeavy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Howlsquad Heavy", 541, Rarity.RARE, mage.cards.h.HowlsquadHeavy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hulldrifter", 47, Rarity.COMMON, mage.cards.h.Hulldrifter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Hulldrifter", 300, Rarity.COMMON, mage.cards.h.Hulldrifter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Interface Ace", 17, Rarity.COMMON, mage.cards.i.InterfaceAce.class)); cards.add(new SetCardInfo("Intimidation Tactics", 92, Rarity.UNCOMMON, mage.cards.i.IntimidationTactics.class)); + cards.add(new SetCardInfo("Island", 273, 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", 281, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 282, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 508, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 513, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jibbirik Omnivore", 166, Rarity.COMMON, mage.cards.j.JibbirikOmnivore.class)); cards.add(new SetCardInfo("Jungle Hollow", 256, Rarity.COMMON, mage.cards.j.JungleHollow.class)); cards.add(new SetCardInfo("Kalakscion, Hunger Tyrant", 93, Rarity.UNCOMMON, mage.cards.k.KalakscionHungerTyrant.class)); @@ -164,9 +263,16 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Ketramose, the New Dawn", 482, Rarity.MYTHIC, mage.cards.k.KetramoseTheNewDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ketramose, the New Dawn", 549, Rarity.MYTHIC, mage.cards.k.KetramoseTheNewDawn.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Kickoff Celebrations", 135, Rarity.COMMON, mage.cards.k.KickoffCelebrations.class)); + cards.add(new SetCardInfo("Kolodin, Triumph Caster", 210, Rarity.RARE, mage.cards.k.KolodinTriumphCaster.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kolodin, Triumph Caster", 364, Rarity.RARE, mage.cards.k.KolodinTriumphCaster.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kolodin, Triumph Caster", 483, Rarity.RARE, mage.cards.k.KolodinTriumphCaster.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lagorin, Soul of Alacria", 211, Rarity.UNCOMMON, mage.cards.l.LagorinSoulOfAlacria.class)); cards.add(new SetCardInfo("Leonin Surveyor", 18, Rarity.COMMON, mage.cards.l.LeoninSurveyor.class)); - cards.add(new SetCardInfo("Lifecraft Engine", 234, Rarity.RARE, mage.cards.l.LifecraftEngine.class)); + cards.add(new SetCardInfo("Lifecraft Engine", 234, Rarity.RARE, mage.cards.l.LifecraftEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lifecraft Engine", 329, Rarity.RARE, mage.cards.l.LifecraftEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lifecraft Engine", 423, Rarity.RARE, mage.cards.l.LifecraftEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lifecraft Engine", 497, Rarity.RARE, mage.cards.l.LifecraftEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lifecraft Engine", 531, Rarity.RARE, mage.cards.l.LifecraftEngine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lightning Strike", 136, Rarity.COMMON, mage.cards.l.LightningStrike.class)); cards.add(new SetCardInfo("Lightshield Parry", 19, Rarity.COMMON, mage.cards.l.LightshieldParry.class)); cards.add(new SetCardInfo("Lightwheel Enhancements", 20, Rarity.COMMON, mage.cards.l.LightwheelEnhancements.class)); @@ -178,30 +284,61 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Loot, the Pathfinder", 484, Rarity.MYTHIC, mage.cards.l.LootThePathfinder.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lotusguard Disciple", 21, Rarity.COMMON, mage.cards.l.LotusguardDisciple.class)); cards.add(new SetCardInfo("Loxodon Surveyor", 167, Rarity.COMMON, mage.cards.l.LoxodonSurveyor.class)); - cards.add(new SetCardInfo("Lumbering Worldwagon", 168, Rarity.RARE, mage.cards.l.LumberingWorldwagon.class)); + cards.add(new SetCardInfo("Lumbering Worldwagon", 168, Rarity.RARE, mage.cards.l.LumberingWorldwagon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lumbering Worldwagon", 316, Rarity.RARE, mage.cards.l.LumberingWorldwagon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lumbering Worldwagon", 422, Rarity.RARE, mage.cards.l.LumberingWorldwagon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lumbering Worldwagon", 467, Rarity.RARE, mage.cards.l.LumberingWorldwagon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lumbering Worldwagon", 528, Rarity.RARE, mage.cards.l.LumberingWorldwagon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Magmakin Artillerist", 137, Rarity.COMMON, mage.cards.m.MagmakinArtillerist.class)); - cards.add(new SetCardInfo("Marauding Mako", 138, Rarity.UNCOMMON, mage.cards.m.MaraudingMako.class)); + cards.add(new SetCardInfo("Marauding Mako", 138, Rarity.UNCOMMON, mage.cards.m.MaraudingMako.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Marauding Mako", 419, Rarity.UNCOMMON, mage.cards.m.MaraudingMako.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("March of the World Ooze", 169, Rarity.MYTHIC, mage.cards.m.MarchOfTheWorldOoze.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("March of the World Ooze", 388, Rarity.MYTHIC, mage.cards.m.MarchOfTheWorldOoze.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("March of the World Ooze", 402, Rarity.MYTHIC, mage.cards.m.MarchOfTheWorldOoze.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("March of the World Ooze", 412, Rarity.MYTHIC, mage.cards.m.MarchOfTheWorldOoze.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("March of the World Ooze", 468, Rarity.MYTHIC, mage.cards.m.MarchOfTheWorldOoze.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Marketback Walker", 235, Rarity.RARE, mage.cards.m.MarketbackWalker.class)); - cards.add(new SetCardInfo("Marshals' Pathcruiser", 236, Rarity.UNCOMMON, mage.cards.m.MarshalsPathcruiser.class)); + cards.add(new SetCardInfo("Marketback Walker", 235, Rarity.RARE, mage.cards.m.MarketbackWalker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Marketback Walker", 393, Rarity.RARE, mage.cards.m.MarketbackWalker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Marketback Walker", 498, Rarity.RARE, mage.cards.m.MarketbackWalker.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Marshals' Pathcruiser", 236, Rarity.UNCOMMON, mage.cards.m.MarshalsPathcruiser.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Marshals' Pathcruiser", 330, Rarity.UNCOMMON, mage.cards.m.MarshalsPathcruiser.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Maximum Overdrive", 96, Rarity.COMMON, mage.cards.m.MaximumOverdrive.class)); cards.add(new SetCardInfo("Memory Guardian", 49, Rarity.UNCOMMON, mage.cards.m.MemoryGuardian.class)); cards.add(new SetCardInfo("Mendicant Core, Guidelight", 213, Rarity.RARE, mage.cards.m.MendicantCoreGuidelight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mendicant Core, Guidelight", 365, Rarity.RARE, mage.cards.m.MendicantCoreGuidelight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mendicant Core, Guidelight", 485, Rarity.RARE, mage.cards.m.MendicantCoreGuidelight.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Midnight Mangler", 50, Rarity.COMMON, mage.cards.m.MidnightMangler.class)); + cards.add(new SetCardInfo("Midnight Mangler", 50, Rarity.COMMON, mage.cards.m.MidnightMangler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Midnight Mangler", 301, Rarity.COMMON, mage.cards.m.MidnightMangler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Migrating Ketradon", 170, Rarity.COMMON, mage.cards.m.MigratingKetradon.class)); - cards.add(new SetCardInfo("Mindspring Merfolk", 51, Rarity.RARE, mage.cards.m.MindspringMerfolk.class)); + cards.add(new SetCardInfo("Mimeoplasm, Revered One", 214, Rarity.MYTHIC, mage.cards.m.MimeoplasmReveredOne.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mimeoplasm, Revered One", 392, Rarity.MYTHIC, mage.cards.m.MimeoplasmReveredOne.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mimeoplasm, Revered One", 405, Rarity.MYTHIC, mage.cards.m.MimeoplasmReveredOne.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mimeoplasm, Revered One", 415, Rarity.MYTHIC, mage.cards.m.MimeoplasmReveredOne.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mimeoplasm, Revered One", 486, Rarity.MYTHIC, mage.cards.m.MimeoplasmReveredOne.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindspring Merfolk", 51, Rarity.RARE, mage.cards.m.MindspringMerfolk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindspring Merfolk", 335, Rarity.RARE, mage.cards.m.MindspringMerfolk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindspring Merfolk", 436, Rarity.RARE, mage.cards.m.MindspringMerfolk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mindspring Merfolk", 534, Rarity.RARE, mage.cards.m.MindspringMerfolk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Molt Tender", 171, Rarity.UNCOMMON, mage.cards.m.MoltTender.class)); cards.add(new SetCardInfo("Momentum Breaker", 97, Rarity.UNCOMMON, mage.cards.m.MomentumBreaker.class)); - cards.add(new SetCardInfo("Monument to Endurance", 237, Rarity.RARE, mage.cards.m.MonumentToEndurance.class)); + cards.add(new SetCardInfo("Monument to Endurance", 237, Rarity.RARE, mage.cards.m.MonumentToEndurance.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Monument to Endurance", 394, Rarity.RARE, mage.cards.m.MonumentToEndurance.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Monument to Endurance", 499, Rarity.RARE, mage.cards.m.MonumentToEndurance.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 275, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mountain", 286, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mu Yanling, Wind Rider", 52, Rarity.MYTHIC, mage.cards.m.MuYanlingWindRider.class)); - cards.add(new SetCardInfo("Muraganda Raceway", 257, Rarity.RARE, mage.cards.m.MuragandaRaceway.class)); + cards.add(new SetCardInfo("Mountain", 287, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 288, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 510, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 515, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mu Yanling, Wind Rider", 52, Rarity.MYTHIC, mage.cards.m.MuYanlingWindRider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mu Yanling, Wind Rider", 379, Rarity.MYTHIC, mage.cards.m.MuYanlingWindRider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mu Yanling, Wind Rider", 399, Rarity.MYTHIC, mage.cards.m.MuYanlingWindRider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mu Yanling, Wind Rider", 409, Rarity.MYTHIC, mage.cards.m.MuYanlingWindRider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mu Yanling, Wind Rider", 437, Rarity.MYTHIC, mage.cards.m.MuYanlingWindRider.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Muraganda Raceway", 257, Rarity.RARE, mage.cards.m.MuragandaRaceway.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Muraganda Raceway", 396, Rarity.RARE, mage.cards.m.MuragandaRaceway.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Muraganda Raceway", 426, Rarity.RARE, mage.cards.m.MuragandaRaceway.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Muraganda Raceway", 502, Rarity.RARE, mage.cards.m.MuragandaRaceway.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mutant Surveyor", 98, Rarity.COMMON, mage.cards.m.MutantSurveyor.class)); cards.add(new SetCardInfo("Nesting Bot", 22, Rarity.UNCOMMON, mage.cards.n.NestingBot.class)); cards.add(new SetCardInfo("Night Market", 258, Rarity.COMMON, mage.cards.n.NightMarket.class)); @@ -212,37 +349,63 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Oildeep Gearhulk", 550, Rarity.MYTHIC, mage.cards.o.OildeepGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ooze Patrol", 172, Rarity.UNCOMMON, mage.cards.o.OozePatrol.class)); cards.add(new SetCardInfo("Outpace Oblivion", 139, Rarity.UNCOMMON, mage.cards.o.OutpaceOblivion.class)); - cards.add(new SetCardInfo("Oviya, Automech Artisan", 173, Rarity.RARE, mage.cards.o.OviyaAutomechArtisan.class)); + cards.add(new SetCardInfo("Oviya, Automech Artisan", 173, Rarity.RARE, mage.cards.o.OviyaAutomechArtisan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oviya, Automech Artisan", 359, Rarity.RARE, mage.cards.o.OviyaAutomechArtisan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oviya, Automech Artisan", 469, Rarity.RARE, mage.cards.o.OviyaAutomechArtisan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pacesetter Paragon", 140, Rarity.UNCOMMON, mage.cards.p.PacesetterParagon.class)); cards.add(new SetCardInfo("Pactdoll Terror", 99, Rarity.COMMON, mage.cards.p.PactdollTerror.class)); cards.add(new SetCardInfo("Pedal to the Metal", 141, Rarity.COMMON, mage.cards.p.PedalToTheMetal.class)); - cards.add(new SetCardInfo("Perilous Snare", 23, Rarity.RARE, mage.cards.p.PerilousSnare.class)); + cards.add(new SetCardInfo("Perilous Snare", 23, Rarity.RARE, mage.cards.p.PerilousSnare.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Perilous Snare", 377, Rarity.RARE, mage.cards.p.PerilousSnare.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Perilous Snare", 430, Rarity.RARE, mage.cards.p.PerilousSnare.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pit Automaton", 238, Rarity.UNCOMMON, mage.cards.p.PitAutomaton.class)); cards.add(new SetCardInfo("Plains", 272, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 277, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 278, 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", 507, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 512, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plow Through", 174, Rarity.UNCOMMON, mage.cards.p.PlowThrough.class)); cards.add(new SetCardInfo("Point the Way", 175, Rarity.UNCOMMON, mage.cards.p.PointTheWay.class)); - cards.add(new SetCardInfo("Possession Engine", 54, Rarity.RARE, mage.cards.p.PossessionEngine.class)); + cards.add(new SetCardInfo("Possession Engine", 54, Rarity.RARE, mage.cards.p.PossessionEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Possession Engine", 302, Rarity.RARE, mage.cards.p.PossessionEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Possession Engine", 438, Rarity.RARE, mage.cards.p.PossessionEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Possession Engine", 521, Rarity.RARE, mage.cards.p.PossessionEngine.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pothole Mole", 176, Rarity.COMMON, mage.cards.p.PotholeMole.class)); cards.add(new SetCardInfo("Pride of the Road", 24, Rarity.UNCOMMON, mage.cards.p.PrideOfTheRoad.class)); cards.add(new SetCardInfo("Prowcatcher Specialist", 142, Rarity.COMMON, mage.cards.p.ProwcatcherSpecialist.class)); cards.add(new SetCardInfo("Push the Limit", 143, Rarity.UNCOMMON, mage.cards.p.PushTheLimit.class)); - cards.add(new SetCardInfo("Pyrewood Gearhulk", 216, Rarity.MYTHIC, mage.cards.p.PyrewoodGearhulk.class)); - cards.add(new SetCardInfo("Quag Feast", 100, Rarity.RARE, mage.cards.q.QuagFeast.class)); + cards.add(new SetCardInfo("Pyrewood Gearhulk", 216, Rarity.MYTHIC, mage.cards.p.PyrewoodGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pyrewood Gearhulk", 352, Rarity.MYTHIC, mage.cards.p.PyrewoodGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pyrewood Gearhulk", 488, Rarity.MYTHIC, mage.cards.p.PyrewoodGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pyrewood Gearhulk", 551, Rarity.MYTHIC, mage.cards.p.PyrewoodGearhulk.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Quag Feast", 100, Rarity.RARE, mage.cards.q.QuagFeast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Quag Feast", 384, Rarity.RARE, mage.cards.q.QuagFeast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Quag Feast", 452, Rarity.RARE, mage.cards.q.QuagFeast.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Racers' Scoreboard", 239, Rarity.UNCOMMON, mage.cards.r.RacersScoreboard.class)); cards.add(new SetCardInfo("Radiant Lotus", 240, Rarity.MYTHIC, mage.cards.r.RadiantLotus.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Radiant Lotus", 395, Rarity.MYTHIC, mage.cards.r.RadiantLotus.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Radiant Lotus", 406, Rarity.MYTHIC, mage.cards.r.RadiantLotus.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Radiant Lotus", 416, Rarity.MYTHIC, mage.cards.r.RadiantLotus.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Radiant Lotus", 500, Rarity.MYTHIC, mage.cards.r.RadiantLotus.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Rangers' Aetherhive", 217, Rarity.UNCOMMON, mage.cards.r.RangersAetherhive.class)); - cards.add(new SetCardInfo("Rangers' Refueler", 55, Rarity.UNCOMMON, mage.cards.r.RangersRefueler.class)); + cards.add(new SetCardInfo("Rangers' Aetherhive", 217, Rarity.UNCOMMON, mage.cards.r.RangersAetherhive.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rangers' Aetherhive", 326, Rarity.UNCOMMON, mage.cards.r.RangersAetherhive.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rangers' Refueler", 55, Rarity.UNCOMMON, mage.cards.r.RangersRefueler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rangers' Refueler", 303, Rarity.UNCOMMON, mage.cards.r.RangersRefueler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Reckless Velocitaur", 144, Rarity.UNCOMMON, mage.cards.r.RecklessVelocitaur.class)); - cards.add(new SetCardInfo("Redshift, Rocketeer Chief", 218, Rarity.RARE, mage.cards.r.RedshiftRocketeerChief.class)); + cards.add(new SetCardInfo("Redshift, Rocketeer Chief", 218, Rarity.RARE, mage.cards.r.RedshiftRocketeerChief.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Redshift, Rocketeer Chief", 366, Rarity.RARE, mage.cards.r.RedshiftRocketeerChief.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Redshift, Rocketeer Chief", 489, Rarity.RARE, mage.cards.r.RedshiftRocketeerChief.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Reef Roads", 259, Rarity.UNCOMMON, mage.cards.r.ReefRoads.class)); - cards.add(new SetCardInfo("Regal Imperiosaur", 177, Rarity.RARE, mage.cards.r.RegalImperiosaur.class)); - cards.add(new SetCardInfo("Repurposing Bay", 56, Rarity.RARE, mage.cards.r.RepurposingBay.class)); + cards.add(new SetCardInfo("Regal Imperiosaur", 177, Rarity.RARE, mage.cards.r.RegalImperiosaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Regal Imperiosaur", 389, Rarity.RARE, mage.cards.r.RegalImperiosaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Regal Imperiosaur", 470, Rarity.RARE, mage.cards.r.RegalImperiosaur.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Repurposing Bay", 56, Rarity.RARE, mage.cards.r.RepurposingBay.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Repurposing Bay", 380, Rarity.RARE, mage.cards.r.RepurposingBay.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Repurposing Bay", 439, Rarity.RARE, mage.cards.r.RepurposingBay.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Ride's End", 25, Rarity.COMMON, mage.cards.r.RidesEnd.class)); - cards.add(new SetCardInfo("Ripclaw Wrangler", 101, Rarity.COMMON, mage.cards.r.RipclawWrangler.class)); + cards.add(new SetCardInfo("Ripclaw Wrangler", 101, Rarity.COMMON, mage.cards.r.RipclawWrangler.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ripclaw Wrangler", 309, Rarity.COMMON, mage.cards.r.RipclawWrangler.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Riptide Gearhulk", 219, Rarity.MYTHIC, mage.cards.r.RiptideGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Riptide Gearhulk", 353, Rarity.MYTHIC, mage.cards.r.RiptideGearhulk.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Riptide Gearhulk", 490, Rarity.MYTHIC, mage.cards.r.RiptideGearhulk.class, NON_FULL_USE_VARIOUS)); @@ -253,19 +416,33 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Riverchurn Monument", 57, Rarity.RARE, mage.cards.r.RiverchurnMonument.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Riverchurn Monument", 381, Rarity.RARE, mage.cards.r.RiverchurnMonument.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Riverchurn Monument", 440, Rarity.RARE, mage.cards.r.RiverchurnMonument.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Riverpyre Verge", 260, Rarity.RARE, mage.cards.r.RiverpyreVerge.class)); + cards.add(new SetCardInfo("Riverpyre Verge", 260, Rarity.RARE, mage.cards.r.RiverpyreVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Riverpyre Verge", 372, Rarity.RARE, mage.cards.r.RiverpyreVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Riverpyre Verge", 503, Rarity.RARE, mage.cards.r.RiverpyreVerge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Road Rage", 145, Rarity.UNCOMMON, mage.cards.r.RoadRage.class)); cards.add(new SetCardInfo("Roadside Assistance", 26, Rarity.UNCOMMON, mage.cards.r.RoadsideAssistance.class)); cards.add(new SetCardInfo("Roadside Blowout", 58, Rarity.UNCOMMON, mage.cards.r.RoadsideBlowout.class)); - cards.add(new SetCardInfo("Rocketeer Boostbuggy", 220, Rarity.UNCOMMON, mage.cards.r.RocketeerBoostbuggy.class)); + cards.add(new SetCardInfo("Rocketeer Boostbuggy", 220, Rarity.UNCOMMON, mage.cards.r.RocketeerBoostbuggy.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rocketeer Boostbuggy", 327, Rarity.UNCOMMON, mage.cards.r.RocketeerBoostbuggy.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rocky Roads", 261, Rarity.UNCOMMON, mage.cards.r.RockyRoads.class)); - cards.add(new SetCardInfo("Rover Blades", 241, Rarity.UNCOMMON, mage.cards.r.RoverBlades.class)); + cards.add(new SetCardInfo("Rover Blades", 241, Rarity.UNCOMMON, mage.cards.r.RoverBlades.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rover Blades", 331, Rarity.UNCOMMON, mage.cards.r.RoverBlades.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rugged Highlands", 262, Rarity.COMMON, mage.cards.r.RuggedHighlands.class)); cards.add(new SetCardInfo("Run Over", 179, Rarity.COMMON, mage.cards.r.RunOver.class)); - cards.add(new SetCardInfo("Sab-Sunen, Luxa Embodied", 221, Rarity.MYTHIC, mage.cards.s.SabSunenLuxaEmbodied.class)); + cards.add(new SetCardInfo("Sab-Sunen, Luxa Embodied", 221, Rarity.MYTHIC, mage.cards.s.SabSunenLuxaEmbodied.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sab-Sunen, Luxa Embodied", 354, Rarity.MYTHIC, mage.cards.s.SabSunenLuxaEmbodied.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sab-Sunen, Luxa Embodied", 491, Rarity.MYTHIC, mage.cards.s.SabSunenLuxaEmbodied.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sab-Sunen, Luxa Embodied", 553, Rarity.MYTHIC, mage.cards.s.SabSunenLuxaEmbodied.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sabotage Strategist", 59, Rarity.UNCOMMON, mage.cards.s.SabotageStrategist.class)); - cards.add(new SetCardInfo("Salvation Engine", 27, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class)); - cards.add(new SetCardInfo("Samut, the Driving Force", 222, Rarity.RARE, mage.cards.s.SamutTheDrivingForce.class)); + cards.add(new SetCardInfo("Salvation Engine", 27, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Salvation Engine", 295, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Salvation Engine", 397, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Salvation Engine", 407, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Salvation Engine", 431, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Salvation Engine", 517, Rarity.MYTHIC, mage.cards.s.SalvationEngine.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Samut, the Driving Force", 222, Rarity.RARE, mage.cards.s.SamutTheDrivingForce.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Samut, the Driving Force", 367, Rarity.RARE, mage.cards.s.SamutTheDrivingForce.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Samut, the Driving Force", 492, Rarity.RARE, mage.cards.s.SamutTheDrivingForce.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Scoured Barrens", 263, Rarity.COMMON, mage.cards.s.ScouredBarrens.class)); cards.add(new SetCardInfo("Scrap Compactor", 242, Rarity.COMMON, mage.cards.s.ScrapCompactor.class)); cards.add(new SetCardInfo("Scrounging Skyray", 60, Rarity.UNCOMMON, mage.cards.s.ScroungingSkyray.class)); @@ -274,7 +451,8 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Sita Varma, Masked Racer", 223, Rarity.RARE, mage.cards.s.SitaVarmaMaskedRacer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sita Varma, Masked Racer", 368, Rarity.RARE, mage.cards.s.SitaVarmaMaskedRacer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sita Varma, Masked Racer", 493, Rarity.RARE, mage.cards.s.SitaVarmaMaskedRacer.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Skybox Ferry", 243, Rarity.COMMON, mage.cards.s.SkyboxFerry.class)); + cards.add(new SetCardInfo("Skybox Ferry", 243, Rarity.COMMON, mage.cards.s.SkyboxFerry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Skybox Ferry", 332, Rarity.COMMON, mage.cards.s.SkyboxFerry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Skycrash", 146, Rarity.UNCOMMON, mage.cards.s.Skycrash.class)); cards.add(new SetCardInfo("Skyseer's Chariot", 28, Rarity.RARE, mage.cards.s.SkyseersChariot.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Skyseer's Chariot", 296, Rarity.RARE, mage.cards.s.SkyseersChariot.class, NON_FULL_USE_VARIOUS)); @@ -295,26 +473,46 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Spin Out", 106, Rarity.COMMON, mage.cards.s.SpinOut.class)); cards.add(new SetCardInfo("Spire Mechcycle", 147, Rarity.UNCOMMON, mage.cards.s.SpireMechcycle.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Spire Mechcycle", 314, Rarity.UNCOMMON, mage.cards.s.SpireMechcycle.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Spotcycle Scouter", 30, Rarity.COMMON, mage.cards.s.SpotcycleScouter.class)); + cards.add(new SetCardInfo("Spotcycle Scouter", 30, Rarity.COMMON, mage.cards.s.SpotcycleScouter.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Spotcycle Scouter", 297, Rarity.COMMON, mage.cards.s.SpotcycleScouter.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Stall Out", 66, Rarity.COMMON, mage.cards.s.StallOut.class)); cards.add(new SetCardInfo("Stampeding Scurryfoot", 181, Rarity.COMMON, mage.cards.s.StampedingScurryfoot.class)); cards.add(new SetCardInfo("Starting Column", 244, Rarity.COMMON, mage.cards.s.StartingColumn.class)); cards.add(new SetCardInfo("Stock Up", 67, Rarity.UNCOMMON, mage.cards.s.StockUp.class)); cards.add(new SetCardInfo("Streaking Oilgorger", 107, Rarity.COMMON, mage.cards.s.StreakingOilgorger.class)); - cards.add(new SetCardInfo("Sunbillow Verge", 264, Rarity.RARE, mage.cards.s.SunbillowVerge.class)); + cards.add(new SetCardInfo("Sunbillow Verge", 264, Rarity.RARE, mage.cards.s.SunbillowVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sunbillow Verge", 373, Rarity.RARE, mage.cards.s.SunbillowVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sunbillow Verge", 504, Rarity.RARE, mage.cards.s.SunbillowVerge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sundial, Dawn Tyrant", 31, Rarity.UNCOMMON, mage.cards.s.SundialDawnTyrant.class)); cards.add(new SetCardInfo("Swamp", 274, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 283, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 284, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 285, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 509, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 514, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swiftwater Cliffs", 265, Rarity.COMMON, mage.cards.s.SwiftwaterCliffs.class)); cards.add(new SetCardInfo("Swiftwing Assailant", 32, Rarity.COMMON, mage.cards.s.SwiftwingAssailant.class)); cards.add(new SetCardInfo("Syphon Fuel", 108, Rarity.COMMON, mage.cards.s.SyphonFuel.class)); cards.add(new SetCardInfo("Terrian, World Tyrant", 182, Rarity.UNCOMMON, mage.cards.t.TerrianWorldTyrant.class)); - cards.add(new SetCardInfo("The Aetherspark", 231, Rarity.MYTHIC, mage.cards.t.TheAetherspark.class)); - cards.add(new SetCardInfo("The Last Ride", 94, Rarity.MYTHIC, mage.cards.t.TheLastRide.class)); - cards.add(new SetCardInfo("The Speed Demon", 105, Rarity.MYTHIC, mage.cards.t.TheSpeedDemon.class)); - cards.add(new SetCardInfo("Thopter Fabricator", 68, Rarity.RARE, mage.cards.t.ThopterFabricator.class)); + cards.add(new SetCardInfo("The Aetherspark", 231, Rarity.MYTHIC, mage.cards.t.TheAetherspark.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Aetherspark", 376, Rarity.MYTHIC, mage.cards.t.TheAetherspark.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Aetherspark", 496, Rarity.MYTHIC, mage.cards.t.TheAetherspark.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Last Ride", 94, Rarity.MYTHIC, mage.cards.t.TheLastRide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Last Ride", 308, Rarity.MYTHIC, mage.cards.t.TheLastRide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Last Ride", 451, Rarity.MYTHIC, mage.cards.t.TheLastRide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Last Ride", 525, Rarity.MYTHIC, mage.cards.t.TheLastRide.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Speed Demon", 105, Rarity.MYTHIC, mage.cards.t.TheSpeedDemon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Speed Demon", 339, Rarity.MYTHIC, mage.cards.t.TheSpeedDemon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Speed Demon", 453, Rarity.MYTHIC, mage.cards.t.TheSpeedDemon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("The Speed Demon", 538, Rarity.MYTHIC, mage.cards.t.TheSpeedDemon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thopter Fabricator", 68, Rarity.RARE, mage.cards.t.ThopterFabricator.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thopter Fabricator", 304, Rarity.RARE, mage.cards.t.ThopterFabricator.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thopter Fabricator", 441, Rarity.RARE, mage.cards.t.ThopterFabricator.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thopter Fabricator", 522, Rarity.RARE, mage.cards.t.ThopterFabricator.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thornwood Falls", 266, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class)); cards.add(new SetCardInfo("Thunderhead Gunner", 148, Rarity.COMMON, mage.cards.t.ThunderheadGunner.class)); - cards.add(new SetCardInfo("Thundering Broodwagon", 225, Rarity.UNCOMMON, mage.cards.t.ThunderingBroodwagon.class)); + cards.add(new SetCardInfo("Thundering Broodwagon", 225, Rarity.UNCOMMON, mage.cards.t.ThunderingBroodwagon.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Thundering Broodwagon", 328, Rarity.UNCOMMON, mage.cards.t.ThunderingBroodwagon.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thunderous Velocipede", 183, Rarity.MYTHIC, mage.cards.t.ThunderousVelocipede.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thunderous Velocipede", 317, Rarity.MYTHIC, mage.cards.t.ThunderousVelocipede.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Thunderous Velocipede", 471, Rarity.MYTHIC, mage.cards.t.ThunderousVelocipede.class, NON_FULL_USE_VARIOUS)); @@ -327,23 +525,45 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Tune Up", 33, Rarity.UNCOMMON, mage.cards.t.TuneUp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tune Up", 417, Rarity.UNCOMMON, mage.cards.t.TuneUp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tyrox, Saurid Tyrant", 149, Rarity.UNCOMMON, mage.cards.t.TyroxSauridTyrant.class)); - cards.add(new SetCardInfo("Unstoppable Plan", 72, Rarity.RARE, mage.cards.u.UnstoppablePlan.class)); + cards.add(new SetCardInfo("Unstoppable Plan", 72, Rarity.RARE, mage.cards.u.UnstoppablePlan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Unstoppable Plan", 382, Rarity.RARE, mage.cards.u.UnstoppablePlan.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Unstoppable Plan", 442, Rarity.RARE, mage.cards.u.UnstoppablePlan.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Unswerving Sloth", 34, Rarity.UNCOMMON, mage.cards.u.UnswervingSloth.class)); - cards.add(new SetCardInfo("Valor's Flagship", 35, Rarity.MYTHIC, mage.cards.v.ValorsFlagship.class)); - cards.add(new SetCardInfo("Veloheart Bike", 184, Rarity.COMMON, mage.cards.v.VeloheartBike.class)); + cards.add(new SetCardInfo("Valor's Flagship", 35, Rarity.MYTHIC, mage.cards.v.ValorsFlagship.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Valor's Flagship", 298, Rarity.MYTHIC, mage.cards.v.ValorsFlagship.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Valor's Flagship", 434, Rarity.MYTHIC, mage.cards.v.ValorsFlagship.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Valor's Flagship", 519, Rarity.MYTHIC, mage.cards.v.ValorsFlagship.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Veloheart Bike", 184, Rarity.COMMON, mage.cards.v.VeloheartBike.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Veloheart Bike", 318, Rarity.COMMON, mage.cards.v.VeloheartBike.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Venomsac Lagac", 185, Rarity.COMMON, mage.cards.v.VenomsacLagac.class)); cards.add(new SetCardInfo("Veteran Beastrider", 226, Rarity.UNCOMMON, mage.cards.v.VeteranBeastrider.class)); - cards.add(new SetCardInfo("Vnwxt, Verbose Host", 73, Rarity.RARE, mage.cards.v.VnwxtVerboseHost.class)); - cards.add(new SetCardInfo("Voyage Home", 227, Rarity.UNCOMMON, mage.cards.v.VoyageHome.class)); - cards.add(new SetCardInfo("Voyager Glidecar", 36, Rarity.RARE, mage.cards.v.VoyagerGlidecar.class)); + cards.add(new SetCardInfo("Vnwxt, Verbose Host", 73, Rarity.RARE, mage.cards.v.VnwxtVerboseHost.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vnwxt, Verbose Host", 356, Rarity.RARE, mage.cards.v.VnwxtVerboseHost.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Vnwxt, Verbose Host", 443, Rarity.RARE, mage.cards.v.VnwxtVerboseHost.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Voyage Home", 227, Rarity.UNCOMMON, mage.cards.v.VoyageHome.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Voyage Home", 421, Rarity.UNCOMMON, mage.cards.v.VoyageHome.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Voyager Glidecar", 36, Rarity.RARE, mage.cards.v.VoyagerGlidecar.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Voyager Glidecar", 299, Rarity.RARE, mage.cards.v.VoyagerGlidecar.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Voyager Glidecar", 435, Rarity.RARE, mage.cards.v.VoyagerGlidecar.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Voyager Glidecar", 520, Rarity.RARE, mage.cards.v.VoyagerGlidecar.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Voyager Quickwelder", 37, Rarity.COMMON, mage.cards.v.VoyagerQuickwelder.class)); cards.add(new SetCardInfo("Walking Sarcophagus", 246, Rarity.COMMON, mage.cards.w.WalkingSarcophagus.class)); - cards.add(new SetCardInfo("Wastewood Verge", 268, Rarity.RARE, mage.cards.w.WastewoodVerge.class)); - cards.add(new SetCardInfo("Waxen Shapethief", 74, Rarity.RARE, mage.cards.w.WaxenShapethief.class)); - cards.add(new SetCardInfo("Webstrike Elite", 186, Rarity.RARE, mage.cards.w.WebstrikeElite.class)); + cards.add(new SetCardInfo("Wastewood Verge", 268, Rarity.RARE, mage.cards.w.WastewoodVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wastewood Verge", 374, Rarity.RARE, mage.cards.w.WastewoodVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wastewood Verge", 505, Rarity.RARE, mage.cards.w.WastewoodVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Waxen Shapethief", 74, Rarity.RARE, mage.cards.w.WaxenShapethief.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Waxen Shapethief", 336, Rarity.RARE, mage.cards.w.WaxenShapethief.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Waxen Shapethief", 444, Rarity.RARE, mage.cards.w.WaxenShapethief.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Waxen Shapethief", 535, Rarity.RARE, mage.cards.w.WaxenShapethief.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Webstrike Elite", 186, Rarity.RARE, mage.cards.w.WebstrikeElite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Webstrike Elite", 345, Rarity.RARE, mage.cards.w.WebstrikeElite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Webstrike Elite", 472, Rarity.RARE, mage.cards.w.WebstrikeElite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Webstrike Elite", 544, Rarity.RARE, mage.cards.w.WebstrikeElite.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wickerfolk Indomitable", 109, Rarity.UNCOMMON, mage.cards.w.WickerfolkIndomitable.class)); cards.add(new SetCardInfo("Wild Roads", 269, Rarity.UNCOMMON, mage.cards.w.WildRoads.class)); - cards.add(new SetCardInfo("Willowrush Verge", 270, Rarity.RARE, mage.cards.w.WillowrushVerge.class)); + cards.add(new SetCardInfo("Willowrush Verge", 270, Rarity.RARE, mage.cards.w.WillowrushVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Willowrush Verge", 375, Rarity.RARE, mage.cards.w.WillowrushVerge.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Willowrush Verge", 506, Rarity.RARE, mage.cards.w.WillowrushVerge.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Wind-Scarred Crag", 271, Rarity.COMMON, mage.cards.w.WindScarredCrag.class)); cards.add(new SetCardInfo("Winter, Cursed Rider", 228, Rarity.RARE, mage.cards.w.WinterCursedRider.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Winter, Cursed Rider", 369, Rarity.RARE, mage.cards.w.WinterCursedRider.class, NON_FULL_USE_VARIOUS)); @@ -351,6 +571,8 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Wreck Remover", 247, Rarity.COMMON, mage.cards.w.WreckRemover.class)); cards.add(new SetCardInfo("Wreckage Wickerfolk", 110, Rarity.COMMON, mage.cards.w.WreckageWickerfolk.class)); cards.add(new SetCardInfo("Wretched Doll", 111, Rarity.UNCOMMON, mage.cards.w.WretchedDoll.class)); - cards.add(new SetCardInfo("Zahur, Glory's Past", 229, Rarity.RARE, mage.cards.z.ZahurGlorysPast.class)); + cards.add(new SetCardInfo("Zahur, Glory's Past", 229, Rarity.RARE, mage.cards.z.ZahurGlorysPast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Zahur, Glory's Past", 370, Rarity.RARE, mage.cards.z.ZahurGlorysPast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Zahur, Glory's Past", 495, Rarity.RARE, mage.cards.z.ZahurGlorysPast.class, NON_FULL_USE_VARIOUS)); } } diff --git a/Mage.Sets/src/mage/sets/AetherdriftCommander.java b/Mage.Sets/src/mage/sets/AetherdriftCommander.java index c3f44d37971..5707ceedfc3 100644 --- a/Mage.Sets/src/mage/sets/AetherdriftCommander.java +++ b/Mage.Sets/src/mage/sets/AetherdriftCommander.java @@ -20,12 +20,16 @@ public final class AetherdriftCommander extends ExpansionSet { this.hasBasicLands = false; cards.add(new SetCardInfo("Academy Ruins", 58, Rarity.RARE, mage.cards.a.AcademyRuins.class)); - cards.add(new SetCardInfo("Accursed Duneyard", 20, Rarity.RARE, mage.cards.a.AccursedDuneyard.class)); - cards.add(new SetCardInfo("Adaptive Omnitool", 16, Rarity.RARE, mage.cards.a.AdaptiveOmnitool.class)); + cards.add(new SetCardInfo("Accursed Duneyard", 20, Rarity.RARE, mage.cards.a.AccursedDuneyard.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Accursed Duneyard", 36, Rarity.RARE, mage.cards.a.AccursedDuneyard.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Adaptive Omnitool", 16, Rarity.RARE, mage.cards.a.AdaptiveOmnitool.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Adaptive Omnitool", 32, Rarity.RARE, mage.cards.a.AdaptiveOmnitool.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Adarkar Wastes", 144, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); cards.add(new SetCardInfo("Aether Hub", 145, Rarity.UNCOMMON, mage.cards.a.AetherHub.class)); - cards.add(new SetCardInfo("Aetherflux Conduit", 17, Rarity.RARE, mage.cards.a.AetherfluxConduit.class)); - cards.add(new SetCardInfo("Aetheric Amplifier", 18, Rarity.RARE, mage.cards.a.AethericAmplifier.class)); + cards.add(new SetCardInfo("Aetherflux Conduit", 17, Rarity.RARE, mage.cards.a.AetherfluxConduit.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aetherflux Conduit", 33, Rarity.RARE, mage.cards.a.AetherfluxConduit.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aetheric Amplifier", 18, Rarity.RARE, mage.cards.a.AethericAmplifier.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Aetheric Amplifier", 34, Rarity.RARE, mage.cards.a.AethericAmplifier.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Aethersquall Ancient", 68, Rarity.RARE, mage.cards.a.AethersquallAncient.class)); cards.add(new SetCardInfo("Aethertide Whale", 69, Rarity.RARE, mage.cards.a.AethertideWhale.class)); cards.add(new SetCardInfo("Aetherwind Basker", 107, Rarity.MYTHIC, mage.cards.a.AetherwindBasker.class)); @@ -33,7 +37,8 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("Angel of Sanctions", 62, Rarity.MYTHIC, mage.cards.a.AngelOfSanctions.class)); cards.add(new SetCardInfo("Arcane Denial", 70, Rarity.COMMON, mage.cards.a.ArcaneDenial.class)); cards.add(new SetCardInfo("Arcane Sanctum", 146, Rarity.UNCOMMON, mage.cards.a.ArcaneSanctum.class)); - cards.add(new SetCardInfo("Arcane Signet", 51, Rarity.COMMON, mage.cards.a.ArcaneSignet.class)); + cards.add(new SetCardInfo("Arcane Signet", 51, Rarity.COMMON, mage.cards.a.ArcaneSignet.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Arcane Signet", 52, Rarity.COMMON, mage.cards.a.ArcaneSignet.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Archfiend of Ifnir", 86, Rarity.RARE, mage.cards.a.ArchfiendOfIfnir.class)); cards.add(new SetCardInfo("Architect of the Untamed", 108, Rarity.RARE, mage.cards.a.ArchitectOfTheUntamed.class)); cards.add(new SetCardInfo("Ash Barrens", 147, Rarity.COMMON, mage.cards.a.AshBarrens.class)); @@ -51,7 +56,8 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("Chaos Warp", 48, Rarity.RARE, mage.cards.c.ChaosWarp.class)); cards.add(new SetCardInfo("Chromatic Lantern", 53, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); cards.add(new SetCardInfo("Combustible Gearhulk", 102, Rarity.MYTHIC, mage.cards.c.CombustibleGearhulk.class)); - cards.add(new SetCardInfo("Command Tower", 59, Rarity.COMMON, mage.cards.c.CommandTower.class)); + cards.add(new SetCardInfo("Command Tower", 59, Rarity.COMMON, mage.cards.c.CommandTower.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Command Tower", 60, Rarity.COMMON, mage.cards.c.CommandTower.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Commander's Sphere", 125, Rarity.COMMON, mage.cards.c.CommandersSphere.class)); cards.add(new SetCardInfo("Commence the Endgame", 38, Rarity.RARE, mage.cards.c.CommenceTheEndgame.class)); cards.add(new SetCardInfo("Confiscation Coup", 73, Rarity.RARE, mage.cards.c.ConfiscationCoup.class)); @@ -78,7 +84,8 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("Elder Gargaroth", 111, Rarity.MYTHIC, mage.cards.e.ElderGargaroth.class)); cards.add(new SetCardInfo("Era of Innovation", 75, Rarity.UNCOMMON, mage.cards.e.EraOfInnovation.class)); cards.add(new SetCardInfo("Eternal Skylord", 76, Rarity.UNCOMMON, mage.cards.e.EternalSkylord.class)); - cards.add(new SetCardInfo("Evolving Wilds", 153, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); + cards.add(new SetCardInfo("Evolving Wilds", 153, Rarity.COMMON, mage.cards.e.EvolvingWilds.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Evolving Wilds", 154, Rarity.COMMON, mage.cards.e.EvolvingWilds.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Exotic Orchard", 155, Rarity.RARE, mage.cards.e.ExoticOrchard.class)); cards.add(new SetCardInfo("Explosive Vegetation", 112, Rarity.UNCOMMON, mage.cards.e.ExplosiveVegetation.class)); cards.add(new SetCardInfo("Fetid Pools", 156, Rarity.RARE, mage.cards.f.FetidPools.class)); @@ -95,6 +102,7 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("God-Pharaoh's Gift", 131, Rarity.RARE, mage.cards.g.GodPharaohsGift.class)); cards.add(new SetCardInfo("Grave Titan", 42, Rarity.MYTHIC, mage.cards.g.GraveTitan.class)); cards.add(new SetCardInfo("Gravecrawler", 43, Rarity.RARE, mage.cards.g.Gravecrawler.class)); + cards.add(new SetCardInfo("Hashaton, Scarab's Fist", 1, Rarity.MYTHIC, mage.cards.h.HashatonScarabsFist.class)); cards.add(new SetCardInfo("Hinterland Harbor", 160, Rarity.RARE, mage.cards.h.HinterlandHarbor.class)); cards.add(new SetCardInfo("Irrigated Farmland", 161, Rarity.RARE, mage.cards.i.IrrigatedFarmland.class)); cards.add(new SetCardInfo("Isolated Chapel", 162, Rarity.RARE, mage.cards.i.IsolatedChapel.class)); @@ -104,50 +112,65 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("Lightning Runner", 103, Rarity.MYTHIC, mage.cards.l.LightningRunner.class)); cards.add(new SetCardInfo("Liliana, Death's Majesty", 94, Rarity.MYTHIC, mage.cards.l.LilianaDeathsMajesty.class)); cards.add(new SetCardInfo("Lord of the Accursed", 95, Rarity.UNCOMMON, mage.cards.l.LordOfTheAccursed.class)); + cards.add(new SetCardInfo("Lost Monarch of Ifnir", 11, Rarity.RARE, mage.cards.l.LostMonarchOfIfnir.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Lost Monarch of Ifnir", 27, Rarity.RARE, mage.cards.l.LostMonarchOfIfnir.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Loyal Apprentice", 104, Rarity.UNCOMMON, mage.cards.l.LoyalApprentice.class)); cards.add(new SetCardInfo("Maskwood Nexus", 132, Rarity.RARE, mage.cards.m.MaskwoodNexus.class)); cards.add(new SetCardInfo("Midnight Clock", 79, Rarity.RARE, mage.cards.m.MidnightClock.class)); cards.add(new SetCardInfo("Midnight Reaper", 44, Rarity.RARE, mage.cards.m.MidnightReaper.class)); - cards.add(new SetCardInfo("Murderous Rider", 45, Rarity.RARE, mage.cards.m.MurderousRider.class)); + cards.add(new SetCardInfo("Murderous Rider // Swift End", 45, Rarity.RARE, mage.cards.m.MurderousRider.class)); cards.add(new SetCardInfo("Never // Return", 96, Rarity.RARE, mage.cards.n.NeverReturn.class)); cards.add(new SetCardInfo("Nissa, Worldsoul Speaker", 13, Rarity.RARE, mage.cards.n.NissaWorldsoulSpeaker.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Nissa, Worldsoul Speaker", 29, Rarity.RARE, mage.cards.n.NissaWorldsoulSpeaker.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("On Wings of Gold", 5, Rarity.RARE, mage.cards.o.OnWingsOfGold.class)); + cards.add(new SetCardInfo("On Wings of Gold", 5, Rarity.RARE, mage.cards.o.OnWingsOfGold.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("On Wings of Gold", 21, Rarity.RARE, mage.cards.o.OnWingsOfGold.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("One with the Machine", 80, Rarity.RARE, mage.cards.o.OneWithTheMachine.class)); cards.add(new SetCardInfo("Ornithopter of Paradise", 133, Rarity.COMMON, mage.cards.o.OrnithopterOfParadise.class)); cards.add(new SetCardInfo("Orzhov Basilica", 164, Rarity.UNCOMMON, mage.cards.o.OrzhovBasilica.class)); cards.add(new SetCardInfo("Orzhov Signet", 134, Rarity.UNCOMMON, mage.cards.o.OrzhovSignet.class)); cards.add(new SetCardInfo("Overflowing Basin", 165, Rarity.RARE, mage.cards.o.OverflowingBasin.class)); cards.add(new SetCardInfo("Panharmonicon", 135, Rarity.RARE, mage.cards.p.Panharmonicon.class)); - cards.add(new SetCardInfo("Path of Ancestry", 61, Rarity.COMMON, mage.cards.p.PathOfAncestry.class)); + cards.add(new SetCardInfo("Path of Ancestry", 61, Rarity.COMMON, mage.cards.p.PathOfAncestry.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Path of Ancestry", 166, Rarity.COMMON, mage.cards.p.PathOfAncestry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Peema Aether-Seer", 113, Rarity.UNCOMMON, mage.cards.p.PeemaAetherSeer.class)); - cards.add(new SetCardInfo("Peema Trailblazer", 14, Rarity.RARE, mage.cards.p.PeemaTrailblazer.class)); + cards.add(new SetCardInfo("Peema Trailblazer", 14, Rarity.RARE, mage.cards.p.PeemaTrailblazer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Peema Trailblazer", 30, Rarity.RARE, mage.cards.p.PeemaTrailblazer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Pia Nalaar, Chief Mechanic", 2, Rarity.MYTHIC, mage.cards.p.PiaNalaarChiefMechanic.class)); cards.add(new SetCardInfo("Pia and Kiran Nalaar", 105, Rarity.RARE, mage.cards.p.PiaAndKiranNalaar.class)); cards.add(new SetCardInfo("Plague Belcher", 97, Rarity.RARE, mage.cards.p.PlagueBelcher.class)); cards.add(new SetCardInfo("Prairie Stream", 167, Rarity.RARE, mage.cards.p.PrairieStream.class)); cards.add(new SetCardInfo("Priest of the Crossing", 6, Rarity.RARE, mage.cards.p.PriestOfTheCrossing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Priest of the Crossing", 22, Rarity.RARE, mage.cards.p.PriestOfTheCrossing.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Prophet of the Scarab", 9, Rarity.RARE, mage.cards.p.ProphetOfTheScarab.class)); + cards.add(new SetCardInfo("Prophet of the Scarab", 9, Rarity.RARE, mage.cards.p.ProphetOfTheScarab.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Prophet of the Scarab", 25, Rarity.RARE, mage.cards.p.ProphetOfTheScarab.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Pull from Tomorrow", 81, Rarity.RARE, mage.cards.p.PullFromTomorrow.class)); + cards.add(new SetCardInfo("Rampaging Aetherhood", 15, Rarity.RARE, mage.cards.r.RampagingAetherhood.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rampaging Aetherhood", 31, Rarity.RARE, mage.cards.r.RampagingAetherhood.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Reality Shift", 39, Rarity.UNCOMMON, mage.cards.r.RealityShift.class)); cards.add(new SetCardInfo("Reckless Fireweaver", 106, Rarity.COMMON, mage.cards.r.RecklessFireweaver.class)); + cards.add(new SetCardInfo("Renewed Solidarity", 7, Rarity.RARE, mage.cards.r.RenewedSolidarity.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Renewed Solidarity", 23, Rarity.RARE, mage.cards.r.RenewedSolidarity.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Retrofitter Foundry", 136, Rarity.RARE, mage.cards.r.RetrofitterFoundry.class)); - cards.add(new SetCardInfo("Rhet-Tomb Mystic", 10, Rarity.RARE, mage.cards.r.RhetTombMystic.class)); + cards.add(new SetCardInfo("Rhet-Tomb Mystic", 10, Rarity.RARE, mage.cards.r.RhetTombMystic.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Rhet-Tomb Mystic", 26, Rarity.RARE, mage.cards.r.RhetTombMystic.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Rogue Refiner", 118, Rarity.UNCOMMON, mage.cards.r.RogueRefiner.class)); cards.add(new SetCardInfo("Rootbound Crag", 168, Rarity.RARE, mage.cards.r.RootboundCrag.class)); cards.add(new SetCardInfo("Rot Hulk", 98, Rarity.MYTHIC, mage.cards.r.RotHulk.class)); + cards.add(new SetCardInfo("Saheeli, Radiant Creator", 3, Rarity.MYTHIC, mage.cards.s.SaheeliRadiantCreator.class)); cards.add(new SetCardInfo("Saheeli, Sublime Artificer", 119, Rarity.UNCOMMON, mage.cards.s.SaheeliSublimeArtificer.class)); cards.add(new SetCardInfo("Sai, Master Thopterist", 82, Rarity.RARE, mage.cards.s.SaiMasterThopterist.class)); cards.add(new SetCardInfo("Servant of the Conduit", 114, Rarity.UNCOMMON, mage.cards.s.ServantOfTheConduit.class)); cards.add(new SetCardInfo("Sheltered Thicket", 169, Rarity.RARE, mage.cards.s.ShelteredThicket.class)); cards.add(new SetCardInfo("Shivan Reef", 170, Rarity.RARE, mage.cards.s.ShivanReef.class)); cards.add(new SetCardInfo("Slagwoods Bridge", 171, Rarity.COMMON, mage.cards.s.SlagwoodsBridge.class)); - cards.add(new SetCardInfo("Sol Ring", 56, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); + cards.add(new SetCardInfo("Sol Ring", 56, Rarity.UNCOMMON, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sol Ring", 57, Rarity.UNCOMMON, mage.cards.s.SolRing.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Solar Transformer", 137, Rarity.UNCOMMON, mage.cards.s.SolarTransformer.class)); cards.add(new SetCardInfo("Solemn Simulacrum", 138, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class)); cards.add(new SetCardInfo("Soul-Guide Lantern", 139, Rarity.UNCOMMON, mage.cards.s.SoulGuideLantern.class)); cards.add(new SetCardInfo("Spire of Industry", 172, Rarity.RARE, mage.cards.s.SpireOfIndustry.class)); - cards.add(new SetCardInfo("Stridehangar Automaton", 19, Rarity.RARE, mage.cards.s.StridehangarAutomaton.class)); + cards.add(new SetCardInfo("Stridehangar Automaton", 19, Rarity.RARE, mage.cards.s.StridehangarAutomaton.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Stridehangar Automaton", 35, Rarity.RARE, mage.cards.s.StridehangarAutomaton.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Sulfur Falls", 173, Rarity.RARE, mage.cards.s.SulfurFalls.class)); cards.add(new SetCardInfo("Sunken Hollow", 174, Rarity.RARE, mage.cards.s.SunkenHollow.class)); cards.add(new SetCardInfo("Swords to Plowshares", 37, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); @@ -160,6 +183,8 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("Temple of Epiphany", 177, Rarity.RARE, mage.cards.t.TempleOfEpiphany.class)); cards.add(new SetCardInfo("Temple of Silence", 178, Rarity.RARE, mage.cards.t.TempleOfSilence.class)); cards.add(new SetCardInfo("Terramorphic Expanse", 179, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class)); + cards.add(new SetCardInfo("Territorial Aetherkite", 12, Rarity.RARE, mage.cards.t.TerritorialAetherkite.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Territorial Aetherkite", 28, Rarity.RARE, mage.cards.t.TerritorialAetherkite.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("The Scarab God", 120, Rarity.MYTHIC, mage.cards.t.TheScarabGod.class)); cards.add(new SetCardInfo("Thopter Spy Network", 83, Rarity.RARE, mage.cards.t.ThopterSpyNetwork.class)); cards.add(new SetCardInfo("Timeless Dragon", 67, Rarity.RARE, mage.cards.t.TimelessDragon.class)); @@ -174,7 +199,8 @@ public final class AetherdriftCommander extends ExpansionSet { cards.add(new SetCardInfo("Wayward Servant", 121, Rarity.UNCOMMON, mage.cards.w.WaywardServant.class)); cards.add(new SetCardInfo("Whirler Rogue", 85, Rarity.UNCOMMON, mage.cards.w.WhirlerRogue.class)); cards.add(new SetCardInfo("Whirler Virtuoso", 122, Rarity.UNCOMMON, mage.cards.w.WhirlerVirtuoso.class)); - cards.add(new SetCardInfo("Wizened Mentor", 8, Rarity.RARE, mage.cards.w.WizenedMentor.class)); + cards.add(new SetCardInfo("Wizened Mentor", 8, Rarity.RARE, mage.cards.w.WizenedMentor.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Wizened Mentor", 24, Rarity.RARE, mage.cards.w.WizenedMentor.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Yavimaya Coast", 184, Rarity.RARE, mage.cards.y.YavimayaCoast.class)); cards.add(new SetCardInfo("Zombie Master", 46, Rarity.RARE, mage.cards.z.ZombieMaster.class)); } diff --git a/Mage.Sets/src/mage/sets/DoctorWho.java b/Mage.Sets/src/mage/sets/DoctorWho.java index 6b5cfefc7c5..b70357f6180 100644 --- a/Mage.Sets/src/mage/sets/DoctorWho.java +++ b/Mage.Sets/src/mage/sets/DoctorWho.java @@ -590,10 +590,10 @@ public final class DoctorWho extends ExpansionSet { cards.add(new SetCardInfo("Path of Ancestry", 884, Rarity.COMMON, mage.cards.p.PathOfAncestry.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Path to Exile", 210, Rarity.UNCOMMON, mage.cards.p.PathToExile.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Path to Exile", 801, Rarity.UNCOMMON, mage.cards.p.PathToExile.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Peri Brown", 26, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Peri Brown", 344, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Peri Brown", 631, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); - //cards.add(new SetCardInfo("Peri Brown", 935, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Peri Brown", 26, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Peri Brown", 344, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Peri Brown", 631, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Peri Brown", 935, Rarity.RARE, mage.cards.p.PeriBrown.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 1156, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 1157, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Plains", 196, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index 4697a47d9a0..bde77f989dc 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -22,6 +22,10 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Jumbo Cactuar", 191, Rarity.RARE, mage.cards.j.JumboCactuar.class)); cards.add(new SetCardInfo("Sazh's Chocobo", 200, Rarity.UNCOMMON, mage.cards.s.SazhsChocobo.class)); + cards.add(new SetCardInfo("Sephiroth, Planet's Heir", 553, Rarity.MYTHIC, mage.cards.s.SephirothPlanetsHeir.class)); + cards.add(new SetCardInfo("Sin, Spira's Punishment", 242, Rarity.RARE, mage.cards.s.SinSpirasPunishment.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sin, Spira's Punishment", 348, Rarity.RARE, mage.cards.s.SinSpirasPunishment.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Sin, Spira's Punishment", 508, Rarity.RARE, mage.cards.s.SinSpirasPunishment.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Summon: Shiva", 78, Rarity.UNCOMMON, mage.cards.s.SummonShiva.class)); cards.add(new SetCardInfo("Tonberry", 122, Rarity.UNCOMMON, mage.cards.t.Tonberry.class)); } diff --git a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java index 757f5c0cc62..618587f8498 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasyCommander.java +++ b/Mage.Sets/src/mage/sets/FinalFantasyCommander.java @@ -19,6 +19,9 @@ public final class FinalFantasyCommander extends ExpansionSet { super("Final Fantasy Commander", "FIC", ExpansionSet.buildDate(2025, 6, 13), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Celes, Rune Knight", 1, Rarity.MYTHIC, mage.cards.c.CelesRuneKnight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Celes, Rune Knight", 201, Rarity.MYTHIC, mage.cards.c.CelesRuneKnight.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Celes, Rune Knight", 220, Rarity.MYTHIC, mage.cards.c.CelesRuneKnight.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloud, Ex-SOLDIER", 2, Rarity.MYTHIC, mage.cards.c.CloudExSOLDIER.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloud, Ex-SOLDIER", 168, Rarity.MYTHIC, mage.cards.c.CloudExSOLDIER.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Cloud, Ex-SOLDIER", 202, Rarity.MYTHIC, mage.cards.c.CloudExSOLDIER.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage.Sets/src/mage/sets/TarkirDragonstorm.java b/Mage.Sets/src/mage/sets/TarkirDragonstorm.java index 853dbf7dc8a..8ea4ca645cc 100644 --- a/Mage.Sets/src/mage/sets/TarkirDragonstorm.java +++ b/Mage.Sets/src/mage/sets/TarkirDragonstorm.java @@ -18,16 +18,76 @@ public final class TarkirDragonstorm extends ExpansionSet { private TarkirDragonstorm() { super("Tarkir: Dragonstorm", "TDM", ExpansionSet.buildDate(2025, 4, 11), SetType.EXPANSION); this.blockName = "Tarkir: Dragonstorm"; // for sorting in GUI - this.hasBasicLands = false; // temporary + this.hasBasicLands = true; + cards.add(new SetCardInfo("Aegis Sculptor", 35, Rarity.UNCOMMON, mage.cards.a.AegisSculptor.class)); + cards.add(new SetCardInfo("Agent of Kotis", 36, Rarity.COMMON, mage.cards.a.AgentOfKotis.class)); + cards.add(new SetCardInfo("Anafenza, Unyielding Lineage", 2, Rarity.RARE, mage.cards.a.AnafenzaUnyieldingLineage.class)); + cards.add(new SetCardInfo("Auroral Procession", 169, Rarity.UNCOMMON, mage.cards.a.AuroralProcession.class)); cards.add(new SetCardInfo("Barrensteppe Siege", 171, Rarity.RARE, mage.cards.b.BarrensteppeSiege.class)); + cards.add(new SetCardInfo("Bearer of Glory", 4, Rarity.COMMON, mage.cards.b.BearerOfGlory.class)); + cards.add(new SetCardInfo("Bloodfell Caves", 250, Rarity.COMMON, mage.cards.b.BloodfellCaves.class)); + cards.add(new SetCardInfo("Blossoming Sands", 251, Rarity.COMMON, mage.cards.b.BlossomingSands.class)); + cards.add(new SetCardInfo("Bone-Cairn Butcher", 173, Rarity.UNCOMMON, mage.cards.b.BoneCairnButcher.class)); + cards.add(new SetCardInfo("Boulderborn Dragon", 239, Rarity.COMMON, mage.cards.b.BoulderbornDragon.class)); + cards.add(new SetCardInfo("Caustic Exhale", 74, Rarity.COMMON, mage.cards.c.CausticExhale.class)); + cards.add(new SetCardInfo("Cori Mountain Stalwart", 175, Rarity.UNCOMMON, mage.cards.c.CoriMountainStalwart.class)); + cards.add(new SetCardInfo("Craterhoof Behemoth", 138, Rarity.MYTHIC, mage.cards.c.CraterhoofBehemoth.class)); + cards.add(new SetCardInfo("Cruel Truths", 76, Rarity.COMMON, mage.cards.c.CruelTruths.class)); + cards.add(new SetCardInfo("Dalkovan Packbeasts", 7, Rarity.UNCOMMON, mage.cards.d.DalkovanPackbeasts.class)); + cards.add(new SetCardInfo("Devoted Duelist", 104, Rarity.COMMON, mage.cards.d.DevotedDuelist.class)); + cards.add(new SetCardInfo("Dismal Backwater", 254, Rarity.COMMON, mage.cards.d.DismalBackwater.class)); + cards.add(new SetCardInfo("Dracogenesis", 105, Rarity.MYTHIC, mage.cards.d.Dracogenesis.class)); + cards.add(new SetCardInfo("Dragonback Assault", 179, Rarity.MYTHIC, mage.cards.d.DragonbackAssault.class)); + cards.add(new SetCardInfo("Dragonback Lancer", 9, Rarity.COMMON, mage.cards.d.DragonbackLancer.class)); + cards.add(new SetCardInfo("Dusyut Earthcarver", 141, Rarity.COMMON, mage.cards.d.DusyutEarthcarver.class)); + cards.add(new SetCardInfo("Equilibrium Adept", 106, Rarity.UNCOMMON, mage.cards.e.EquilibriumAdept.class)); + cards.add(new SetCardInfo("Evolving Wilds", 255, Rarity.COMMON, mage.cards.e.EvolvingWilds.class)); + cards.add(new SetCardInfo("Fangkeeper's Familiar", 183, Rarity.RARE, mage.cards.f.FangkeepersFamiliar.class)); + cards.add(new SetCardInfo("Forest", 285, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fortress Kin-Guard", 12, Rarity.COMMON, mage.cards.f.FortressKinGuard.class)); + cards.add(new SetCardInfo("Fresh Start", 46, Rarity.UNCOMMON, mage.cards.f.FreshStart.class)); + cards.add(new SetCardInfo("Frontier Bivouac", 256, Rarity.UNCOMMON, mage.cards.f.FrontierBivouac.class)); + cards.add(new SetCardInfo("Heritage Reclamation", 145, Rarity.COMMON, mage.cards.h.HeritageReclamation.class)); cards.add(new SetCardInfo("Inevitable Defeat", 194, Rarity.RARE, mage.cards.i.InevitableDefeat.class)); + cards.add(new SetCardInfo("Island", 279, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Jade-Cast Sentinel", 243, Rarity.COMMON, mage.cards.j.JadeCastSentinel.class)); + cards.add(new SetCardInfo("Jungle Hollow", 258, Rarity.COMMON, mage.cards.j.JungleHollow.class)); + cards.add(new SetCardInfo("Mountain", 283, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Mox Jasper", 246, Rarity.MYTHIC, mage.cards.m.MoxJasper.class)); + cards.add(new SetCardInfo("Mystic Monastery", 262, Rarity.UNCOMMON, mage.cards.m.MysticMonastery.class)); cards.add(new SetCardInfo("Narset, Jeskai Waymaster", 209, Rarity.RARE, mage.cards.n.NarsetJeskaiWaymaster.class)); + cards.add(new SetCardInfo("Nomad Outpost", 263, Rarity.UNCOMMON, mage.cards.n.NomadOutpost.class)); + cards.add(new SetCardInfo("Opulent Palace", 264, Rarity.UNCOMMON, mage.cards.o.OpulentPalace.class)); + cards.add(new SetCardInfo("Plains", 277, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Qarsi Revenant", 86, Rarity.RARE, mage.cards.q.QarsiRevenant.class)); + cards.add(new SetCardInfo("Rakshasa's Bargain", 214, Rarity.UNCOMMON, mage.cards.r.RakshasasBargain.class)); cards.add(new SetCardInfo("Rally the Monastery", 19, Rarity.UNCOMMON, mage.cards.r.RallyTheMonastery.class)); + cards.add(new SetCardInfo("Reigning Victor", 216, Rarity.COMMON, mage.cards.r.ReigningVictor.class)); + cards.add(new SetCardInfo("Ringing Strike Mastery", 53, Rarity.COMMON, mage.cards.r.RingingStrikeMastery.class)); + cards.add(new SetCardInfo("Roiling Dragonstorm", 55, Rarity.UNCOMMON, mage.cards.r.RoilingDragonstorm.class)); + cards.add(new SetCardInfo("Rugged Highlands", 265, Rarity.COMMON, mage.cards.r.RuggedHighlands.class)); + cards.add(new SetCardInfo("Sandsteppe Citadel", 266, Rarity.UNCOMMON, mage.cards.s.SandsteppeCitadel.class)); + cards.add(new SetCardInfo("Sarkhan's Resolve", 158, Rarity.COMMON, mage.cards.s.SarkhansResolve.class)); + cards.add(new SetCardInfo("Scoured Barrens", 267, Rarity.COMMON, mage.cards.s.ScouredBarrens.class)); cards.add(new SetCardInfo("Shiko, Paragon of the Way", 223, Rarity.MYTHIC, mage.cards.s.ShikoParagonOfTheWay.class)); + cards.add(new SetCardInfo("Shock Brigade", 120, Rarity.COMMON, mage.cards.s.ShockBrigade.class)); cards.add(new SetCardInfo("Skirmish Rhino", 224, Rarity.UNCOMMON, mage.cards.s.SkirmishRhino.class)); cards.add(new SetCardInfo("Smile at Death", 24, Rarity.MYTHIC, mage.cards.s.SmileAtDeath.class)); + cards.add(new SetCardInfo("Snakeskin Veil", 159, Rarity.COMMON, mage.cards.s.SnakeskinVeil.class)); + cards.add(new SetCardInfo("Stormplain Detainment", 28, Rarity.COMMON, mage.cards.s.StormplainDetainment.class)); cards.add(new SetCardInfo("Stormscale Scion", 123, Rarity.MYTHIC, mage.cards.s.StormscaleScion.class)); + cards.add(new SetCardInfo("Summit Intimidator", 125, Rarity.COMMON, mage.cards.s.SummitIntimidator.class)); + cards.add(new SetCardInfo("Swamp", 281, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swiftwater Cliffs", 268, Rarity.COMMON, mage.cards.s.SwiftwaterCliffs.class)); + cards.add(new SetCardInfo("Tempest Hawk", 31, Rarity.COMMON, mage.cards.t.TempestHawk.class)); + cards.add(new SetCardInfo("Thornwood Falls", 269, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class)); + cards.add(new SetCardInfo("Tranquil Cove", 270, Rarity.COMMON, mage.cards.t.TranquilCove.class)); + cards.add(new SetCardInfo("Undergrowth Leopard", 165, Rarity.COMMON, mage.cards.u.UndergrowthLeopard.class)); + cards.add(new SetCardInfo("Unrooted Ancestor", 96, Rarity.UNCOMMON, mage.cards.u.UnrootedAncestor.class)); + cards.add(new SetCardInfo("Venerated Stormsinger", 97, Rarity.UNCOMMON, mage.cards.v.VeneratedStormsinger.class)); + cards.add(new SetCardInfo("Voice of Victory", 33, Rarity.RARE, mage.cards.v.VoiceOfVictory.class)); + cards.add(new SetCardInfo("Watcher of the Wayside", 249, Rarity.COMMON, mage.cards.w.WatcherOfTheWayside.class)); + cards.add(new SetCardInfo("Wind-Scarred Crag", 271, Rarity.COMMON, mage.cards.w.WindScarredCrag.class)); } } diff --git a/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java b/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java index 9e5f74393d1..bbfd6596519 100644 --- a/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java +++ b/Mage.Sets/src/mage/sets/TarkirDragonstormCommander.java @@ -19,7 +19,213 @@ public final class TarkirDragonstormCommander extends ExpansionSet { super("Tarkir: Dragonstorm Commander", "TDC", ExpansionSet.buildDate(2025, 4, 11), SetType.SUPPLEMENTAL); this.hasBasicLands = false; + cards.add(new SetCardInfo("Abrade", 203, Rarity.UNCOMMON, mage.cards.a.Abrade.class)); + cards.add(new SetCardInfo("Adarkar Wastes", 338, Rarity.RARE, mage.cards.a.AdarkarWastes.class)); + cards.add(new SetCardInfo("Adeline, Resplendent Cathar", 108, Rarity.RARE, mage.cards.a.AdelineResplendentCathar.class)); + cards.add(new SetCardInfo("Amphin Mutineer", 143, Rarity.RARE, mage.cards.a.AmphinMutineer.class)); + cards.add(new SetCardInfo("Ancestral Vision", 144, Rarity.RARE, mage.cards.a.AncestralVision.class)); + cards.add(new SetCardInfo("Angel of Invention", 109, Rarity.MYTHIC, mage.cards.a.AngelOfInvention.class)); + cards.add(new SetCardInfo("Arcane Signet", 105, Rarity.UNCOMMON, mage.cards.a.ArcaneSignet.class)); + cards.add(new SetCardInfo("Archmage Emeritus", 145, Rarity.RARE, mage.cards.a.ArchmageEmeritus.class)); + cards.add(new SetCardInfo("Aron, Benalia's Ruin", 280, Rarity.UNCOMMON, mage.cards.a.AronBenaliasRuin.class)); + cards.add(new SetCardInfo("Ash Barrens", 339, Rarity.COMMON, mage.cards.a.AshBarrens.class)); + cards.add(new SetCardInfo("Avenger of Zendikar", 247, Rarity.MYTHIC, mage.cards.a.AvengerOfZendikar.class)); + cards.add(new SetCardInfo("Azorius Signet", 312, Rarity.UNCOMMON, mage.cards.a.AzoriusSignet.class)); + cards.add(new SetCardInfo("Baral and Kari Zev", 282, Rarity.RARE, mage.cards.b.BaralAndKariZev.class)); + cards.add(new SetCardInfo("Baral's Expertise", 146, Rarity.RARE, mage.cards.b.BaralsExpertise.class)); + cards.add(new SetCardInfo("Bastion of Remembrance", 171, Rarity.UNCOMMON, mage.cards.b.BastionOfRemembrance.class)); + cards.add(new SetCardInfo("Battlefield Forge", 340, Rarity.RARE, mage.cards.b.BattlefieldForge.class)); + cards.add(new SetCardInfo("Beetleback Chief", 205, Rarity.UNCOMMON, mage.cards.b.BeetlebackChief.class)); cards.add(new SetCardInfo("Betor, Ancestor's Voice", 1, Rarity.MYTHIC, mage.cards.b.BetorAncestorsVoice.class)); + cards.add(new SetCardInfo("Big Score", 206, Rarity.COMMON, mage.cards.b.BigScore.class)); + cards.add(new SetCardInfo("Bitter Triumph", 173, Rarity.UNCOMMON, mage.cards.b.BitterTriumph.class)); + cards.add(new SetCardInfo("Blade of Selves", 313, Rarity.RARE, mage.cards.b.BladeOfSelves.class)); + cards.add(new SetCardInfo("Bojuka Bog", 341, Rarity.COMMON, mage.cards.b.BojukaBog.class)); + cards.add(new SetCardInfo("Boros Signet", 314, Rarity.UNCOMMON, mage.cards.b.BorosSignet.class)); + cards.add(new SetCardInfo("Caldera Pyremaw", 33, Rarity.RARE, mage.cards.c.CalderaPyremaw.class)); + cards.add(new SetCardInfo("Canyon Slough", 344, Rarity.RARE, mage.cards.c.CanyonSlough.class)); + cards.add(new SetCardInfo("Cascade Bluffs", 345, Rarity.RARE, mage.cards.c.CascadeBluffs.class)); + cards.add(new SetCardInfo("Castle Ardenvale", 346, Rarity.RARE, mage.cards.c.CastleArdenvale.class)); + cards.add(new SetCardInfo("Castle Embereth", 347, Rarity.RARE, mage.cards.c.CastleEmbereth.class)); + cards.add(new SetCardInfo("Casualties of War", 98, Rarity.COMMON, mage.cards.c.CasualtiesOfWar.class)); + cards.add(new SetCardInfo("Caves of Koilos", 348, Rarity.RARE, mage.cards.c.CavesOfKoilos.class)); + cards.add(new SetCardInfo("Cephalid Coliseum", 349, Rarity.UNCOMMON, mage.cards.c.CephalidColiseum.class)); + cards.add(new SetCardInfo("Chittering Witch", 175, Rarity.RARE, mage.cards.c.ChitteringWitch.class)); + cards.add(new SetCardInfo("Clifftop Retreat", 351, Rarity.RARE, mage.cards.c.ClifftopRetreat.class)); + cards.add(new SetCardInfo("Command Beacon", 352, Rarity.RARE, mage.cards.c.CommandBeacon.class)); + cards.add(new SetCardInfo("Command Tower", 107, Rarity.COMMON, mage.cards.c.CommandTower.class)); + cards.add(new SetCardInfo("Commander's Insignia", 111, Rarity.RARE, mage.cards.c.CommandersInsignia.class)); + cards.add(new SetCardInfo("Compulsive Research", 147, Rarity.COMMON, mage.cards.c.CompulsiveResearch.class)); + cards.add(new SetCardInfo("Conduit of Worlds", 251, Rarity.RARE, mage.cards.c.ConduitOfWorlds.class)); + cards.add(new SetCardInfo("Consider", 148, Rarity.COMMON, mage.cards.c.Consider.class)); + cards.add(new SetCardInfo("Consuming Aberration", 283, Rarity.RARE, mage.cards.c.ConsumingAberration.class)); + cards.add(new SetCardInfo("Contaminated Aquifer", 353, Rarity.COMMON, mage.cards.c.ContaminatedAquifer.class)); + cards.add(new SetCardInfo("Crawling Sensation", 252, Rarity.UNCOMMON, mage.cards.c.CrawlingSensation.class)); + cards.add(new SetCardInfo("Crypt of Agadeem", 354, Rarity.RARE, mage.cards.c.CryptOfAgadeem.class)); + cards.add(new SetCardInfo("Cultivate", 253, Rarity.COMMON, mage.cards.c.Cultivate.class)); + cards.add(new SetCardInfo("Curse of Opulence", 209, Rarity.UNCOMMON, mage.cards.c.CurseOfOpulence.class)); + cards.add(new SetCardInfo("Curse of the Swine", 149, Rarity.RARE, mage.cards.c.CurseOfTheSwine.class)); + cards.add(new SetCardInfo("Darkwater Catacombs", 355, Rarity.RARE, mage.cards.d.DarkwaterCatacombs.class)); + cards.add(new SetCardInfo("Dauthi Voidwalker", 176, Rarity.RARE, mage.cards.d.DauthiVoidwalker.class)); + cards.add(new SetCardInfo("Deadly Dispute", 177, Rarity.COMMON, mage.cards.d.DeadlyDispute.class)); + cards.add(new SetCardInfo("Deep Analysis", 150, Rarity.COMMON, mage.cards.d.DeepAnalysis.class)); + cards.add(new SetCardInfo("Disciple of Bolas", 178, Rarity.RARE, mage.cards.d.DiscipleOfBolas.class)); + cards.add(new SetCardInfo("Dismantling Wave", 112, Rarity.RARE, mage.cards.d.DismantlingWave.class)); + cards.add(new SetCardInfo("Divine Visitation", 113, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); + cards.add(new SetCardInfo("Dragonskull Summit", 357, Rarity.RARE, mage.cards.d.DragonskullSummit.class)); + cards.add(new SetCardInfo("Dreamroot Cascade", 358, Rarity.RARE, mage.cards.d.DreamrootCascade.class)); + cards.add(new SetCardInfo("Drownyard Temple", 359, Rarity.RARE, mage.cards.d.DrownyardTemple.class)); + cards.add(new SetCardInfo("Electrodominance", 212, Rarity.RARE, mage.cards.e.Electrodominance.class)); + cards.add(new SetCardInfo("Eliminate the Competition", 179, Rarity.RARE, mage.cards.e.EliminateTheCompetition.class)); + cards.add(new SetCardInfo("Emeria Angel", 114, Rarity.RARE, mage.cards.e.EmeriaAngel.class)); + cards.add(new SetCardInfo("Exotic Orchard", 360, Rarity.RARE, mage.cards.e.ExoticOrchard.class)); + cards.add(new SetCardInfo("Expansion // Explosion", 287, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); + cards.add(new SetCardInfo("Expressive Iteration", 288, Rarity.UNCOMMON, mage.cards.e.ExpressiveIteration.class)); + cards.add(new SetCardInfo("Faithless Looting", 213, Rarity.COMMON, mage.cards.f.FaithlessLooting.class)); + cards.add(new SetCardInfo("Farseek", 255, Rarity.UNCOMMON, mage.cards.f.Farseek.class)); + cards.add(new SetCardInfo("Fellwar Stone", 318, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); + cards.add(new SetCardInfo("Ferrous Lake", 361, Rarity.RARE, mage.cards.f.FerrousLake.class)); + cards.add(new SetCardInfo("Fetid Heath", 362, Rarity.RARE, mage.cards.f.FetidHeath.class)); + cards.add(new SetCardInfo("Fetid Pools", 363, Rarity.RARE, mage.cards.f.FetidPools.class)); + cards.add(new SetCardInfo("Forbidden Alchemy", 152, Rarity.COMMON, mage.cards.f.ForbiddenAlchemy.class)); + cards.add(new SetCardInfo("Foreboding Landscape", 365, Rarity.COMMON, mage.cards.f.ForebodingLandscape.class)); + cards.add(new SetCardInfo("Frantic Search", 153, Rarity.COMMON, mage.cards.f.FranticSearch.class)); + cards.add(new SetCardInfo("Ghostly Prison", 116, Rarity.UNCOMMON, mage.cards.g.GhostlyPrison.class)); + cards.add(new SetCardInfo("Gix, Yawgmoth Praetor", 181, Rarity.MYTHIC, mage.cards.g.GixYawgmothPraetor.class)); + cards.add(new SetCardInfo("Glacial Fortress", 367, Rarity.RARE, mage.cards.g.GlacialFortress.class)); + cards.add(new SetCardInfo("Goblin Electromancer", 99, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); + cards.add(new SetCardInfo("Goldnight Commander", 117, Rarity.UNCOMMON, mage.cards.g.GoldnightCommander.class)); + cards.add(new SetCardInfo("Golgari Rot Farm", 368, Rarity.UNCOMMON, mage.cards.g.GolgariRotFarm.class)); + cards.add(new SetCardInfo("Grand Crescendo", 118, Rarity.RARE, mage.cards.g.GrandCrescendo.class)); + cards.add(new SetCardInfo("Grapple with the Past", 257, Rarity.COMMON, mage.cards.g.GrappleWithThePast.class)); + cards.add(new SetCardInfo("Gravecrawler", 93, Rarity.COMMON, mage.cards.g.Gravecrawler.class)); + cards.add(new SetCardInfo("Grenzo, Havoc Raiser", 216, Rarity.RARE, mage.cards.g.GrenzoHavocRaiser.class)); + cards.add(new SetCardInfo("Grisly Salvage", 290, Rarity.COMMON, mage.cards.g.GrislySalvage.class)); + cards.add(new SetCardInfo("Guttersnipe", 217, Rarity.UNCOMMON, mage.cards.g.Guttersnipe.class)); + cards.add(new SetCardInfo("Harrow", 258, Rarity.COMMON, mage.cards.h.Harrow.class)); + cards.add(new SetCardInfo("Haughty Djinn", 154, Rarity.RARE, mage.cards.h.HaughtyDjinn.class)); + cards.add(new SetCardInfo("Haunted Mire", 369, Rarity.COMMON, mage.cards.h.HauntedMire.class)); + cards.add(new SetCardInfo("Hedron Crab", 155, Rarity.UNCOMMON, mage.cards.h.HedronCrab.class)); + cards.add(new SetCardInfo("Hero of Bladehold", 119, Rarity.MYTHIC, mage.cards.h.HeroOfBladehold.class)); + cards.add(new SetCardInfo("Hinterland Harbor", 371, Rarity.RARE, mage.cards.h.HinterlandHarbor.class)); + cards.add(new SetCardInfo("Hour of Reckoning", 120, Rarity.RARE, mage.cards.h.HourOfReckoning.class)); + cards.add(new SetCardInfo("Idol of Oblivion", 319, Rarity.RARE, mage.cards.i.IdolOfOblivion.class)); + cards.add(new SetCardInfo("Irrigated Farmland", 372, Rarity.RARE, mage.cards.i.IrrigatedFarmland.class)); + cards.add(new SetCardInfo("Isolated Chapel", 373, Rarity.RARE, mage.cards.i.IsolatedChapel.class)); + cards.add(new SetCardInfo("Izzet Signet", 320, Rarity.COMMON, mage.cards.i.IzzetSignet.class)); + cards.add(new SetCardInfo("Jarad, Golgari Lich Lord", 293, Rarity.MYTHIC, mage.cards.j.JaradGolgariLichLord.class)); + cards.add(new SetCardInfo("Junji, the Midnight Sky", 183, Rarity.MYTHIC, mage.cards.j.JunjiTheMidnightSky.class)); + cards.add(new SetCardInfo("Kaya, Geist Hunter", 294, Rarity.MYTHIC, mage.cards.k.KayaGeistHunter.class)); + cards.add(new SetCardInfo("Legion Loyalty", 122, Rarity.MYTHIC, mage.cards.l.LegionLoyalty.class)); + cards.add(new SetCardInfo("Legion Warboss", 220, Rarity.RARE, mage.cards.l.LegionWarboss.class)); + cards.add(new SetCardInfo("Lethal Scheme", 184, Rarity.RARE, mage.cards.l.LethalScheme.class)); + cards.add(new SetCardInfo("Lier, Disciple of the Drowned", 157, Rarity.MYTHIC, mage.cards.l.LierDiscipleOfTheDrowned.class)); + cards.add(new SetCardInfo("Life from the Loam", 96, Rarity.RARE, mage.cards.l.LifeFromTheLoam.class)); + cards.add(new SetCardInfo("Lightning Greaves", 102, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class)); + cards.add(new SetCardInfo("Lingering Souls", 123, Rarity.UNCOMMON, mage.cards.l.LingeringSouls.class)); + cards.add(new SetCardInfo("Living Death", 185, Rarity.RARE, mage.cards.l.LivingDeath.class)); + cards.add(new SetCardInfo("Llanowar Wastes", 376, Rarity.RARE, mage.cards.l.LlanowarWastes.class)); + cards.add(new SetCardInfo("Lord of Extinction", 295, Rarity.MYTHIC, mage.cards.l.LordOfExtinction.class)); + cards.add(new SetCardInfo("Lord of the Forsaken", 186, Rarity.MYTHIC, mage.cards.l.LordOfTheForsaken.class)); + cards.add(new SetCardInfo("Loyal Apprentice", 222, Rarity.UNCOMMON, mage.cards.l.LoyalApprentice.class)); + cards.add(new SetCardInfo("Magma Opus", 296, Rarity.MYTHIC, mage.cards.m.MagmaOpus.class)); + cards.add(new SetCardInfo("Mana Geyser", 223, Rarity.COMMON, mage.cards.m.ManaGeyser.class)); + cards.add(new SetCardInfo("Manaform Hellkite", 224, Rarity.MYTHIC, mage.cards.m.ManaformHellkite.class)); + cards.add(new SetCardInfo("Mangara, the Diplomat", 124, Rarity.RARE, mage.cards.m.MangaraTheDiplomat.class)); + cards.add(new SetCardInfo("Memorial to Folly", 377, Rarity.UNCOMMON, mage.cards.m.MemorialToFolly.class)); + cards.add(new SetCardInfo("Meren of Clan Nel Toth", 297, Rarity.RARE, mage.cards.m.MerenOfClanNelToth.class)); + cards.add(new SetCardInfo("Millikin", 321, Rarity.UNCOMMON, mage.cards.m.Millikin.class)); + cards.add(new SetCardInfo("Mindblade Render", 187, Rarity.RARE, mage.cards.m.MindbladeRender.class)); + cards.add(new SetCardInfo("Monastery Mentor", 125, Rarity.MYTHIC, mage.cards.m.MonasteryMentor.class)); + cards.add(new SetCardInfo("Morbid Opportunist", 188, Rarity.UNCOMMON, mage.cards.m.MorbidOpportunist.class)); + cards.add(new SetCardInfo("Multani, Yavimaya's Avatar", 263, Rarity.MYTHIC, mage.cards.m.MultaniYavimayasAvatar.class)); + cards.add(new SetCardInfo("Myr Battlesphere", 322, Rarity.RARE, mage.cards.m.MyrBattlesphere.class)); + cards.add(new SetCardInfo("Myriad Landscape", 380, Rarity.UNCOMMON, mage.cards.m.MyriadLandscape.class)); + cards.add(new SetCardInfo("Narset's Reversal", 92, Rarity.RARE, mage.cards.n.NarsetsReversal.class)); + cards.add(new SetCardInfo("Necromantic Selection", 189, Rarity.RARE, mage.cards.n.NecromanticSelection.class)); + cards.add(new SetCardInfo("Necropolis Fiend", 190, Rarity.RARE, mage.cards.n.NecropolisFiend.class)); + cards.add(new SetCardInfo("Noxious Gearhulk", 191, Rarity.MYTHIC, mage.cards.n.NoxiousGearhulk.class)); + cards.add(new SetCardInfo("Nyx Weaver", 298, Rarity.UNCOMMON, mage.cards.n.NyxWeaver.class)); + cards.add(new SetCardInfo("Ob Nixilis, the Fallen", 192, Rarity.MYTHIC, mage.cards.o.ObNixilisTheFallen.class)); + cards.add(new SetCardInfo("Ogre Battledriver", 227, Rarity.RARE, mage.cards.o.OgreBattledriver.class)); + cards.add(new SetCardInfo("Ophiomancer", 193, Rarity.RARE, mage.cards.o.Ophiomancer.class)); + cards.add(new SetCardInfo("Opt", 158, Rarity.COMMON, mage.cards.o.Opt.class)); + cards.add(new SetCardInfo("Path of Ancestry", 382, Rarity.COMMON, mage.cards.p.PathOfAncestry.class)); + cards.add(new SetCardInfo("Perilous Landscape", 383, Rarity.COMMON, mage.cards.p.PerilousLandscape.class)); + cards.add(new SetCardInfo("Phyrexian Reclamation", 194, Rarity.UNCOMMON, mage.cards.p.PhyrexianReclamation.class)); + cards.add(new SetCardInfo("Ponder", 159, Rarity.COMMON, mage.cards.p.Ponder.class)); + cards.add(new SetCardInfo("Pongify", 160, Rarity.UNCOMMON, mage.cards.p.Pongify.class)); + cards.add(new SetCardInfo("Prairie Stream", 384, Rarity.RARE, mage.cards.p.PrairieStream.class)); + cards.add(new SetCardInfo("Preordain", 161, Rarity.COMMON, mage.cards.p.Preordain.class)); + cards.add(new SetCardInfo("Prismari Command", 299, Rarity.RARE, mage.cards.p.PrismariCommand.class)); + cards.add(new SetCardInfo("Putrefy", 300, Rarity.UNCOMMON, mage.cards.p.Putrefy.class)); + cards.add(new SetCardInfo("Rampant Growth", 265, Rarity.COMMON, mage.cards.r.RampantGrowth.class)); + cards.add(new SetCardInfo("Reassembling Skeleton", 195, Rarity.UNCOMMON, mage.cards.r.ReassemblingSkeleton.class)); + cards.add(new SetCardInfo("Release the Dogs", 127, Rarity.UNCOMMON, mage.cards.r.ReleaseTheDogs.class)); + cards.add(new SetCardInfo("Reliquary Tower", 386, Rarity.UNCOMMON, mage.cards.r.ReliquaryTower.class)); + cards.add(new SetCardInfo("Rite of Replication", 165, Rarity.RARE, mage.cards.r.RiteOfReplication.class)); + cards.add(new SetCardInfo("River Kelpie", 166, Rarity.RARE, mage.cards.r.RiverKelpie.class)); + cards.add(new SetCardInfo("Rugged Prairie", 389, Rarity.RARE, mage.cards.r.RuggedPrairie.class)); + cards.add(new SetCardInfo("Sakura-Tribe Elder", 266, Rarity.COMMON, mage.cards.s.SakuraTribeElder.class)); + cards.add(new SetCardInfo("Satyr Wayfinder", 267, Rarity.COMMON, mage.cards.s.SatyrWayfinder.class)); + cards.add(new SetCardInfo("Selfless Spirit", 129, Rarity.RARE, mage.cards.s.SelflessSpirit.class)); + cards.add(new SetCardInfo("Shadow Summoning", 101, Rarity.UNCOMMON, mage.cards.s.ShadowSummoning.class)); + cards.add(new SetCardInfo("Shattered Landscape", 390, Rarity.COMMON, mage.cards.s.ShatteredLandscape.class)); + cards.add(new SetCardInfo("Shattered Sanctum", 391, Rarity.RARE, mage.cards.s.ShatteredSanctum.class)); + cards.add(new SetCardInfo("Shigeki, Jukai Visionary", 270, Rarity.RARE, mage.cards.s.ShigekiJukaiVisionary.class)); + cards.add(new SetCardInfo("Shiny Impetus", 231, Rarity.COMMON, mage.cards.s.ShinyImpetus.class)); + cards.add(new SetCardInfo("Shivan Reef", 393, Rarity.RARE, mage.cards.s.ShivanReef.class)); + cards.add(new SetCardInfo("Siege-Gang Commander", 232, Rarity.RARE, mage.cards.s.SiegeGangCommander.class)); + cards.add(new SetCardInfo("Skull Prophet", 304, Rarity.UNCOMMON, mage.cards.s.SkullProphet.class)); + cards.add(new SetCardInfo("Skullclamp", 103, Rarity.UNCOMMON, mage.cards.s.Skullclamp.class)); + cards.add(new SetCardInfo("Skycloud Expanse", 394, Rarity.RARE, mage.cards.s.SkycloudExpanse.class)); + cards.add(new SetCardInfo("Smoldering Marsh", 395, Rarity.RARE, mage.cards.s.SmolderingMarsh.class)); + cards.add(new SetCardInfo("Sol Ring", 106, Rarity.UNCOMMON, mage.cards.s.SolRing.class)); + cards.add(new SetCardInfo("Solemn Simulacrum", 325, Rarity.RARE, mage.cards.s.SolemnSimulacrum.class)); + cards.add(new SetCardInfo("Springbloom Druid", 271, Rarity.COMMON, mage.cards.s.SpringbloomDruid.class)); + cards.add(new SetCardInfo("Stitcher's Supplier", 196, Rarity.UNCOMMON, mage.cards.s.StitchersSupplier.class)); + cards.add(new SetCardInfo("Storm-Kiln Artist", 235, Rarity.UNCOMMON, mage.cards.s.StormKilnArtist.class)); + cards.add(new SetCardInfo("Stroke of Midnight", 132, Rarity.UNCOMMON, mage.cards.s.StrokeOfMidnight.class)); + cards.add(new SetCardInfo("Sublime Epiphany", 167, Rarity.RARE, mage.cards.s.SublimeEpiphany.class)); + cards.add(new SetCardInfo("Sulfur Falls", 396, Rarity.RARE, mage.cards.s.SulfurFalls.class)); + cards.add(new SetCardInfo("Sun Titan", 133, Rarity.MYTHIC, mage.cards.s.SunTitan.class)); + cards.add(new SetCardInfo("Sunken Hollow", 398, Rarity.RARE, mage.cards.s.SunkenHollow.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 134, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Talisman of Conviction", 329, Rarity.UNCOMMON, mage.cards.t.TalismanOfConviction.class)); + cards.add(new SetCardInfo("Talisman of Hierarchy", 331, Rarity.UNCOMMON, mage.cards.t.TalismanOfHierarchy.class)); + cards.add(new SetCardInfo("Talisman of Progress", 333, Rarity.UNCOMMON, mage.cards.t.TalismanOfProgress.class)); + cards.add(new SetCardInfo("Tasigur, the Golden Fang", 197, Rarity.RARE, mage.cards.t.TasigurTheGoldenFang.class)); + cards.add(new SetCardInfo("Tear Asunder", 273, Rarity.UNCOMMON, mage.cards.t.TearAsunder.class)); + cards.add(new SetCardInfo("Tempest Technique", 16, Rarity.RARE, mage.cards.t.TempestTechnique.class)); + cards.add(new SetCardInfo("Temple of Enlightenment", 401, Rarity.RARE, mage.cards.t.TempleOfEnlightenment.class)); + cards.add(new SetCardInfo("Temple of Epiphany", 402, Rarity.RARE, mage.cards.t.TempleOfEpiphany.class)); + cards.add(new SetCardInfo("Temple of Malady", 403, Rarity.RARE, mage.cards.t.TempleOfMalady.class)); + cards.add(new SetCardInfo("Temple of Silence", 406, Rarity.RARE, mage.cards.t.TempleOfSilence.class)); + cards.add(new SetCardInfo("Temple of Triumph", 407, Rarity.RARE, mage.cards.t.TempleOfTriumph.class)); + cards.add(new SetCardInfo("Tempt with Vengeance", 239, Rarity.RARE, mage.cards.t.TemptWithVengeance.class)); + cards.add(new SetCardInfo("Terramorphic Expanse", 408, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class)); cards.add(new SetCardInfo("Teval, the Balanced Scale", 8, Rarity.MYTHIC, mage.cards.t.TevalTheBalancedScale.class)); + cards.add(new SetCardInfo("Thalisse, Reverent Medium", 306, Rarity.UNCOMMON, mage.cards.t.ThalisseReverentMedium.class)); + cards.add(new SetCardInfo("Think Twice", 168, Rarity.COMMON, mage.cards.t.ThinkTwice.class)); + cards.add(new SetCardInfo("Third Path Iconoclast", 307, Rarity.UNCOMMON, mage.cards.t.ThirdPathIconoclast.class)); + cards.add(new SetCardInfo("Time Wipe", 308, Rarity.RARE, mage.cards.t.TimeWipe.class)); + cards.add(new SetCardInfo("Timeless Witness", 274, Rarity.UNCOMMON, mage.cards.t.TimelessWitness.class)); + cards.add(new SetCardInfo("Tocasia's Welcome", 135, Rarity.RARE, mage.cards.t.TocasiasWelcome.class)); + cards.add(new SetCardInfo("Treasure Cruise", 169, Rarity.COMMON, mage.cards.t.TreasureCruise.class)); + cards.add(new SetCardInfo("Twilight Drover", 136, Rarity.RARE, mage.cards.t.TwilightDrover.class)); + cards.add(new SetCardInfo("Vanquish the Horde", 91, Rarity.RARE, mage.cards.v.VanquishTheHorde.class)); + cards.add(new SetCardInfo("Vault of the Archangel", 410, Rarity.RARE, mage.cards.v.VaultOfTheArchangel.class)); + cards.add(new SetCardInfo("Velomachus Lorehold", 309, Rarity.MYTHIC, mage.cards.v.VelomachusLorehold.class)); + cards.add(new SetCardInfo("Veyran, Voice of Duality", 310, Rarity.MYTHIC, mage.cards.v.VeyranVoiceOfDuality.class)); + cards.add(new SetCardInfo("Victimize", 198, Rarity.UNCOMMON, mage.cards.v.Victimize.class)); + cards.add(new SetCardInfo("Viscera Seer", 199, Rarity.COMMON, mage.cards.v.VisceraSeer.class)); + cards.add(new SetCardInfo("Wayfarer's Bauble", 335, Rarity.COMMON, mage.cards.w.WayfarersBauble.class)); + cards.add(new SetCardInfo("Whirlwind of Thought", 311, Rarity.RARE, mage.cards.w.WhirlwindOfThought.class)); + cards.add(new SetCardInfo("Windbrisk Heights", 411, Rarity.RARE, mage.cards.w.WindbriskHeights.class)); + cards.add(new SetCardInfo("Woe Strider", 201, Rarity.RARE, mage.cards.w.WoeStrider.class)); + cards.add(new SetCardInfo("Wonder", 170, Rarity.UNCOMMON, mage.cards.w.Wonder.class)); + cards.add(new SetCardInfo("Woodland Cemetery", 412, Rarity.RARE, mage.cards.w.WoodlandCemetery.class)); + cards.add(new SetCardInfo("Yahenni, Undying Partisan", 202, Rarity.RARE, mage.cards.y.YahenniUndyingPartisan.class)); + cards.add(new SetCardInfo("Young Pyromancer", 95, Rarity.UNCOMMON, mage.cards.y.YoungPyromancer.class)); } } diff --git a/Mage/src/main/java/mage/abilities/common/CastSecondSpellTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/CastSecondSpellTriggeredAbility.java index d3918d0dfa6..e6ec70e6e3d 100644 --- a/Mage/src/main/java/mage/abilities/common/CastSecondSpellTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/CastSecondSpellTriggeredAbility.java @@ -36,7 +36,6 @@ public class CastSecondSpellTriggeredAbility extends TriggeredAbilityImpl { } /** - * * @param zone What zone the ability can trigger from (see {@link mage.abilities.Ability#getZone}) * @param effect What effect will happen when this ability triggers (see {@link mage.abilities.Ability#getEffects}) * @param targetController Which player(s) to pay attention to @@ -44,7 +43,7 @@ public class CastSecondSpellTriggeredAbility extends TriggeredAbilityImpl { * @param setTargetPointer Who to set the target pointer of the effects to. Only accepts NONE, PLAYER (the player who cast the spell), and SPELL (the spell which was cast) */ public CastSecondSpellTriggeredAbility(Zone zone, Effect effect, TargetController targetController, - boolean optional, SetTargetPointer setTargetPointer) { + boolean optional, SetTargetPointer setTargetPointer) { super(zone, effect, optional); if (targetController == TargetController.YOU) { this.addHint(hint); @@ -54,7 +53,7 @@ public class CastSecondSpellTriggeredAbility extends TriggeredAbilityImpl { setTriggerPhrase(generateTriggerPhrase()); } - private CastSecondSpellTriggeredAbility(final CastSecondSpellTriggeredAbility ability) { + protected CastSecondSpellTriggeredAbility(final CastSecondSpellTriggeredAbility ability) { super(ability); this.targetController = ability.targetController; this.setTargetPointer = ability.setTargetPointer; diff --git a/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java index 093aa5ea88a..ec32ead1748 100644 --- a/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/EntersBattlefieldOneOrMoreTriggeredAbility.java @@ -29,7 +29,7 @@ public class EntersBattlefieldOneOrMoreTriggeredAbility extends TriggeredAbility setTriggerPhrase(generateTriggerPhrase()); } - private EntersBattlefieldOneOrMoreTriggeredAbility(final EntersBattlefieldOneOrMoreTriggeredAbility ability) { + protected EntersBattlefieldOneOrMoreTriggeredAbility(final EntersBattlefieldOneOrMoreTriggeredAbility ability) { super(ability); this.filter = ability.filter; this.targetController = ability.targetController; diff --git a/Mage/src/main/java/mage/abilities/common/FlurryAbility.java b/Mage/src/main/java/mage/abilities/common/FlurryAbility.java new file mode 100644 index 00000000000..0d9b99e2c20 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/FlurryAbility.java @@ -0,0 +1,26 @@ +package mage.abilities.common; + +import mage.abilities.effects.Effect; +import mage.constants.AbilityWord; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * @author TheElk801 + */ +public class FlurryAbility extends CastSecondSpellTriggeredAbility { + + public FlurryAbility(Effect effect) { + super(Zone.BATTLEFIELD, effect, TargetController.YOU, false); + this.setAbilityWord(AbilityWord.FLURRY); + } + + private FlurryAbility(final FlurryAbility ability) { + super(ability); + } + + @Override + public FlurryAbility copy() { + return new FlurryAbility(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/common/RenewAbility.java b/Mage/src/main/java/mage/abilities/common/RenewAbility.java new file mode 100644 index 00000000000..7a533e1b204 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/RenewAbility.java @@ -0,0 +1,83 @@ +package mage.abilities.common; + +import mage.abilities.Ability; +import mage.abilities.costs.common.ExileSourceFromGraveCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.constants.AbilityWord; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.Counter; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author TheElk801 + */ +public class RenewAbility extends ActivateAsSorceryActivatedAbility { + + public RenewAbility(String manaString, Counter... counters) { + super(Zone.GRAVEYARD, new RenewEffect(counters), new ManaCostsImpl<>(manaString)); + this.addCost(new ExileSourceFromGraveCost()); + this.addTarget(new TargetCreaturePermanent()); + this.setAbilityWord(AbilityWord.RENEW); + } + + private RenewAbility(final RenewAbility ability) { + super(ability); + } + + @Override + public RenewAbility copy() { + return new RenewAbility(this); + } +} + +class RenewEffect extends OneShotEffect { + + private final List counters = new ArrayList<>(); + + RenewEffect(Counter... counters) { + super(Outcome.Benefit); + for (Counter counter : counters) { + this.counters.add(counter); + } + staticText = makeText(this.counters); + } + + private RenewEffect(final RenewEffect effect) { + super(effect); + for (Counter counter : effect.counters) { + this.counters.add(counter.copy()); + } + } + + @Override + public RenewEffect copy() { + return new RenewEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent == null) { + return false; + } + for (Counter counter : counters) { + permanent.addCounters(counter, source, game); + } + return true; + } + + private static String makeText(List counters) { + return "put " + CardUtil.concatWithAnd( + counters.stream().map(Counter::getDescription).collect(Collectors.toList()) + ) + " on target creature"; + } +} diff --git a/Mage/src/main/java/mage/abilities/condition/common/CardsInExileCondition.java b/Mage/src/main/java/mage/abilities/condition/common/CardsInExileCondition.java index 1f8f4a3b784..1b0cf661b9b 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/CardsInExileCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/CardsInExileCondition.java @@ -14,27 +14,23 @@ import mage.util.CardUtil; * * @author Jmlundeen */ -public class CardsInExileCondition implements Condition -{ +public class CardsInExileCondition implements Condition { private final ComparisonType type; private final int count; private final DynamicValue cardsInExileCount; - public CardsInExileCondition(ComparisonType type, int count) - { + public CardsInExileCondition(ComparisonType type, int count) { this(type, count, CardsInExileCount.ALL); } - public CardsInExileCondition(ComparisonType type, int count, DynamicValue cardsInExileCount) - { + public CardsInExileCondition(ComparisonType type, int count, DynamicValue cardsInExileCount) { this.type = type; this.count = count; this.cardsInExileCount = cardsInExileCount; } @Override - public boolean apply(Game game, Ability source) - { + public boolean apply(Game game, Ability source) { int exileCards = cardsInExileCount.calculate(game, source, null); return ComparisonType.compare(exileCards, type, count); } diff --git a/Mage/src/main/java/mage/abilities/condition/common/SacrificedPermanentCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SacrificedPermanentCondition.java new file mode 100644 index 00000000000..f9148a97f20 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/condition/common/SacrificedPermanentCondition.java @@ -0,0 +1,42 @@ +package mage.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.util.CardUtil; + +import java.util.Collection; + +public class SacrificedPermanentCondition implements Condition { + + private final FilterPermanent filter; + private boolean useThisWay = false; + + public SacrificedPermanentCondition(FilterPermanent filter) { + this.filter = filter; + } + + public SacrificedPermanentCondition(FilterPermanent filter, boolean useThisWay) { + this.filter = filter; + this.useThisWay = useThisWay; + } + + @Override + public boolean apply(Game game, Ability source) { + return CardUtil.castStream(source.getCosts() + .stream(), SacrificeTargetCost.class) + .map(SacrificeTargetCost::getPermanents) + .flatMap(Collection::stream) + .anyMatch(permanent -> filter.match(permanent, source.getControllerId(), source, game)); + } + + @Override + public String toString() { + if (useThisWay) { + return "if " + filter.getMessage() + " was sacrificed this way"; + } + return "if the sacrificed " + filter.getMessage(); + } +} diff --git a/Mage/src/main/java/mage/abilities/costs/common/BeholdDragonCost.java b/Mage/src/main/java/mage/abilities/costs/common/BeholdDragonCost.java new file mode 100644 index 00000000000..3502a9a0888 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/costs/common/BeholdDragonCost.java @@ -0,0 +1,109 @@ +package mage.abilities.costs.common; + +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.CostImpl; +import mage.cards.Card; +import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.TargetPermanent; +import mage.target.common.TargetCardInHand; + +import java.util.Optional; +import java.util.UUID; + +/** + * @author TheElk801 + */ +public class BeholdDragonCost extends CostImpl { + + private static final FilterPermanent filterPermanent = new FilterControlledPermanent(SubType.DRAGON); + private static final FilterCard filterCard = new FilterCard("a Dragon card"); + + static { + filterCard.add(SubType.DRAGON.getPredicate()); + } + + public BeholdDragonCost() { + super(); + this.text = "behold a Dragon"; + } + + private BeholdDragonCost(final BeholdDragonCost cost) { + super(cost); + } + + @Override + public BeholdDragonCost copy() { + return new BeholdDragonCost(this); + } + + @Override + public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { + return Optional + .ofNullable(game.getPlayer(controllerId)) + .map(Player::getHand) + .map(cards -> cards.count(filterCard, game) > 0) + .orElse(false) + || game + .getBattlefield() + .contains(filterPermanent, controllerId, source, game, 1); + } + + @Override + public boolean pay(Ability ability, Game game, Ability source, UUID controllerId, boolean noMana, Cost costToPay) { + Player player = game.getPlayer(controllerId); + if (player == null) { + paid = false; + return paid; + } + boolean hasPermanent = game + .getBattlefield() + .contains(filterPermanent, controllerId, source, game, 1); + boolean hasHand = player.getHand().count(filterCard, game) > 0; + boolean usePermanent; + if (hasPermanent && hasHand) { + usePermanent = player.chooseUse( + Outcome.Neutral, "Choose a Dragon you control or reveal one from your hand?", + null, "Choose controlled", "Reveal from hand", source, game); + } else if (hasPermanent) { + usePermanent = true; + } else if (hasHand) { + usePermanent = false; + } else { + paid = false; + return paid; + } + if (usePermanent) { + TargetPermanent target = new TargetPermanent(filterPermanent); + target.withNotTarget(true); + player.choose(Outcome.Neutral, target, source, game); + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent == null) { + paid = false; + return paid; + } + game.informPlayers(player.getLogName() + " chooses to behold " + permanent.getLogName()); + paid = true; + return true; + } + TargetCard target = new TargetCardInHand(filterCard); + player.choose(Outcome.Neutral, player.getHand(), target, source, game); + Card card = game.getCard(target.getFirstTarget()); + if (card == null) { + paid = false; + return paid; + } + player.revealCards(source, new CardsImpl(card), game); + paid = true; + return paid; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/AdditionalCombatPhaseEffect.java b/Mage/src/main/java/mage/abilities/effects/common/AdditionalCombatPhaseEffect.java index 23163ca9c79..273fcbe3cff 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/AdditionalCombatPhaseEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/AdditionalCombatPhaseEffect.java @@ -7,15 +7,34 @@ import mage.constants.TurnPhase; import mage.game.Game; import mage.game.turn.TurnMod; + public class AdditionalCombatPhaseEffect extends OneShotEffect { + private final int additionalPhases; + public AdditionalCombatPhaseEffect() { super(Outcome.Benefit); + this.additionalPhases = 1; staticText = "after this phase, there is an additional combat phase"; } + public AdditionalCombatPhaseEffect(int additionalPhases) { + super(Outcome.Benefit); + if (additionalPhases < 1) { + throw new IllegalArgumentException("Number of additional phases must be at least 1"); + } + if (additionalPhases == 1) { + this.additionalPhases = 1; + staticText = "after this phase, there is an additional combat phase"; + } else { + this.additionalPhases = additionalPhases; + staticText = "after this phase, there are " + additionalPhases + " additional combat phases"; + } + } + protected AdditionalCombatPhaseEffect(final AdditionalCombatPhaseEffect effect) { super(effect); + this.additionalPhases = effect.additionalPhases; } @Override @@ -25,7 +44,10 @@ public class AdditionalCombatPhaseEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - game.getState().getTurnMods().add(new TurnMod(game.getState().getActivePlayerId()).withExtraPhase(TurnPhase.COMBAT)); + for (int i = 0; i < additionalPhases; i++) { + TurnMod combat = new TurnMod(game.getState().getActivePlayerId()).withExtraPhase(TurnPhase.COMBAT); + game.getState().getTurnMods().add(combat); + } return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java index ab20f9658f1..7d05603eeda 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java @@ -121,6 +121,17 @@ public class CreateTokenEffect extends OneShotEffect { return lastAddedTokenIds; } + public void sacrificeTokensCreatedAtNextEndStep(Game game, Ability source) { + for (UUID tokenId : this.getLastAddedTokenIds()) { + Permanent tokenPermanent = game.getPermanent(tokenId); + if (tokenPermanent != null) { + SacrificeTargetEffect sacrificeEffect = new SacrificeTargetEffect(); + sacrificeEffect.setTargetPointer(new FixedTarget(tokenPermanent, game)); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(sacrificeEffect), source); + } + } + } + public void exileTokensCreatedAtNextEndStep(Game game, Ability source) { for (UUID tokenId : this.getLastAddedTokenIds()) { Permanent tokenPermanent = game.getPermanent(tokenId); diff --git a/Mage/src/main/java/mage/abilities/effects/common/SaddleTargetMountEffect.java b/Mage/src/main/java/mage/abilities/effects/common/SaddleTargetMountEffect.java new file mode 100644 index 00000000000..e32f6036408 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/SaddleTargetMountEffect.java @@ -0,0 +1,40 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.SaddleAbility; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * @author Jmlundeen + */ +public class SaddleTargetMountEffect extends OneShotEffect { + + public SaddleTargetMountEffect() { + super(Outcome.Benefit); + staticText = "Target Mount you control becomes saddled until end of turn"; + } + + public SaddleTargetMountEffect(String rule) { + super(Outcome.Benefit); + staticText = rule; + } + + protected SaddleTargetMountEffect(final SaddleTargetMountEffect effect) { + super(effect); + } + + @Override + public SaddleTargetMountEffect copy() { + return new SaddleTargetMountEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return SaddleAbility.applySaddle(game.getPermanent(getTargetPointer().getFirst(game, source)), game); + } + +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java index 543245abb19..11844e6c322 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureAttachedEffect.java @@ -36,6 +36,7 @@ public class BecomesCreatureAttachedEffect extends ContinuousEffectImpl { this.token = token; this.loseType = loseType; staticText = text; + this.dependencyTypes.add(DependencyType.BecomeCreature); } protected BecomesCreatureAttachedEffect(final BecomesCreatureAttachedEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java index e9e9ee45137..f04894de77c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureIfVehicleEffect.java @@ -16,6 +16,7 @@ public class BecomesCreatureIfVehicleEffect extends ContinuousEffectImpl { public BecomesCreatureIfVehicleEffect() { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); this.staticText = "As long as enchanted permanent is a Vehicle, it's a creature in addition to its other types"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } protected BecomesCreatureIfVehicleEffect(final BecomesCreatureIfVehicleEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/VehiclesBecomeArtifactCreatureEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/VehiclesBecomeArtifactCreatureEffect.java index 961adf11310..66f8632b223 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/VehiclesBecomeArtifactCreatureEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/VehiclesBecomeArtifactCreatureEffect.java @@ -11,6 +11,7 @@ public class VehiclesBecomeArtifactCreatureEffect extends ContinuousEffectImpl { public VehiclesBecomeArtifactCreatureEffect(Duration duration) { super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.BecomeCreature); staticText = "Vehicles you control become artifact creatures until end of turn"; + this.dependencyTypes.add(DependencyType.BecomeCreature); } private VehiclesBecomeArtifactCreatureEffect(final VehiclesBecomeArtifactCreatureEffect effect) { diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/EndureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/EndureSourceEffect.java new file mode 100644 index 00000000000..d6a8b4e9fea --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/keyword/EndureSourceEffect.java @@ -0,0 +1,57 @@ +package mage.abilities.effects.keyword; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.permanent.token.SpiritXXToken; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * @author TheElk801 + */ +public class EndureSourceEffect extends OneShotEffect { + + private final int amount; + + public EndureSourceEffect(int amount) { + this(amount, "it"); + } + + public EndureSourceEffect(int amount, String selfText) { + super(Outcome.Benefit); + staticText = selfText + " endures " + amount; + this.amount = amount; + } + + private EndureSourceEffect(final EndureSourceEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public EndureSourceEffect copy() { + return new EndureSourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent != null && player.chooseUse( + Outcome.BoostCreature, "Put " + CardUtil.numberToText(amount, "a") + " +1/+1 counter" + + (amount > 1 ? "s" : "") + " on " + permanent.getName() + " or create " + + CardUtil.addArticle("" + amount) + ' ' + amount + '/' + amount + " Spirit token?", + null, "Add counters", "Create token", source, game + )) { + return permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game); + } + return new SpiritXXToken(amount).putOntoBattlefield(1, game, source); + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java new file mode 100644 index 00000000000..9c412ee595e --- /dev/null +++ b/Mage/src/main/java/mage/abilities/keyword/MobilizeAbility.java @@ -0,0 +1,65 @@ +package mage.abilities.keyword; + +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.token.RedWarriorToken; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * @author balazskristof + */ +public class MobilizeAbility extends AttacksTriggeredAbility { + + public MobilizeAbility(int count) { + super(new MobilizeEffect(count), false, "Mobilize " + count + " (Whenever this creature attacks, create " + + (count == 1 ? "a" : CardUtil.numberToText(count)) + " tapped and attacking 1/1 red Warrior creature " + + (count == 1 ? "token" : "tokens") + ". Sacrifice " + (count == 1 ? "it" : "them") + + " at the beginning of the next end step.)"); + } + + protected MobilizeAbility(final MobilizeAbility ability) { + super(ability); + } + + @Override + public MobilizeAbility copy() { + return new MobilizeAbility(this); + } +} + +class MobilizeEffect extends OneShotEffect { + + private final int count; + + MobilizeEffect(int count) { + super(Outcome.Benefit); + this.count = count; + } + + private MobilizeEffect(final MobilizeEffect effect) { + super(effect); + this.count = effect.count; + } + + @Override + public MobilizeEffect copy() { + return new MobilizeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + CreateTokenEffect effect = new CreateTokenEffect(new RedWarriorToken(), this.count, true, true); + effect.apply(game, source); + effect.sacrificeTokensCreatedAtNextEndStep(game, source); + return true; + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java b/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java index 6967270ddc3..a9b2d74730f 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java @@ -48,6 +48,23 @@ public class SaddleAbility extends SimpleActivatedAbility { this.value = ability.value; } + public static boolean applySaddle(Permanent permanent, Game game) { + if (permanent == null) { + return false; + } + SaddleAbility saddleAbility = permanent.getAbilities().stream() + .filter(a -> a instanceof SaddleAbility) + .map(a -> (SaddleAbility) a) + .findFirst() + .orElse(null); + if (saddleAbility != null) { + SaddleEventEffect effect = new SaddleEventEffect(); + effect.apply(game, saddleAbility); + return true; + } + return false; + } + @Override public SaddleAbility copy() { return new SaddleAbility(this); diff --git a/Mage/src/main/java/mage/cards/decks/DeckValidator.java b/Mage/src/main/java/mage/cards/decks/DeckValidator.java index 79e7867f8b9..71f5f1ecafb 100644 --- a/Mage/src/main/java/mage/cards/decks/DeckValidator.java +++ b/Mage/src/main/java/mage/cards/decks/DeckValidator.java @@ -49,6 +49,7 @@ public abstract class DeckValidator implements Serializable { maxCopiesMap.put("Slime Against Humanity", Integer.MAX_VALUE); maxCopiesMap.put("Templar Knight", Integer.MAX_VALUE); maxCopiesMap.put("Hare Apparent", Integer.MAX_VALUE); + maxCopiesMap.put("Tempest Hawk", Integer.MAX_VALUE); maxCopiesMap.put("Once More with Feeling", 1); maxCopiesMap.put("Seven Dwarves", 7); maxCopiesMap.put("Nazgul", 9); diff --git a/Mage/src/main/java/mage/constants/AbilityWord.java b/Mage/src/main/java/mage/constants/AbilityWord.java index 8f18afeaf64..6e79b03c841 100644 --- a/Mage/src/main/java/mage/constants/AbilityWord.java +++ b/Mage/src/main/java/mage/constants/AbilityWord.java @@ -31,6 +31,7 @@ public enum AbilityWord { FATEFUL_HOUR("Fateful hour"), FATHOMLESS_DESCENT("Fathomless descent"), FEROCIOUS("Ferocious"), + FLURRY("Flurry"), FORMIDABLE("Formidable"), GRANDEUR("Grandeur"), HATE("Hate"), @@ -51,6 +52,7 @@ public enum AbilityWord { RADIANCE("Radiance"), RAID("Raid"), RALLY("Rally"), + RENEW("Renew"), REVOLT("Revolt"), SECRET_COUNCIL("Secret council"), SPELL_MASTERY("Spell mastery"), diff --git a/Mage/src/main/java/mage/game/permanent/token/NalaarAetherjetToken.java b/Mage/src/main/java/mage/game/permanent/token/NalaarAetherjetToken.java new file mode 100644 index 00000000000..59128ff8e5d --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/NalaarAetherjetToken.java @@ -0,0 +1,28 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.abilities.keyword.CrewAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.CardType; +import mage.constants.SubType; + +public class NalaarAetherjetToken extends TokenImpl{ + + public NalaarAetherjetToken(int xValue) { + super("Nalaar Aetherjet", "X/X colorless Vehicle artifact token named Nalaar Aetherjet with flying and crew 2"); + cardType.add(CardType.ARTIFACT); + subtype.add(SubType.VEHICLE); + power = new MageInt(xValue); + toughness = new MageInt(xValue); + addAbility(FlyingAbility.getInstance()); + addAbility(new CrewAbility(2)); + } + + private NalaarAetherjetToken(final NalaarAetherjetToken token) { + super(token); + } + + public NalaarAetherjetToken copy() { + return new NalaarAetherjetToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/RedWarriorToken.java b/Mage/src/main/java/mage/game/permanent/token/RedWarriorToken.java new file mode 100644 index 00000000000..9e4b0e04837 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/RedWarriorToken.java @@ -0,0 +1,29 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author balazskristof + */ +public final class RedWarriorToken extends TokenImpl { + + public RedWarriorToken() { + super("Warrior Token", "1/1 red Warrior creature token"); + cardType.add(CardType.CREATURE); + color.setRed(true); + subtype.add(SubType.WARRIOR); + power = new MageInt(1); + toughness = new MageInt(1); + } + + private RedWarriorToken(final RedWarriorToken token) { + super(token); + } + + @Override + public RedWarriorToken copy() { + return new RedWarriorToken(this); + } +} diff --git a/Mage/src/main/java/mage/game/permanent/token/SpiritWarriorToken.java b/Mage/src/main/java/mage/game/permanent/token/SpiritWarriorToken.java new file mode 100644 index 00000000000..755251aa988 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/SpiritWarriorToken.java @@ -0,0 +1,31 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +public class SpiritWarriorToken extends TokenImpl { + + public SpiritWarriorToken() { + this(1); + } + + public SpiritWarriorToken(int x) { + super("Spirit Warrior Token", "X/X black and green Spirit Warrior creature token, where X is the greatest toughness among creatures you control"); + this.cardType.add(CardType.CREATURE); + this.subtype.add(SubType.SPIRIT); + this.subtype.add(SubType.WARRIOR); + this.color.setBlack(true); + this.color.setGreen(true); + this.power = new MageInt(x); + this.toughness = new MageInt(x); + } + + private SpiritWarriorToken(final SpiritWarriorToken token) { + super(token); + } + + public SpiritWarriorToken copy() { + return new SpiritWarriorToken(this); + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/game/permanent/token/SpiritXXToken.java b/Mage/src/main/java/mage/game/permanent/token/SpiritXXToken.java new file mode 100644 index 00000000000..9cdd78ab040 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/SpiritXXToken.java @@ -0,0 +1,33 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author nantuko + */ +public final class SpiritXXToken extends TokenImpl { + + public SpiritXXToken() { + this(0); + } + + public SpiritXXToken(int amount) { + super("Spirit Token", amount + '/' + amount + " white Spirit creature token"); + cardType.add(CardType.CREATURE); + subtype.add(SubType.SPIRIT); + color.setWhite(true); + power = new MageInt(amount); + toughness = new MageInt(amount); + } + + private SpiritXXToken(final SpiritXXToken token) { + super(token); + } + + @Override + public SpiritXXToken copy() { + return new SpiritXXToken(this); + } +} diff --git a/Mage/src/main/resources/tokens-database.txt b/Mage/src/main/resources/tokens-database.txt index 8b69c37b086..8e8bbdbd04a 100644 --- a/Mage/src/main/resources/tokens-database.txt +++ b/Mage/src/main/resources/tokens-database.txt @@ -363,7 +363,7 @@ |Generate|TOK:C18|Cat Warrior|||CatWarriorToken| |Generate|TOK:C18|Clue|||ClueArtifactToken| |Generate|TOK:C18|Construct|1||Construct4Token| -|Generate|TOK:C18|Construct|2||StoneTrapIdolToken| +|Generate|TOK:C18|Construct|2||StoneIdolToken| |Generate|TOK:C18|Dragon|||DragonEggDragonToken| |Generate|TOK:C18|Dragon Egg|||NestingDragonToken| |Generate|TOK:C18|Elemental|||DokaiWeaverofLifeToken| @@ -632,8 +632,8 @@ |Generate|TOK:M11|Avatar|||AvatarToken| |Generate|TOK:M11|Beast|||BeastToken| |Generate|TOK:M11|Bird|||RocEggToken| -|Generate|TOK:M11|Ooze|1||OozeToken| -|Generate|TOK:M11|Ooze|2||Ooze2Token| +|Generate|TOK:M11|Ooze|1||MitoticSlimeOozeToken| +|Generate|TOK:M11|Ooze|2||OozeToken| |Generate|TOK:M11|Zombie|||ZombieToken| |Generate|TOK:M12|Beast|||BeastToken| |Generate|TOK:M12|Bird|||RocEggToken| @@ -801,7 +801,7 @@ |Generate|TOK:SHM|Elf Warrior|2||GreenWhiteElfWarriorToken| |Generate|TOK:SHM|Faerie Rogue|||OonaQueenFaerieRogueToken| |Generate|TOK:SHM|Giant Warrior|||GiantBaitingGiantWarriorToken| -|Generate|TOK:SHM|Goblin Warrior|||WortTheRaidmotherToken| +|Generate|TOK:SHM|Goblin Warrior|||GoblinWarriorToken| |Generate|TOK:SHM|Kithkin Soldier|||KithkinSoldierToken| |Generate|TOK:SHM|Rat|||RatToken| |Generate|TOK:SHM|Spider|||SpiderToken| @@ -854,7 +854,7 @@ |Generate|TOK:THS|Soldier|3||AkroanSoldierToken| |Generate|TOK:UST|Dragon|||DragonTokenGold| |Generate|TOK:UST|Storm Crow|||StormCrowToken| -|Generate|TOK:WWK|Construct|||StoneTrapIdolToken| +|Generate|TOK:WWK|Construct|||StoneIdolToken| |Generate|TOK:WWK|Dragon|||DragonToken2| |Generate|TOK:WWK|Elephant|||ElephantToken| |Generate|TOK:WWK|Ogre|||OgreToken| @@ -1094,7 +1094,7 @@ |Generate|TOK:CMR|Illusion|||MelokuTheCloudedMirrorToken| |Generate|TOK:CMR|Plant|||PlantToken| |Generate|TOK:CMR|Rock|||RockToken| -|Generate|TOK:CMR|Salamander Warrior|||SalamnderWarriorToken| +|Generate|TOK:CMR|Salamander Warrior|||SalamanderWarriorToken| |Generate|TOK:CMR|Saproling|||SaprolingToken| |Generate|TOK:CMR|Soldier|1||SoldierToken| |Generate|TOK:CMR|Soldier|2||SoldierToken| @@ -1332,7 +1332,7 @@ |Generate|TOK:NEO|Keimi|||KeimiToken| |Generate|TOK:NEO|Mechtitan|||MechtitanToken| |Generate|TOK:NEO|Ninja|||NinjaToken| -|Generate|TOK:NEO|Pilot|||PilotToken| +|Generate|TOK:NEO|Pilot|||PilotCrewToken| |Generate|TOK:NEO|Rat Rogue|||RatRogueToken| |Generate|TOK:NEO|Samurai|||SamuraiToken| |Generate|TOK:NEO|Spirit|1||SpiritToken| @@ -1443,7 +1443,7 @@ |Generate|TOK:NCC|Lightning Rager|||LightningRagerToken| |Generate|TOK:NCC|Ogre|||OgreToken| |Generate|TOK:NCC|Ooze|1||OozeToken| -|Generate|TOK:NCC|Ooze|2||Ooze2Token| +|Generate|TOK:NCC|Ooze|2||MitoticSlimeOozeToken| |Generate|TOK:NCC|Plant|||PlantToken| |Generate|TOK:NCC|Saproling|||SaprolingToken| |Generate|TOK:NCC|Soldier|1||SoldierLifelinkToken| @@ -1513,7 +1513,7 @@ |Generate|TOK:PCA|Hellion|||HellionToken| |Generate|TOK:PCA|Insect|||InsectToken| |Generate|TOK:PCA|Ooze|1||OozeToken| -|Generate|TOK:PCA|Ooze|2||Ooze2Token| +|Generate|TOK:PCA|Ooze|2||MitoticSlimeOozeToken| |Generate|TOK:PCA|Plant|||PlantToken| |Generate|TOK:PCA|Saproling|||SaprolingToken| |Generate|TOK:PCA|Spider|||PenumbraSpiderToken| @@ -1706,7 +1706,7 @@ |Generate|TOK:DMC|Kobolds of Kher Keep|||KherKeepKoboldToken| |Generate|TOK:DMC|Merfolk|||MerfolkToken| |Generate|TOK:DMC|Ragavan|||RagavanToken| -|Generate|TOK:DMC|Sand Warrior|||HazezonTamarSandWarriorToken| +|Generate|TOK:DMC|Sand Warrior|||SandWarriorToken| |Generate|TOK:DMC|Snake|||SnakeToken| |Generate|TOK:DMC|Stangg Twin|||StanggTwinToken| |Generate|TOK:DMC|Treasure|||TreasureToken| @@ -1834,7 +1834,7 @@ |Generate|TOK:30A|Clue|2||ClueArtifactToken| |Generate|TOK:30A|Demon|||DemonToken| |Generate|TOK:30A|Human|||HumanToken| -|Generate|TOK:30A|Human Cleric|||HumanCleric| +|Generate|TOK:30A|Human Cleric|||HumanClericToken| |Generate|TOK:30A|Human Warrior|||HumanWarriorToken| |Generate|TOK:30A|Human Wizard|||HumanWizardToken| |Generate|TOK:30A|Skeleton|||SkeletonToken| @@ -1878,7 +1878,7 @@ |Generate|TOK:MOC|Blood|||BloodToken| |Generate|TOK:MOC|Butterfly|||ButterflyToken| |Generate|TOK:MOC|Clue|||ClueArtifactToken| -|Generate|TOK:MOC|Construct|||StoneTrapIdolToken| +|Generate|TOK:MOC|Construct|||StoneIdolToken| |Generate|TOK:MOC|Demon|||BelzenlokDemonToken| |Generate|TOK:MOC|Eldrazi|||EldraziAnnihilatorToken| |Generate|TOK:MOC|Elemental|||WildfireAwakenerToken| @@ -1961,7 +1961,7 @@ |Generate|TOK:CMM|Construct|1||OviyaPashiriSageLifecrafterToken| |Generate|TOK:CMM|Construct|2||KarnConstructToken| |Generate|TOK:CMM|Construct|3||ConstructToken| -|Generate|TOK:CMM|Construct|4||StoneTrapIdolToken| +|Generate|TOK:CMM|Construct|4||StoneIdolToken| |Generate|TOK:CMM|Demon|||DemonToken| |Generate|TOK:CMM|Dragon|1||DragonEggDragonToken| |Generate|TOK:CMM|Dragon|2||DragonToken| @@ -2212,7 +2212,7 @@ |Generate|TOK:OTC|Plant Warrior|||PlantWarriorToken| |Generate|TOK:OTC|Rat|||RatToken| |Generate|TOK:OTC|Rogue|||RogueToken| -|Generate|TOK:OTC|Sand Warrior|||HazezonTamarSandWarriorToken| +|Generate|TOK:OTC|Sand Warrior|||SandWarriorToken| |Generate|TOK:OTC|Shark|||SharkToken| |Generate|TOK:OTC|Soldier|||SoldierArtifactToken| |Generate|TOK:OTC|Thopter|||ThopterColorlessToken| @@ -2453,3 +2453,31 @@ |Generate|TOK:INR|Zombie|1||ZombieToken2| |Generate|TOK:INR|Zombie|2||ZombieToken| |Generate|TOK:INR|Zombie|3||ZombieDecayedToken| + +# DFT +|Generate|TOK:DFT|Cat|||CatToken2| +|Generate|TOK:DFT|Dinosaur Dragon|||DinDragonToken| +|Generate|TOK:DFT|Elephant|||ElephantToken| +|Generate|TOK:DFT|Goblin|||GoblinToken| +|Generate|TOK:DFT|Insect|||InsectToken| +|Generate|TOK:DFT|Pilot|||PilotCrewToken| +|Generate|TOK:DFT|Servo|||ServoToken| +|Generate|TOK:DFT|Thopter|1||ThopterColorlessToken| +|Generate|TOK:DFT|Thopter|2||ThopterColorlessToken| +|Generate|TOK:DFT|Treasure|||TreasureToken| +|Generate|TOK:DFT|Vehicle|||VehicleToken| +|Generate|TOK:DFT|Zombie|||ZombieToken| + +# DRC +|Generate|TOK:DRC|Beast|1||BeastToken| +|Generate|TOK:DRC|Beast|2||ArchitectOfTheUntamedBeastToken| +|Generate|TOK:DRC|Construct|||Construct4Token| +|Generate|TOK:DRC|Golem|1||GolemFlyingToken| +|Generate|TOK:DRC|Golem|2||GolemTrampleToken| +|Generate|TOK:DRC|Golem|3||GolemVigilanceToken| +|Generate|TOK:DRC|Nalaar Aetherjet|||NalaarAetherjetToken| +|Generate|TOK:DRC|Shapeshifter|||ShapeshifterToken| +|Generate|TOK:DRC|Zombie|1||ZombieWhiteToken| +|Generate|TOK:DRC|Zombie|2||ZombieDecayedToken| +|Generate|TOK:DRC|Zombie Army|||ZombieArmyToken| +|Generate|TOK:DRC|Zombie Warrior|||GodEternalOketraToken| \ No newline at end of file diff --git a/Utils/keywords.txt b/Utils/keywords.txt index f4b661ac0e6..a55b9e603d9 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -85,6 +85,7 @@ Melee|new| Menace|new| Mentor|new| Miracle|manaString| +Mobilize|number| Modular|card, number| Mountaincycling|cost| Mountainwalk|new| diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 705fd64ef1a..b4f80d3d634 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -57177,6 +57177,7 @@ Underground River|Aetherdrift Commander|181|R||Land|||{T}: Add {C}.${T}: Add {U} Unholy Grotto|Aetherdrift Commander|182|R||Land|||{T}: Add {C}.${B}, {T}: Put target Zombie card from your graveyard on top of your library.| Vineglimmer Snarl|Aetherdrift Commander|183|R||Land|||As Vineglimmer Snarl enters, you may reveal a Forest or Island card from your hand. If you don't, Vineglimmer Snarl enters tapped.${T}: Add {G} or {U}.| Yavimaya Coast|Aetherdrift Commander|184|R||Land|||{T}: Add {C}.${T}: Add {G} or {U}. Yavimaya Coast deals 1 damage to you.| +Celes, Rune Knight|Final Fantasy Commander|1|M|{1}{R}{W}{B}|Legendary Creature - Human Wizard Knight|4|4|When Celes enters, discard any number of cards, then draw that many cards plus one.$Whenever one or more other creatures you control enter, if one or more of them entered from a graveyard or was cast from a graveyard, put a +1/+1 counter on each creature you control.| Cloud, Ex-SOLDIER|Final Fantasy Commander|2|M|{2}{R}{G}{W}|Legendary Creature - Human Soldier Mercenary|4|4|Haste$When Cloud enters, attach up to one target Equipment you control to it.$Whenever Cloud attacks, draw a card for each equipped attacking creature you control. Then if Cloud has power 7 or greater, create two Treasure tokens.| Terra, Herald of Hope|Final Fantasy Commander|4|M|{R}{W}{B}|Legendary Creature - Human Wizard Warrior|3|3|Trance -- At the beginning of combat on your turn, mill two cards. Terra gains flying until end of turn.$Whenever Terra deals combat damage to a player, you may pay {2}. When you do, return target creature card with power 3 or less from your graveyard to the battlefield tapped.| Tidus, Yuna's Guardian|Final Fantasy Commander|5|M|{G}{W}{U}|Legendary Creature - Human Warrior|3|3|At the beginning of combat on your turn, you may move a counter from target creature you control onto a second target creature you control.$Cheer - Whenever one or more creatures you control with counters on them deal combat damage to a player, you may draw a card and proliferate. Do this only once each turn.| @@ -57197,15 +57198,412 @@ Chaos, the Endless|Final Fantasy|221|U||Legendary Creature - Demon|5|5|Flying$Wh Sin, Spira's Punishment|Final Fantasy|242|R|{4}{B}{G}{U}|Legendary Creature - Leviathan Avatar|7|7|Flying$Whenever Sin enters or attacks, exile a permanent card from your graveyard at random, then create a tapped token that's a copy of that card. If the exiled card is a land card, repeat this process.| Cloud, Planet's Champion|Final Fantasy|552|M|{3}{R}{W}|Legendary Creature - Human Soldier Mercenary|4|4|During your turn, as long as Cloud is equipped, it has double strike and indestructible.$Equip abilities you activate that target Cloud cost {2} less to activate.| Sephiroth, Planet's Heir|Final Fantasy|553|M|{4}{U}{B}|Legendary Creature - Human Avatar Soldier|4|4|Vigilance$When Sephiroth enters, creatures your opponents control get -2/-2 until end of turn.$Whenever a creature an opponent controls dies, put a +1/+1 counter on Sephiroth.| -Rally the Monastery|Tarkir: Dragonstorm|19|U|{3}{W}|Instant|||This spell costs {2} less to cast if you've cast another spell this turn.$Choose one —$• Create two 1/1 white Monk creature tokens with prowess.$• Up to two target creatures you control each get +2/+2 until end of turn.$• Destroy target creature with power 4 or greater.| +Ugin, Eye of the Storms|Tarkir: Dragonstorm|1|M|{7}|Legendary Planeswalker - Ugin|7|When you cast this spell, exile up to one target permanent that's one or more colors.$Whenever you cast a colorless spell, exile up to one target permanent that's one or more colors.$+2: You gain 3 life and draw a card.$0: Add {C}{C}{C}.$-11: Search your library for any number of colorless nonland cards, exile them, then shuffle. Until end of turn, you may cast those cards without paying their mana costs.| +Anafenza, Unyielding Lineage|Tarkir: Dragonstorm|2|R|{2}{W}|Legendary Creature - Spirit Soldier|2|2|Flash$First strike$Whenever another nontoken creature you control dies, Anafenza endures 2.| +Bearer of Glory|Tarkir: Dragonstorm|4|C|{1}{W}|Creature - Human Soldier|2|1|During your turn, this creature has first strike.${4}{W}: Creatures you control get +1/+1 until end of turn.| +Coordinated Maneuver|Tarkir: Dragonstorm|6|C|{1}{W}|Instant|||Choose one --$* Coordinated Maneuver deals damage equal to the number of creatures you control to target creature or planeswalker.$* Destroy target enchantment.| +Dalkovan Packbeasts|Tarkir: Dragonstorm|7|U|{2}{W}|Creature - Ox|0|4|Vigilance$Mobilize 3| +Descendant of Storms|Tarkir: Dragonstorm|8|U|{W}|Creature - Human Soldier|2|1|Whenever this creature attacks, you may pay {1}{W}. If you do, it endures 1.| +Dragonback Lancer|Tarkir: Dragonstorm|9|C|{3}{W}|Creature - Human Soldier|3|3|Flying$Mobilize 1| +Duty Beyond Death|Tarkir: Dragonstorm|10|U|{1}{W}|Instant|||As an additional cost to cast this spell, sacrifice a creature.$Creatures you control gain indestructible until end of turn. Put a +1/+1 counter on each creature you control.| +Elspeth, Storm Slayer|Tarkir: Dragonstorm|11|M|{3}{W}{W}|Legendary Planeswalker - Elspeth|5|If one or more tokens would be created under your control, twice that many of those tokens are created instead.$+1: Create a 1/1 white Soldier creature token.$0: Put a +1/+1 counter on each creature you control. Those creatures gain flying until your next turn.$-3: Destroy target creature an opponent controls with mana value 3 or greater.| +Fortress Kin-Guard|Tarkir: Dragonstorm|12|C|{1}{W}|Creature - Dog Soldier|1|2|When this creature enters, it endures 1.| +Mardu Devotee|Tarkir: Dragonstorm|16|C|{W}|Creature - Human Scout|1|2|When this creature enters, scry 2.${1}: Add {R}, {W}, or {B}. Activate only once each turn.| +Rally the Monastery|Tarkir: Dragonstorm|19|U|{3}{W}|Instant|||This spell costs {2} less to cast if you've cast another spell this turn.$Choose one --$* Create two 1/1 white Monk creature tokens with prowess.$* Up to two target creatures you control each get +2/+2 until end of turn.$* Destroy target creature with power 4 or greater.| +Riling Dawnbreaker|Tarkir: Dragonstorm|21|C|{4}{W}|Creature - Dragon|3|4|Flying, vigilance$At the beginning of combat on your turn, another target creature you control gets +1/+0 until end of turn.| +Signaling Roar|Tarkir: Dragonstorm|21|C|{1}{W}|Sorcery - Omen|3|4|Create a 2/2 white Soldier creature token.| +Salt Road Packbeast|Tarkir: Dragonstorm|23|C|{5}{W}|Creature - Beast|4|3|This spell costs {1} less to cast for each creature you control.$When this creature enters, draw a card.| Smile at Death|Tarkir: Dragonstorm|24|M|{3}{W}{W}|Enchantment|||At the beginning of your upkeep, return up to two target creature cards with power 2 or less from your graveyard to the battlefield. Put a +1/+1 counter on each of those creatures.| +Static Snare|Tarkir: Dragonstorm|26|U|{4}{W}|Enchantment|||Flash$This spell costs {1} less to cast for each attacking creature.$When this enchantment enters, exile target artifact or creature an opponent controls until this enchantment leaves the battlefield.| +Stormplain Detainment|Tarkir: Dragonstorm|28|C|{2}{W}|Enchantment|||When this enchantment enters, exile target nonland permanent an opponent controls until this enchantment leaves the battlefield.| +Tempest Hawk|Tarkir: Dragonstorm|31|C|{2}{W}|Creature - Bird|2|2|Flying$Whenever this creature deals combat damage to a player, you may search your library for a card named Tempest Hawk, reveal it, put it into your hand, then shuffle.$A deck can have any number of cards named Tempest Hawk.| +United Battlefront|Tarkir: Dragonstorm|32|R|{3}{W}|Sorcery|||Look at the top seven cards of your library. Put up to two noncreature, nonland permanent cards with mana value 3 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| +Voice of Victory|Tarkir: Dragonstorm|33|R|{1}{W}|Creature - Human Bard|1|3|Mobilize 2$Your opponents can't cast spells during your turn.| +Aegis Sculptor|Tarkir: Dragonstorm|35|U|{3}{U}|Creature - Bird Wizard|2|3|Flying$Ward {2}$At the beginning of your upkeep, you may exile two cards from your graveyard. If you do, put a +1/+1 counter on this creature.| +Agent of Kotis|Tarkir: Dragonstorm|36|C|{1}{U}|Creature - Human Rogue|2|1|Renew -- {3}{U}, Exile this card from your graveyard: Put two +1/+1 counters on target creature. Activate only as a sorcery.| +Dirgur Island Dragon|Tarkir: Dragonstorm|40|C|{5}{U}|Creature - Dragon|4|4|Flying$Ward {2}| +Skimming Strike|Tarkir: Dragonstorm|40|C|{1}{U}|Instant - Omen|4|4|Tap up to one target creature. Draw a card.| +Dragonologist|Tarkir: Dragonstorm|42|R|{2}{U}|Creature - Human Wizard|1|3|When this creature enters, look at the top six cards of your library. You may reveal an instant, sorcery, or Dragon card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.$Untapped Dragons you control have hexproof.| +Essence Anchor|Tarkir: Dragonstorm|44|U|{2}{U}|Artifact|||At the beginning of your upkeep, surveil 1.${T}: Create a 2/2 black Zombie Druid creature token. Activate only during your turn and only if a card left your graveyard this turn.| +Fresh Start|Tarkir: Dragonstorm|46|U|{1}{U}|Enchantment - Aura|||Flash$Enchant creature$Enchanted creature gets -5/-0 and loses all abilities.| +Marang River Regent|Tarkir: Dragonstorm|51|R|{4}{U}{U}|Creature - Dragon|6|7|Flying$When this creature enters, return up to two other target nonland permanents to their owners' hands.| +Coil and Catch|Tarkir: Dragonstorm|51|R|{3}{U}|Instant - Omen|6|7|Draw three cards, then discard a card.| +Ringing Strike Mastery|Tarkir: Dragonstorm|53|C|{U}|Enchantment - Aura|||Enchant creature$When this Aura enters, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.$Enchanted creature has "{5}: Untap this creature."| +Roiling Dragonstorm|Tarkir: Dragonstorm|55|U|{1}{U}|Enchantment|||When this enchantment enters, draw two cards, then discard a card.$When a Dragon you control enters, return this enchantment to its owner's hand.| +Snowmelt Stag|Tarkir: Dragonstorm|57|C|{3}{U}|Creature - Elemental Elk|2|5|Vigilance$During your turn, this creature has base power and toughness 5/2.${5}{U}{U}: This creature can't be blocked this turn.| +Spectral Denial|Tarkir: Dragonstorm|58|U|{X}{U}|Instant|||This spell costs {1} less to cast for each creature you control with power 4 or greater.$Counter target spell unless its controller pays {X}.| +Taigam, Master Opportunist|Tarkir: Dragonstorm|60|M|{1}{U}|Legendary Creature - Human Monk|2|2|Flurry -- Whenever you cast your second spell each turn, copy it, then exile the spell you cast with four time counters on it. If it doesn't have suspend, it gains suspend.| +Temur Devotee|Tarkir: Dragonstorm|61|C|{1}{U}|Creature - Human Druid|3|3|Defender${1}: Add {G}, {U}, or {R}. Activate only once each turn.| +Ureni's Rebuff|Tarkir: Dragonstorm|63|U|{1}{U}|Sorcery|||Return target creature to its owner's hand.$Harmonize {5}{U}| +Winternight Stories|Tarkir: Dragonstorm|67|R|{2}{U}|Sorcery|||Draw three cards. Then discard two cards unless you discard a creature card.$Harmonize {4}{U}| +Abzan Devotee|Tarkir: Dragonstorm|68|C|{1}{B}|Creature - Dog Cleric|2|1|{1}: Add {W}, {B}, or {G}. Activate only once each turn.${2}{B}: Return this card from your graveyard to your hand.| +Alesha's Legacy|Tarkir: Dragonstorm|72|C|{1}{B}|Instant|||Target creature you control gains deathtouch and indestructible until end of turn.| +Avenger of the Fallen|Tarkir: Dragonstorm|73|R|{2}{B}|Creature - Human Warrior|2|4|Deathtouch$Mobilize X, where X is the number of creature cards in your graveyard.| +Caustic Exhale|Tarkir: Dragonstorm|74|C|{B}|Instant|||As an additional cost to cast this spell, behold a Dragon or pay {1}.$Target creature gets -3/-3 until end of turn.| +Corroding Dragonstorm|Tarkir: Dragonstorm|75|U|{1}{B}|Enchantment|||When this enchantment enters, each opponent loses 2 life and you gain 2 life. Surveil 2.$When a Dragon you control enters, return this enchantment to its owner's hand.| +Cruel Truths|Tarkir: Dragonstorm|76|C|{3}{B}|Instant|||Surveil 2, then draw two cards. You lose 2 life.| +Desperate Measures|Tarkir: Dragonstorm|78|U|{B}|Instant|||Target creature gets +1/-1 until end of turn. When it dies under your control this turn, draw two cards.| +Krumar Initiate|Tarkir: Dragonstorm|84|U|{1}{B}|Creature - Human Cleric|2|2|{X}{B}, {T}, Pay X life: This creature endures X. Activate only as a sorcery.| +Qarsi Revenant|Tarkir: Dragonstorm|86|R|{1}{B}{B}|Creature - Vampire|3|3|Flying, deathtouch, lifelink$Renew -- {2}{B}, Exile this card from your graveyard: Put a flying counter, a deathtouch counter, and a lifelink counter on target creature. Activate only as a sorcery.| +The Sibsig Ceremony|Tarkir: Dragonstorm|91|R|{B}{B}{B}|Legendary Enchantment|||Creature spells you cast cost {2} less to cast.$Whenever a creature you control enters, if you cast it, destroy that creature, then create a 2/2 black Zombie Druid creature token.| +Sidisi, Regent of the Mire|Tarkir: Dragonstorm|92|R|{1}{B}|Legendary Creature - Zombie Snake Warlock|1|3|{T}, Sacrifice a creature you control with mana value X other than Sidisi: Return target creature card with mana value X plus 1 from your graveyard to the battlefield. Activate only as a sorcery.| +Unrooted Ancestor|Tarkir: Dragonstorm|96|U|{2}{B}|Creature - Spirit Cleric|3|2|Flash${1}, Sacrifice another creature: This creature gains indestructible until end of turn. Tap it.| +Venerated Stormsinger|Tarkir: Dragonstorm|97|U|{3}{B}|Creature - Orc Cleric|3|3|Mobilize 1$Whenever this creature or another creature you control dies, each opponent loses 1 life and you gain 1 life.| +Yathan Tombguard|Tarkir: Dragonstorm|100|U|{2}{B}|Creature - Human Warrior|2|3|Menace$Whenever a creature you control with a counter on it deals combat damage to a player, you draw a card and you lose 1 life.| +Devoted Duelist|Tarkir: Dragonstorm|104|C|{1}{R}|Creature - Goblin Monk|2|1|Haste$Flurry -- Whenever you cast your second spell each turn, this creature deals 1 damage to each opponent.| +Dracogenesis|Tarkir: Dragonstorm|105|M|{6}{R}{R}|Enchantment|||You may cast Dragon spells without paying their mana costs.| +Equilibrium Adept|Tarkir: Dragonstorm|106|U|{3}{R}|Creature - Dog Monk|2|4|When this creature enters, exile the top card of your library. Until the end of your next turn, you may play that card.$Flurry -- Whenever you cast your second spell each turn, this creature gains double strike until end of turn.| +Jeskai Devotee|Tarkir: Dragonstorm|110|C|{1}{R}|Creature - Orc Monk|2|2|Flurry -- Whenever you cast your second spell each turn, this creature gets +1/+1 until end of turn.${1}: Add {U}, {R}, or {W}. Activate only once each turn.| +Magmatic Hellkite|Tarkir: Dragonstorm|111|R|{2}{R}{R}|Creature - Dragon|4|5|Flying$When this creature enters, destroy target nonbasic land an opponent controls. Its controller searches their library for a basic land card, puts it onto the battlefield tapped with a stun counter on it, then shuffles.| Sarkhan, Dragon Ascendant|Tarkir: Dragonstorm|118|R|{1}{R}|Legendary Creature - Human Druid|2|2|When Sarkhan enters, you may behold a Dragon. If you do, create a Treasure token.$Whenever a Dragon you control enters, put a +1/+1 counter on Sarkhan. Until end of turn, Sarkhan becomes a Dragon in addition to its other types and gains flying.| +Seize Opportunity|Tarkir: Dragonstorm|119|C|{2}{R}|Instant|||Choose one --$* Exile the top two cards of your library. Until the end of your next turn, you may play those cards.$* Up to two target creatures each get +2/+1 until end of turn.| +Shock Brigade|Tarkir: Dragonstorm|120|C|{1}{R}|Creature - Goblin Soldier|1|3|Menace$Mobilize 1| Stormscale Scion|Tarkir: Dragonstorm|123|M|{4}{R}{R}|Creature - Dragon|4|4|Flying$Other Dragons you control get +1/+1.$Storm| +Summit Intimidator|Tarkir: Dragonstorm|125|C|{3}{R}|Creature - Yeti|4|3|Reach$When this creature enters, target creature can't block this turn.| +Sunset Strikemaster|Tarkir: Dragonstorm|126|U|{1}{R}|Creature - Human Monk|3|1|{T}: Add {R}.${2}{R}, {T}, Sacrifice this creature: It deals 6 damage to target creature with flying.| +Tersa Lightshatter|Tarkir: Dragonstorm|127|R|{2}{R}|Legendary Creature - Orc Wizard|3|3|Haste$When Tersa Lightshatter enters, discard up to two cards, then draw that many cards.$Whenever Tersa Lightshatter attacks, if there are seven or more cards in your graveyard, exile a card at random from your graveyard. You may play that card this turn.| +Underfoot Underdogs|Tarkir: Dragonstorm|129|C|{2}{R}|Creature - Goblin Warrior|1|2|When this creature enters, create a 1/1 red Goblin creature token.${1}, {T}: Target creature you control with power 2 or less can't be blocked this turn.| +War Effort|Tarkir: Dragonstorm|131|U|{3}{R}|Enchantment|||Creatures you control get +1/+0.$Whenever you attack, create a 1/1 red Warrior creature token that's tapped and attacking. Sacrifice it at the beginning of the next end step.| +Attuned Hunter|Tarkir: Dragonstorm|135|U|{2}{G}|Creature - Human Ranger|3|3|Trample$Whenever one or more cards leave your graveyard during your turn, put a +1/+1 counter on this creature.| +Bloomvine Regent|Tarkir: Dragonstorm|136|R|{3}{G}{G}|Creature - Dragon|4|5|Flying$Whenever this creature or another Dragon you control enters, you gain 3 life.| +Claim Territory|Tarkir: Dragonstorm|136|R|{2}{G}|Sorcery - Omen|4|5|Search your library for up to two basic Forest cards, reveal them, put one onto the batatlefield tapped and the other into your hand, then shuffle.| +Craterhoof Behemoth|Tarkir: Dragonstorm|138|M|{5}{G}{G}{G}|Creature - Beast|5|5|Haste$When this creature enters, creatures you control gain trample and get +X/+X until end of turn, where X is the number of creatures you control.| +Dragonbroods' Relic|Tarkir: Dragonstorm|140|U|{1}{G}|Artifact|||{T}, Tap an untapped creature you control: Add one mana of any color.${3}{W}{U}{B}{R}{G}, Sacrifice this artifact: Create a 4/4 Dragon creature token named Reliquary Dragon that's all colors. It has flying, lifelink, and "When this token enters, it deals 3 damage to any target." Activate only as a sorcery.| +Dusyut Earthcarver|Tarkir: Dragonstorm|141|C|{5}{G}|Creature - Elephant Druid|4|4|Reach$When this creature enters, it endures 3.| +Heritage Reclamation|Tarkir: Dragonstorm|145|C|{1}{G}|Instant|||Choose one --$* Destroy target artifact.$* Destroy target enchantment.$* Exile up to one target card from a graveyard. Draw a card.| +Rite of Renewal|Tarkir: Dragonstorm|153|U|{3}{G}|Sorcery|||Return up to two target permanent cards from your graveyard to your hand. Target player shuffles up to four target cards from their graveyard into their library. Exile Rite of Renewal.| +Roamer's Routine|Tarkir: Dragonstorm|154|C|{2}{G}|Sorcery|||Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.$Harmonize {4}{G}| +Sagu Wildling|Tarkir: Dragonstorm|157|C|{4}{G}|Creature - Dragon|3|3|Flying$When this creature enters, you gain 3 life.| +Roost Seek|Tarkir: Dragonstorm|157|C|{G}|Sorcery - Omen|3|3|Search your library for a basic land card, reveal it, put it into your hand, then shuffle.| +Sarkhan's Resolve|Tarkir: Dragonstorm|158|C|{1}{G}|Instant|||Choose one --$* Target creature gets +3/+3 until end of turn.$* Destroy target creature with flying.| +Snakeskin Veil|Tarkir: Dragonstorm|159|C|{G}|Instant|||Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn.| +Sultai Devotee|Tarkir: Dragonstorm|160|C|{1}{G}|Creature - Zombie Snake Druid|2|1|Deathtouch${1}: Add {B}, {G}, or {U}. Activate only once each turn.| +Surrak, Elusive Hunter|Tarkir: Dragonstorm|161|R|{2}{G}|Legendary Creature - Human Warrior|4|3|This spell can't be countered.$Trample$Whenever a creature you control or a creature spell you control becomes the target of a spell or ability an opponent controls, draw a card.| +Undergrowth Leopard|Tarkir: Dragonstorm|165|C|{1}{G}|Creature - Cat|2|2|Vigilance${1}, Sacrifice this creature: Destroy target artifact or enchantment.| +All-Out Assault|Tarkir: Dragonstorm|167|M|{2}{R}{W}{B}|Enchantment|||Creatures you control get +1/+1 and have deathtouch.$When this enchantment enters, if it's your main phase, there is an additional combat phase after this phase followed by an additional main phase. When you next attack this turn, untap each creature you control.| +Auroral Procession|Tarkir: Dragonstorm|169|U|{G}{U}|Instant|||Return target card from your graveyard to your hand.| +Awaken the Honored Dead|Tarkir: Dragonstorm|170|R|{B}{G}{U}|Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I -- Destroy target nonland permanent.$II -- Mill three cards.$III -- You may discard a card. When you do, return target creature or land card from your graveyard to your hand.| Barrensteppe Siege|Tarkir: Dragonstorm|171|R|{2}{W}{B}|Enchantment|||As this enchantment enters, choose Abzan or Mardu.$* Abzan -- At the beginning of your end step, put a +1/+1 counter on each creature you control.$* Mardu -- At the beginning of your end step, if a creature died under your control this turn, each opponent sacrifices a creature of their choice.| +Betor, Kin to All|Tarkir: Dragonstorm|172|M|{2}{W}{B}{G}|Legendary Creature - Spirit Dragon|5|7|Flying$At the beginning of your end step, if creatures you control have total toughness 10 or greater, draw a card. Then if creatures you control have total toughness 20 or greater, untap each creature you control. Then if creatures you control have total toughness 40 or greater, each opponent loses half their life, rounded up.| +Bone-Cairn Butcher|Tarkir: Dragonstorm|173|U|{1}{R}{W}{B}|Creature - Demon|4|4|Mobilize 2$Attacking tokens you control have deathtouch.| +Cori Mountain Stalwart|Tarkir: Dragonstorm|175|U|{1}{R}{W}|Creature - Human Monk|3|3|Flurry -- Whenever you cast your second spell each turn, this creature deals 2 damage to each opponent and you gain 2 life.| +Death Begets Life|Tarkir: Dragonstorm|176|M|{5}{B}{G}{U}|Sorcery|||Destroy all creatures and enchantments. Draw a card for each permanent destroyed this way.| +Disruptive Stormbrood|Tarkir: Dragonstorm|178|U|{4}{G}|Creature - Dragon|3|3|Flying$When this creature enters, destroy up to one target artifact or enchantment.| +Petty Revenge|Tarkir: Dragonstorm|178|U|{1}{B}|Sorcery - Omen|3|3|Destroy target creature with power 3 or less.| +Dragonback Assault|Tarkir: Dragonstorm|179|M|{3}{G}{U}{R}|Enchantment|||When this enchantment enters, it deals 3 damage to each creature and each planeswalker.$Landfall -- Whenever a land you control enters, create a 4/4 red Dragon creature token with flying.| +Effortless Master|Tarkir: Dragonstorm|181|U|{2}{U}{R}|Creature - Orc Monk|4|3|Vigilance$Menace$This creature enters with two +1/+1 counters on it if you've cast two or more spells this turn.| +Eshki Dragonclaw|Tarkir: Dragonstorm|182|R|{1}{G}{U}{R}|Legendary Creature - Human Warrior|4|4|Vigilance, trample, ward {1}$At the beginning of combat on your turn, if you've cast both a creature spell and a noncreature spell this turn, draw a card and put two +1/+1 counters on Eshki Dragonclaw.| +Fangkeeper's Familiar|Tarkir: Dragonstorm|183|R|{1}{B}{G}{U}|Creature - Snake|3|3|Flash$When this creature enters, choose one --$* You gain 3 life and surveil 3.$* Destroy target enchantment.$* Counter target creature spell.| +Frostcliff Siege|Tarkir: Dragonstorm|187|R|{1}{U}{R}|Enchantment|||As this enchantment enters, choose Jeskai or Temur.$* Jeskai -- Whenever one or more creatures you control deal combat damage to a player, draw a card.$* Temur -- Creatures you control get +1/+0 and have trample and haste.| +Glacierwood Siege|Tarkir: Dragonstorm|189|R|{1}{G}{U}|Enchantment|||As this enchantment enters, choose Temur or Sultai.$* Temur -- Whenever you cast an instant or sorcery spell, target player mills four cards.$* Sultai -- You may play lands from your graveyard.| +Gurmag Nightwatch|Tarkir: Dragonstorm|190|C|{2/B}{2/G}{2/U}|Creature - Human Ranger|3|3|When this creature enters, look at the top three cards of your library. You may put one of those cards back on top of your library. Put the rest into your graveyard.| +Host of the Hereafter|Tarkir: Dragonstorm|193|U|{2}{B}{G}|Creature - Zombie Warlock|2|2|This creature enters with two +1/+1 counters on it.$Whenever this creature or another creature you control dies, if it had counters on it, put its counters on up to one target creature you control.| Inevitable Defeat|Tarkir: Dragonstorm|194|R|{1}{R}{W}{B}|Instant|||This spell can't be countered.$Exile target nonland permanent. Its controller loses 3 life and you gain 3 life.| +Kishla Skimmer|Tarkir: Dragonstorm|201|U|{G}{U}|Creature - Bird Scout|2|2|Flying$Whenever a card leaves your graveyard during your turn, draw a card. This ability triggers only once each turn.| +Kotis, the Fangkeeper|Tarkir: Dragonstorm|202|R|{1}{B}{G}{U}|Legendary Creature - Zombie Warrior|2|1|Indestructible$Whenever Kotis deals combat damage to a player, exile the top X cards of their library, where X is the amount of damage dealt. You may cast any number of spells with mana value X or less from among them without paying their mana costs.| +Lie in Wait|Tarkir: Dragonstorm|203|U|{B}{G}{U}|Sorcery|||Return target creature card from your graveyard to your hand. Lie in Wait deals damage equal to that card's power to target creature.| +Marshal of the Lost|Tarkir: Dragonstorm|207|U|{2}{W}{B}|Creature - Orc Warrior|3|3|Deathtouch$Whenever you attack, target creature gets +X/+X until end of turn, where X is the number of attacking creatures.| +Monastery Messenger|Tarkir: Dragonstorm|208|C|{2/U}{2/R}{2/W}|Creature - Bird Scout|2|3|Flying, vigilance$When this creature enters, put up to one target noncreature, nonland card from your graveyard on top of your library.| Narset, Jeskai Waymaster|Tarkir: Dragonstorm|209|R|{U}{R}{W}|Legendary Creature - Human Monk|3|4|At the beginning of your end step, you may discard your hand. If you do, draw cards equal to the number of spells you've cast this turn.| +Neriv, Heart of the Storm|Tarkir: Dragonstorm|210|M|{1}{R}{W}{B}|Legendary Creature - Spirit Dragon|4|5|Flying$If a creature you control that entered this turn would deal damage, it deals twice that much damage instead.| +New Way Forward|Tarkir: Dragonstorm|211|R|{2}{U}{R}{W}|Instant|||The next time a source of your choice would deal damage to you this turn, prevent that damage. When damage is prevented this way, New Way Forward deals that much damage to that source's controller and you draw that many cards.| +Perennation|Tarkir: Dragonstorm|212|M|{3}{W}{B}{G}|Sorcery|||Return target permanent card from your graveyard to the battlefield with a hexproof counter and an indestructible counter on it.| +Purging Stormbrood|Tarkir: Dragonstorm|213|U|{4}{B}|Creature - Dragon|4|4|Flying$Ward--Pay 2 life.$When this creature enters, remove all counters from up to one target creature.| +Absorb Essence|Tarkir: Dragonstorm|213|U|{1}{W}|Instant - Omen|4|4|Target creature gets +2/+2 and gains lifelink and hexproof until end of turn.| +Rakshasa's Bargain|Tarkir: Dragonstorm|214|U|{2/B}{2/G}{2/U}|Instant|||Look at the top four cards of your library. Put two of them into your hand and the rest into your graveyard.| +Rediscover the Way|Tarkir: Dragonstorm|215|R|{U}{R}{W}|Enchantment - Saga|||(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)$I, II -- Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.$III -- Whenever you cast a noncreature spell this turn, target creature you control gains double strike until end of turn.| +Reigning Victor|Tarkir: Dragonstorm|216|C|{2/R}{2/W}{2/B}|Creature - Orc Warrior|3|3|Mobilize 1$When this creature enters, target creature gets +1/+0 and gains indestructible until end of turn.| +Riverwheel Sweep|Tarkir: Dragonstorm|219|U|{2/U}{2/R}{2/W}|Sorcery|||Tap target creature. Put three stun counters on it.$Exile the top two cards of your library. Choose one of them. Until the end of your next turn, you may play that card.| +Runescale Stormbrood|Tarkir: Dragonstorm|221|U|{3}{R}|Creature - Dragon|2|4|Flying$Whenever you cast a noncreature spell or a Dragon spell, this creature gets +2/+0 until end of turn.| +Chilling Screech|Tarkir: Dragonstorm|221|U|{1}{U}|Instant - Omen|2|4|Counter target spell with mana value 2 or less.| +Severance Priest|Tarkir: Dragonstorm|222|R|{W}{B}{G}|Creature - Djinn Cleric|3|3|Deathtouch$When this creature enters, target opponent reveals their hand. You may choose a nonland card from it. If you do, exile that card.$When this creature leaves the battlefield, the exiled card's owner creates an X/X white Spirit creature token, where X is the mana value of the exiled card.| Shiko, Paragon of the Way|Tarkir: Dragonstorm|223|M|{2}{U}{R}{W}|Legendary Creature - Spirit Dragon|4|5|Flying, vigilance$When Shiko enters, exile target nonland card with mana value 3 or less from your graveyard. Copy it, then you may cast the copy without paying its mana cost.| Skirmish Rhino|Tarkir: Dragonstorm|224|U|{W}{B}{G}|Creature - Rhino|3|4|Trample$When this creature enters, each opponent loses 2 life and you gain 2 life.| +Sonic Shrieker|Tarkir: Dragonstorm|226|U|{2}{R}{W}{B}|Creature - Dragon|4|4|Flying$When this creature enters, it deals 2 damage to any target and you gain 2 life. If a player is dealt damage this way, they discard a card.| +Stalwart Successor|Tarkir: Dragonstorm|227|U|{1}{B}{G}|Creature - Human Warrior|3|2|Menace$Whenever one or more counters are put on a creature you control, if it's the first time counters have been put on that creature this turn, put a +1/+1 counter on that creature.| +Temur Battlecrier|Tarkir: Dragonstorm|228|R|{G}{U}{R}|Creature - Orc Ranger|4|3|During your turn, spells you cast cost {1} less to cast for each creature you control with power 4 or greater.| +Teval, Arbiter of Virtue|Tarkir: Dragonstorm|230|M|{2}{B}{G}{U}|Legendary Creature - Spirit Dragon|6|6|Flying, lifelink$Spells you cast have delve.$Whenever you cast a spell, you lose life equal to its mana value.| +Twinmaw Stormbrood|Tarkir: Dragonstorm|232|U|{5}{W}|Creature - Dragon|5|4|Flying$When this creature enters, you gain 5 life.| +Charring Bite|Tarkir: Dragonstorm|232|U|{1}{R}|Sorcery - Omen|5|4|Charring Bite deals 5 damage to target creature without flying.| +Ureni, the Song Unending|Tarkir: Dragonstorm|233|M|{5}{G}{U}{R}|Legendary Creature - Spirit Dragon|10|10|Flying, protection from white and from black$When Ureni enters, it deals X damage divided as you choose among any number of target creatures and/or planeswalkers your opponents control, where X is the number of lands you control.| +Whirlwing Stormbrood|Tarkir: Dragonstorm|234|U|{4}{U}|Creature - Dragon|4|3|Flash$Flying$You may cast sorcery spells and Dragon spells as though they had flash.| +Dynamic Soar|Tarkir: Dragonstorm|234|U|{2}{G}|Sorcery - Omen|4|3|Put three +1/+1 counters on target creature you control.| +Yathan Roadwatcher|Tarkir: Dragonstorm|236|R|{1}{W}{B}{G}|Creature - Human Scout|3|3|When this creature enters, if you cast it, mill four cards. When you do, return target creature card with mana value 3 or less from your graveyard to the battlefield.| +Zurgo, Thunder's Decree|Tarkir: Dragonstorm|237|R|{R}{W}{B}|Legendary Creature - Orc Warrior|2|4|Mobilize 2$During your end step, Warrior tokens you control have "This token can't be sacrificed."| +Abzan Monument|Tarkir: Dragonstorm|238|U|{2}|Artifact|||When this artifact enters, search your library for a basic Plains, Swamp, or Forest card, reveal it, put it into your hand, then shuffle.${1}{W}{B}{G}, {T}, Sacrifice this artifact: Create an X/X white Spirit creature token, where X is the greatest toughness among creatures you control. Activate only as a sorcery.| +Boulderborn Dragon|Tarkir: Dragonstorm|239|C|{5}|Artifact Creature - Dragon|3|3|Flying, vigilance$Whenever this creature attacks, surveil 1.| +Embermouth Sentinel|Tarkir: Dragonstorm|242|C|{2}|Artifact Creature - Chimera|2|1|When this creature enters, you may search your library for a basic land card, reveal it, then shuffle and put that card on top. If you control a Dragon, put that card onto the battlefield tapped instead.| +Jade-Cast Sentinel|Tarkir: Dragonstorm|243|C|{4}|Artifact Creature - Ape Snake|1|5|Reach${2}, {T}: Put target card from a graveyard on the bottom of its owner's library.| +Jeskai Monument|Tarkir: Dragonstorm|244|U|{2}|Artifact|||When this artifact enters, search your library for a basic Island, Mountain, or Plains card, reveal it, put it into your hand, then shuffle.${1}{U}{R}{W}, {T}, Sacrifice this artifact: Create two 1/1 white Bird creature tokens with flying. Activate only as a sorcery.| +Mardu Monument|Tarkir: Dragonstorm|245|U|{2}|Artifact|||When this artifact enters, search your library for a basic Mountain, Plains, or Swamp card, reveal it, put it into your hand, then shuffle.${2}{R}{W}{B}, {T}, Sacrifice this artifact: Create three 1/1 red Warrior creature tokens. They gain menace and haste until end of turn. Activate only as a sorcery.| Mox Jasper|Tarkir: Dragonstorm|246|M|{0}|Legendary Artifact|||{T}: Add one mana of any color. Activate only if you control a Dragon.| +Sultai Monument|Tarkir: Dragonstorm|247|U|{2}|Artifact|||When this artifact enters, search your library for a basic Swamp, Forest, or Island card, reveal it, put it into your hand, then shuffle.${2}{B}{G}{U}, {T}, Sacrifice this artifact: Create two 2/2 black Zombie Druid creature tokens. Activate only as a sorcery.| +Temur Monument|Tarkir: Dragonstorm|248|U|{2}|Artifact|||When this artifact enters, search your library for a basic Forest, Island, or Mountain card, reveal it, put it into your hand, then shuffle.${3}{G}{U}{R}, {T}, Sacrifice this artifact: Create a 5/5 green Elephant creature token. Activate only as a sorcery.| +Watcher of the Wayside|Tarkir: Dragonstorm|249|C|{3}|Artifact Creature - Golem|3|2|When this creature enters, target player mills two cards. You gain 2 life.| +Bloodfell Caves|Tarkir: Dragonstorm|250|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {B} or {R}.| +Blossoming Sands|Tarkir: Dragonstorm|251|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {G} or {W}.| +Cori Mountain Monastery|Tarkir: Dragonstorm|252|R||Land|||This land enters tapped unless you control a Plains or an Island.${T}: Add {R}.${3}{R}, {T}: Exile the top card of your library. Until the end of your next turn, you may play that card.| +Dalkovan Encampment|Tarkir: Dragonstorm|253|R||Land|||This land enters tapped unless you control a Swamp or a Mountain.${T}: Add {W}.${2}{W}, {T}: Whenever you attack this turn, create two 1/1 red Warrior creature tokens that are tapped and attacking. Sacrifice them at the beginning of the next end step.| +Dismal Backwater|Tarkir: Dragonstorm|254|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {U} or {B}.| +Evolving Wilds|Tarkir: Dragonstorm|255|C||Land|||{T}, Sacrifice this land: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| +Frontier Bivouac|Tarkir: Dragonstorm|256|U||Land|||This land enters tapped.${T}: Add {G}, {U}, or {R}.| +Great Arashin City|Tarkir: Dragonstorm|257|R||Land|||This land enters tapped unless you control a Forest or a Plains.${T}: Add {B}.${1}{B}, {T}, Exile a creature card from your graveyard: Create a 1/1 white Spirit creature token.| +Jungle Hollow|Tarkir: Dragonstorm|258|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {B} or {G}.| +Kishla Village|Tarkir: Dragonstorm|259|R||Land|||This land enters tapped unless you control an Island or a Swamp.${T}: Add {G}.${3}{G}, {T}: Surveil 2.| +Maelstrom of the Spirit Dragon|Tarkir: Dragonstorm|260|R||Land|||{T}: Add {C}.${T}: Add one mana of any color. Spend this mana only to cast a Dragon spell or an Omen spell.${4}, {T}, Sacrifice this land: Search your library for a Dragon card, reveal it, put it into your hand, then shuffle.| +Mistrise Village|Tarkir: Dragonstorm|261|R||Land|||This land enters tapped unless you control a Mountain or a Forest.${T}: Add {U}.${U}, {T}: The next spell you cast this turn can't be countered.| +Mystic Monastery|Tarkir: Dragonstorm|262|U||Land|||This land enters tapped.${T}: Add {U}, {R}, or {W}.| +Nomad Outpost|Tarkir: Dragonstorm|263|U||Land|||This land enters tapped.${T}: Add {R}, {W}, or {B}.| +Opulent Palace|Tarkir: Dragonstorm|264|U||Land|||This land enters tapped.${T}: Add {B}, {G}, or {U}.| +Rugged Highlands|Tarkir: Dragonstorm|265|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {R} or {G}.| +Sandsteppe Citadel|Tarkir: Dragonstorm|266|U||Land|||This land enters tapped.${T}: Add {W}, {B}, or {G}.| +Scoured Barrens|Tarkir: Dragonstorm|267|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {W} or {B}.| +Swiftwater Cliffs|Tarkir: Dragonstorm|268|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {U} or {R}.| +Thornwood Falls|Tarkir: Dragonstorm|269|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {G} or {U}.| +Tranquil Cove|Tarkir: Dragonstorm|270|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {W} or {U}.| +Wind-Scarred Crag|Tarkir: Dragonstorm|271|C||Land|||This land enters tapped.$When this land enters, you gain 1 life.${T}: Add {R} or {W}.| +Plains|Tarkir: Dragonstorm|277|C||Basic Land - Plains|||({T}: Add {W}.)| +Island|Tarkir: Dragonstorm|279|C||Basic Land - Island|||({T}: Add {U}.)| +Swamp|Tarkir: Dragonstorm|281|C||Basic Land - Swamp|||({T}: Add {B}.)| +Mountain|Tarkir: Dragonstorm|283|C||Basic Land - Mountain|||({T}: Add {R}.)| +Forest|Tarkir: Dragonstorm|285|C||Basic Land - Forest|||({T}: Add {G}.)| +Strategic Betrayal|Tarkir: Dragonstorm|422|U|{1}{B}|Sorcery|||Target opponent exiles a creature they control and their graveyard.| +Channeled Dragonfire|Tarkir: Dragonstorm|423|U|{R}|Sorcery|||Channeled Dragonfire deals 2 damage to any target.$Harmonize {5}{R}{R}| +Encroaching Dragonstorm|Tarkir: Dragonstorm|424|U|{3}{G}|Enchantment|||When this enchantment enters, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.$When a Dragon you control enters, return this enchantment to its owner's hand.| +Betor, Ancestor's Voice|Tarkir: Dragonstorm Commander|1|M|{2}{W}{B}{G}|Legendary Creature - Spirit Dragon|3|5|Flying, lifelink$At the beginning of your end step, put a number of +1/+1 counters on up to one other target creature you control equal to the amount of life you gained this turn. Return up to one target creature card with mana value less than or equal to the amount of life you lost this turn from your graveyard to the battlefield.| +Elsha, Threefold Master|Tarkir: Dragonstorm Commander|2|M|{U}{R}{W}|Legendary Creature - Djinn Monk|1|1|Trample$Prowess$Whenever Elsha deals combat damage to a player, create that many 1/1 white Monk creature tokens with prowess.| +Eshki, Temur's Roar|Tarkir: Dragonstorm Commander|3|M|{G}{U}{R}|Legendary Creature - Human Warrior|2|2|Whenever you cast a creature spell, put a +1/+1 counter on Eshki. If that spell's power is 4 or greater, draw a card. If that spell's power is 6 or greater, Eshki deals damage equal to Eshki's power to each opponent.| +Felothar the Steadfast|Tarkir: Dragonstorm Commander|4|M|{1}{W}{B}{G}|Legendary Creature - Human Warrior|0|5|Each creature you control assigns combat damage equal to its toughness rather than its power.$Creatures you control can attack as though they didn't have defender.${3}, {T}, Sacrifice another creature: Draw cards equal to the sacrificed creature's toughness, then discard cards equal to its power.| +Kotis, Sibsig Champion|Tarkir: Dragonstorm Commander|5|M|{B}{G}{U}|Legendary Creature - Zombie Warrior|3|3|Once during each of your turns, you may cast a creature spell from your graveyard by exiling three other cards from your graveyard in addition to paying its other costs.$Whenever one or more creatures you control enter, if one or more of them entered from a graveyard or was cast from a graveyard, put two +1/+1 counters on Kotis.| +Neriv, Crackling Vanguard|Tarkir: Dragonstorm Commander|6|M|{2}{R}{W}{B}|Legendary Creature - Spirit Dragon|4|4|Flying, deathtouch$When Neriv enters, create two 1/1 red Goblin creature tokens.$Whenever Neriv attacks, exile a number of cards from the top of your library equal to the number of differently named tokens you control. During any turn you attacked with a commander, you may play those cards.| +Shiko and Narset, Unified|Tarkir: Dragonstorm Commander|7|M|{1}{U}{R}{W}|Legendary Creature - Human Spirit Dragon|4|4|Flying, vigilance$Flurry -- Whenever you cast your second spell each turn, copy that spell if it targets a permanent or player, and you may choose new targets for the copy. If you don't copy a spell this way, draw a card.| Teval, the Balanced Scale|Tarkir: Dragonstorm Commander|8|M|{1}{B}{G}{U}|Legendary Creature - Spirit Dragon|4|4|Flying$Whenever Teval attacks, mill three cards. Then you may return a land card from your graveyard to the battlefield tapped.$Whenever one or more cards leave your graveyard, create a 2/2 black Zombie Druid creature token.| -Betor, Ancestor's Voice|Tarkir: Dragonstorm Commander|1|M|{2}{W}{B}{G}|Legendary Creature - Spirit Dragon|3|5|Flying, lifelink$At the beginning of your end step, put a number of +1/+1 counters on up to one other target creature you control equal to the amount of life you gained this turn. Return up to one target creature card with mana value less than or equal to the amount of life you lost this turn from your graveyard to the battlefield. +Ureni of the Unwritten|Tarkir: Dragonstorm Commander|9|M|{4}{G}{U}{R}|Legendary Creature - Spirit Dragon|7|7|Flying, trample$Whenever Ureni enters or attacks, look at the top eight cards of your library. You may put a Dragon creature card from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| +Zurgo Stormrender|Tarkir: Dragonstorm Commander|10|M|{R}{W}{B}|Legendary Creature - Orc Warrior|3|3|Mobilize 1$Whenever a creature token you control leaves the battlefield, draw a card if it was attacking. Otherwise, each opponent loses 1 life.| +Ainok Strike Leader|Tarkir: Dragonstorm Commander|11|R|{1}{W}|Creature - Dog Warrior|2|2|Whenever you attack with this creature and/or your commander, for each opponent, create a 1/1 red Goblin creature token that's tapped and attacking that player.$Sacrifice this creature: Creature tokens you control gain indestructible until end of turn.| +Aligned Heart|Tarkir: Dragonstorm Commander|12|R|{2}{W}|Enchantment|||Flurry -- Whenever you cast your second spell each turn, put a rally counter on this enchantment. Then create a 1/1 white Monk creature token with prowess for each rally counter on it.| +Ironwill Forger|Tarkir: Dragonstorm Commander|13|R|{3}{W}|Creature - Orc Artificer|3|3|Lieutenant -- At the beginning of combat on your turn, if you control your commander, target nonlegendary creature you control gains myriad until end of turn.| +Tempest Technique|Tarkir: Dragonstorm Commander|16|R|{3}{W}|Enchantment - Aura|||Storm$Enchant creature you control$Enchanted creature gets +1/+1 for each enchantment you control.| +Will of the Mardu|Tarkir: Dragonstorm Commander|17|R|{2}{W}|Instant|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Create a number of 1/1 red Warrior creature tokens equal to the number of creatures target player controls.$* Will of the Mardu deals damage to target creature equal to the number of creatures you control.| +Adaptive Training Post|Tarkir: Dragonstorm Commander|18|R|{2}{U}|Artifact|||Whenever you cast an instant or sorcery spell, if this artifact has fewer than three charge counters on it, put a charge counter on it.$Remove three charge counters from this artifact: When you next cast an instant or sorcery spell this turn, copy it and you may choose new targets for the copy.| +Diviner of Mist|Tarkir: Dragonstorm Commander|20|R|{4}{U}|Creature - Dragon|4|5|Flying$Whenever this creature attacks, mill four cards. You may cast an instant or sorcery spell from your graveyard with mana value 4 or less without paying its mana cost. If that spell would be put into your graveyard, exile it instead.| +Transcendent Dragon|Tarkir: Dragonstorm Commander|22|R|{4}{U}{U}|Creature - Dragon|4|3|Flash$Flying$When this creature enters, if you cast it, counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard, then you may cast it without paying its mana cost.| +Voracious Bibliophile|Tarkir: Dragonstorm Commander|23|R|{3}{U}|Creature - Dragon|3|3|Flying, vigilance$Whenever you cast a spell with one or more targets, draw that many cards.| +Afterlife from the Loam|Tarkir: Dragonstorm Commander|25|R|{5}{B}{B}{B}|Sorcery|||Delve$For each player, choose up to one target creature card in that player's graveyard. Put those cards onto the battlefield under your control. They're Zombies in addition to their other types.| +Bone Devourer|Tarkir: Dragonstorm Commander|26|R|{3}{B}|Creature - Dragon|2|2|Flash$Flying$This creature enters with a number of +1/+1 counters on it equal to the number of creatures that died this turn.$When this creature dies, you draw X cards and you lose X life, where X is the number of +1/+1 counters on it.| +Teval's Judgment|Tarkir: Dragonstorm Commander|28|R|{2}{B}|Enchantment|||Whenever one or more cards leave your graveyard, choose one that hasn't been chosen this turn --$* Draw a card.$* Create a Treasure token.$* Create a 2/2 black Zombie Druid creature token.| +Welcome the Dead|Tarkir: Dragonstorm Commander|30|R|{3}{B}|Sorcery|||Draw two cards, then discard a card and you lose 2 life. Create X tapped 2/2 black Zombie Druid creature tokens, where X is the number of cards that were put into your graveyard from your hand or library this turn.$Flashback {5}{B}| +Within Range|Tarkir: Dragonstorm Commander|32|R|{3}{B}|Enchantment|||When this enchantment enters, create two 1/1 red Warrior creature tokens.$Whenever you attack, each opponent loses life equal to the number of creatures attacking them.| +Caldera Pyremaw|Tarkir: Dragonstorm Commander|33|R|{3}{R}{R}|Creature - Dragon|3|3|Flying$Whenever you cast an instant or sorcery spell, put a +1/+1 counter on this creature. Then this creature deals damage equal to its power to target opponent.| +Goldlust Triad|Tarkir: Dragonstorm Commander|34|R|{4}{R}|Creature - Dragon|4|3|Flying$Myriad$Whenever this creature deals combat damage to a player, create a Treasure token.| +Infantry Shield|Tarkir: Dragonstorm Commander|35|R|{2}{R}|Artifact - Equipment|||Equipped creature has menace and mobilize X, where X is its power.$Equip {2}| +Redoubled Stormsinger|Tarkir: Dragonstorm Commander|37|R|{2}{R}|Creature - Orc Wizard|3|3|First strike$Whenever this creature attacks, for each creature token you control that entered this turn, create a tapped and attacking token that's a copy of that token. At the beginning of the next end step, sacrifice those tokens.| +Transforming Flourish|Tarkir: Dragonstorm Commander|39|R|{2}{R}|Instant|||Demonstrate$Destroy target artifact or creature you don't control. If that permanent is destroyed this way, its controller exiles cards from the top of their library until they exile a nonland card, then they may cast that card without paying its mana cost.| +Will of the Jeskai|Tarkir: Dragonstorm Commander|40|R|{3}{R}|Sorcery|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Each player may discard their hand and draw five cards.$* Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.| +Floral Evoker|Tarkir: Dragonstorm Commander|46|R|{2}{G}|Creature - Snake Druid|2|3|Landfall -- Whenever a land you control enters, put a+1/+1 counter on this creature.${G}, Discard a creature card: Return target land card from your graveyard to the battlefield tapped.| +Steward of the Harvest|Tarkir: Dragonstorm Commander|48|R|{3}{G}|Creature - Human Druid|3|3|When this creature enters, exile up to three target land cards from your graveyard.$Creatures you control have all activated abilities of all land cards exiled with this creature.| +Will of the Sultai|Tarkir: Dragonstorm Commander|49|R|{4}{G}|Sorcery|||Choose one. If you control a commander as you cast this spell, you may choose both instead.$* Target player mills three cards. Return all land cards from your graveyard to the battlefield tapped.$* Put X+1/+1 counters on target creature, where X is the number of lands you control. It gains trample until end of turn.| +Colossal Grave-Reaver|Tarkir: Dragonstorm Commander|50|R|{6}{B}{G}|Creature - Dragon|7|6|Flying$Whenever this creature enters or attacks, mill three cards.$Whenever one or more creature cards are put into your graveyard from your library, put one of them onto the battlefield.| +Vanquish the Horde|Tarkir: Dragonstorm Commander|91|R|{6}{W}{W}|Sorcery|||This spell costs {1} less to cast for each creature on the battlefield.$Destroy all creatures.| +Narset's Reversal|Tarkir: Dragonstorm Commander|92|R|{U}{U}|Instant|||Copy target instant or sorcery spell, then return it to its owner's hand. You may choose new targets for the copy.| +Gravecrawler|Tarkir: Dragonstorm Commander|93|C|{B}|Creature - Zombie|2|1|This creature can't block.$You may cast this card from your graveyard as long as you control a Zombie.| +Young Pyromancer|Tarkir: Dragonstorm Commander|95|U|{1}{R}|Creature - Human Shaman|2|1|Whenever you cast an instant or sorcery spell, create a 1/1 red Elemental creature token.| +Life from the Loam|Tarkir: Dragonstorm Commander|96|R|{1}{G}|Sorcery|||Return up to three target land cards from your graveyard to your hand.$Dredge 3| +Casualties of War|Tarkir: Dragonstorm Commander|98|C|{2}{B}{B}{G}{G}|Sorcery|||Choose one or more --$* Destroy target artifact.$* Destroy target creature.$* Destroy target enchantment.$* Destroy target land.$* Destroy target planeswalker.| +Goblin Electromancer|Tarkir: Dragonstorm Commander|99|C|{U}{R}|Creature - Goblin Wizard|2|2|Instant and sorcery spells you cast cost {1} less to cast.| +Shadow Summoning|Tarkir: Dragonstorm Commander|101|U|{W}{B}|Sorcery|||Create two tapped 1/1 white Spirit creature tokens with flying.| +Lightning Greaves|Tarkir: Dragonstorm Commander|102|U|{2}|Artifact - Equipment|||Equipped creature has haste and shroud.$Equip {0}| +Skullclamp|Tarkir: Dragonstorm Commander|103|U|{1}|Artifact - Equipment|||Equipped creature gets +1/-1.$Whenever equipped creature dies, draw two cards.$Equip {1}| +Arcane Signet|Tarkir: Dragonstorm Commander|105|U|{2}|Artifact|||{T}: Add one mana of any color in your commander's color identity.| +Sol Ring|Tarkir: Dragonstorm Commander|106|U|{1}|Artifact|||{T}: Add {C}{C}.| +Command Tower|Tarkir: Dragonstorm Commander|107|C||Land|||{T}: Add one mana of any color in your commander's color identity.| +Adeline, Resplendent Cathar|Tarkir: Dragonstorm Commander|108|R|{1}{W}{W}|Legendary Creature - Human Knight|*|4|Vigilance$Adeline's power is equal to the number of creatures you control.$Whenever you attack, for each opponent, create a 1/1 white Human creature token that's tapped and attacking that player or a planeswalker they control.| +Angel of Invention|Tarkir: Dragonstorm Commander|109|M|{3}{W}{W}|Creature - Angel|2|1|Flying, vigilance, lifelink$Fabricate 2$Other creatures you control get +1/+1.| +Commander's Insignia|Tarkir: Dragonstorm Commander|111|R|{2}{W}{W}|Enchantment|||Creatures you control get +1/+1 for each time you've cast your commander from the command zone this game.| +Dismantling Wave|Tarkir: Dragonstorm Commander|112|R|{2}{W}|Sorcery|||For each opponent, destroy up to one target artifact or enchantment that player controls.$Cycling {6}{W}{W}$When you cycle this card, destroy all artifacts and enchantments.| +Divine Visitation|Tarkir: Dragonstorm Commander|113|M|{3}{W}{W}|Enchantment|||If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead.| +Emeria Angel|Tarkir: Dragonstorm Commander|114|R|{2}{W}{W}|Creature - Angel|3|3|Flying$Landfall -- Whenever a land you control enters, you may create a 1/1 white Bird creature token with flying.| +Ghostly Prison|Tarkir: Dragonstorm Commander|116|U|{2}{W}|Enchantment|||Creatures can't attack you unless their controller pays {2} for each creature they control that's attacking you.| +Goldnight Commander|Tarkir: Dragonstorm Commander|117|U|{3}{W}|Creature - Human Cleric Soldier|2|2|Whenever another creature you control enters, creatures you control get +1/+1 until end of turn.| +Grand Crescendo|Tarkir: Dragonstorm Commander|118|R|{X}{W}{W}|Instant|||Create X 1/1 green and white Citizen creature tokens. Creatures you control gain indestructible until end of turn.| +Hero of Bladehold|Tarkir: Dragonstorm Commander|119|M|{2}{W}{W}|Creature - Human Knight|3|4|Battle cry$Whenever this creature attacks, create two 1/1 white Soldier creature tokens that are tapped and attacking.| +Hour of Reckoning|Tarkir: Dragonstorm Commander|120|R|{4}{W}{W}{W}|Sorcery|||Convoke$Destroy all nontoken creatures.| +Legion Loyalty|Tarkir: Dragonstorm Commander|122|M|{6}{W}{W}|Enchantment|||Creatures you control have myriad.| +Lingering Souls|Tarkir: Dragonstorm Commander|123|U|{2}{W}|Sorcery|||Create two 1/1 white Spirit creature tokens with flying.$Flashback {1}{B}| +Mangara, the Diplomat|Tarkir: Dragonstorm Commander|124|R|{3}{W}|Legendary Creature - Human Cleric|2|4|Lifelink$Whenever an opponent attacks with creatures, if two or more of those creatures are attacking you and/or planeswalkers you control, draw a card.$Whenever an opponent casts their second spell each turn, draw a card.| +Monastery Mentor|Tarkir: Dragonstorm Commander|125|M|{2}{W}|Creature - Human Monk|2|2|Prowess$Whenever you cast a noncreature spell, create a 1/1 white Monk creature token with prowess.| +Release the Dogs|Tarkir: Dragonstorm Commander|127|U|{3}{W}|Sorcery|||Create four 1/1 white Dog creature tokens.| +Selfless Spirit|Tarkir: Dragonstorm Commander|129|R|{1}{W}|Creature - Spirit Cleric|2|1|Flying$Sacrifice this creature: Creatures you control gain indestructible until end of turn.| +Stroke of Midnight|Tarkir: Dragonstorm Commander|132|U|{2}{W}|Instant|||Destroy target nonland permanent. Its controller creates a 1/1 white Human creature token.| +Sun Titan|Tarkir: Dragonstorm Commander|133|M|{4}{W}{W}|Creature - Giant|6|6|Vigilance$Whenever this creature enters or attacks, you may return target permanent card with mana value 3 or less from your graveyard to the battlefield.| +Swords to Plowshares|Tarkir: Dragonstorm Commander|134|U|{W}|Instant|||Exile target creature. Its controller gains life equal to its power.| +Tocasia's Welcome|Tarkir: Dragonstorm Commander|135|R|{2}{W}|Enchantment|||Whenever one or more creatures you control with mana value 3 or less enter, draw a card. This ability triggers only once each turn.| +Twilight Drover|Tarkir: Dragonstorm Commander|136|R|{2}{W}|Creature - Spirit|1|1|Whenever a creature token leaves the battlefield, put a +1/+1 counter on this creature.${2}{W}, Remove a +1/+1 counter from this creature: Create two 1/1 white Spirit creature tokens with flying.| +Amphin Mutineer|Tarkir: Dragonstorm Commander|143|R|{3}{U}|Creature - Salamander Pirate|3|3|When this creature enters, exile up to one target non-Salamander creature. That creature's controller creates a 4/3 blue Salamander Warrior creature token.$Encore {4}{U}{U}| +Ancestral Vision|Tarkir: Dragonstorm Commander|144|R||Sorcery|||Suspend 4--{U}$Target player draws three cards.| +Archmage Emeritus|Tarkir: Dragonstorm Commander|145|R|{2}{U}{U}|Creature - Human Wizard|2|2|Magecraft -- Whenever you cast or copy an instant or sorcery spell, draw a card.| +Baral's Expertise|Tarkir: Dragonstorm Commander|146|R|{3}{U}{U}|Sorcery|||Return up to three target artifacts and/or creatures to their owners' hands.$You may cast a spell with mana value 4 or less from your hand without paying its mana cost.| +Compulsive Research|Tarkir: Dragonstorm Commander|147|C|{2}{U}|Sorcery|||Target player draws three cards. Then that player discards two cards unless they discard a land card.| +Consider|Tarkir: Dragonstorm Commander|148|C|{U}|Instant|||Surveil 1.$Draw a card.| +Curse of the Swine|Tarkir: Dragonstorm Commander|149|R|{X}{U}{U}|Sorcery|||Exile X target creatures. For each creature exiled this way, its controller creates a 2/2 green Boar creature token.| +Deep Analysis|Tarkir: Dragonstorm Commander|150|C|{3}{U}|Sorcery|||Target player draws two cards.$Flashback--{1}{U}, Pay 3 life.| +Forbidden Alchemy|Tarkir: Dragonstorm Commander|152|C|{2}{U}|Instant|||Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard.$Flashback {6}{B}| +Frantic Search|Tarkir: Dragonstorm Commander|153|C|{2}{U}|Instant|||Draw two cards, then discard two cards. Untap up to three lands.| +Haughty Djinn|Tarkir: Dragonstorm Commander|154|R|{1}{U}{U}|Creature - Djinn|*|4|Flying$Haughty Djinn's power is equal to the number of instant and sorcery cards in your graveyard.$Instant and sorcery spells you cast cost {1} less to cast.| +Hedron Crab|Tarkir: Dragonstorm Commander|155|U|{U}|Creature - Crab|0|2|Landfall -- Whenever a land you control enters, target player mills three cards.| +Lier, Disciple of the Drowned|Tarkir: Dragonstorm Commander|157|M|{3}{U}{U}|Legendary Creature - Human Wizard|3|4|Spells can't be countered.$Each instant and sorcery card in your graveyard has flashback. The flashback cost is equal to that card's mana cost.| +Opt|Tarkir: Dragonstorm Commander|158|C|{U}|Instant|||Scry 1.$Draw a card.| +Ponder|Tarkir: Dragonstorm Commander|159|C|{U}|Sorcery|||Look at the top three cards of your library, then put them back in any order. You may shuffle.$Draw a card.| +Pongify|Tarkir: Dragonstorm Commander|160|U|{U}|Instant|||Destroy target creature. It can't be regenerated. Its controller creates a 3/3 green Ape creature token.| +Preordain|Tarkir: Dragonstorm Commander|161|C|{U}|Sorcery|||Scry 2, then draw a card.| +Rite of Replication|Tarkir: Dragonstorm Commander|165|R|{2}{U}{U}|Sorcery|||Kicker {5}$Create a token that's a copy of target creature. If this spell was kicked, create five of those tokens instead.| +River Kelpie|Tarkir: Dragonstorm Commander|166|R|{3}{U}{U}|Creature - Beast|3|3|Whenever this creature or another permanent enters from a graveyard, draw a card.$Whenever a player casts a spell from a graveyard, draw a card.$Persist| +Sublime Epiphany|Tarkir: Dragonstorm Commander|167|R|{4}{U}{U}|Instant|||Choose one or more --$* Counter target spell.$* Counter target activated or triggered ability.$* Return target nonland permanent to its owner's hand.$* Create a token that's a copy of target creature you control.$* Target player draws a card.| +Think Twice|Tarkir: Dragonstorm Commander|168|C|{1}{U}|Instant|||Draw a card.$Flashback {2}{U}| +Treasure Cruise|Tarkir: Dragonstorm Commander|169|C|{7}{U}|Sorcery|||Delve$Draw three cards.| +Wonder|Tarkir: Dragonstorm Commander|170|U|{3}{U}|Creature - Incarnation|2|2|Flying$As long as this card is in your graveyard and you control an Island, creatures you control have flying.| +Bastion of Remembrance|Tarkir: Dragonstorm Commander|171|U|{2}{B}|Enchantment|||When this enchantment enters, create a 1/1 white Human Soldier creature token.$Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.| +Bitter Triumph|Tarkir: Dragonstorm Commander|173|U|{1}{B}|Instant|||As an additional cost to cast this spell, discard a card or pay 3 life.$Destroy target creature or planeswalker.| +Chittering Witch|Tarkir: Dragonstorm Commander|175|R|{3}{B}|Creature - Human Warlock|2|2|When this creature enters, 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.| +Dauthi Voidwalker|Tarkir: Dragonstorm Commander|176|R|{B}{B}|Creature - Dauthi Rogue|3|2|Shadow$If a card would be put into an opponent's graveyard from anywhere, instead exile it with a void counter on it.${T}, Sacrifice this creature: Choose an exiled card an opponent owns with a void counter on it. You may play it this turn without paying its mana cost.| +Deadly Dispute|Tarkir: Dragonstorm Commander|177|C|{1}{B}|Instant|||As an additional cost to cast this spell, sacrifice an artifact or creature.$Draw two cards and create a Treasure token.| +Disciple of Bolas|Tarkir: Dragonstorm Commander|178|R|{3}{B}|Creature - Human Wizard|2|1|When this creature enters, sacrifice another creature. You gain X life and draw X cards, where X is that creature's power.| +Eliminate the Competition|Tarkir: Dragonstorm Commander|179|R|{4}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice X creatures.$Destroy X target creatures.| +Gix, Yawgmoth Praetor|Tarkir: Dragonstorm Commander|181|M|{1}{B}{B}|Legendary Creature - Phyrexian Praetor|3|3|Whenever a creature deals combat damage to one of your opponents, its controller may pay 1 life. If they do, they draw a card.${4}{B}{B}{B}, Discard X cards: Exile the top X cards of target opponent's library. You may play lands and cast spells from among cards exiled this way without paying their mana costs.| +Junji, the Midnight Sky|Tarkir: Dragonstorm Commander|183|M|{3}{B}{B}|Legendary Creature - Dragon Spirit|5|5|Flying, menace$When Junji dies, choose one --$* Each opponent discards two cards and loses 2 life.$* Put target non-Dragon creature card from a graveyard onto the battlefield under your control. You lose 2 life.| +Lethal Scheme|Tarkir: Dragonstorm Commander|184|R|{2}{B}{B}|Instant|||Convoke$Destroy target creature or planeswalker. Each creature that convoked Lethal Scheme connives.| +Living Death|Tarkir: Dragonstorm Commander|185|R|{3}{B}{B}|Sorcery|||Each player exiles all creature cards from their graveyard, then sacrifices all creatures they control, then puts all cards they exiled this way onto the battlefield.| +Lord of the Forsaken|Tarkir: Dragonstorm Commander|186|M|{4}{B}{B}|Creature - Demon|6|6|Flying, trample${B}, Sacrifice another creature: Target player mills three cards.$Pay 1 life: Add {C}. Spend this mana only to cast a spell from your graveyard.| +Mindblade Render|Tarkir: Dragonstorm Commander|187|R|{1}{B}|Creature - Azra Warrior|1|3|Whenever your opponents are dealt combat damage, if any of that damage was dealt by a Warrior, you draw a card and you lose 1 life.| +Morbid Opportunist|Tarkir: Dragonstorm Commander|188|U|{2}{B}|Creature - Human Rogue|1|3|Whenever one or more other creatures die, draw a card. This ability triggers only once each turn.| +Necromantic Selection|Tarkir: Dragonstorm Commander|189|R|{4}{B}{B}{B}|Sorcery|||Destroy all creatures, then return a creature card put into a graveyard this way to the battlefield under your control. It's a black Zombie in addition to its other colors and types. Exile Necromantic Selection.| +Necropolis Fiend|Tarkir: Dragonstorm Commander|190|R|{7}{B}{B}|Creature - Demon|4|5|Delve$Flying${X}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn.| +Noxious Gearhulk|Tarkir: Dragonstorm Commander|191|M|{4}{B}{B}|Artifact Creature - Construct|5|4|Menace$When this creature enters, you may destroy another target creature. If a creature is destroyed this way, you gain life equal to its toughness.| +Ob Nixilis, the Fallen|Tarkir: Dragonstorm Commander|192|M|{3}{B}{B}|Legendary Creature - Demon|3|3|Landfall -- Whenever a land you control enters, you may have target player lose 3 life. If you do, put three +1/+1 counters on Ob Nixilis.| +Ophiomancer|Tarkir: Dragonstorm Commander|193|R|{2}{B}|Creature - Human Shaman|2|2|At the beginning of each upkeep, if you control no Snakes, create a 1/1 black Snake creature token with deathtouch.| +Phyrexian Reclamation|Tarkir: Dragonstorm Commander|194|U|{B}|Enchantment|||{1}{B}, Pay 2 life: Return target creature card from your graveyard to your hand.| +Reassembling Skeleton|Tarkir: Dragonstorm Commander|195|U|{1}{B}|Creature - Skeleton Warrior|1|1|{1}{B}: Return this card from your graveyard to the battlefield tapped.| +Stitcher's Supplier|Tarkir: Dragonstorm Commander|196|U|{B}|Creature - Zombie|1|1|When this creature enters or dies, mill three cards.| +Tasigur, the Golden Fang|Tarkir: Dragonstorm Commander|197|R|{5}{B}|Legendary Creature - Human Shaman|4|5|Delve${2}{G/U}{G/U}: Mill two cards, then return a nonland card of an opponent's choice from your graveyard to your hand.| +Victimize|Tarkir: Dragonstorm Commander|198|U|{2}{B}|Sorcery|||Choose two target creature cards in your graveyard. Sacrifice a creature. If you do, return the chosen cards to the battlefield tapped.| +Woe Strider|Tarkir: Dragonstorm Commander|201|R|{2}{B}|Creature - Horror|3|2|When this creature enters, create a 0/1 white Goat creature token.$Sacrifice another creature: Scry 1.$Escape--{3}{B}{B}, Exile four other cards from your graveyard.$This creature escapes with two +1/+1 counters on it.| +Yahenni, Undying Partisan|Tarkir: Dragonstorm Commander|202|R|{2}{B}|Legendary Creature - Aetherborn Vampire|2|2|Haste$Whenever a creature an opponent controls dies, put a +1/+1 counter on Yahenni.$Sacrifice another creature: Yahenni gains indestructible until end of turn.| +Abrade|Tarkir: Dragonstorm Commander|203|U|{1}{R}|Instant|||Choose one --$* Abrade deals 3 damage to target creature.$* Destroy target artifact.| +Beetleback Chief|Tarkir: Dragonstorm Commander|205|U|{2}{R}{R}|Creature - Goblin Warrior|2|2|When this creature enters, create two 1/1 red Goblin creature tokens.| +Big Score|Tarkir: Dragonstorm Commander|206|C|{3}{R}|Instant|||As an additional cost to cast this spell, discard a card.$Draw two cards and create two Treasure tokens.| +Curse of Opulence|Tarkir: Dragonstorm Commander|209|U|{R}|Enchantment - Aura Curse|||Enchant player$Whenever enchanted player is attacked, create a Gold token. Each opponent attacking that player does the same.| +Electrodominance|Tarkir: Dragonstorm Commander|212|R|{X}{R}{R}|Instant|||Electrodominance deals X damage to any target. You may cast a spell with mana value X or less from your hand without paying its mana cost.| +Faithless Looting|Tarkir: Dragonstorm Commander|213|C|{R}|Sorcery|||Draw two cards, then discard two cards.$Flashback {2}{R}| +Grenzo, Havoc Raiser|Tarkir: Dragonstorm Commander|216|R|{R}{R}|Legendary Creature - Goblin Rogue|2|2|Whenever a creature you control deals combat damage to a player, choose one --$* Goad target creature that player controls.$* Exile the top card of that player's library. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast that spell.| +Guttersnipe|Tarkir: Dragonstorm Commander|217|U|{2}{R}|Creature - Goblin Shaman|2|2|Whenever you cast an instant or sorcery spell, this creature deals 2 damage to each opponent.| +Legion Warboss|Tarkir: Dragonstorm Commander|220|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| +Loyal Apprentice|Tarkir: Dragonstorm Commander|222|U|{1}{R}|Creature - Human Artificer|2|1|Haste$Lieutenant -- At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn.| +Mana Geyser|Tarkir: Dragonstorm Commander|223|C|{3}{R}{R}|Sorcery|||Add {R} for each tapped land your opponents control.| +Manaform Hellkite|Tarkir: Dragonstorm Commander|224|M|{2}{R}{R}|Creature - Dragon|4|4|Flying$Whenever you cast a noncreature spell, create an X/X red Dragon Illusion creature token with flying and haste, where X is the amount of mana spent to cast that spell. Exile that token at the beginning of the next end step.| +Ogre Battledriver|Tarkir: Dragonstorm Commander|227|R|{2}{R}{R}|Creature - Ogre Warrior|3|3|Whenever another creature you control enters, that creature gets +2/+0 and gains haste until end of turn.| +Shiny Impetus|Tarkir: Dragonstorm Commander|231|C|{2}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+2 and is goaded.$Whenever enchanted creature attacks, you create a Treasure token.| +Siege-Gang Commander|Tarkir: Dragonstorm Commander|232|R|{3}{R}{R}|Creature - Goblin|2|2|When this creature enters, create three 1/1 red Goblin creature tokens.${1}{R}, Sacrifice a Goblin: This creature deals 2 damage to any target.| +Storm-Kiln Artist|Tarkir: Dragonstorm Commander|235|U|{3}{R}|Creature - Dwarf Shaman|2|2|This creature gets +1/+0 for each artifact you control.$Magecraft -- Whenever you cast or copy an instant or sorcery spell, create a Treasure token.| +Tempt with Vengeance|Tarkir: Dragonstorm Commander|239|R|{X}{R}|Sorcery|||Tempting offer -- Create X 1/1 red Elemental creature tokens with haste. Each opponent may create X 1/1 red Elemental creature tokens with haste. For each opponent who does, create X 1/1 red Elemental creature tokens with haste.| +Avenger of Zendikar|Tarkir: Dragonstorm Commander|247|M|{5}{G}{G}|Creature - Elemental|5|5|When this creature enters, create a 0/1 green Plant creature token for each land you control.$Landfall -- Whenever a land you control enters, you may put a +1/+1 counter on each Plant creature you control.| +Conduit of Worlds|Tarkir: Dragonstorm Commander|251|R|{2}{G}{G}|Artifact|||You may play lands from your graveyard.${T}: Choose target nonland permanent card in your graveyard. If you haven't cast a spell this turn, you may cast that card. If you do, you can't cast additional spells this turn. Activate only as a sorcery.| +Crawling Sensation|Tarkir: Dragonstorm Commander|252|U|{2}{G}|Enchantment|||At the beginning of your upkeep, you may mill two cards.$Whenever one or more land cards are put into your graveyard from anywhere for the first time each turn, create a 1/1 green Insect creature token.| +Cultivate|Tarkir: Dragonstorm Commander|253|C|{2}{G}|Sorcery|||Search your library for up to two basic land cards, reveal those cards, put one onto the battlefield tapped and the other into your hand, then shuffle.| +Farseek|Tarkir: Dragonstorm Commander|255|U|{1}{G}|Sorcery|||Search your library for a Plains, Island, Swamp, or Mountain card, put it onto the battlefield tapped, then shuffle.| +Grapple with the Past|Tarkir: Dragonstorm Commander|257|C|{1}{G}|Instant|||Mill three cards, then you may return a creature or land card from your graveyard to your hand.| +Harrow|Tarkir: Dragonstorm Commander|258|C|{2}{G}|Instant|||As an additional cost to cast this spell, sacrifice a land.$Search your library for up to two basic land cards, put them onto the battlefield, then shuffle.| +Multani, Yavimaya's Avatar|Tarkir: Dragonstorm Commander|263|M|{4}{G}{G}|Legendary Creature - Elemental Avatar|0|0|Reach, trample$Multani gets +1/+1 for each land you control and each land card in your graveyard.${1}{G}, Return two lands you control to their owner's hand: Return Multani from your graveyard to your hand.| +Rampant Growth|Tarkir: Dragonstorm Commander|265|C|{1}{G}|Sorcery|||Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| +Sakura-Tribe Elder|Tarkir: Dragonstorm Commander|266|C|{1}{G}|Creature - Snake Shaman|1|1|Sacrifice this creature: Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| +Satyr Wayfinder|Tarkir: Dragonstorm Commander|267|C|{1}{G}|Creature - Satyr|1|1|When this creature enters, reveal the top four cards of your library. You may put a land card from among them into your hand. Put the rest into your graveyard.| +Shigeki, Jukai Visionary|Tarkir: Dragonstorm Commander|270|R|{1}{G}|Legendary Enchantment Creature - Snake Druid|1|3|{1}{G}, {T}, Return Shigeki to its owner's hand: Reveal the top four cards of your library. You may put a land card from among them onto the battlefield tapped. Put the rest into your graveyard.$Channel -- {X}{X}{G}{G}, Discard this card: Return X target nonlegendary cards from your graveyard to your hand.| +Springbloom Druid|Tarkir: Dragonstorm Commander|271|C|{2}{G}|Creature - Elf Druid|1|1|When this creature enters, you may sacrifice a land. If you do, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.| +Tear Asunder|Tarkir: Dragonstorm Commander|273|U|{1}{G}|Instant|||Kicker {1}{B}$Exile target artifact or enchantment. If this spell was kicked, exile target nonland permanent instead.| +Timeless Witness|Tarkir: Dragonstorm Commander|274|U|{2}{G}{G}|Creature - Human Shaman|2|1|When this creature enters, return target card from your graveyard to your hand.$Eternalize {5}{G}{G}| +Aron, Benalia's Ruin|Tarkir: Dragonstorm Commander|280|U|{W}{W}{B}|Legendary Creature - Phyrexian Human|3|3|Menace${W}{B}, {T}, Sacrifice another creature: Put a +1/+1 counter on each creature you control.| +Baral and Kari Zev|Tarkir: Dragonstorm Commander|282|R|{1}{U}{R}|Legendary Creature - Human|2|4|First strike, menace$Whenever you cast your first instant or sorcery spell each turn, you may cast a spell with lesser mana value that shares a card type with it from your hand without paying its mana cost. If you don't, create First Mate Ragavan, a legendary 2/1 red Monkey Pirate creature token. It gains haste until end of turn.| +Consuming Aberration|Tarkir: Dragonstorm Commander|283|R|{3}{U}{B}|Creature - Horror|*|*|Consuming Aberration's power and toughness are each equal to the number of cards in your opponents' graveyards.$Whenever you cast a spell, each opponent reveals cards from the top of their library until they reveal a land card, then puts those cards into their graveyard.| +Expansion // Explosion|Tarkir: Dragonstorm Commander|287|R|{U/R}{U/R}|Instant|||Copy target instant or sorcery spell with mana value 4 or less. You may choose new targets for the copy.$Explosion${X}{U}{U}{R}{R}$Instant$Explosion deals X damage to any target. Target player draws X cards.| +Expressive Iteration|Tarkir: Dragonstorm Commander|288|U|{U}{R}|Sorcery|||Look at the top three cards of your library. Put one of them into your hand, put one of them on the bottom of your library, and exile one of them. You may play the exiled card this turn.| +Grisly Salvage|Tarkir: Dragonstorm Commander|290|C|{B}{G}|Instant|||Reveal the top five cards of your library. You may put a creature or land card from among them into your hand. Put the rest into your graveyard.| +Jarad, Golgari Lich Lord|Tarkir: Dragonstorm Commander|293|M|{B}{B}{G}{G}|Legendary Creature - Zombie Elf|2|2|Jarad gets +1/+1 for each creature card in your graveyard.${1}{B}{G}, Sacrifice another creature: Each opponent loses life equal to the sacrificed creature's power.$Sacrifice a Swamp and a Forest: Return this card from your graveyard to your hand.| +Kaya, Geist Hunter|Tarkir: Dragonstorm Commander|294|M|{1}{W}{B}|Legendary Planeswalker - Kaya|3|+1: Creatures you control gain deathtouch until end of turn. Put a +1/+1 counter on up to one target creature token you control.$-2: Until end of turn, if one or more tokens would be created under your control, twice that many of those tokens are created instead.$-6: Exile all cards from all graveyards, then create a 1/1 white Spirit creature token with flying for each card exiled this way.| +Lord of Extinction|Tarkir: Dragonstorm Commander|295|M|{3}{B}{G}|Creature - Elemental|*|*|Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards.| +Magma Opus|Tarkir: Dragonstorm Commander|296|M|{6}{U}{R}|Instant|||Magma Opus deals 4 damage divided as you choose among any number of targets. Tap two target permanents. Create a 4/4 blue and red Elemental creature token. Draw two cards.${U/R}{U/R}, Discard this card: Create a Treasure token.| +Meren of Clan Nel Toth|Tarkir: Dragonstorm Commander|297|R|{2}{B}{G}|Legendary Creature - Human Shaman|3|4|Whenever another creature you control dies, you get an experience counter.$At the beginning of your end step, choose target creature card in your graveyard. If that card's mana value is less than or equal to the number of experience counters you have, return it to the battlefield. Otherwise, put it into your hand.| +Nyx Weaver|Tarkir: Dragonstorm Commander|298|U|{1}{B}{G}|Enchantment Creature - Spider|2|3|Reach$At the beginning of your upkeep, mill two cards.${1}{B}{G}, Exile this creature: Return target card from your graveyard to your hand.| +Prismari Command|Tarkir: Dragonstorm Commander|299|R|{1}{U}{R}|Instant|||Choose two --$* Prismari Command deals 2 damage to any target.$* Target player draws two cards, then discards two cards.$* Target player creates a Treasure token.$* Destroy target artifact.| +Putrefy|Tarkir: Dragonstorm Commander|300|U|{1}{B}{G}|Instant|||Destroy target artifact or creature. It can't be regenerated.| +Skull Prophet|Tarkir: Dragonstorm Commander|304|U|{B}{G}|Creature - Human Druid|3|1|{T}: Add {B} or {G}.${T}: Mill two cards.| +Thalisse, Reverent Medium|Tarkir: Dragonstorm Commander|306|U|{3}{W}{B}|Legendary Creature - Human Cleric|3|4|At the beginning of each end step, create X 1/1 white Spirit creature tokens with flying, where X is the number of tokens you created this turn.| +Third Path Iconoclast|Tarkir: Dragonstorm Commander|307|U|{U}{R}|Creature - Human Monk|2|1|Whenever you cast a noncreature spell, create a 1/1 colorless Soldier artifact creature token.| +Time Wipe|Tarkir: Dragonstorm Commander|308|R|{2}{W}{W}{U}|Sorcery|||Return a creature you control to its owner's hand, then destroy all creatures.| +Velomachus Lorehold|Tarkir: Dragonstorm Commander|309|M|{5}{R}{W}|Legendary Creature - Elder Dragon|5|5|Flying, vigilance, haste$Whenever Velomachus Lorehold attacks, look at the top seven cards of your library. You may cast an instant or sorcery spell with mana value less than or equal to Velomachus Lorehold's power from among them without paying its mana cost. Put the rest on the bottom of your library in a random order.| +Veyran, Voice of Duality|Tarkir: Dragonstorm Commander|310|M|{1}{U}{R}|Legendary Creature - Efreet Wizard|2|2|Magecraft -- Whenever you cast or copy an instant or sorcery spell, Veyran gets +1/+1 until end of turn.$If you casting or copying an instant or sorcery spell causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.| +Whirlwind of Thought|Tarkir: Dragonstorm Commander|311|R|{1}{U}{R}{W}|Enchantment|||Whenever you cast a noncreature spell, draw a card.| +Azorius Signet|Tarkir: Dragonstorm Commander|312|U|{2}|Artifact|||{1}, {T}: Add {W}{U}.| +Blade of Selves|Tarkir: Dragonstorm Commander|313|R|{2}|Artifact - Equipment|||Equipped creature has myriad.$Equip {4}| +Boros Signet|Tarkir: Dragonstorm Commander|314|U|{2}|Artifact|||{1}, {T}: Add {R}{W}.| +Fellwar Stone|Tarkir: Dragonstorm Commander|318|U|{2}|Artifact|||{T}: Add one mana of any color that a land an opponent controls could produce.| +Idol of Oblivion|Tarkir: Dragonstorm Commander|319|R|{2}|Artifact|||{T}: Draw a card. Activate only if you created a token this turn.${8}, {T}, Sacrifice this artifact: Create a 10/10 colorless Eldrazi creature token.| +Izzet Signet|Tarkir: Dragonstorm Commander|320|C|{2}|Artifact|||{1}, {T}: Add {U}{R}.| +Millikin|Tarkir: Dragonstorm Commander|321|U|{2}|Artifact Creature - Construct|0|1|{T}, Mill a card: Add {C}.| +Myr Battlesphere|Tarkir: Dragonstorm Commander|322|R|{7}|Artifact Creature - Myr Construct|4|7|When this creature enters, create four 1/1 colorless Myr artifact creature tokens.$Whenever this creature attacks, you may tap X untapped Myr you control. If you do, this creature gets +X/+0 until end of turn and deals X damage to the player or planeswalker it's attacking.| +Solemn Simulacrum|Tarkir: Dragonstorm Commander|325|R|{4}|Artifact Creature - Golem|2|2|When this creature enters, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.$When this creature dies, you may draw a card.| +Talisman of Conviction|Tarkir: Dragonstorm Commander|329|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {R} or {W}. This artifact deals 1 damage to you.| +Talisman of Hierarchy|Tarkir: Dragonstorm Commander|331|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {W} or {B}. This artifact deals 1 damage to you.| +Talisman of Progress|Tarkir: Dragonstorm Commander|333|U|{2}|Artifact|||{T}: Add {C}.${T}: Add {W} or {U}. This artifact deals 1 damage to you.| +Wayfarer's Bauble|Tarkir: Dragonstorm Commander|335|C|{1}|Artifact|||{2}, {T}, Sacrifice this artifact: Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle.| +Adarkar Wastes|Tarkir: Dragonstorm Commander|338|R||Land|||{T}: Add {C}.${T}: Add {W} or {U}. This land deals 1 damage to you.| +Ash Barrens|Tarkir: Dragonstorm Commander|339|C||Land|||{T}: Add {C}.$Basic landcycling {1}| +Battlefield Forge|Tarkir: Dragonstorm Commander|340|R||Land|||{T}: Add {C}.${T}: Add {R} or {W}. This land deals 1 damage to you.| +Bojuka Bog|Tarkir: Dragonstorm Commander|341|C||Land|||This land enters tapped.$When this land enters, exile target player's graveyard.${T}: Add {B}.| +Canyon Slough|Tarkir: Dragonstorm Commander|344|R||Land - Swamp Mountain|||({T}: Add {B} or {R}.)$This land enters tapped.$Cycling {2}| +Cascade Bluffs|Tarkir: Dragonstorm Commander|345|R||Land|||{T}: Add {C}.${U/R}, {T}: Add {U}{U}, {U}{R}, or {R}{R}.| +Castle Ardenvale|Tarkir: Dragonstorm Commander|346|R||Land|||This land enters tapped unless you control a Plains.${T}: Add {W}.${2}{W}{W}, {T}: Create a 1/1 white Human creature token.| +Castle Embereth|Tarkir: Dragonstorm Commander|347|R||Land|||This land enters tapped unless you control a Mountain.${T}: Add {R}.${1}{R}{R}, {T}: Creatures you control get +1/+0 until end of turn.| +Caves of Koilos|Tarkir: Dragonstorm Commander|348|R||Land|||{T}: Add {C}.${T}: Add {W} or {B}. This land deals 1 damage to you.| +Cephalid Coliseum|Tarkir: Dragonstorm Commander|349|U||Land|||{T}: Add {U}. This land deals 1 damage to you.$Threshold -- {U}, {T}, Sacrifice this land: Target player draws three cards, then discards three cards. Activate only if seven or more cards are in your graveyard.| +Clifftop Retreat|Tarkir: Dragonstorm Commander|351|R||Land|||This land enters tapped unless you control a Mountain or a Plains.${T}: Add {R} or {W}.| +Command Beacon|Tarkir: Dragonstorm Commander|352|R||Land|||{T}: Add {C}.${T}, Sacrifice this land: Put your commander into your hand from the command zone.| +Contaminated Aquifer|Tarkir: Dragonstorm Commander|353|C||Land - Island Swamp|||({T}: Add {U} or {B}.)$This land enters tapped.| +Crypt of Agadeem|Tarkir: Dragonstorm Commander|354|R||Land|||This land enters tapped.${T}: Add {B}.${2}, {T}: Add {B} for each black creature card in your graveyard.| +Darkwater Catacombs|Tarkir: Dragonstorm Commander|355|R||Land|||{1}, {T}: Add {U}{B}.| +Dragonskull Summit|Tarkir: Dragonstorm Commander|357|R||Land|||This land enters tapped unless you control a Swamp or a Mountain.${T}: Add {B} or {R}.| +Dreamroot Cascade|Tarkir: Dragonstorm Commander|358|R||Land|||This land enters tapped unless you control two or more other lands.${T}: Add {G} or {U}.| +Drownyard Temple|Tarkir: Dragonstorm Commander|359|R||Land|||{T}: Add {C}.${3}: Return this card from your graveyard to the battlefield tapped.| +Exotic Orchard|Tarkir: Dragonstorm Commander|360|R||Land|||{T}: Add one mana of any color that a land an opponent controls could produce.| +Ferrous Lake|Tarkir: Dragonstorm Commander|361|R||Land|||{1}, {T}: Add {U}{R}.| +Fetid Heath|Tarkir: Dragonstorm Commander|362|R||Land|||{T}: Add {C}.${W/B}, {T}: Add {W}{W}, {W}{B}, or {B}{B}.| +Fetid Pools|Tarkir: Dragonstorm Commander|363|R||Land - Island Swamp|||({T}: Add {U} or {B}.)$This land enters tapped.$Cycling {2}| +Foreboding Landscape|Tarkir: Dragonstorm Commander|365|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Swamp, Forest, or Island card, put it onto the battlefield tapped, then shuffle.$Cycling {B}{G}{U}| +Glacial Fortress|Tarkir: Dragonstorm Commander|367|R||Land|||This land enters tapped unless you control a Plains or an Island.${T}: Add {W} or {U}.| +Golgari Rot Farm|Tarkir: Dragonstorm Commander|368|U||Land|||This land enters tapped.$When this land enters, return a land you control to its owner's hand.${T}: Add {B}{G}.| +Haunted Mire|Tarkir: Dragonstorm Commander|369|C||Land - Swamp Forest|||({T}: Add {B} or {G}.)$This land enters tapped.| +Hinterland Harbor|Tarkir: Dragonstorm Commander|371|R||Land|||This land enters tapped unless you control a Forest or an Island.${T}: Add {G} or {U}.| +Irrigated Farmland|Tarkir: Dragonstorm Commander|372|R||Land - Plains Island|||({T}: Add {W} or {U}.)$This land enters tapped.$Cycling {2}| +Isolated Chapel|Tarkir: Dragonstorm Commander|373|R||Land|||This land enters tapped unless you control a Plains or a Swamp.${T}: Add {W} or {B}.| +Llanowar Wastes|Tarkir: Dragonstorm Commander|376|R||Land|||{T}: Add {C}.${T}: Add {B} or {G}. This land deals 1 damage to you.| +Memorial to Folly|Tarkir: Dragonstorm Commander|377|U||Land|||This land enters tapped.${T}: Add {B}.${2}{B}, {T}, Sacrifice this land: Return target creature card from your graveyard to your hand.| +Myriad Landscape|Tarkir: Dragonstorm Commander|380|U||Land|||This land enters tapped.${T}: Add {C}.${2}, {T}, Sacrifice this land: Search your library for up to two basic land cards that share a land type, put them onto the battlefield tapped, then shuffle.| +Path of Ancestry|Tarkir: Dragonstorm Commander|382|C||Land|||This land enters tapped.${T}: Add one mana of any color in your commander's color identity. When that mana is spent to cast a creature spell that shares a creature type with your commander, scry 1.| +Perilous Landscape|Tarkir: Dragonstorm Commander|383|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Island, Mountain, or Plains card, put it onto the battlefield tapped, then shuffle.$Cycling {U}{R}{W}| +Prairie Stream|Tarkir: Dragonstorm Commander|384|R||Land - Plains Island|||({T}: Add {W} or {U}.)$This land enters tapped unless you control two or more basic lands.| +Reliquary Tower|Tarkir: Dragonstorm Commander|386|U||Land|||You have no maximum hand size.${T}: Add {C}.| +Rugged Prairie|Tarkir: Dragonstorm Commander|389|R||Land|||{T}: Add {C}.${R/W}, {T}: Add {R}{R}, {R}{W}, or {W}{W}.| +Shattered Landscape|Tarkir: Dragonstorm Commander|390|C||Land|||{T}: Add {C}.${T}, Sacrifice this land: Search your library for a basic Mountain, Plains, or Swamp card, put it onto the battlefield tapped, then shuffle.$Cycling {R}{W}{B}| +Shattered Sanctum|Tarkir: Dragonstorm Commander|391|R||Land|||This land enters tapped unless you control two or more other lands.${T}: Add {W} or {B}.| +Shivan Reef|Tarkir: Dragonstorm Commander|393|R||Land|||{T}: Add {C}.${T}: Add {U} or {R}. This land deals 1 damage to you.| +Skycloud Expanse|Tarkir: Dragonstorm Commander|394|R||Land|||{1}, {T}: Add {W}{U}.| +Smoldering Marsh|Tarkir: Dragonstorm Commander|395|R||Land - Swamp Mountain|||({T}: Add {B} or {R}.)$This land enters tapped unless you control two or more basic lands.| +Sulfur Falls|Tarkir: Dragonstorm Commander|396|R||Land|||This land enters tapped unless you control an Island or a Mountain.${T}: Add {U} or {R}.| +Sunken Hollow|Tarkir: Dragonstorm Commander|398|R||Land - Island Swamp|||({T}: Add {U} or {B}.)$This land enters tapped unless you control two or more basic lands.| +Temple of Enlightenment|Tarkir: Dragonstorm Commander|401|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {W} or {U}.| +Temple of Epiphany|Tarkir: Dragonstorm Commander|402|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {U} or {R}.| +Temple of Malady|Tarkir: Dragonstorm Commander|403|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {B} or {G}.| +Temple of Silence|Tarkir: Dragonstorm Commander|406|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {W} or {B}.| +Temple of Triumph|Tarkir: Dragonstorm Commander|407|R||Land|||This land enters tapped.$When this land enters, scry 1.${T}: Add {R} or {W}.| +Terramorphic Expanse|Tarkir: Dragonstorm Commander|408|C||Land|||{T}, Sacrifice this land: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle.| +Vault of the Archangel|Tarkir: Dragonstorm Commander|410|R||Land|||{T}: Add {C}.${2}{W}{B}, {T}: Creatures you control gain deathtouch and lifelink until end of turn.| +Windbrisk Heights|Tarkir: Dragonstorm Commander|411|R||Land|||Hideaway 4$This land enters tapped.${T}: Add {W}.${W}, {T}: You may play the exiled card without paying its mana cost if you attacked with three or more creatures this turn.| +Woodland Cemetery|Tarkir: Dragonstorm Commander|412|R||Land|||This land enters tapped unless you control a Swamp or a Forest.${T}: Add {B} or {G}.|