diff --git a/Mage.Sets/src/mage/cards/a/AnimusOfNightsReach.java b/Mage.Sets/src/mage/cards/a/AnimusOfNightsReach.java
deleted file mode 100644
index ec8de09da90..00000000000
--- a/Mage.Sets/src/mage/cards/a/AnimusOfNightsReach.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.dynamicvalue.DynamicValue;
-import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount;
-import mage.abilities.dynamicvalue.common.StaticValue;
-import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.abilities.hint.Hint;
-import mage.abilities.keyword.MenaceAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.filter.FilterCard;
-import mage.filter.StaticFilters;
-import mage.filter.common.FilterCreatureCard;
-import mage.filter.predicate.card.DefendingPlayerOwnsCardPredicate;
-import mage.game.Game;
-
-import java.util.Objects;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-/**
- * @author TheElk801
- */
-public final class AnimusOfNightsReach extends CardImpl {
-
- private static final FilterCard filter
- = new FilterCreatureCard("creature cards in defending player's graveyard");
-
- static {
- filter.add(DefendingPlayerOwnsCardPredicate.instance);
- }
-
- private static final DynamicValue xValue = new CardsInAllGraveyardsCount(filter);
-
- public AnimusOfNightsReach(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.SPIRIT);
- this.power = new MageInt(0);
- this.toughness = new MageInt(4);
- this.color.setBlack(true);
- this.nightCard = true;
-
- // Menace
- this.addAbility(new MenaceAbility());
-
- // Whenever Animus of Night's Reach attacks, it gets +X/+0 until end of turn, where X is the number of creature cards in defending player's graveyard.
- this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(
- xValue, StaticValue.get(0), Duration.EndOfTurn
- ).setText("it gets +X/+0 until end of turn, where X is the number of creature cards in defending player's graveyard")).addHint(AnimusOfNightsReachHint.instance));
- }
-
- private AnimusOfNightsReach(final AnimusOfNightsReach card) {
- super(card);
- }
-
- @Override
- public AnimusOfNightsReach copy() {
- return new AnimusOfNightsReach(this);
- }
-}
-
-enum AnimusOfNightsReachHint implements Hint {
- instance;
-
- @Override
- public String getText(Game game, Ability ability) {
- return "Cards in each opponent's graveyard:
"
- + game
- .getOpponents(ability.getControllerId())
- .stream()
- .map(game::getPlayer)
- .filter(Objects::nonNull)
- .map(player -> player
- .getName()
- + ": " + player
- .getGraveyard()
- .count(StaticFilters.FILTER_CARD_CREATURE, game))
- .collect(Collectors.joining("
"));
- }
-
- @Override
- public AnimusOfNightsReachHint copy() {
- return instance;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/ArchitectOfRestoration.java b/Mage.Sets/src/mage/cards/a/ArchitectOfRestoration.java
deleted file mode 100644
index 7796e0f603a..00000000000
--- a/Mage.Sets/src/mage/cards/a/ArchitectOfRestoration.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.game.permanent.token.SpiritToken;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class ArchitectOfRestoration extends CardImpl {
-
- public ArchitectOfRestoration(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.FOX);
- this.subtype.add(SubType.MONK);
- this.power = new MageInt(3);
- this.toughness = new MageInt(4);
- this.color.setWhite(true);
- this.nightCard = true;
-
- // Vigilance
- this.addAbility(VigilanceAbility.getInstance());
-
- // Whenever Architect of Restoration attacks or blocks, create a 1/1 colorless Spirit creature token.
- this.addAbility(new AttacksOrBlocksTriggeredAbility(new CreateTokenEffect(new SpiritToken()), false));
- }
-
- private ArchitectOfRestoration(final ArchitectOfRestoration card) {
- super(card);
- }
-
- @Override
- public ArchitectOfRestoration copy() {
- return new ArchitectOfRestoration(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AvatarKuruk.java b/Mage.Sets/src/mage/cards/a/AvatarKuruk.java
deleted file mode 100644
index 94c2be30e65..00000000000
--- a/Mage.Sets/src/mage/cards/a/AvatarKuruk.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.abilities.common.SpellCastControllerTriggeredAbility;
-import mage.abilities.costs.common.WaterbendCost;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
-import mage.abilities.keyword.ExhaustAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.filter.StaticFilters;
-import mage.game.permanent.token.SpiritWorldToken;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class AvatarKuruk extends CardImpl {
-
- public AvatarKuruk(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.AVATAR);
- this.power = new MageInt(4);
- this.toughness = new MageInt(3);
- this.nightCard = true;
-
- // Whenever you cast a spell, create a 1/1 colorless Spirit creature token with "This token can't block or be blocked by non-Spirit creatures."
- this.addAbility(new SpellCastControllerTriggeredAbility(
- new CreateTokenEffect(new SpiritWorldToken()), StaticFilters.FILTER_SPELL_A, false
- ));
-
- // Exhaust -- Waterbend {20}: Take an extra turn after this one.
- this.addAbility(new ExhaustAbility(new AddExtraTurnControllerEffect(), new WaterbendCost(20)));
- }
-
- private AvatarKuruk(final AvatarKuruk card) {
- super(card);
- }
-
- @Override
- public AvatarKuruk copy() {
- return new AvatarKuruk(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AvatarKyoshi.java b/Mage.Sets/src/mage/cards/a/AvatarKyoshi.java
deleted file mode 100644
index c4c67099081..00000000000
--- a/Mage.Sets/src/mage/cards/a/AvatarKyoshi.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.Mana;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.dynamicvalue.common.GreatestAmongPermanentsValue;
-import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
-import mage.abilities.keyword.HexproofAbility;
-import mage.abilities.keyword.TrampleAbility;
-import mage.abilities.mana.DynamicManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.filter.StaticFilters;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class AvatarKyoshi extends CardImpl {
-
- public AvatarKyoshi(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.AVATAR);
- this.power = new MageInt(5);
- this.toughness = new MageInt(4);
- this.nightCard = true;
-
- // Lands you control have trample and hexproof.
- Ability ability = new SimpleStaticAbility(new GainAbilityControlledEffect(
- TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS
- ));
- ability.addEffect(new GainAbilityControlledEffect(
- HexproofAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS
- ).setText("and hexproof"));
- this.addAbility(ability);
-
- // {T}: Add X mana of any one color, where X is the greatest power among creatures you control.
- this.addAbility(new DynamicManaAbility(
- Mana.AnyMana(1), GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES,
- new TapSourceCost(), "add X mana of any one color, " +
- "where X is the greatest power among creatures you control", true
- ).addHint(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES.getHint()));
- }
-
- private AvatarKyoshi(final AvatarKyoshi card) {
- super(card);
- }
-
- @Override
- public AvatarKyoshi copy() {
- return new AvatarKyoshi(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AvatarRoku.java b/Mage.Sets/src/mage/cards/a/AvatarRoku.java
deleted file mode 100644
index c5b970958a7..00000000000
--- a/Mage.Sets/src/mage/cards/a/AvatarRoku.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.keyword.FirebendingAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.game.permanent.token.DragonFirebendingToken;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class AvatarRoku extends CardImpl {
-
- public AvatarRoku(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.AVATAR);
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
- this.nightCard = true;
-
- // Firebending 4
- this.addAbility(new FirebendingAbility(4));
-
- // {8}: Create a 4/4 red Dragon creature token with flying and firebending 4.
- this.addAbility(new SimpleActivatedAbility(
- new CreateTokenEffect(new DragonFirebendingToken()), new GenericManaCost(8)
- ));
- }
-
- private AvatarRoku(final AvatarRoku card) {
- super(card);
- }
-
- @Override
- public AvatarRoku copy() {
- return new AvatarRoku(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AvatarYangchen.java b/Mage.Sets/src/mage/cards/a/AvatarYangchen.java
deleted file mode 100644
index 558ecad122c..00000000000
--- a/Mage.Sets/src/mage/cards/a/AvatarYangchen.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.CastSecondSpellTriggeredAbility;
-import mage.abilities.effects.keyword.AirbendTargetEffect;
-import mage.abilities.keyword.FlyingAbility;
-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.FilterNonlandPermanent;
-import mage.filter.predicate.mageobject.AnotherPredicate;
-import mage.target.TargetPermanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class AvatarYangchen extends CardImpl {
-
- private static final FilterPermanent filter = new FilterNonlandPermanent("other target nonland permanent");
-
- static {
- filter.add(AnotherPredicate.instance);
- }
-
- public AvatarYangchen(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.AVATAR);
- this.power = new MageInt(4);
- this.toughness = new MageInt(5);
- this.nightCard = true;
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
-
- // Whenever you cast your second spell each turn, airbend up to one other target nonland permanent.
- Ability ability = new CastSecondSpellTriggeredAbility(new AirbendTargetEffect());
- ability.addTarget(new TargetPermanent(0, 1, filter));
- this.addAbility(ability);
- }
-
- private AvatarYangchen(final AvatarYangchen card) {
- super(card);
- }
-
- @Override
- public AvatarYangchen copy() {
- return new AvatarYangchen(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/a/AwokenHorror.java b/Mage.Sets/src/mage/cards/a/AwokenHorror.java
deleted file mode 100644
index 1fab7bc271c..00000000000
--- a/Mage.Sets/src/mage/cards/a/AwokenHorror.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package mage.cards.a;
-
-import mage.MageInt;
-import mage.abilities.common.TransformIntoSourceTriggeredAbility;
-import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.Predicates;
-
-import java.util.UUID;
-
-/**
- * @author fireshoes
- */
-public final class AwokenHorror extends CardImpl {
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Horror creatures");
-
- static {
- filter.add(Predicates.not(SubType.HORROR.getPredicate()));
- }
-
- public AwokenHorror(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.KRAKEN);
- this.subtype.add(SubType.HORROR);
- this.power = new MageInt(7);
- this.toughness = new MageInt(8);
- this.color.setBlue(true);
-
- this.nightCard = true;
-
- // When this creature transforms into Awoken Horrow, return all non-Horror creatures to their owners' hands.
- this.addAbility(new TransformIntoSourceTriggeredAbility(new ReturnToHandFromBattlefieldAllEffect(filter)));
- }
-
- private AwokenHorror(final AwokenHorror card) {
- super(card);
- }
-
- @Override
- public AwokenHorror copy() {
- return new AwokenHorror(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/b/BarracksOfTheThousand.java b/Mage.Sets/src/mage/cards/b/BarracksOfTheThousand.java
deleted file mode 100644
index 5a462272b46..00000000000
--- a/Mage.Sets/src/mage/cards/b/BarracksOfTheThousand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package mage.cards.b;
-
-import mage.abilities.common.CastSpellPaidBySourceTriggeredAbility;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.mana.WhiteManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SuperType;
-import mage.filter.FilterSpell;
-import mage.filter.predicate.Predicates;
-import mage.game.permanent.token.GnomeSoldierStarStarToken;
-
-import java.util.UUID;
-
-/**
- * @author Susucr
- */
-public final class BarracksOfTheThousand extends CardImpl {
-
- private static final FilterSpell filter = new FilterSpell("an artifact or creature spell");
-
- static {
- filter.add(Predicates.or(
- CardType.ARTIFACT.getPredicate(),
- CardType.CREATURE.getPredicate()
- ));
- }
-
- public BarracksOfTheThousand(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.LAND}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
-
- // (Transforms from Thousand Moons Smithy.)
- this.nightCard = true;
-
- // {T}: Add {W}.
- this.addAbility(new WhiteManaAbility());
-
- // Whenever you cast an artifact or creature spell using mana produced by Barracks of the Thousand, create a white Gnome Soldier artifact creature token with "This creature's power and toughness are each equal to the number of artifacts and/or creatures you control."
- this.addAbility(new CastSpellPaidBySourceTriggeredAbility(
- new CreateTokenEffect(new GnomeSoldierStarStarToken()),
- filter, false
- ));
- }
-
- private BarracksOfTheThousand(final BarracksOfTheThousand card) {
- super(card);
- }
-
- @Override
- public BarracksOfTheThousand copy() {
- return new BarracksOfTheThousand(this);
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/b/BurnishedDunestomper.java b/Mage.Sets/src/mage/cards/b/BurnishedDunestomper.java
deleted file mode 100644
index ad484ef7305..00000000000
--- a/Mage.Sets/src/mage/cards/b/BurnishedDunestomper.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package mage.cards.b;
-
-import mage.MageInt;
-import mage.abilities.keyword.TrampleAbility;
-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 BurnishedDunestomper extends CardImpl {
-
- public BurnishedDunestomper(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.PHYREXIAN);
- this.subtype.add(SubType.DOG);
- this.subtype.add(SubType.WARRIOR);
- this.power = new MageInt(4);
- this.toughness = new MageInt(3);
- this.color.setWhite(true);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Trample
- this.addAbility(TrampleAbility.getInstance());
- }
-
- private BurnishedDunestomper(final BurnishedDunestomper card) {
- super(card);
- }
-
- @Override
- public BurnishedDunestomper copy() {
- return new BurnishedDunestomper(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/c/ConsumingSepulcher.java b/Mage.Sets/src/mage/cards/c/ConsumingSepulcher.java
deleted file mode 100644
index 7499d76d724..00000000000
--- a/Mage.Sets/src/mage/cards/c/ConsumingSepulcher.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package mage.cards.c;
-
-import mage.abilities.Ability;
-import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.effects.common.LoseLifeOpponentsEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class ConsumingSepulcher extends CardImpl {
-
- public ConsumingSepulcher(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
- this.nightCard = true;
- this.color.setBlack(true);
-
- // At the beginning of your upkeep, each opponent loses 1 life and you gain 1 life.
- Ability ability = new BeginningOfUpkeepTriggeredAbility(
- new LoseLifeOpponentsEffect(1)
- );
- ability.addEffect(new GainLifeEffect(1).concatBy("and"));
- this.addAbility(ability);
- }
-
- private ConsumingSepulcher(final ConsumingSepulcher card) {
- super(card);
- }
-
- @Override
- public ConsumingSepulcher copy() {
- return new ConsumingSepulcher(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/d/DireStrainBrawler.java b/Mage.Sets/src/mage/cards/d/DireStrainBrawler.java
deleted file mode 100644
index b1ee9f52960..00000000000
--- a/Mage.Sets/src/mage/cards/d/DireStrainBrawler.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package mage.cards.d;
-
-import mage.MageInt;
-import mage.abilities.keyword.NightboundAbility;
-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 DireStrainBrawler extends CardImpl {
-
- public DireStrainBrawler(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(6);
- this.toughness = new MageInt(6);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Vigilance
- this.addAbility(VigilanceAbility.getInstance());
-
- // Nightbound
- this.addAbility(new NightboundAbility());
- }
-
- private DireStrainBrawler(final DireStrainBrawler card) {
- super(card);
- }
-
- @Override
- public DireStrainBrawler copy() {
- return new DireStrainBrawler(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java b/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java
deleted file mode 100644
index 3def1f2d789..00000000000
--- a/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package mage.cards.d;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.counters.CounterType;
-import mage.filter.FilterPermanent;
-import mage.filter.StaticFilters;
-import mage.filter.common.FilterControlledPermanent;
-import mage.game.Game;
-import mage.players.Player;
-import mage.util.CardUtil;
-
-import java.util.Objects;
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class DragonKamisEgg extends CardImpl {
-
- private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DRAGON);
-
- public DragonKamisEgg(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.EGG);
- this.power = new MageInt(0);
- this.toughness = new MageInt(1);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Whenever Dragon-Kami's Egg or a Dragon you control dies, you may cast a creature spell from among cards you own in exile with hatching counters on them without paying its mana cost.
- this.addAbility(new DiesThisOrAnotherTriggeredAbility(
- new DragonKamisEggEffect(), false, filter
- ).setTriggerPhrase("Whenever {this} or a Dragon you control dies, "));
- }
-
- private DragonKamisEgg(final DragonKamisEgg card) {
- super(card);
- }
-
- @Override
- public DragonKamisEgg copy() {
- return new DragonKamisEgg(this);
- }
-}
-
-class DragonKamisEggEffect extends OneShotEffect {
-
- DragonKamisEggEffect() {
- super(Outcome.Benefit);
- staticText = "you may cast a creature spell from among cards you own in exile " +
- "with hatching counters on them without paying its mana cost";
- }
-
- private DragonKamisEggEffect(final DragonKamisEggEffect effect) {
- super(effect);
- }
-
- @Override
- public DragonKamisEggEffect copy() {
- return new DragonKamisEggEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player == null) {
- return false;
- }
- Cards cards = new CardsImpl();
- game.getExile()
- .getCardsOwned(game, player.getId())
- .stream()
- .filter(Objects::nonNull)
- .filter(card -> card.getCounters(game).containsKey(CounterType.HATCHLING))
- .forEach(cards::add);
- return !cards.isEmpty() && CardUtil.castSpellWithAttributesForFree(
- player, source, game, cards, StaticFilters.FILTER_CARD_CREATURE
- );
- }
-}
diff --git a/Mage.Sets/src/mage/cards/e/EchoOfDeathsWail.java b/Mage.Sets/src/mage/cards/e/EchoOfDeathsWail.java
deleted file mode 100644
index 03883109463..00000000000
--- a/Mage.Sets/src/mage/cards/e/EchoOfDeathsWail.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package mage.cards.e;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.common.EntersBattlefieldTriggeredAbility;
-import mage.abilities.costs.common.SacrificeTargetCost;
-import mage.abilities.effects.common.DoIfCostPaid;
-import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.effects.common.continuous.GainControlAllEffect;
-import mage.constants.Duration;
-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.filter.FilterPermanent;
-import mage.filter.StaticFilters;
-import mage.filter.predicate.permanent.TokenPredicate;
-
-/**
- *
- * @author weirddan455
- */
-public final class EchoOfDeathsWail extends CardImpl {
-
- private static final FilterPermanent filter = new FilterPermanent(SubType.RAT, "Rat tokens");
-
- static {
- filter.add(TokenPredicate.TRUE);
- }
-
- public EchoOfDeathsWail(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.SPIRIT);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
- this.color.setBlack(true);
- this.nightCard = true;
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
-
- // Haste
- this.addAbility(HasteAbility.getInstance());
-
- // When Echo of Death's Wail enters the battlefield, gain control of all Rat tokens.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new GainControlAllEffect(Duration.Custom, filter)));
-
- // Whenever Echo of Death's Wail attacks, you may sacrifice another creature. If you do, draw a card.
- this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
- new DrawCardSourceControllerEffect(1),
- new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)
- )));
- }
-
- private EchoOfDeathsWail(final EchoOfDeathsWail card) {
- super(card);
- }
-
- @Override
- public EchoOfDeathsWail copy() {
- return new EchoOfDeathsWail(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/e/EsperTerra.java b/Mage.Sets/src/mage/cards/e/EsperTerra.java
deleted file mode 100644
index fd4cde6c0f4..00000000000
--- a/Mage.Sets/src/mage/cards/e/EsperTerra.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package mage.cards.e;
-
-import mage.MageInt;
-import mage.Mana;
-import mage.abilities.Ability;
-import mage.abilities.common.SagaAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
-import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
-import mage.abilities.effects.mana.BasicManaEffect;
-import mage.abilities.keyword.FlyingAbility;
-import mage.abilities.keyword.HasteAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.counters.CounterType;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledEnchantmentPermanent;
-import mage.filter.predicate.Predicates;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.target.TargetPermanent;
-
-import java.util.Optional;
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class EsperTerra extends CardImpl {
-
- private static final FilterPermanent filter = new FilterControlledEnchantmentPermanent("nonlegendary enchantment you control");
-
- static {
- filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
- }
-
- public EsperTerra(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.SAGA);
- this.subtype.add(SubType.WIZARD);
- this.power = new MageInt(6);
- this.toughness = new MageInt(6);
- this.nightCard = true;
- this.color.setRed(true);
- this.color.setGreen(true);
-
- // (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this, SagaChapter.CHAPTER_IV);
-
- // I, II, III -- Create a token that's a copy of target nonlegendary enchantment you control. It gains haste. If it's a Saga, put up to three lore counters on it. Sacrifice it at the beginning of your next end step.
- sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_III,
- new EsperTerraEffect(), new TargetPermanent(filter)
- );
-
- // IV -- Add {W}{W}, {U}{U}, {B}{B}, {R}{R}, and {G}{G}. Exile Esper Terra, then return it to the battlefield.
- sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_IV,
- new BasicManaEffect(new Mana(
- 2, 2, 2, 2, 2, 0, 0, 0
- )).setText("add {W}{W}, {U}{U}, {B}{B}, {R}{R}, and {G}{G}"),
- new ExileSourceAndReturnFaceUpEffect());
- this.addAbility(sagaAbility);
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
- }
-
- private EsperTerra(final EsperTerra card) {
- super(card);
- }
-
- @Override
- public EsperTerra copy() {
- return new EsperTerra(this);
- }
-}
-
-class EsperTerraEffect extends OneShotEffect {
-
- EsperTerraEffect() {
- super(Outcome.Benefit);
- staticText = "create a token that's a copy of target nonlegendary enchantment you control. " +
- "It gains haste. If it's a Saga, put up to three lore counters on it. " +
- "Sacrifice it at the beginning of your next end step";
- }
-
- private EsperTerraEffect(final EsperTerraEffect effect) {
- super(effect);
- }
-
- @Override
- public EsperTerraEffect copy() {
- return new EsperTerraEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (permanent == null) {
- return false;
- }
- CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect();
- effect.setSavedPermanent(permanent);
- effect.addAdditionalAbilities(HasteAbility.getInstance());
- effect.apply(game, source);
- for (Permanent token : effect.getAddedPermanents()) {
- if (!token.hasSubtype(SubType.SAGA, game)) {
- continue;
- }
- Optional.ofNullable(source.getControllerId())
- .map(game::getPlayer)
- .map(player -> player.getAmount(
- 0, 3, "Choose how many lore counters to put on " + token.getIdName(), source, game
- ))
- .filter(amount -> amount > 0)
- .ifPresent(amount -> token.addCounters(CounterType.LORE.createInstance(amount), source, game));
- }
- effect.removeTokensCreatedAt(game, source, false, PhaseStep.END_TURN, TargetController.YOU);
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/f/FibrousEntangler.java b/Mage.Sets/src/mage/cards/f/FibrousEntangler.java
deleted file mode 100644
index ac64f9a2e07..00000000000
--- a/Mage.Sets/src/mage/cards/f/FibrousEntangler.java
+++ /dev/null
@@ -1,50 +0,0 @@
-
-package mage.cards.f;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect;
-import mage.abilities.effects.common.combat.MustBeBlockedByAtLeastOneSourceEffect;
-import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Zone;
-
-/**
- *
- * @author LevelX2
- */
-public final class FibrousEntangler extends CardImpl {
-
- public FibrousEntangler(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
- this.subtype.add(SubType.ELDRAZI);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(4);
- this.toughness = new MageInt(6);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- // Vigilance
- this.addAbility(VigilanceAbility.getInstance());
- // Fibrous Entangler must be blocked if able.
- this.addAbility(new SimpleStaticAbility(new MustBeBlockedByAtLeastOneSourceEffect(Duration.WhileOnBattlefield)));
-
- // Fibrous Entangler can block an additional creature each combat.
- this.addAbility(new SimpleStaticAbility(new CanBlockAdditionalCreatureEffect(Duration.WhileOnBattlefield, 1)));
- }
-
- private FibrousEntangler(final FibrousEntangler card) {
- super(card);
- }
-
- @Override
- public FibrousEntangler copy() {
- return new FibrousEntangler(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/f/FireLordSozin.java b/Mage.Sets/src/mage/cards/f/FireLordSozin.java
deleted file mode 100644
index 5074b2310fa..00000000000
--- a/Mage.Sets/src/mage/cards/f/FireLordSozin.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package mage.cards.f;
-
-import mage.MageInt;
-import mage.MageObject;
-import mage.abilities.Ability;
-import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
-import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
-import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.costs.mana.ManaCosts;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
-import mage.abilities.keyword.FirebendingAbility;
-import mage.abilities.keyword.MenaceAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.filter.FilterCard;
-import mage.filter.common.FilterCreatureCard;
-import mage.filter.predicate.card.OwnerIdPredicate;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.common.TargetCardInGraveyard;
-import mage.util.CardUtil;
-
-import java.util.Objects;
-import java.util.Set;
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class FireLordSozin extends CardImpl {
-
- public FireLordSozin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.NOBLE);
- this.power = new MageInt(5);
- this.toughness = new MageInt(5);
- this.color.setBlack(true);
- this.nightCard = true;
-
- // Menace
- this.addAbility(new MenaceAbility());
-
- // Firebending 3
- this.addAbility(new FirebendingAbility(3));
-
- // Whenever Fire Lord Sozin deals combat damage to a player, you may pay {X}. When you do, put any number of target creature cards with total mana value X or less from that player's graveyard onto the battlefield under your control.
- this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new FireLordSozinEffect()));
- }
-
- private FireLordSozin(final FireLordSozin card) {
- super(card);
- }
-
- @Override
- public FireLordSozin copy() {
- return new FireLordSozin(this);
- }
-}
-
-class FireLordSozinEffect extends OneShotEffect {
-
- FireLordSozinEffect() {
- super(Outcome.Benefit);
- staticText = "you may pay {X}. When you do, put any number of target creature cards with " +
- "total mana value X or less from that player's graveyard onto the battlefield under your control";
- }
-
- private FireLordSozinEffect(final FireLordSozinEffect effect) {
- super(effect);
- }
-
- @Override
- public FireLordSozinEffect copy() {
- return new FireLordSozinEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller == null) {
- return false;
- }
- if (controller == null || !controller.chooseUse(Outcome.BoostCreature, "Pay {X}?", source, game)) {
- return false;
- }
- int xValue = controller.announceX(0, Integer.MAX_VALUE, "Announce the value for {X}", game, source, true);
- ManaCosts cost = new ManaCostsImpl<>("{X}");
- cost.add(new GenericManaCost(xValue));
- if (!cost.pay(source, game, source, source.getControllerId(), false, null)) {
- return false;
- }
- ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), false);
- ability.addTarget(new FireLordSozinTarget((UUID) getValue("damagedPlayer"), xValue));
- game.fireReflexiveTriggeredAbility(ability, source);
- return true;
- }
-}
-
-class FireLordSozinTarget extends TargetCardInGraveyard {
-
- private final int xValue;
-
- private static final FilterCard makeFilter(UUID ownerId, int xValue) {
- FilterCard filter = new FilterCreatureCard("creature cards with total mana value " + xValue + " or less from that player's graveyard");
- filter.add(new OwnerIdPredicate(ownerId));
- return filter;
- }
-
- FireLordSozinTarget(UUID ownerId, int xValue) {
- super(0, Integer.MAX_VALUE, makeFilter(ownerId, xValue), false);
- this.xValue = xValue;
- }
-
- private FireLordSozinTarget(final FireLordSozinTarget target) {
- super(target);
- this.xValue = target.xValue;
- }
-
- @Override
- public FireLordSozinTarget copy() {
- return new FireLordSozinTarget(this);
- }
-
- @Override
- public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) {
- return super.canTarget(playerId, id, source, game)
- && CardUtil.checkCanTargetTotalValueLimit(this.getTargets(), id, MageObject::getManaValue, xValue, game);
- }
-
- @Override
- public Set possibleTargets(UUID sourceControllerId, Ability source, Game game) {
- return CardUtil.checkPossibleTargetsTotalValueLimit(
- this.getTargets(),
- super.possibleTargets(sourceControllerId, source, game),
- MageObject::getManaValue, xValue, game
- );
- }
-
- @Override
- public String getMessage(Game game) {
- // shows selected total
- int selectedValue = this.getTargets().stream()
- .map(game::getObject)
- .filter(Objects::nonNull)
- .mapToInt(MageObject::getManaValue)
- .sum();
- return super.getMessage(game) + " (selected total mana value " + selectedValue + ")";
- }
-}
diff --git a/Mage.Sets/src/mage/cards/f/FragmentOfKonda.java b/Mage.Sets/src/mage/cards/f/FragmentOfKonda.java
deleted file mode 100644
index 77b85acde32..00000000000
--- a/Mage.Sets/src/mage/cards/f/FragmentOfKonda.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package mage.cards.f;
-
-import mage.MageInt;
-import mage.abilities.common.DiesSourceTriggeredAbility;
-import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.keyword.DefenderAbility;
-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 FragmentOfKonda extends CardImpl {
-
- public FragmentOfKonda(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.NOBLE);
- this.power = new MageInt(1);
- this.toughness = new MageInt(3);
- this.color.setWhite(true);
- this.nightCard = true;
-
- // Defender
- this.addAbility(DefenderAbility.getInstance());
-
- // When Fragment of Konda dies, draw a card.
- this.addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)));
- }
-
- private FragmentOfKonda(final FragmentOfKonda card) {
- super(card);
- }
-
- @Override
- public FragmentOfKonda copy() {
- return new FragmentOfKonda(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/i/IncitedRabble.java b/Mage.Sets/src/mage/cards/i/IncitedRabble.java
deleted file mode 100644
index 91003feeba6..00000000000
--- a/Mage.Sets/src/mage/cards/i/IncitedRabble.java
+++ /dev/null
@@ -1,48 +0,0 @@
-
-package mage.cards.i;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.common.AttacksEachCombatStaticAbility;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Duration;
-import mage.constants.Zone;
-
-/**
- *
- * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com)
- */
-public final class IncitedRabble extends CardImpl {
-
- public IncitedRabble(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
- this.subtype.add(SubType.HUMAN);
- this.power = new MageInt(2);
- this.toughness = new MageInt(3);
- this.color.setRed(true);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- // Incited Rabble attacks each combat if able.
- this.addAbility(new AttacksEachCombatStaticAbility());
-
- // {2}: Incited Rabble gets +1/+0 until end of turn.
- this.addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{2}")));
- }
-
- private IncitedRabble(final IncitedRabble card) {
- super(card);
- }
-
- @Override
- public IncitedRabble copy() {
- return new IncitedRabble(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/k/KirinTouchedOrochi.java b/Mage.Sets/src/mage/cards/k/KirinTouchedOrochi.java
deleted file mode 100644
index 254d48fc2e5..00000000000
--- a/Mage.Sets/src/mage/cards/k/KirinTouchedOrochi.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package mage.cards.k;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.Mode;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.counter.AddCountersTargetEffect;
-import mage.cards.Card;
-import mage.constants.Outcome;
-import mage.constants.SubType;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Zone;
-import mage.counters.CounterType;
-import mage.filter.FilterCard;
-import mage.filter.StaticFilters;
-import mage.filter.predicate.Predicates;
-import mage.game.Game;
-import mage.game.permanent.token.SpiritToken;
-import mage.players.Player;
-import mage.target.common.TargetCardInGraveyard;
-import mage.target.common.TargetControlledCreaturePermanent;
-
-/**
- *
- * @author weirddan455
- */
-public final class KirinTouchedOrochi extends CardImpl {
-
- private static final FilterCard filter = new FilterCard("noncreature card from a graveyard");
- static {
- filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
- }
-
- public KirinTouchedOrochi(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.SNAKE);
- this.subtype.add(SubType.MONK);
- this.power = new MageInt(1);
- this.toughness = new MageInt(1);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Whenever Kirin-Touched Orochi attacks, choose one —
- // • Exile target creature card from a graveyard. When you do, create a 1/1 colorless Spirit creature token.
- Ability ability = new AttacksTriggeredAbility(new KirinTouchedOrochiTokenEffect());
- ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD));
-
- // • Exile target noncreature card from a graveyard. When you do, put a +1/+1 counter on target creature you control.
- Mode mode = new Mode(new KirinTouchedOrochiCounterEffect());
- mode.addTarget(new TargetCardInGraveyard(filter));
- ability.addMode(mode);
- this.addAbility(ability);
- }
-
- private KirinTouchedOrochi(final KirinTouchedOrochi card) {
- super(card);
- }
-
- @Override
- public KirinTouchedOrochi copy() {
- return new KirinTouchedOrochi(this);
- }
-}
-
-class KirinTouchedOrochiTokenEffect extends OneShotEffect {
-
- KirinTouchedOrochiTokenEffect() {
- super(Outcome.Exile);
- this.staticText = "Exile target creature card from a graveyard. When you do, create a 1/1 colorless Spirit creature token";
- }
-
- private KirinTouchedOrochiTokenEffect(final KirinTouchedOrochiTokenEffect effect) {
- super(effect);
- }
-
- @Override
- public KirinTouchedOrochiTokenEffect copy() {
- return new KirinTouchedOrochiTokenEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- UUID targetId = source.getFirstTarget();
- Card card = game.getCard(targetId);
- if (controller == null || card == null || game.getState().getZone(targetId) != Zone.GRAVEYARD) {
- return false;
- }
- if (!controller.moveCards(card, Zone.EXILED, source, game)) {
- return false;
- }
- ReflexiveTriggeredAbility reflexiveTokenAbility = new ReflexiveTriggeredAbility(new CreateTokenEffect(new SpiritToken()), false);
- game.fireReflexiveTriggeredAbility(reflexiveTokenAbility, source);
- return true;
- }
-}
-
-class KirinTouchedOrochiCounterEffect extends OneShotEffect {
-
- KirinTouchedOrochiCounterEffect() {
- super(Outcome.Exile);
- this.staticText = "Exile target noncreature card from a graveyard. When you do, put a +1/+1 counter on target creature you control";
- }
-
- private KirinTouchedOrochiCounterEffect(final KirinTouchedOrochiCounterEffect effect) {
- super(effect);
- }
-
- @Override
- public KirinTouchedOrochiCounterEffect copy() {
- return new KirinTouchedOrochiCounterEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- UUID targetId = source.getFirstTarget();
- Card card = game.getCard(targetId);
- if (controller == null || card == null || game.getState().getZone(targetId) != Zone.GRAVEYARD) {
- return false;
- }
- if (!controller.moveCards(card, Zone.EXILED, source, game)) {
- return false;
- }
- ReflexiveTriggeredAbility reflexiveCounterAbility = new ReflexiveTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false);
- reflexiveCounterAbility.addTarget(new TargetControlledCreaturePermanent());
- game.fireReflexiveTriggeredAbility(reflexiveCounterAbility, source);
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/l/LocusOfEnlightenment.java b/Mage.Sets/src/mage/cards/l/LocusOfEnlightenment.java
deleted file mode 100644
index 190c43c56fc..00000000000
--- a/Mage.Sets/src/mage/cards/l/LocusOfEnlightenment.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package mage.cards.l;
-
-import mage.abilities.Ability;
-import mage.abilities.ActivatedAbility;
-import mage.abilities.common.ActivateAbilityTriggeredAbility;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
-import mage.abilities.effects.common.CopyStackObjectEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.FilterStackObject;
-import mage.filter.common.FilterActivatedOrTriggeredAbility;
-import mage.filter.predicate.other.NotManaAbilityPredicate;
-import mage.game.ExileZone;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.util.CardUtil;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class LocusOfEnlightenment extends CardImpl {
- private static final FilterStackObject filter = new FilterActivatedOrTriggeredAbility("an ability that isn't a mana ability");
-
- static {
- filter.add(NotManaAbilityPredicate.instance);
- }
- public LocusOfEnlightenment(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.nightCard = true;
- this.color.setBlue(true);
-
- // Locus of Enlightenment has each activated ability of the exiled cards used to craft it. You may activate each of those abilities only once each turn.
- this.addAbility(new SimpleStaticAbility(new LocusOfEnlightenmentEffect()));
-
- // Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy.
- this.addAbility(new ActivateAbilityTriggeredAbility(new CopyStackObjectEffect("it"), filter, SetTargetPointer.SPELL));
- }
-
- private LocusOfEnlightenment(final LocusOfEnlightenment card) {
- super(card);
- }
-
- @Override
- public LocusOfEnlightenment copy() {
- return new LocusOfEnlightenment(this);
- }
-}
-
-class LocusOfEnlightenmentEffect extends ContinuousEffectImpl {
-
- LocusOfEnlightenmentEffect() {
- super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.Benefit);
- staticText = "{this} has each activated ability of the exiled cards " +
- "used to craft it. You may activate each of those abilities only once each turn";
- }
-
- private LocusOfEnlightenmentEffect(final LocusOfEnlightenmentEffect effect) {
- super(effect);
- }
-
- @Override
- public LocusOfEnlightenmentEffect copy() {
- return new LocusOfEnlightenmentEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = source.getSourcePermanentIfItStillExists(game);
- if (permanent == null) {
- return false;
- }
- ExileZone exileZone = game
- .getExile()
- .getExileZone(CardUtil.getExileZoneId(
- game, permanent.getId(), permanent.getZoneChangeCounter(game) - 2
- ));
- if (exileZone == null) {
- return false;
- }
- for (Card card : exileZone.getCards(game)) {
- for (Ability ability : card.getAbilities(game)) {
- if (ability.isActivatedAbility()) {
- ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
- copyAbility.setMaxActivationsPerTurn(1);
- permanent.addAbility(copyAbility, source.getSourceId(), game, true);
- }
- }
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/m/MycoidMaze.java b/Mage.Sets/src/mage/cards/m/MycoidMaze.java
deleted file mode 100644
index 04fa111f543..00000000000
--- a/Mage.Sets/src/mage/cards/m/MycoidMaze.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package mage.cards.m;
-
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
-import mage.abilities.mana.GreenManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.PutCards;
-import mage.constants.SubType;
-import mage.filter.StaticFilters;
-
-import java.util.UUID;
-
-/**
- * @author xenohedron
- */
-public final class MycoidMaze extends CardImpl {
-
- public MycoidMaze(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.subtype.add(SubType.CAVE);
-
- // (Transforms from Twists and Turns.)
- this.nightCard = true;
-
- // {T}: Add {G}.
- this.addAbility(new GreenManaAbility());
-
- // {3}{G}, {T}: Look at the top four cards of your library. You may reveal a creature card from among them and put that card into your hand. Put the rest on the bottom of your library in a random order.
- Ability ability = new SimpleActivatedAbility(new LookLibraryAndPickControllerEffect(
- 4, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM
- ), new ManaCostsImpl<>("{3}{G}"));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
-
- }
-
- private MycoidMaze(final MycoidMaze card) {
- super(card);
- }
-
- @Override
- public MycoidMaze copy() {
- return new MycoidMaze(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/n/NamelessConqueror.java b/Mage.Sets/src/mage/cards/n/NamelessConqueror.java
deleted file mode 100644
index 2151a7b5730..00000000000
--- a/Mage.Sets/src/mage/cards/n/NamelessConqueror.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package mage.cards.n;
-
-import mage.MageInt;
-import mage.abilities.keyword.HasteAbility;
-import mage.abilities.keyword.TrampleAbility;
-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 NamelessConqueror extends CardImpl {
-
- public NamelessConqueror(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.SAMURAI);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
- this.color.setRed(true);
- this.nightCard = true;
-
- // Trample
- this.addAbility(TrampleAbility.getInstance());
-
- // Haste
- this.addAbility(HasteAbility.getInstance());
- }
-
- private NamelessConqueror(final NamelessConqueror card) {
- super(card);
- }
-
- @Override
- public NamelessConqueror copy() {
- return new NamelessConqueror(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/o/OKagachiMadeManifest.java b/Mage.Sets/src/mage/cards/o/OKagachiMadeManifest.java
deleted file mode 100644
index d20338dc62a..00000000000
--- a/Mage.Sets/src/mage/cards/o/OKagachiMadeManifest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package mage.cards.o;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.InfoEffect;
-import mage.abilities.effects.common.continuous.BoostSourceEffect;
-import mage.abilities.keyword.FlyingAbility;
-import mage.abilities.keyword.TrampleAbility;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.StaticFilters;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.TargetCard;
-import mage.target.common.TargetCardInGraveyard;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class OKagachiMadeManifest extends CardImpl {
-
- public OKagachiMadeManifest(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.DRAGON);
- this.subtype.add(SubType.SPIRIT);
- this.power = new MageInt(6);
- this.toughness = new MageInt(6);
- this.nightCard = true;
-
- // O-Kagachi Made Manifest is all colors.
- this.color.setWhite(true);
- this.color.setBlue(true);
- this.color.setBlack(true);
- this.color.setRed(true);
- this.color.setGreen(true);
- this.addAbility(new SimpleStaticAbility(new InfoEffect("{this} is all colors")));
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
-
- // Trample
- this.addAbility(TrampleAbility.getInstance());
-
- // Whenever O-Kagachi Made Manifest attacks, defending player chooses a nonland card in your graveyard. Return that card to your hand. O-Kagachi Made Manifest gets +X/+0 until end of turn, where X is the mana value of that card.
- this.addAbility(new AttacksTriggeredAbility(
- new OKagachiMadeManifestEffect(), false, null, SetTargetPointer.PLAYER
- ));
- }
-
- private OKagachiMadeManifest(final OKagachiMadeManifest card) {
- super(card);
- }
-
- @Override
- public OKagachiMadeManifest copy() {
- return new OKagachiMadeManifest(this);
- }
-}
-
-class OKagachiMadeManifestEffect extends OneShotEffect {
-
- OKagachiMadeManifestEffect() {
- super(Outcome.Benefit);
- staticText = "defending player chooses a nonland card in your graveyard. Return that card to your hand. " +
- "{this} gets +X/+0 until end of turn, where X is the mana value of that card";
- }
-
- private OKagachiMadeManifestEffect(final OKagachiMadeManifestEffect effect) {
- super(effect);
- }
-
- @Override
- public OKagachiMadeManifestEffect copy() {
- return new OKagachiMadeManifestEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
- if (controller == null || player == null) {
- return false;
- }
- Card card;
- switch (controller.getGraveyard().count(StaticFilters.FILTER_CARD_A_NON_LAND, game)) {
- case 0:
- return false;
- case 1:
- card = controller
- .getGraveyard()
- .getCards(StaticFilters.FILTER_CARD_A_NON_LAND, game)
- .stream()
- .findFirst()
- .orElse(null);
- break;
- default:
- TargetCard target = new TargetCardInGraveyard(StaticFilters.FILTER_CARD_A_NON_LAND);
- target.withNotTarget(true);
- player.choose(Outcome.ReturnToHand, controller.getGraveyard(), target, source, game);
- card = game.getCard(target.getFirstTarget());
- }
- if (card == null) {
- return false;
- }
- int manaValue = card.getManaValue();
- player.moveCards(card, Zone.HAND, source, game);
- if (manaValue > 0) {
- game.addEffect(new BoostSourceEffect(manaValue, 0, Duration.EndOfTurn), source);
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/r/RampagingWerewolf.java b/Mage.Sets/src/mage/cards/r/RampagingWerewolf.java
deleted file mode 100644
index b31735e695b..00000000000
--- a/Mage.Sets/src/mage/cards/r/RampagingWerewolf.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package mage.cards.r;
-
-import mage.MageInt;
-import mage.abilities.common.WerewolfBackTriggeredAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-import java.util.UUID;
-
-/**
- * @author nantuko
- */
-public final class RampagingWerewolf extends CardImpl {
-
- public RampagingWerewolf(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
- this.subtype.add(SubType.WEREWOLF);
- this.color.setRed(true);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- this.power = new MageInt(6);
- this.toughness = new MageInt(4);
-
- // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Rampaging Werewolf.
- this.addAbility(new WerewolfBackTriggeredAbility());
- }
-
- private RampagingWerewolf(final RampagingWerewolf card) {
- super(card);
- }
-
- @Override
- public RampagingWerewolf copy() {
- return new RampagingWerewolf(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/SeshirosLivingLegacy.java b/Mage.Sets/src/mage/cards/s/SeshirosLivingLegacy.java
deleted file mode 100644
index 61ed396df36..00000000000
--- a/Mage.Sets/src/mage/cards/s/SeshirosLivingLegacy.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package mage.cards.s;
-
-import mage.MageInt;
-import mage.abilities.keyword.HasteAbility;
-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 SeshirosLivingLegacy extends CardImpl {
-
- public SeshirosLivingLegacy(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.SNAKE);
- this.subtype.add(SubType.WARRIOR);
- this.power = new MageInt(5);
- this.toughness = new MageInt(5);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Vigilance
- this.addAbility(VigilanceAbility.getInstance());
-
- // Haste
- this.addAbility(HasteAbility.getInstance());
- }
-
- private SeshirosLivingLegacy(final SeshirosLivingLegacy card) {
- super(card);
- }
-
- @Override
- public SeshirosLivingLegacy copy() {
- return new SeshirosLivingLegacy(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/SpiresOfOrazca.java b/Mage.Sets/src/mage/cards/s/SpiresOfOrazca.java
deleted file mode 100644
index 49d9508989b..00000000000
--- a/Mage.Sets/src/mage/cards/s/SpiresOfOrazca.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package mage.cards.s;
-
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
-import mage.abilities.effects.common.UntapTargetEffect;
-import mage.abilities.mana.ColorlessManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterOpponentsCreaturePermanent;
-import mage.filter.predicate.permanent.AttackingPredicate;
-import mage.target.TargetPermanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class SpiresOfOrazca extends CardImpl {
-
- private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent("attacking creature an opponent controls");
-
- static {
- filter.add(AttackingPredicate.instance);
- }
-
- public SpiresOfOrazca(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
- this.nightCard = true;
-
- // {T}: Add {C}.
- this.addAbility(new ColorlessManaAbility());
-
- // {T}: Untap target attacking creature an opponent controls and remove it from combat.
- Ability ability = new SimpleActivatedAbility(
- new UntapTargetEffect()
- .setText("Untap target attacking creature an opponent controls"),
- new TapSourceCost()
- );
- ability.addEffect(new RemoveFromCombatTargetEffect().setText("and remove it from combat"));
- ability.addTarget(new TargetPermanent(filter));
- this.addAbility(ability);
- }
-
- private SpiresOfOrazca(final SpiresOfOrazca card) {
- super(card);
- }
-
- @Override
- public SpiresOfOrazca copy() {
- return new SpiresOfOrazca(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/s/StonewingAntagonizer.java b/Mage.Sets/src/mage/cards/s/StonewingAntagonizer.java
deleted file mode 100644
index 31f18cbdc2b..00000000000
--- a/Mage.Sets/src/mage/cards/s/StonewingAntagonizer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-
-package mage.cards.s;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.keyword.FlyingAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-/**
- *
- * @author fireshoes
- */
-public final class StonewingAntagonizer extends CardImpl {
-
- public StonewingAntagonizer(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"");
- this.subtype.add(SubType.GARGOYLE);
- this.subtype.add(SubType.HORROR);
- this.power = new MageInt(4);
- this.toughness = new MageInt(2);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
- }
-
- private StonewingAntagonizer(final StonewingAntagonizer card) {
- super(card);
- }
-
- @Override
- public StonewingAntagonizer copy() {
- return new StonewingAntagonizer(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TalesOfMasterSeshiro.java b/Mage.Sets/src/mage/cards/t/TalesOfMasterSeshiro.java
index 6f85e081486..5f9a0a4d45d 100644
--- a/Mage.Sets/src/mage/cards/t/TalesOfMasterSeshiro.java
+++ b/Mage.Sets/src/mage/cards/t/TalesOfMasterSeshiro.java
@@ -5,10 +5,10 @@ import mage.abilities.effects.Effects;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SagaChapter;
import mage.constants.SubType;
@@ -21,20 +21,22 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TalesOfMasterSeshiro extends CardImpl {
+public final class TalesOfMasterSeshiro extends TransformingDoubleFacedCard {
public TalesOfMasterSeshiro(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.s.SeshirosLivingLegacy.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{4}{G}",
+ "Seshiro's Living Legacy",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SNAKE, SubType.WARRIOR}, "G"
+ );
+ // Tales of Master Seshiro
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I, II — Put a +1/+1 counter on target creature or Vehicle you control. It gains vigilance until end of turn.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
new Effects(
new AddCountersTargetEffect(CounterType.P1P1.createInstance()),
new GainAbilityTargetEffect(VigilanceAbility.getInstance())
@@ -43,10 +45,18 @@ public final class TalesOfMasterSeshiro extends CardImpl {
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Seshiro's Living Legacy
+ this.getRightHalfCard().setPT(5, 5);
+
+ // Vigilance
+ this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
+
+ // Haste
+ this.getRightHalfCard().addAbility(HasteAbility.getInstance());
}
private TalesOfMasterSeshiro(final TalesOfMasterSeshiro card) {
diff --git a/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java b/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java
index 4777b4073b6..68f64afa8e5 100644
--- a/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java
+++ b/Mage.Sets/src/mage/cards/t/TangleclawWerewolf.java
@@ -1,42 +1,52 @@
-
package mage.cards.t;
-import java.util.UUID;
-
-import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.combat.MustBeBlockedByAtLeastOneSourceEffect;
+import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
-import mage.constants.SubType;
import mage.constants.Duration;
-import mage.constants.Zone;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
* @author LevelX2
*/
-public final class TangleclawWerewolf extends CardImpl {
+public final class TangleclawWerewolf extends TransformingDoubleFacedCard {
public TangleclawWerewolf(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
- this.subtype.add(SubType.WEREWOLF);
- this.subtype.add(SubType.HORROR);
- this.power = new MageInt(2);
- this.toughness = new MageInt(4);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF, SubType.HORROR}, "{2}{G}{G}",
+ "Fibrous Entangler",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.WEREWOLF}, ""
+ );
- this.secondSideCardClazz = mage.cards.f.FibrousEntangler.class;
+ // Tangleclaw Werewolf
+ this.getLeftHalfCard().setPT(2, 4);
// Tangleclaw Werewolf can block an additional creature each combat.
- this.addAbility(new SimpleStaticAbility(new CanBlockAdditionalCreatureEffect(Duration.WhileOnBattlefield, 1)));
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new CanBlockAdditionalCreatureEffect(Duration.WhileOnBattlefield, 1)));
// {6}{G}: Transform Tangleclaw Werewolf.
- this.addAbility(new TransformAbility());
- this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{6}{G}")));
+ this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{6}{G}")));
+
+ // Fibrous Entangler
+ this.getRightHalfCard().setPT(4, 6);
+
+ // Vigilance
+ this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
+
+ // Fibrous Entangler must be blocked if able.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new MustBeBlockedByAtLeastOneSourceEffect(Duration.WhileOnBattlefield)));
+
+ // Fibrous Entangler can block an additional creature each combat.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new CanBlockAdditionalCreatureEffect(Duration.WhileOnBattlefield, 1)));
}
private TangleclawWerewolf(final TangleclawWerewolf card) {
diff --git a/Mage.Sets/src/mage/cards/t/TarkirDuneshaper.java b/Mage.Sets/src/mage/cards/t/TarkirDuneshaper.java
index 3b20c0913f1..1e2b32000df 100644
--- a/Mage.Sets/src/mage/cards/t/TarkirDuneshaper.java
+++ b/Mage.Sets/src/mage/cards/t/TarkirDuneshaper.java
@@ -1,12 +1,11 @@
package mage.cards.t;
-import mage.MageInt;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@@ -15,20 +14,26 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TarkirDuneshaper extends CardImpl {
+public final class TarkirDuneshaper extends TransformingDoubleFacedCard {
public TarkirDuneshaper(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DOG, SubType.WARRIOR}, "{W}",
+ "Burnished Dunestomper",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.DOG, SubType.WARRIOR}, "WG"
+ );
- this.subtype.add(SubType.DOG);
- this.subtype.add(SubType.WARRIOR);
- this.power = new MageInt(1);
- this.toughness = new MageInt(2);
- this.secondSideCardClazz = mage.cards.b.BurnishedDunestomper.class;
+ // Tarkir Duneshaper
+ this.getLeftHalfCard().setPT(1, 2);
// {4}{G/P}: Transform Tarkir Duneshaper. Activate only as a sorcery.
- this.addAbility(new TransformAbility());
- this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{G/P}")));
+ this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{G/P}")));
+
+ // Burnished Dunestomper
+ this.getRightHalfCard().setPT(4, 3);
+
+ // Trample
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
}
private TarkirDuneshaper(final TarkirDuneshaper card) {
diff --git a/Mage.Sets/src/mage/cards/t/TarriansJournal.java b/Mage.Sets/src/mage/cards/t/TarriansJournal.java
index 3649563facd..5040d9877ef 100644
--- a/Mage.Sets/src/mage/cards/t/TarriansJournal.java
+++ b/Mage.Sets/src/mage/cards/t/TarriansJournal.java
@@ -1,29 +1,49 @@
package mage.cards.t;
-import java.util.UUID;
+import mage.MageIdentifier;
+import mage.MageObject;
+import mage.MageObjectReference;
import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.DiscardHandCost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.AsThoughEffectImpl;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.counter.AddCounterEnteringCreatureEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.cards.Card;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.counters.CounterType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.Spell;
+import mage.game.stack.StackObject;
+import mage.target.targetpointer.FixedTarget;
+import mage.util.CardUtil;
+import mage.util.SubTypes;
+import mage.watchers.Watcher;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
/**
*
* @author jeffwadsworth
*/
-public class TarriansJournal extends CardImpl {
+public class TarriansJournal extends TransformingDoubleFacedCard {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another artifact or creature");
@@ -36,23 +56,33 @@ public class TarriansJournal extends CardImpl {
}
public TarriansJournal(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{B}");
- this.supertype.add(SuperType.LEGENDARY);
-
- this.secondSideCardClazz = mage.cards.t.TheTombOfAclazotz.class;
- this.color.setBlack(true);
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{B}",
+ "The Tomb of Aclazotz",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{SubType.CAVE}, ""
+ );
+ // Tarrian's Journal
// T: Sacrifice another artifact or creature: Draw a card. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(new DrawCardSourceControllerEffect(1), new TapSourceCost());
ability.addCost(new SacrificeTargetCost(filter));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
// {2}, {T}, Discard your hand: Transform Tarrian's Journal.
- this.addAbility(new TransformAbility());
Ability transformAbility = new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{2}"));
transformAbility.addCost(new TapSourceCost());
transformAbility.addCost(new DiscardHandCost());
- this.addAbility(transformAbility);
+ this.getLeftHalfCard().addAbility(transformAbility);
+
+ // The Tomb of Aclazotz
+ // {T}: Add {B}.
+ this.getRightHalfCard().addAbility(new BlackManaAbility());
+
+ // You may cast a creature spell from your graveyard this turn. If you do, it enters with a finality counter on it and is a Vampire in addition to its other types.
+ Ability castSpellAbility = new SimpleActivatedAbility(new TheTombOfAclazotzEffect(), new TapSourceCost());
+ castSpellAbility.setIdentifier(MageIdentifier.TheTombOfAclazotzWatcher);
+ castSpellAbility.addWatcher(new TheTombOfAclazotzWatcher());
+ this.getRightHalfCard().addAbility(castSpellAbility);
}
@@ -66,3 +96,221 @@ public class TarriansJournal extends CardImpl {
}
}
+
+class TheTombOfAclazotzEffect extends AsThoughEffectImpl {
+
+ TheTombOfAclazotzEffect() {
+ super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
+ staticText = "You may cast a creature spell from your graveyard this turn. If you do, it enters with a finality counter on it and is a Vampire in addition to its other types. (If a creature with a finality counter on it would die, exile it instead.)";
+ }
+
+ private TheTombOfAclazotzEffect(final TheTombOfAclazotzEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public TheTombOfAclazotzEffect copy() {
+ return new TheTombOfAclazotzEffect(this);
+ }
+
+ @Override
+ public void init(Ability source, Game game) {
+ super.init(source, game);
+ TheTombOfAclazotzWatcher watcher = game.getState().getWatcher(TheTombOfAclazotzWatcher.class);
+ if (watcher != null) {
+ watcher.addPlayable(source, game);
+ watcher.addPlayFromAnywhereEffect(this.getId());
+ }
+ }
+
+ @Override
+ public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
+ throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility");
+ }
+
+ @Override
+ public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) {
+ TheTombOfAclazotzWatcher watcher = game.getState().getWatcher(TheTombOfAclazotzWatcher.class);
+ if (watcher == null
+ || !watcher.checkPermission(playerId, source, game)
+ || game.getState().getZone(objectId) != Zone.GRAVEYARD) {
+ return false;
+ }
+ Card card = game.getCard(objectId);
+ return card != null
+ && affectedAbility instanceof SpellAbility
+ && card.getOwnerId().equals(playerId)
+ && card.isCreature(game);
+ }
+}
+
+class TheTombOfAclazotzWatcher extends Watcher {
+
+ private final Map> morMap = new HashMap<>();
+ private UUID playFromAnywhereEffectId;
+
+ TheTombOfAclazotzWatcher() {
+ super(WatcherScope.GAME);
+ }
+
+ @Override
+ public void watch(GameEvent event, Game game) {
+ if (GameEvent.EventType.CAST_SPELL.equals(event.getType())
+ && event.hasApprovingIdentifier(MageIdentifier.TheTombOfAclazotzWatcher)) {
+ Spell target = game.getSpell(event.getTargetId());
+ Card card = target.getCard();
+ if (card != null) {
+ game.getState().addEffect(new AddCounterEnteringCreatureEffect(new MageObjectReference(target.getCard(), game),
+ CounterType.FINALITY.createInstance(), Outcome.Neutral),
+ target.getSpellAbility());
+ game.getState().addEffect(new AddSubtypeEnteringCreatureEffect(new MageObjectReference(target.getCard(), game), SubType.VAMPIRE, Outcome.Benefit), card.getSpellAbility());
+ // Rule 728.2 we must insure the effect is used (creature is cast successfully) before discarding the play effect
+ UUID playEffectId = this.getPlayFromAnywhereEffect();
+ if (playEffectId != null
+ && game.getContinuousEffects().getApplicableAsThoughEffects(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, game).listIterator().next().getId().equals(playEffectId)) {
+ // discard the play effect
+ game.getContinuousEffects().getApplicableAsThoughEffects(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, game).listIterator().next().discard();
+ }
+ }
+ }
+ }
+
+ boolean checkPermission(UUID playerId, Ability source, Game game) {
+ if (!playerId.equals(source.getControllerId())) {
+ return false;
+ }
+ MageObjectReference mor = new MageObjectReference(
+ source.getSourceId(), source.getStackMomentSourceZCC(), game
+ );
+ return morMap.computeIfAbsent(mor, m -> new HashMap<>()).getOrDefault(playerId, 0) > 0;
+ }
+
+ void addPlayable(Ability source, Game game) {
+ MageObjectReference mor = new MageObjectReference(
+ source.getSourceId(), source.getStackMomentSourceZCC(), game
+ );
+ morMap.computeIfAbsent(mor, m -> new HashMap<>())
+ .compute(source.getControllerId(), CardUtil::setOrIncrementValue);
+ }
+
+ void addPlayFromAnywhereEffect(UUID uuid) {
+ playFromAnywhereEffectId = uuid;
+ }
+
+ UUID getPlayFromAnywhereEffect() {
+ return playFromAnywhereEffectId;
+ }
+
+ @Override
+ public void reset() {
+ morMap.clear();
+ super.reset();
+ }
+
+}
+
+class AddSubtypeEnteringCreatureEffect extends ReplacementEffectImpl {
+
+ private final MageObjectReference mor;
+ private final SubType subType;
+
+ AddSubtypeEnteringCreatureEffect(MageObjectReference mor, SubType subType, Outcome outcome) {
+ super(Duration.WhileOnBattlefield, outcome);
+ this.mor = mor;
+ this.subType = subType;
+ }
+
+ private AddSubtypeEnteringCreatureEffect(final AddSubtypeEnteringCreatureEffect effect) {
+ super(effect);
+ this.mor = effect.mor;
+ this.subType = effect.subType;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CAST_SPELL_LATE;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ MageObject spell = game.getObject(event.getSourceId());
+ return spell != null && mor.refersTo(spell, game);
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Spell target = game.getSpell(event.getSourceId());
+ if (target != null) {
+ AddCardSubTypeEnteringTargetEffect effect = new AddCardSubTypeEnteringTargetEffect(mor, subType, Duration.WhileOnBattlefield);
+ effect.setTargetPointer(new FixedTarget(target, game));
+ game.addEffect(effect, source);
+ }
+ return false;
+ }
+
+ @Override
+ public AddSubtypeEnteringCreatureEffect copy() {
+ return new AddSubtypeEnteringCreatureEffect(this);
+ }
+}
+
+class AddCardSubTypeEnteringTargetEffect extends ContinuousEffectImpl {
+
+ private final SubType addedSubType;
+ private final MageObjectReference mor;
+ private Card card;
+
+ AddCardSubTypeEnteringTargetEffect(MageObjectReference mor, SubType addedSubType, Duration duration) {
+ super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
+ this.addedSubType = addedSubType;
+ this.mor = mor;
+ }
+
+ protected AddCardSubTypeEnteringTargetEffect(final AddCardSubTypeEnteringTargetEffect effect) {
+ super(effect);
+ this.addedSubType = effect.addedSubType;
+ this.mor = effect.mor;
+ this.card = effect.card;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Spell spell = game.getSpell(getTargetPointer().getFirst(game, source));
+ MageObject target = game.getObject(getTargetPointer().getFirst(game, source));
+ if (spell != null) {
+ card = spell.getCard();
+ }
+ for (StackObject stackObject : game.getStack()) {
+ if (stackObject instanceof Spell
+ && target != null
+ && target.equals(stackObject)
+ && mor.refersTo(target, game)) {
+ setCreatureSubtype(stackObject, addedSubType, game);
+ setCreatureSubtype(((Spell) stackObject).getCard(), addedSubType, game);
+ }
+ }
+ if (card != null
+ && game.getPermanent(card.getId()) != null
+ && game.getState().getZoneChangeCounter(card.getId()) == mor.getZoneChangeCounter() + 1) { // blinking, etc
+ game.getPermanent(card.getId()).addSubType(game, addedSubType);
+ }
+ return true;
+ }
+
+ private void setCreatureSubtype(MageObject object, SubType subtype, Game game) {
+ SubTypes subTypes = game.getState().getCreateMageObjectAttribute(object, game).getSubtype();
+ if (!subTypes.contains(subtype)) {
+ subTypes.add(subtype);
+ }
+ }
+
+ @Override
+ public AddCardSubTypeEnteringTargetEffect copy() {
+ return new AddCardSubTypeEnteringTargetEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TavernRuffian.java b/Mage.Sets/src/mage/cards/t/TavernRuffian.java
index 804e7551083..22bc66e2b86 100644
--- a/Mage.Sets/src/mage/cards/t/TavernRuffian.java
+++ b/Mage.Sets/src/mage/cards/t/TavernRuffian.java
@@ -1,9 +1,9 @@
package mage.cards.t;
-import mage.MageInt;
import mage.abilities.keyword.DayboundAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@@ -12,21 +12,26 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TavernRuffian extends CardImpl {
+public final class TavernRuffian extends TransformingDoubleFacedCard {
public TavernRuffian(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARRIOR, SubType.WEREWOLF}, "{3}{R}",
+ "Tavern Smasher",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
+ );
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WARRIOR);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(2);
- this.toughness = new MageInt(5);
-
- this.secondSideCardClazz = mage.cards.t.TavernSmasher.class;
+ // Tavern Ruffian
+ this.getLeftHalfCard().setPT(2, 5);
// Daybound
- this.addAbility(new DayboundAbility());
+ this.getLeftHalfCard().addAbility(new DayboundAbility());
+
+ // Tavern Smasher
+ this.getRightHalfCard().setPT(6, 5);
+
+ // Nightbound
+ this.getRightHalfCard().addAbility(new NightboundAbility());
}
private TavernRuffian(final TavernRuffian card) {
diff --git a/Mage.Sets/src/mage/cards/t/TavernSmasher.java b/Mage.Sets/src/mage/cards/t/TavernSmasher.java
deleted file mode 100644
index 23e61cd013e..00000000000
--- a/Mage.Sets/src/mage/cards/t/TavernSmasher.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package mage.cards.t;
-
-import mage.MageInt;
-import mage.abilities.keyword.NightboundAbility;
-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 TavernSmasher extends CardImpl {
-
- public TavernSmasher(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.WEREWOLF);
-
- this.color.setRed(true);
-
- this.nightCard = true;
-
- this.power = new MageInt(6);
- this.toughness = new MageInt(5);
-
- // Nightbound
- this.addAbility(new NightboundAbility());
- }
-
- private TavernSmasher(final TavernSmasher card) {
- super(card);
- }
-
- @Override
- public TavernSmasher copy() {
- return new TavernSmasher(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TeachingsOfTheKirin.java b/Mage.Sets/src/mage/cards/t/TeachingsOfTheKirin.java
index 7b0d51758cf..7a9802562c4 100644
--- a/Mage.Sets/src/mage/cards/t/TeachingsOfTheKirin.java
+++ b/Mage.Sets/src/mage/cards/t/TeachingsOfTheKirin.java
@@ -1,54 +1,84 @@
package mage.cards.t;
-import java.util.UUID;
-
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SagaAbility;
+import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.constants.SagaChapter;
-import mage.constants.SubType;
-import mage.cards.CardImpl;
+import mage.cards.Card;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.counters.CounterType;
+import mage.filter.FilterCard;
+import mage.filter.StaticFilters;
+import mage.filter.predicate.Predicates;
+import mage.game.Game;
import mage.game.permanent.token.SpiritToken;
+import mage.players.Player;
+import mage.target.common.TargetCardInGraveyard;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
*
* @author weirddan455
*/
-public final class TeachingsOfTheKirin extends CardImpl {
+public final class TeachingsOfTheKirin extends TransformingDoubleFacedCard {
+
+ private static final FilterCard filter = new FilterCard("noncreature card from a graveyard");
+
+ static {
+ filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
+ }
public TeachingsOfTheKirin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.k.KirinTouchedOrochi.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{1}{G}",
+ "Kirin-Touched Orochi",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SNAKE, SubType.MONK}, "G"
+ );
+ // Teachings of the Kirin
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I - Mill three cards. Create a 1/1 colorless Spirit creature token.
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I,
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_I,
new MillCardsControllerEffect(3),
new CreateTokenEffect(new SpiritToken())
);
// II — Put a +1/+1 counter on target creature you control.
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new AddCountersTargetEffect(CounterType.P1P1.createInstance()),
new TargetControlledCreaturePermanent()
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Kirin-Touched Orochi
+ this.getRightHalfCard().setPT(1, 1);
+
+ // Whenever Kirin-Touched Orochi attacks, choose one —
+ // • Exile target creature card from a graveyard. When you do, create a 1/1 colorless Spirit creature token.
+ Ability ability = new AttacksTriggeredAbility(new KirinTouchedOrochiTokenEffect());
+ ability.addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_A_GRAVEYARD));
+
+ // • Exile target noncreature card from a graveyard. When you do, put a +1/+1 counter on target creature you control.
+ Mode mode = new Mode(new KirinTouchedOrochiCounterEffect());
+ mode.addTarget(new TargetCardInGraveyard(filter));
+ ability.addMode(mode);
+ this.getRightHalfCard().addAbility(ability);
}
private TeachingsOfTheKirin(final TeachingsOfTheKirin card) {
@@ -60,3 +90,70 @@ public final class TeachingsOfTheKirin extends CardImpl {
return new TeachingsOfTheKirin(this);
}
}
+
+class KirinTouchedOrochiTokenEffect extends OneShotEffect {
+
+ KirinTouchedOrochiTokenEffect() {
+ super(Outcome.Exile);
+ this.staticText = "Exile target creature card from a graveyard. When you do, create a 1/1 colorless Spirit creature token";
+ }
+
+ private KirinTouchedOrochiTokenEffect(final KirinTouchedOrochiTokenEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KirinTouchedOrochiTokenEffect copy() {
+ return new KirinTouchedOrochiTokenEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ UUID targetId = source.getFirstTarget();
+ Card card = game.getCard(targetId);
+ if (controller == null || card == null || game.getState().getZone(targetId) != Zone.GRAVEYARD) {
+ return false;
+ }
+ if (!controller.moveCards(card, Zone.EXILED, source, game)) {
+ return false;
+ }
+ ReflexiveTriggeredAbility reflexiveTokenAbility = new ReflexiveTriggeredAbility(new CreateTokenEffect(new SpiritToken()), false);
+ game.fireReflexiveTriggeredAbility(reflexiveTokenAbility, source);
+ return true;
+ }
+}
+
+class KirinTouchedOrochiCounterEffect extends OneShotEffect {
+
+ KirinTouchedOrochiCounterEffect() {
+ super(Outcome.Exile);
+ this.staticText = "Exile target noncreature card from a graveyard. When you do, put a +1/+1 counter on target creature you control";
+ }
+
+ private KirinTouchedOrochiCounterEffect(final KirinTouchedOrochiCounterEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KirinTouchedOrochiCounterEffect copy() {
+ return new KirinTouchedOrochiCounterEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ UUID targetId = source.getFirstTarget();
+ Card card = game.getCard(targetId);
+ if (controller == null || card == null || game.getState().getZone(targetId) != Zone.GRAVEYARD) {
+ return false;
+ }
+ if (!controller.moveCards(card, Zone.EXILED, source, game)) {
+ return false;
+ }
+ ReflexiveTriggeredAbility reflexiveCounterAbility = new ReflexiveTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), false);
+ reflexiveCounterAbility.addTarget(new TargetControlledCreaturePermanent());
+ game.fireReflexiveTriggeredAbility(reflexiveCounterAbility, source);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TerraMagicalAdept.java b/Mage.Sets/src/mage/cards/t/TerraMagicalAdept.java
index 2b3d125cd26..d52e721e859 100644
--- a/Mage.Sets/src/mage/cards/t/TerraMagicalAdept.java
+++ b/Mage.Sets/src/mage/cards/t/TerraMagicalAdept.java
@@ -1,52 +1,91 @@
package mage.cards.t;
-import mage.MageInt;
+import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SagaAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenCopyTargetEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
+import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.MillThenPutInHandEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.mana.BasicManaEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.HasteAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.PutCards;
-import mage.constants.SubType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.counters.CounterType;
+import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledEnchantmentPermanent;
+import mage.filter.predicate.Predicates;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import java.util.Optional;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TerraMagicalAdept extends CardImpl {
+public final class TerraMagicalAdept extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter = new FilterControlledEnchantmentPermanent("nonlegendary enchantment you control");
+
+ static {
+ filter.add(Predicates.not(SuperType.LEGENDARY.getPredicate()));
+ }
public TerraMagicalAdept(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD, SubType.WARRIOR}, "{1}{R}{G}",
+ "Esper Terra",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SAGA, SubType.WIZARD}, "RG"
+ );
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WIZARD);
- this.subtype.add(SubType.WARRIOR);
- this.power = new MageInt(4);
- this.toughness = new MageInt(2);
- this.secondSideCardClazz = mage.cards.e.EsperTerra.class;
+ // Terra, Magical Adept
+ this.getLeftHalfCard().setPT(4, 2);
// When Terra enters, mill five cards. Put up to one enchantment milled this this way into your hand.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new MillThenPutInHandEffect(
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new MillThenPutInHandEffect(
5, StaticFilters.FILTER_CARD_ENCHANTMENT, true
).setText("mill five cards. Put up to one enchantment card milled this way into your hand")));
// Trance -- {4}{R}{G}, {T}: Exile Terra, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery.
- this.addAbility(new TransformAbility());
Ability ability = new ActivateAsSorceryActivatedAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED), new ManaCostsImpl<>("{4}{R}{G}")
);
ability.addCost(new TapSourceCost());
- this.addAbility(ability.withFlavorWord("Trance"));
+ this.getLeftHalfCard().addAbility(ability.withFlavorWord("Trance"));
+
+ // Esper Terra
+ this.getRightHalfCard().setPT(6, 6);
+
+ // (As this Saga enters and after your draw step, add a lore counter.)
+ SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard(), SagaChapter.CHAPTER_IV);
+
+ // I, II, III -- Create a token that's a copy of target nonlegendary enchantment you control. It gains haste. If it's a Saga, put up to three lore counters on it. Sacrifice it at the beginning of your next end step.
+ sagaAbility.addChapterEffect(
+ this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_III,
+ new EsperTerraEffect(), new TargetPermanent(filter)
+ );
+
+ // IV -- Add {W}{W}, {U}{U}, {B}{B}, {R}{R}, and {G}{G}. Exile Esper Terra, then return it to the battlefield.
+ sagaAbility.addChapterEffect(
+ this.getRightHalfCard(), SagaChapter.CHAPTER_IV,
+ new BasicManaEffect(new Mana(
+ 2, 2, 2, 2, 2, 0, 0, 0
+ )).setText("add {W}{W}, {U}{U}, {B}{B}, {R}{R}, and {G}{G}"),
+ new ExileSourceAndReturnFaceUpEffect());
+ this.getRightHalfCard().addAbility(sagaAbility);
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
}
private TerraMagicalAdept(final TerraMagicalAdept card) {
@@ -58,3 +97,48 @@ public final class TerraMagicalAdept extends CardImpl {
return new TerraMagicalAdept(this);
}
}
+
+class EsperTerraEffect extends OneShotEffect {
+
+ EsperTerraEffect() {
+ super(Outcome.Benefit);
+ staticText = "create a token that's a copy of target nonlegendary enchantment you control. " +
+ "It gains haste. If it's a Saga, put up to three lore counters on it. " +
+ "Sacrifice it at the beginning of your next end step";
+ }
+
+ private EsperTerraEffect(final EsperTerraEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public EsperTerraEffect copy() {
+ return new EsperTerraEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (permanent == null) {
+ return false;
+ }
+ CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect();
+ effect.setSavedPermanent(permanent);
+ effect.addAdditionalAbilities(HasteAbility.getInstance());
+ effect.apply(game, source);
+ for (Permanent token : effect.getAddedPermanents()) {
+ if (!token.hasSubtype(SubType.SAGA, game)) {
+ continue;
+ }
+ Optional.ofNullable(source.getControllerId())
+ .map(game::getPlayer)
+ .map(player -> player.getAmount(
+ 0, 3, "Choose how many lore counters to put on " + token.getIdName(), source, game
+ ))
+ .filter(amount -> amount > 0)
+ .ifPresent(amount -> token.addCounters(CounterType.LORE.createInstance(amount), source, game));
+ }
+ effect.removeTokensCreatedAt(game, source, false, PhaseStep.END_TURN, TargetController.YOU);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TetzinGnomeChampion.java b/Mage.Sets/src/mage/cards/t/TetzinGnomeChampion.java
index 1f93a371526..b6d4297b2eb 100644
--- a/Mage.Sets/src/mage/cards/t/TetzinGnomeChampion.java
+++ b/Mage.Sets/src/mage/cards/t/TetzinGnomeChampion.java
@@ -1,11 +1,16 @@
package mage.cards.t;
-import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldThisOrAnotherTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.MillThenPutInHandEffect;
+import mage.abilities.effects.common.TransformTargetEffect;
import mage.abilities.keyword.CraftAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
@@ -14,6 +19,8 @@ import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.card.DoubleFacedCardPredicate;
import mage.filter.predicate.mageobject.AnotherPredicate;
+import mage.game.permanent.token.GnomeToken;
+import mage.target.TargetPermanent;
import java.util.UUID;
@@ -21,43 +28,62 @@ import java.util.UUID;
*
* @author jeffwadsworth
*/
-public class TetzinGnomeChampion extends CardImpl {
+public class TetzinGnomeChampion extends TransformingDoubleFacedCard {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("double-faced artifact");
+ private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("other target double-faced artifact you control");
static {
filter.add(AnotherPredicate.instance);
filter.add(Predicates.and(
DoubleFacedCardPredicate.instance,
- CardType.ARTIFACT.getPredicate()
- )
+ CardType.ARTIFACT.getPredicate())
+ );
+ filter2.add(AnotherPredicate.instance);
+ filter2.add(Predicates.and(
+ DoubleFacedCardPredicate.instance,
+ CardType.ARTIFACT.getPredicate())
);
}
public TetzinGnomeChampion(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{U}{R}{W}");
- this.supertype.add(SuperType.LEGENDARY);
- this.cardType.add(CardType.CREATURE);
- this.subtype.add(SubType.GNOME);
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GNOME}, "{U}{R}{W}",
+ "The Golden-Gear Colossus",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GNOME}, "URW"
+ );
- this.secondSideCardClazz = mage.cards.t.TheGoldenGearColossus.class;
- this.color.setBlue(true);
- this.color.setRed(true);
- this.color.setWhite(true);
+ // Tetzin, Gnome Champion
+ this.getLeftHalfCard().setPT(2, 2);
// Whenever Tetzin or another double-faced artifact you control enters, mill three cards. You may put an artifact card from among them into your hand.
- this.addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility(
new MillThenPutInHandEffect(3, StaticFilters.FILTER_CARD_ARTIFACT_AN).withTextOptions("them"),
filter, false, true
));
// Craft with six artifacts 4 (4, Exile this artifact, Exile the six from among other permanents you control and/or cards from your graveyard: Return this card transformed under its owner's control. Craft only as a sorcery.)
- this.addAbility(new CraftAbility(
+ this.getLeftHalfCard().addAbility(new CraftAbility(
"{4}", "six artifacts", "other artifacts you control and/or"
+ "artifact cards in your graveyard", 6, 6, CardType.ARTIFACT.getPredicate()
));
+
+ // The Golden-Gear Colossus
+ this.getRightHalfCard().setPT(6, 6);
+
+ // Vigilance
+ this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
+
+ // Trample
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
+
+ // Whenever The Golden-Gear Colossus enters the battlefield or attacks, transform up to one other target double-faced artifact you control. Create two 1/1 colorless Gnome artifact creature tokens.
+ Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new TransformTargetEffect());
+ TargetPermanent target = new TargetPermanent(0, 1, filter2);
+ ability.addTarget(target);
+ ability.addEffect(new CreateTokenEffect(new GnomeToken(), 2));
+ this.getRightHalfCard().addAbility(ability);
+
}
private TetzinGnomeChampion(final TetzinGnomeChampion card) {
diff --git a/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java b/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java
index 9f87ab86bfc..ad31deb3782 100644
--- a/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java
+++ b/Mage.Sets/src/mage/cards/t/ThaumaticCompass.java
@@ -6,17 +6,24 @@ import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.RemoveFromCombatTargetEffect;
import mage.abilities.effects.common.TransformSourceEffect;
+import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.hint.common.LandsYouControlHint;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.mana.ColorlessManaAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.ComparisonType;
+import mage.constants.SubType;
+import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterLandPermanent;
+import mage.filter.common.FilterOpponentsCreaturePermanent;
+import mage.filter.predicate.permanent.AttackingPredicate;
+import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
@@ -24,28 +31,51 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class ThaumaticCompass extends CardImpl {
+public final class ThaumaticCompass extends TransformingDoubleFacedCard {
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterLandPermanent("you control seven or more lands"),
ComparisonType.MORE_THAN, 6, true
);
- public ThaumaticCompass(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
- this.secondSideCardClazz = mage.cards.s.SpiresOfOrazca.class;
+ private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent("attacking creature an opponent controls");
+ static {
+ filter.add(AttackingPredicate.instance);
+ }
+
+ public ThaumaticCompass(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}",
+ "Spires of Orazca",
+ new CardType[]{CardType.LAND}, new SubType[]{}, ""
+ );
+
+ // Thaumatic Compass
// {3}, {T}: Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.
Ability ability = new SimpleActivatedAbility(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true),
new GenericManaCost(3));
ability.addCost(new TapSourceCost());
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
// At the beginning of your end step, if you control seven or more lands, transform Thaumatic Compass.
- this.addAbility(new TransformAbility());
- this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
+ this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(condition).addHint(LandsYouControlHint.instance));
+
+ // Spires of Orazca
+ // {T}: Add {C}.
+ this.getRightHalfCard().addAbility(new ColorlessManaAbility());
+
+ // {T}: Untap target attacking creature an opponent controls and remove it from combat.
+ Ability ability2 = new SimpleActivatedAbility(
+ new UntapTargetEffect()
+ .setText("Untap target attacking creature an opponent controls"),
+ new TapSourceCost()
+ );
+ ability2.addEffect(new RemoveFromCombatTargetEffect().setText("and remove it from combat"));
+ ability2.addTarget(new TargetPermanent(filter));
+ this.getRightHalfCard().addAbility(ability2);
}
private ThaumaticCompass(final ThaumaticCompass card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheDragonKamiReborn.java b/Mage.Sets/src/mage/cards/t/TheDragonKamiReborn.java
index 798e0674802..86e9be938cb 100644
--- a/Mage.Sets/src/mage/cards/t/TheDragonKamiReborn.java
+++ b/Mage.Sets/src/mage/cards/t/TheDragonKamiReborn.java
@@ -1,47 +1,63 @@
package mage.cards.t;
import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.Effects;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.keyword.TransformAbility;
import mage.cards.*;
import mage.constants.*;
import mage.counters.CounterType;
+import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
+import mage.util.CardUtil;
+import java.util.Objects;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheDragonKamiReborn extends CardImpl {
+public final class TheDragonKamiReborn extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter = new FilterControlledPermanent(SubType.DRAGON);
public TheDragonKamiReborn(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.d.DragonKamisEgg.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{2}{G}",
+ "Dragon-Kami's Egg",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.EGG}, "G"
+ );
+ // The Dragon-Kami Reborn
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I, II — You gain 2 life. Look at the top three cards of your library. Exile one of them face down with a hatching counter on it, then put the rest on the bottom of your library in any order.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
new Effects(new GainLifeEffect(2), new TheDragonKamiRebornEffect())
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Dragon-Kami's Egg
+ this.getRightHalfCard().setPT(0, 1);
+
+ // Whenever Dragon-Kami's Egg or a Dragon you control dies, you may cast a creature spell from among cards you own in exile with hatching counters on them without paying its mana cost.
+ this.getRightHalfCard().addAbility(new DiesThisOrAnotherTriggeredAbility(
+ new DragonKamisEggEffect(), false, filter
+ ).setTriggerPhrase("Whenever {this} or a Dragon you control dies, "));
}
private TheDragonKamiReborn(final TheDragonKamiReborn card) {
@@ -94,3 +110,39 @@ class TheDragonKamiRebornEffect extends OneShotEffect {
return true;
}
}
+
+class DragonKamisEggEffect extends OneShotEffect {
+
+ DragonKamisEggEffect() {
+ super(Outcome.Benefit);
+ staticText = "you may cast a creature spell from among cards you own in exile " +
+ "with hatching counters on them without paying its mana cost";
+ }
+
+ private DragonKamisEggEffect(final DragonKamisEggEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DragonKamisEggEffect copy() {
+ return new DragonKamisEggEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ Cards cards = new CardsImpl();
+ game.getExile()
+ .getCardsOwned(game, player.getId())
+ .stream()
+ .filter(Objects::nonNull)
+ .filter(card -> card.getCounters(game).containsKey(CounterType.HATCHLING))
+ .forEach(cards::add);
+ return !cards.isEmpty() && CardUtil.castSpellWithAttributesForFree(
+ player, source, game, cards, StaticFilters.FILTER_CARD_CREATURE
+ );
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TheEmperorOfPalamecia.java b/Mage.Sets/src/mage/cards/t/TheEmperorOfPalamecia.java
index 734c875717f..ed36bbb4531 100644
--- a/Mage.Sets/src/mage/cards/t/TheEmperorOfPalamecia.java
+++ b/Mage.Sets/src/mage/cards/t/TheEmperorOfPalamecia.java
@@ -1,55 +1,70 @@
package mage.cards.t;
-import mage.MageInt;
import mage.Mana;
import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
+import mage.abilities.effects.common.DamagePlayersEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.hint.Hint;
+import mage.abilities.hint.ValueHint;
import mage.abilities.mana.ConditionalColoredManaAbility;
import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.abilities.mana.conditional.ConditionalSpellManaBuilder;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
+import mage.constants.TargetController;
import mage.counters.CounterType;
+import mage.filter.FilterCard;
+import mage.filter.FilterSpell;
import mage.filter.StaticFilters;
+import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheEmperorOfPalamecia extends CardImpl {
+public final class TheEmperorOfPalamecia extends TransformingDoubleFacedCard {
- private final ConditionalManaBuilder manaBuilder
- = new ConditionalSpellManaBuilder(StaticFilters.FILTER_SPELLS_NON_CREATURE);
+ private final ConditionalManaBuilder manaBuilder = new ConditionalSpellManaBuilder(new FilterSpell("a noncreature spell"));
private static final Condition condition = new SourceHasCounterCondition(CounterType.P1P1, 3);
- public TheEmperorOfPalamecia(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{R}");
+ private static final FilterCard filter = new FilterCard("noncreature, nonland cards in your graveyard");
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.NOBLE);
- this.subtype.add(SubType.WIZARD);
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
- this.secondSideCardClazz = mage.cards.t.TheLordMasterOfHell.class;
+ static {
+ filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
+ filter.add(Predicates.not(CardType.LAND.getPredicate()));
+ }
+
+ private static final DynamicValue xValue = new CardsInControllerGraveyardCount(filter);
+ private static final Hint hint = new ValueHint("Noncreature, nonland cards in your graveyard", xValue);
+
+ public TheEmperorOfPalamecia(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.NOBLE, SubType.WIZARD}, "{U}{R}",
+ "The Lord Master of Hell",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON, SubType.NOBLE, SubType.WIZARD}, "UR"
+ );
+
+ // The Emperor of Palamecia
+ this.getLeftHalfCard().setPT(2, 2);
// {T}: Add {U} or {R}. Spend this mana only to cast a noncreature spell.
- this.addAbility(new ConditionalColoredManaAbility(new TapSourceCost(), Mana.BlueMana(1), manaBuilder));
- this.addAbility(new ConditionalColoredManaAbility(new TapSourceCost(), Mana.RedMana(1), manaBuilder));
+ this.getLeftHalfCard().addAbility(new ConditionalColoredManaAbility(new TapSourceCost(), Mana.BlueMana(1), manaBuilder));
+ this.getLeftHalfCard().addAbility(new ConditionalColoredManaAbility(new TapSourceCost(), Mana.RedMana(1), manaBuilder));
// Whenever you cast a noncreature spell, if at least four mana was spent to cast it, put a +1/+1 counter on The Emperor of Palamecia. Then if it has three or more +1/+1 counters on it, transform it.
- this.addAbility(new TransformAbility());
Ability ability = new SpellCastControllerTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
StaticFilters.FILTER_NONCREATURE_SPELL_FOUR_MANA_SPENT, false
@@ -58,7 +73,17 @@ public final class TheEmperorOfPalamecia extends CardImpl {
new TransformSourceEffect(), condition,
"Then if it has three or more +1/+1 counters on it, transform it"
));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // The Lord Master of Hell
+ this.getRightHalfCard().setPT(3, 3);
+
+ // Starfall -- Whenever The Lord Master of Hell attacks, it deals X damage to each opponent, where X is the number of noncreature, nonland cards in your graveyard.
+ this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new DamagePlayersEffect(
+ xValue, TargetController.OPPONENT
+ ).setText("it deals X damage to each opponent, where X is " +
+ "the number of noncreature, nonland cards in your graveyard"))
+ .withFlavorWord("Starfall").addHint(hint));
}
private TheEmperorOfPalamecia(final TheEmperorOfPalamecia card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheEnigmaJewel.java b/Mage.Sets/src/mage/cards/t/TheEnigmaJewel.java
index 6a515394202..4f14a25fdac 100644
--- a/Mage.Sets/src/mage/cards/t/TheEnigmaJewel.java
+++ b/Mage.Sets/src/mage/cards/t/TheEnigmaJewel.java
@@ -1,43 +1,69 @@
package mage.cards.t;
import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.ActivatedAbility;
+import mage.abilities.common.ActivateAbilityTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.common.CopyStackObjectEffect;
import mage.abilities.keyword.CraftAbility;
import mage.abilities.mana.ConditionalColorlessManaAbility;
import mage.abilities.mana.builder.common.ActivatedAbilityManaBuilder;
import mage.cards.Card;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.FilterStackObject;
+import mage.filter.common.FilterActivatedOrTriggeredAbility;
import mage.filter.predicate.Predicate;
+import mage.filter.predicate.other.NotManaAbilityPredicate;
+import mage.game.ExileZone;
import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheEnigmaJewel extends CardImpl {
+public final class TheEnigmaJewel extends TransformingDoubleFacedCard {
+
+ private static final FilterStackObject filter = new FilterActivatedOrTriggeredAbility("an ability that isn't a mana ability");
+
+ static {
+ filter.add(NotManaAbilityPredicate.instance);
+ }
public TheEnigmaJewel(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{U}");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.secondSideCardClazz = mage.cards.l.LocusOfEnlightenment.class;
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{U}",
+ "Locus of Enlightenment",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "U"
+ );
+ // The Enigma Jewel
// The Enigma Jewel enters the battlefield tapped.
- this.addAbility(new EntersBattlefieldTappedAbility());
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTappedAbility());
// {T}: Add {C}{C}. Spend this mana only to activate abilities.
- this.addAbility(new ConditionalColorlessManaAbility(2, new ActivatedAbilityManaBuilder()));
+ this.getLeftHalfCard().addAbility(new ConditionalColorlessManaAbility(2, new ActivatedAbilityManaBuilder()));
// Craft with four or more nonlands with activated abilities {8}{U}
- this.addAbility(new CraftAbility(
+ this.getLeftHalfCard().addAbility(new CraftAbility(
"{8}{U}", "four or more nonlands with activated abilities", "other " +
"nonland permanents you control with activated abilities and/or nonland cards in your " +
"graveyard with activated abilities", 4, Integer.MAX_VALUE, TheEnigmaJewelPredicate.instance
));
+
+ // Locus of Enlightenment
+ // Locus of Enlightenment has each activated ability of the exiled cards used to craft it. You may activate each of those abilities only once each turn.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new LocusOfEnlightenmentEffect()));
+
+ // Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy.
+ this.getRightHalfCard().addAbility(new ActivateAbilityTriggeredAbility(new CopyStackObjectEffect("it"), filter, SetTargetPointer.SPELL));
}
private TheEnigmaJewel(final TheEnigmaJewel card) {
@@ -62,3 +88,47 @@ enum TheEnigmaJewelPredicate implements Predicate {
.anyMatch(a -> (a.isActivatedAbility()));
}
}
+
+class LocusOfEnlightenmentEffect extends ContinuousEffectImpl {
+
+ LocusOfEnlightenmentEffect() {
+ super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.Benefit);
+ staticText = "{this} has each activated ability of the exiled cards " +
+ "used to craft it. You may activate each of those abilities only once each turn";
+ }
+
+ private LocusOfEnlightenmentEffect(final LocusOfEnlightenmentEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LocusOfEnlightenmentEffect copy() {
+ return new LocusOfEnlightenmentEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = source.getSourcePermanentIfItStillExists(game);
+ if (permanent == null) {
+ return false;
+ }
+ ExileZone exileZone = game
+ .getExile()
+ .getExileZone(CardUtil.getExileZoneId(
+ game, permanent.getId(), permanent.getZoneChangeCounter(game) - 2
+ ));
+ if (exileZone == null) {
+ return false;
+ }
+ for (Card card : exileZone.getCards(game)) {
+ for (Ability ability : card.getAbilities(game)) {
+ if (ability.isActivatedAbility()) {
+ ActivatedAbility copyAbility = (ActivatedAbility) ability.copy();
+ copyAbility.setMaxActivationsPerTurn(1);
+ permanent.addAbility(copyAbility, source.getSourceId(), game, true);
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TheEverflowingWell.java b/Mage.Sets/src/mage/cards/t/TheEverflowingWell.java
index 62aecfd6a98..787947c892a 100644
--- a/Mage.Sets/src/mage/cards/t/TheEverflowingWell.java
+++ b/Mage.Sets/src/mage/cards/t/TheEverflowingWell.java
@@ -1,42 +1,67 @@
package mage.cards.t;
import mage.abilities.Ability;
+import mage.abilities.common.CastSpellPaidBySourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.condition.common.DescendCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CopyEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.MillCardsControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.mana.BlueManaAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AbilityWord;
-import mage.constants.CardType;
-import mage.constants.SuperType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.FilterSpell;
+import mage.filter.StaticFilters;
+import mage.filter.predicate.mageobject.PermanentPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.PermanentCard;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author jeffwadsworth
*/
-public class TheEverflowingWell extends CardImpl {
+public class TheEverflowingWell extends TransformingDoubleFacedCard {
+
+ private static final FilterSpell filter = new FilterSpell("a permanent spell");
+
+ static {
+ filter.add(PermanentPredicate.instance);
+ }
public TheEverflowingWell(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{U}");
- this.supertype.add(SuperType.LEGENDARY);
-
- this.secondSideCardClazz = mage.cards.t.TheMyriadPools.class;
- this.color.setBlue(true);
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}{U}",
+ "The Myriad Pools",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.LAND}, new SubType[]{}, ""
+ );
+ // The Everflowing Well
// When the Everflowing Well enters the battlefield, mill two cards, then draw two cards.
Ability entersAbility = new EntersBattlefieldTriggeredAbility(new MillCardsControllerEffect(2));
entersAbility.addEffect(new DrawCardSourceControllerEffect(2).concatBy(", then"));
- this.addAbility(entersAbility);
+ this.getLeftHalfCard().addAbility(entersAbility);
// Descend 8 -- At the beginning of your upkeep, if there are eight or more permanent cards in your graveyard, transform The Everflowing Well.
- this.addAbility(new TransformAbility());
- this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect())
+ this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(DescendCondition.EIGHT).setAbilityWord(AbilityWord.DESCEND_8).addHint(DescendCondition.getHint()));
+
+ // The Myriad Pools
+ // {T}: Add {U}.
+ this.getRightHalfCard().addAbility(new BlueManaAbility());
+
+ // Whenever you cast a permanent spell using mana produced by The Myriad Pools, up to one other target permanent you control becomes a copy of that spell until end of turn.
+ Ability ability = new CastSpellPaidBySourceTriggeredAbility(new TheMyriadPoolsCopyEffect(), filter, false);
+ ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_TARGET_PERMANENT));
+ this.getRightHalfCard().addAbility(ability);
}
private TheEverflowingWell(final TheEverflowingWell card) {
@@ -49,3 +74,37 @@ public class TheEverflowingWell extends CardImpl {
}
}
+
+class TheMyriadPoolsCopyEffect extends OneShotEffect {
+
+ TheMyriadPoolsCopyEffect() {
+ super(Outcome.Neutral);
+ this.staticText = "up to one other target permanent you control becomes a copy of that spell until end of turn";
+ }
+
+ private TheMyriadPoolsCopyEffect(final TheMyriadPoolsCopyEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public TheMyriadPoolsCopyEffect copy() {
+ return new TheMyriadPoolsCopyEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent targetPermanentToCopyTo = game.getPermanent(getTargetPointer().getFirst(game, source));
+ Player controller = game.getPlayer(source.getControllerId());
+ Object spell = getValue("spellCast");
+ if (controller == null || targetPermanentToCopyTo == null || !(spell instanceof Spell)) {
+ return false;
+ }
+ Permanent newBluePrint = new PermanentCard(((Spell) spell).getCard(), source.getControllerId(), game);
+ newBluePrint.assignNewId();
+ CopyEffect copyEffect = new CopyEffect(Duration.EndOfTurn, newBluePrint, targetPermanentToCopyTo.getId());
+ Ability newAbility = source.copy();
+ copyEffect.init(newAbility, game);
+ game.addEffect(copyEffect, newAbility);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TheFallOfLordKonda.java b/Mage.Sets/src/mage/cards/t/TheFallOfLordKonda.java
index 450b8d2312e..9968ca03993 100644
--- a/Mage.Sets/src/mage/cards/t/TheFallOfLordKonda.java
+++ b/Mage.Sets/src/mage/cards/t/TheFallOfLordKonda.java
@@ -1,12 +1,14 @@
package mage.cards.t;
+import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.SagaAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.continuous.GainControlAllOwnedEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.DefenderAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SagaChapter;
@@ -22,7 +24,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheFallOfLordKonda extends CardImpl {
+public final class TheFallOfLordKonda extends TransformingDoubleFacedCard {
private static final FilterPermanent filter
= new FilterOpponentsCreaturePermanent("creature an opponent controls with mana value 4 or greater");
@@ -32,34 +34,44 @@ public final class TheFallOfLordKonda extends CardImpl {
}
public TheFallOfLordKonda(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.f.FragmentOfKonda.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{2}{W}",
+ "Fragment of Konda",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.NOBLE}, "W"
+ );
+ // The Fall of Lord Konda
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I — Exile target creature an opponent controls with mana value 4 or greater.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new ExileTargetEffect(), new TargetPermanent(filter)
);
// II — Each player gains control of all permanents they own.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new GainControlAllOwnedEffect(StaticFilters.FILTER_PERMANENTS)
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_III,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_III,
new ExileSagaAndReturnTransformedEffect()
);
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Fragment of Konda
+ this.getRightHalfCard().setPT(1, 3);
+
+ // Defender
+ this.getRightHalfCard().addAbility(DefenderAbility.getInstance());
+
+ // When Fragment of Konda dies, draw a card.
+ this.getRightHalfCard().addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(1)));
}
private TheFallOfLordKonda(final TheFallOfLordKonda card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheGoldenGearColossus.java b/Mage.Sets/src/mage/cards/t/TheGoldenGearColossus.java
deleted file mode 100644
index 02c6add9e7a..00000000000
--- a/Mage.Sets/src/mage/cards/t/TheGoldenGearColossus.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package mage.cards.t;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.TransformTargetEffect;
-import mage.abilities.keyword.TrampleAbility;
-import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.card.DoubleFacedCardPredicate;
-import mage.filter.predicate.mageobject.AnotherPredicate;
-import mage.game.permanent.token.GnomeToken;
-import mage.target.TargetPermanent;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class TheGoldenGearColossus extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("other target double-faced artifact you control");
-
- static {
- filter.add(AnotherPredicate.instance);
- filter.add(Predicates.and(
- DoubleFacedCardPredicate.instance,
- CardType.ARTIFACT.getPredicate()
- )
- );
- }
-
- public TheGoldenGearColossus(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, null);
- this.supertype.add(SuperType.LEGENDARY);
- this.cardType.add(CardType.CREATURE);
- this.subtype.add(SubType.GNOME);
- this.power = new MageInt(6);
- this.toughness = new MageInt(6);
-
- this.nightCard = true;
-
- this.color.setBlue(true);
- this.color.setRed(true);
- this.color.setWhite(true);
-
- this.addAbility(VigilanceAbility.getInstance());
- this.addAbility(TrampleAbility.getInstance());
-
- // Whenever The Golden-Gear Colossus enters the battlefield or attacks, transform up to one other target double-faced artifact you control. Create two 1/1 colorless Gnome artifact creature tokens.
- Ability ability = new EntersBattlefieldOrAttacksSourceTriggeredAbility(new TransformTargetEffect());
- TargetPermanent target = new TargetPermanent(0, 1, filter);
- ability.addTarget(target);
- ability.addEffect(new CreateTokenEffect(new GnomeToken(), 2));
- this.addAbility(ability);
-
- }
-
- private TheGoldenGearColossus(final TheGoldenGearColossus card) {
- super(card);
- }
-
- @Override
- public TheGoldenGearColossus copy() {
- return new TheGoldenGearColossus(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TheGrimCaptain.java b/Mage.Sets/src/mage/cards/t/TheGrimCaptain.java
deleted file mode 100644
index 3ec8f196b3f..00000000000
--- a/Mage.Sets/src/mage/cards/t/TheGrimCaptain.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package mage.cards.t;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.SacrificeOpponentsEffect;
-import mage.abilities.keyword.HexproofAbility;
-import mage.abilities.keyword.LifelinkAbility;
-import mage.abilities.keyword.MenaceAbility;
-import mage.abilities.keyword.TrampleAbility;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.StaticFilters;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
-import mage.target.TargetCard;
-import mage.target.common.TargetCardInExile;
-import mage.util.CardUtil;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class TheGrimCaptain extends CardImpl {
-
- public TheGrimCaptain(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.SKELETON);
- this.subtype.add(SubType.SPIRIT);
- this.subtype.add(SubType.PIRATE);
- this.power = new MageInt(7);
- this.toughness = new MageInt(7);
- this.nightCard = true;
- this.color.setBlack(true);
-
- // Menace
- this.addAbility(new MenaceAbility(false));
-
- // Trample
- this.addAbility(TrampleAbility.getInstance());
-
- // Lifelink
- this.addAbility(LifelinkAbility.getInstance());
-
- // Hexproof
- this.addAbility(HexproofAbility.getInstance());
-
- // Whenever The Grim Captain attacks, each opponent sacrifices a nonland permanent. Then you may put an exiled creature card used to craft The Grim Captain onto the battlefield under your control tapped and attacking.
- Ability ability = new AttacksTriggeredAbility(new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_NON_LAND));
- ability.addEffect(new TheGrimCaptainEffect());
- this.addAbility(ability);
- }
-
- private TheGrimCaptain(final TheGrimCaptain card) {
- super(card);
- }
-
- @Override
- public TheGrimCaptain copy() {
- return new TheGrimCaptain(this);
- }
-}
-
-class TheGrimCaptainEffect extends OneShotEffect {
-
- TheGrimCaptainEffect() {
- super(Outcome.Benefit);
- staticText = "Then you may put an exiled creature card used to craft {this} " +
- "onto the battlefield under your control tapped and attacking";
- }
-
- private TheGrimCaptainEffect(final TheGrimCaptainEffect effect) {
- super(effect);
- }
-
- @Override
- public TheGrimCaptainEffect copy() {
- return new TheGrimCaptainEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player == null) {
- return false;
- }
- TargetCard target = new TargetCardInExile(
- 0, 1, StaticFilters.FILTER_CARD_CREATURE,
- CardUtil.getExileZoneId(game, source, -2)
- );
- target.withNotTarget(true);
- player.choose(outcome, target, source, game);
- Card card = game.getCard(target.getFirstTarget());
- if (card == null) {
- return false;
- }
- player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
- Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game);
- if (permanent == null) {
- return false;
- }
- game.getCombat().addAttackingCreature(card.getId(), game);
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TheKamiWar.java b/Mage.Sets/src/mage/cards/t/TheKamiWar.java
index 62364fcf76d..05f5d7da75d 100644
--- a/Mage.Sets/src/mage/cards/t/TheKamiWar.java
+++ b/Mage.Sets/src/mage/cards/t/TheKamiWar.java
@@ -1,29 +1,39 @@
package mage.cards.t;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SagaAbility;
+import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effects;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.effects.common.InfoEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.Card;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SagaChapter;
-import mage.constants.SubType;
-import mage.constants.TargetController;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
import mage.target.TargetPermanent;
+import mage.target.common.TargetCardInGraveyard;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheKamiWar extends CardImpl {
+public final class TheKamiWar extends TransformingDoubleFacedCard {
private static final FilterPermanent filter
= new FilterNonlandPermanent("nonland permanent an opponent controls");
@@ -36,23 +46,25 @@ public final class TheKamiWar extends CardImpl {
}
public TheKamiWar(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{U}{B}{R}{G}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.o.OKagachiMadeManifest.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{1}{W}{U}{B}{R}{G}",
+ "O-Kagachi Made Manifest",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.DRAGON, SubType.SPIRIT}, "WUBRG"
+ );
+ // The Kami War
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I — Exile target nonland permanent an opponent controls.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new ExileTargetEffect(), new TargetPermanent(filter)
);
// II — Return up to one other target nonland permanent to its owner's hand. Then each opponent discards a card.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new Effects(
new ReturnToHandTargetEffect(),
new DiscardEachPlayerEffect(TargetController.OPPONENT)
@@ -61,10 +73,26 @@ public final class TheKamiWar extends CardImpl {
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // O-Kagachi Made Manifest
+ this.getRightHalfCard().setPT(6, 6);
+
+ // O-Kagachi Made Manifest is all colors.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new InfoEffect("{this} is all colors")));
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
+
+ // Trample
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
+
+ // Whenever O-Kagachi Made Manifest attacks, defending player chooses a nonland card in your graveyard. Return that card to your hand. O-Kagachi Made Manifest gets +X/+0 until end of turn, where X is the mana value of that card.
+ this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(
+ new OKagachiMadeManifestEffect(), false, null, SetTargetPointer.PLAYER
+ ));
}
private TheKamiWar(final TheKamiWar card) {
@@ -76,3 +104,57 @@ public final class TheKamiWar extends CardImpl {
return new TheKamiWar(this);
}
}
+
+class OKagachiMadeManifestEffect extends OneShotEffect {
+
+ OKagachiMadeManifestEffect() {
+ super(Outcome.Benefit);
+ staticText = "defending player chooses a nonland card in your graveyard. Return that card to your hand. " +
+ "{this} gets +X/+0 until end of turn, where X is the mana value of that card";
+ }
+
+ private OKagachiMadeManifestEffect(final OKagachiMadeManifestEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public OKagachiMadeManifestEffect copy() {
+ return new OKagachiMadeManifestEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (controller == null || player == null) {
+ return false;
+ }
+ Card card;
+ switch (controller.getGraveyard().count(StaticFilters.FILTER_CARD_A_NON_LAND, game)) {
+ case 0:
+ return false;
+ case 1:
+ card = controller
+ .getGraveyard()
+ .getCards(StaticFilters.FILTER_CARD_A_NON_LAND, game)
+ .stream()
+ .findFirst()
+ .orElse(null);
+ break;
+ default:
+ TargetCard target = new TargetCardInGraveyard(StaticFilters.FILTER_CARD_A_NON_LAND);
+ target.withNotTarget(true);
+ player.choose(Outcome.ReturnToHand, controller.getGraveyard(), target, source, game);
+ card = game.getCard(target.getFirstTarget());
+ }
+ if (card == null) {
+ return false;
+ }
+ int manaValue = card.getManaValue();
+ player.moveCards(card, Zone.HAND, source, game);
+ if (manaValue > 0) {
+ game.addEffect(new BoostSourceEffect(manaValue, 0, Duration.EndOfTurn), source);
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TheLegendOfKuruk.java b/Mage.Sets/src/mage/cards/t/TheLegendOfKuruk.java
index 17e8d452e98..55fb361f9f3 100644
--- a/Mage.Sets/src/mage/cards/t/TheLegendOfKuruk.java
+++ b/Mage.Sets/src/mage/cards/t/TheLegendOfKuruk.java
@@ -1,36 +1,45 @@
package mage.cards.t;
import mage.abilities.common.SagaAbility;
+import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.costs.common.WaterbendCost;
import mage.abilities.effects.Effects;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
+import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
import mage.abilities.effects.keyword.ScryEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.ExhaustAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SagaChapter;
import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.filter.StaticFilters;
+import mage.game.permanent.token.SpiritWorldToken;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheLegendOfKuruk extends CardImpl {
+public final class TheLegendOfKuruk extends TransformingDoubleFacedCard {
public TheLegendOfKuruk(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{U}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.a.AvatarKuruk.class;
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{2}{U}{U}",
+ "Avatar Kuruk",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR}, "U"
+ );
+ // The Legend of Kuruk
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I, II -- Scry 2, then draw a card.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
new Effects(
new ScryEffect(2, false),
new DrawCardSourceControllerEffect(1).concatBy(", then")
@@ -38,9 +47,19 @@ public final class TheLegendOfKuruk extends CardImpl {
);
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Avatar Kuruk
+ this.getRightHalfCard().setPT(4, 3);
+
+ // Whenever you cast a spell, create a 1/1 colorless Spirit creature token with "This token can't block or be blocked by non-Spirit creatures."
+ this.getRightHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
+ new CreateTokenEffect(new SpiritWorldToken()), StaticFilters.FILTER_SPELL_A, false
+ ));
+
+ // Exhaust -- Waterbend {20}: Take an extra turn after this one.
+ this.getRightHalfCard().addAbility(new ExhaustAbility(new AddExtraTurnControllerEffect(), new WaterbendCost(20)));
}
private TheLegendOfKuruk(final TheLegendOfKuruk card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheLegendOfKyoshi.java b/Mage.Sets/src/mage/cards/t/TheLegendOfKyoshi.java
index a07bc9bd4a9..162268e8b3e 100644
--- a/Mage.Sets/src/mage/cards/t/TheLegendOfKyoshi.java
+++ b/Mage.Sets/src/mage/cards/t/TheLegendOfKyoshi.java
@@ -1,20 +1,25 @@
package mage.cards.t;
+import mage.Mana;
+import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.common.CardsInControllerHandCount;
import mage.abilities.dynamicvalue.common.GreatestAmongPermanentsValue;
import mage.abilities.effects.Effects;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.keyword.EarthbendTargetEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.HexproofAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.abilities.mana.DynamicManaAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SagaChapter;
-import mage.constants.SubType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.StaticFilters;
import mage.target.common.TargetControlledLandPermanent;
import java.util.UUID;
@@ -22,27 +27,29 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheLegendOfKyoshi extends CardImpl {
+public final class TheLegendOfKyoshi extends TransformingDoubleFacedCard {
public TheLegendOfKyoshi(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{G}{G}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.a.AvatarKyoshi.class;
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{4}{G}{G}",
+ "Avatar Kyoshi",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR}, ""
+ );
+ // The Legend of Kyoshi
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I -- Draw cards equal to the greatest power among creatures you control.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I,
new DrawCardSourceControllerEffect(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES)
.setText("draw cards equal to the greatest power among creatures you control")
);
// II -- Earthbend X, where X is the number of cards in your hand. That land becomes an Island in addition to its other types.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new Effects(
new EarthbendTargetEffect(CardsInControllerHandCount.ANY, true)
.setText("earthbend X, where X is the number of cards in your hand"),
@@ -52,9 +59,27 @@ public final class TheLegendOfKyoshi extends CardImpl {
);
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility.addHint(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES.getHint()));
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ this.getLeftHalfCard().addAbility(sagaAbility.addHint(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES.getHint()));
+
+ // Avatar Kyoshi
+ this.getRightHalfCard().setPT(5, 4);
+
+ // Lands you control have trample and hexproof.
+ Ability ability = new SimpleStaticAbility(new GainAbilityControlledEffect(
+ TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS
+ ));
+ ability.addEffect(new GainAbilityControlledEffect(
+ HexproofAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_LANDS
+ ).setText("and hexproof"));
+ this.getRightHalfCard().addAbility(ability);
+
+ // {T}: Add X mana of any one color, where X is the greatest power among creatures you control.
+ this.getRightHalfCard().addAbility(new DynamicManaAbility(
+ Mana.AnyMana(1), GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES,
+ new TapSourceCost(), "add X mana of any one color, " +
+ "where X is the greatest power among creatures you control", true
+ ).addHint(GreatestAmongPermanentsValue.POWER_CONTROLLED_CREATURES.getHint()));
}
private TheLegendOfKyoshi(final TheLegendOfKyoshi card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheLegendOfRoku.java b/Mage.Sets/src/mage/cards/t/TheLegendOfRoku.java
index 37aa1bd902f..2914dd2741b 100644
--- a/Mage.Sets/src/mage/cards/t/TheLegendOfRoku.java
+++ b/Mage.Sets/src/mage/cards/t/TheLegendOfRoku.java
@@ -1,46 +1,59 @@
package mage.cards.t;
import mage.abilities.common.SagaAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
import mage.abilities.effects.mana.AddManaOfAnyColorEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.FirebendingAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.SagaChapter;
-import mage.constants.SubType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.game.permanent.token.DragonFirebendingToken;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheLegendOfRoku extends CardImpl {
+public final class TheLegendOfRoku extends TransformingDoubleFacedCard {
public TheLegendOfRoku(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.a.AvatarRoku.class;
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{2}{R}{R}",
+ "Avatar Roku",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR}, ""
+ );
+ // The Legend of Roku
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I -- Exile the top three cards of your library. Until the end of your next turn, you may play those cards.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I,
new ExileTopXMayPlayUntilEffect(3, Duration.UntilEndOfYourNextTurn)
);
// II -- Add one mana of any color.
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new AddManaOfAnyColorEffect(1));
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_II, new AddManaOfAnyColorEffect(1));
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Avatar Roku
+ this.getRightHalfCard().setPT(4, 4);
+
+ // Firebending 4
+ this.getRightHalfCard().addAbility(new FirebendingAbility(4));
+
+ // {8}: Create a 4/4 red Dragon creature token with flying and firebending 4.
+ this.getRightHalfCard().addAbility(new SimpleActivatedAbility(
+ new CreateTokenEffect(new DragonFirebendingToken()), new GenericManaCost(8)
+ ));
}
private TheLegendOfRoku(final TheLegendOfRoku card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheLegendOfYangchen.java b/Mage.Sets/src/mage/cards/t/TheLegendOfYangchen.java
index e38cae32e99..ab1dd21f630 100644
--- a/Mage.Sets/src/mage/cards/t/TheLegendOfYangchen.java
+++ b/Mage.Sets/src/mage/cards/t/TheLegendOfYangchen.java
@@ -1,18 +1,22 @@
package mage.cards.t;
import mage.abilities.Ability;
+import mage.abilities.common.CastSecondSpellTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.Effects;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.DrawCardTargetEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.keyword.AirbendTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
+import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
@@ -29,23 +33,31 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheLegendOfYangchen extends CardImpl {
+public final class TheLegendOfYangchen extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter = new FilterNonlandPermanent("other target nonland permanent");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ }
public TheLegendOfYangchen(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{W}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.a.AvatarYangchen.class;
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{3}{W}{W}",
+ "Avatar Yangchen",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR}, ""
+ );
+ // The Legend of Yangchen
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I -- Starting with you, each player chooses up to one permanent with mana value 3 or greater from among permanents your opponents control. Exile those permanents.
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new TheLegendOfYangchenEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_I, new TheLegendOfYangchenEffect());
// II -- You may have target opponent draw three cards. If you do, draw three cards.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new Effects(
new DrawCardTargetEffect(3).setText("have target opponent draw three cards. If you do"),
new DrawCardSourceControllerEffect(3).concatBy(",")
@@ -53,9 +65,19 @@ public final class TheLegendOfYangchen extends CardImpl {
);
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Avatar Yangchen
+ this.getRightHalfCard().setPT(4, 5);
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
+
+ // Whenever you cast your second spell each turn, airbend up to one other target nonland permanent.
+ Ability ability = new CastSecondSpellTriggeredAbility(new AirbendTargetEffect());
+ ability.addTarget(new TargetPermanent(0, 1, filter));
+ this.getRightHalfCard().addAbility(ability);
}
private TheLegendOfYangchen(final TheLegendOfYangchen card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheLongReachOfNight.java b/Mage.Sets/src/mage/cards/t/TheLongReachOfNight.java
index c883920df4b..241c6b8d50d 100644
--- a/Mage.Sets/src/mage/cards/t/TheLongReachOfNight.java
+++ b/Mage.Sets/src/mage/cards/t/TheLongReachOfNight.java
@@ -1,48 +1,83 @@
package mage.cards.t;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.costs.common.DiscardCardCost;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount;
+import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.SacrificeOpponentsUnlessPayEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.hint.Hint;
+import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.SagaChapter;
import mage.constants.SubType;
+import mage.filter.FilterCard;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.card.DefendingPlayerOwnsCardPredicate;
+import mage.game.Game;
+import java.util.Objects;
import java.util.UUID;
+import java.util.stream.Collectors;
/**
* @author TheElk801
*/
-public final class TheLongReachOfNight extends CardImpl {
+public final class TheLongReachOfNight extends TransformingDoubleFacedCard {
+
+ private static final FilterCard filter
+ = new FilterCreatureCard("creature cards in defending player's graveyard");
+
+ static {
+ filter.add(DefendingPlayerOwnsCardPredicate.instance);
+ }
+
+ private static final DynamicValue xValue = new CardsInAllGraveyardsCount(filter);
public TheLongReachOfNight(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.a.AnimusOfNightsReach.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{3}{B}",
+ "Animus of Night's Reach",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SPIRIT}, "B"
+ );
+ // The Long Reach of Night
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I, II — Each opponent sacrifices a creature unless they discard a card.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
new SacrificeOpponentsUnlessPayEffect(
new DiscardCardCost(), StaticFilters.FILTER_PERMANENT_CREATURE
)
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect()
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect()
);
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Animus of Night's Reach
+ this.getRightHalfCard().setPT(0, 4);
+
+ // Menace
+ this.getRightHalfCard().addAbility(new MenaceAbility());
+
+ // Whenever Animus of Night's Reach attacks, it gets +X/+0 until end of turn, where X is the number of creature cards in defending player's graveyard.
+ this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(
+ xValue, StaticValue.get(0), Duration.EndOfTurn
+ ).setText("it gets +X/+0 until end of turn, where X is the number of creature cards in defending player's graveyard")).addHint(AnimusOfNightsReachHint.instance));
}
private TheLongReachOfNight(final TheLongReachOfNight card) {
@@ -54,3 +89,28 @@ public final class TheLongReachOfNight extends CardImpl {
return new TheLongReachOfNight(this);
}
}
+
+enum AnimusOfNightsReachHint implements Hint {
+ instance;
+
+ @Override
+ public String getText(Game game, Ability ability) {
+ return "Cards in each opponent's graveyard:
"
+ + game
+ .getOpponents(ability.getControllerId())
+ .stream()
+ .map(game::getPlayer)
+ .filter(Objects::nonNull)
+ .map(player -> player
+ .getName()
+ + ": " + player
+ .getGraveyard()
+ .count(StaticFilters.FILTER_CARD_CREATURE, game))
+ .collect(Collectors.joining("
"));
+ }
+
+ @Override
+ public AnimusOfNightsReachHint copy() {
+ return instance;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TheLordMasterOfHell.java b/Mage.Sets/src/mage/cards/t/TheLordMasterOfHell.java
deleted file mode 100644
index 86f366c3704..00000000000
--- a/Mage.Sets/src/mage/cards/t/TheLordMasterOfHell.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package mage.cards.t;
-
-import mage.MageInt;
-import mage.abilities.common.AttacksTriggeredAbility;
-import mage.abilities.dynamicvalue.DynamicValue;
-import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
-import mage.abilities.effects.common.DamagePlayersEffect;
-import mage.abilities.hint.Hint;
-import mage.abilities.hint.ValueHint;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.SuperType;
-import mage.constants.TargetController;
-import mage.filter.FilterCard;
-import mage.filter.predicate.Predicates;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class TheLordMasterOfHell extends CardImpl {
-
- private static final FilterCard filter = new FilterCard("noncreature, nonland cards in your graveyard");
-
- static {
- filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
- filter.add(Predicates.not(CardType.LAND.getPredicate()));
- }
-
- private static final DynamicValue xValue = new CardsInControllerGraveyardCount(filter);
- private static final Hint hint = new ValueHint("Noncreature, nonland cards in your graveyard", xValue);
-
- public TheLordMasterOfHell(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.DEMON);
- this.subtype.add(SubType.NOBLE);
- this.subtype.add(SubType.WIZARD);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
- this.nightCard = true;
- this.color.setBlue(true);
- this.color.setRed(true);
-
- // Starfall -- Whenever The Lord Master of Hell attacks, it deals X damage to each opponent, where X is the number of noncreature, nonland cards in your graveyard.
- this.addAbility(new AttacksTriggeredAbility(new DamagePlayersEffect(
- xValue, TargetController.OPPONENT
- ).setText("it deals X damage to each opponent, where X is " +
- "the number of noncreature, nonland cards in your graveyard"))
- .withFlavorWord("Starfall").addHint(hint));
- }
-
- private TheLordMasterOfHell(final TheLordMasterOfHell card) {
- super(card);
- }
-
- @Override
- public TheLordMasterOfHell copy() {
- return new TheLordMasterOfHell(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TheModernAge.java b/Mage.Sets/src/mage/cards/t/TheModernAge.java
index 8377efec220..191e2cd3e21 100644
--- a/Mage.Sets/src/mage/cards/t/TheModernAge.java
+++ b/Mage.Sets/src/mage/cards/t/TheModernAge.java
@@ -3,9 +3,9 @@ package mage.cards.t;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SagaChapter;
import mage.constants.SubType;
@@ -15,28 +15,35 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheModernAge extends CardImpl {
+public final class TheModernAge extends TransformingDoubleFacedCard {
public TheModernAge(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.v.VectorGlider.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{1}{U}",
+ "Vector Glider",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SPIRIT}, "U"
+ );
+ // The Modern Age
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I, II — Draw a card, then discard a card.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
new DrawDiscardControllerEffect(1, 1)
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Vector Glider
+ this.getRightHalfCard().setPT(2, 3);
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
}
private TheModernAge(final TheModernAge card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheMyriadPools.java b/Mage.Sets/src/mage/cards/t/TheMyriadPools.java
deleted file mode 100644
index bcde9f4288f..00000000000
--- a/Mage.Sets/src/mage/cards/t/TheMyriadPools.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package mage.cards.t;
-
-import mage.abilities.Ability;
-import mage.abilities.common.CastSpellPaidBySourceTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.CopyEffect;
-import mage.abilities.mana.BlueManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.SuperType;
-import mage.filter.FilterSpell;
-import mage.filter.StaticFilters;
-import mage.filter.predicate.mageobject.PermanentPredicate;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.game.permanent.PermanentCard;
-import mage.game.stack.Spell;
-import mage.players.Player;
-import mage.target.TargetPermanent;
-
-import java.util.UUID;
-
-/**
- * @author jeffwadsworth
- */
-public class TheMyriadPools extends CardImpl {
-
- private static final FilterSpell filter = new FilterSpell("a permanent spell");
-
- static {
- filter.add(PermanentPredicate.instance);
- }
-
- public TheMyriadPools(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.LAND}, null);
- this.supertype.add(SuperType.LEGENDARY);
-
- // this is the second face of The Everflowing Well
- this.nightCard = true;
-
- // {T}: Add {U}.
- this.addAbility(new BlueManaAbility());
-
- // Whenever you cast a permanent spell using mana produced by The Myriad Pools, up to one other target permanent you control becomes a copy of that spell until end of turn.
- Ability ability = new CastSpellPaidBySourceTriggeredAbility(new TheMyriadPoolsCopyEffect(), filter, false);
- ability.addTarget(new TargetPermanent(0, 1, StaticFilters.FILTER_CONTROLLED_ANOTHER_TARGET_PERMANENT));
- this.addAbility(ability);
- }
-
- private TheMyriadPools(final TheMyriadPools card) {
- super(card);
- }
-
- @Override
- public TheMyriadPools copy() {
- return new TheMyriadPools(this);
- }
-}
-
-class TheMyriadPoolsCopyEffect extends OneShotEffect {
-
- TheMyriadPoolsCopyEffect() {
- super(Outcome.Neutral);
- this.staticText = "up to one other target permanent you control becomes a copy of that spell until end of turn";
- }
-
- private TheMyriadPoolsCopyEffect(final TheMyriadPoolsCopyEffect effect) {
- super(effect);
- }
-
- @Override
- public TheMyriadPoolsCopyEffect copy() {
- return new TheMyriadPoolsCopyEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent targetPermanentToCopyTo = game.getPermanent(getTargetPointer().getFirst(game, source));
- Player controller = game.getPlayer(source.getControllerId());
- Object spell = getValue("spellCast");
- if (controller == null || targetPermanentToCopyTo == null || !(spell instanceof Spell)) {
- return false;
- }
- Permanent newBluePrint = new PermanentCard(((Spell)spell).getCard(), source.getControllerId(), game);
- newBluePrint.assignNewId();
- CopyEffect copyEffect = new CopyEffect(Duration.EndOfTurn, newBluePrint, targetPermanentToCopyTo.getId());
- Ability newAbility = source.copy();
- copyEffect.init(newAbility, game);
- game.addEffect(copyEffect, newAbility);
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TheRestorationOfEiganjo.java b/Mage.Sets/src/mage/cards/t/TheRestorationOfEiganjo.java
index 3de02b60f26..645601c3a08 100644
--- a/Mage.Sets/src/mage/cards/t/TheRestorationOfEiganjo.java
+++ b/Mage.Sets/src/mage/cards/t/TheRestorationOfEiganjo.java
@@ -1,15 +1,17 @@
package mage.cards.t;
+import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.costs.common.DiscardCardCost;
+import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoWhenCostPaid;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SagaChapter;
@@ -18,6 +20,7 @@ import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterPermanentCard;
import mage.filter.predicate.mageobject.ManaValuePredicate;
+import mage.game.permanent.token.SpiritToken;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCardInYourGraveyard;
@@ -26,7 +29,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheRestorationOfEiganjo extends CardImpl {
+public final class TheRestorationOfEiganjo extends TransformingDoubleFacedCard {
private static final FilterCard filter2
= new FilterPermanentCard("permanent card with mana value 2 or less from your graveyard");
@@ -36,17 +39,19 @@ public final class TheRestorationOfEiganjo extends CardImpl {
}
public TheRestorationOfEiganjo(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.a.ArchitectOfRestoration.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{2}{W}",
+ "Architect of Restoration",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.FOX, SubType.MONK}, "W"
+ );
+ // The Restoration of Eiganjo
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I - Search your library for a basic Plains card, reveal it, put it into your hand, then shuffle.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, new SearchLibraryPutInHandEffect(
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, new SearchLibraryPutInHandEffect(
new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_PLAINS), true
)
);
@@ -57,16 +62,24 @@ public final class TheRestorationOfEiganjo extends CardImpl {
);
ability.addTarget(new TargetCardInYourGraveyard(filter2));
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II, new DoWhenCostPaid(
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II, new DoWhenCostPaid(
ability, new DiscardCardCost(), "Discard a card?"
)
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Architect of Restoration
+ this.getRightHalfCard().setPT(3, 4);
+
+ // Vigilance
+ this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
+
+ // Whenever Architect of Restoration attacks or blocks, create a 1/1 colorless Spirit creature token.
+ this.getRightHalfCard().addAbility(new AttacksOrBlocksTriggeredAbility(new CreateTokenEffect(new SpiritToken()), false));
}
private TheRestorationOfEiganjo(final TheRestorationOfEiganjo card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheRiseOfSozin.java b/Mage.Sets/src/mage/cards/t/TheRiseOfSozin.java
index 78a8b2bd579..3383f91df6a 100644
--- a/Mage.Sets/src/mage/cards/t/TheRiseOfSozin.java
+++ b/Mage.Sets/src/mage/cards/t/TheRiseOfSozin.java
@@ -1,55 +1,83 @@
package mage.cards.t;
+import mage.MageObject;
import mage.abilities.Ability;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SagaAbility;
+import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.costs.mana.ManaCosts;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.Effects;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.ChooseACardNameEffect;
import mage.abilities.effects.common.DestroyAllEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
+import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.FirebendingAbility;
+import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SagaChapter;
-import mage.constants.SubType;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.FilterCard;
import mage.filter.StaticFilters;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.card.OwnerIdPredicate;
import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInGraveyard;
import mage.target.common.TargetOpponent;
+import mage.util.CardUtil;
+import java.util.Objects;
+import java.util.Set;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheRiseOfSozin extends CardImpl {
+public final class TheRiseOfSozin extends TransformingDoubleFacedCard {
public TheRiseOfSozin(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}{B}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.f.FireLordSozin.class;
+ super(ownerId, setInfo,
+ new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{4}{B}{B}",
+ "Fire Lord Sozin",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.NOBLE}, "B"
+ );
+ // The Rise of Sozin
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I -- Destroy all creatures.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, new DestroyAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES)
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, new DestroyAllEffect(StaticFilters.FILTER_PERMANENT_CREATURES)
);
// II -- Choose a card name. Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. Then that player shuffles.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II,
new Effects(
new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL), new TheRiseOfSozinEffect()
), new TargetOpponent()
);
// III -- Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Fire Lord Sozin
+ this.getRightHalfCard().setPT(5, 5);
+
+ // Menace
+ this.getRightHalfCard().addAbility(new MenaceAbility());
+
+ // Firebending 3
+ this.getRightHalfCard().addAbility(new FirebendingAbility(3));
+
+ // Whenever Fire Lord Sozin deals combat damage to a player, you may pay {X}. When you do, put any number of target creature cards with total mana value X or less from that player's graveyard onto the battlefield under your control.
+ this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new FireLordSozinEffect()));
}
private TheRiseOfSozin(final TheRiseOfSozin card) {
@@ -83,3 +111,94 @@ class TheRiseOfSozinEffect extends SearchTargetGraveyardHandLibraryForCardNameAn
return applySearchAndExile(game, source, chosenCardName, getTargetPointer().getFirst(game, source));
}
}
+
+class FireLordSozinEffect extends OneShotEffect {
+
+ FireLordSozinEffect() {
+ super(Outcome.Benefit);
+ staticText = "you may pay {X}. When you do, put any number of target creature cards with " +
+ "total mana value X or less from that player's graveyard onto the battlefield under your control";
+ }
+
+ private FireLordSozinEffect(final FireLordSozinEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FireLordSozinEffect copy() {
+ return new FireLordSozinEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller == null) {
+ return false;
+ }
+ if (!controller.chooseUse(Outcome.BoostCreature, "Pay {X}?", source, game)) {
+ return false;
+ }
+ int xValue = controller.announceX(0, Integer.MAX_VALUE, "Announce the value for {X}", game, source, true);
+ ManaCosts cost = new ManaCostsImpl<>("{X}");
+ cost.add(new GenericManaCost(xValue));
+ if (!cost.pay(source, game, source, source.getControllerId(), false, null)) {
+ return false;
+ }
+ ReflexiveTriggeredAbility ability = new ReflexiveTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), false);
+ ability.addTarget(new FireLordSozinTarget((UUID) getValue("damagedPlayer"), xValue));
+ game.fireReflexiveTriggeredAbility(ability, source);
+ return true;
+ }
+}
+
+class FireLordSozinTarget extends TargetCardInGraveyard {
+
+ private final int xValue;
+
+ private static final FilterCard makeFilter(UUID ownerId, int xValue) {
+ FilterCard filter = new FilterCreatureCard("creature cards with total mana value " + xValue + " or less from that player's graveyard");
+ filter.add(new OwnerIdPredicate(ownerId));
+ return filter;
+ }
+
+ FireLordSozinTarget(UUID ownerId, int xValue) {
+ super(0, Integer.MAX_VALUE, makeFilter(ownerId, xValue), false);
+ this.xValue = xValue;
+ }
+
+ private FireLordSozinTarget(final FireLordSozinTarget target) {
+ super(target);
+ this.xValue = target.xValue;
+ }
+
+ @Override
+ public FireLordSozinTarget copy() {
+ return new FireLordSozinTarget(this);
+ }
+
+ @Override
+ public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) {
+ return super.canTarget(playerId, id, source, game)
+ && CardUtil.checkCanTargetTotalValueLimit(this.getTargets(), id, MageObject::getManaValue, xValue, game);
+ }
+
+ @Override
+ public Set possibleTargets(UUID sourceControllerId, Ability source, Game game) {
+ return CardUtil.checkPossibleTargetsTotalValueLimit(
+ this.getTargets(),
+ super.possibleTargets(sourceControllerId, source, game),
+ MageObject::getManaValue, xValue, game
+ );
+ }
+
+ @Override
+ public String getMessage(Game game) {
+ // shows selected total
+ int selectedValue = this.getTargets().stream()
+ .map(game::getObject)
+ .filter(Objects::nonNull)
+ .mapToInt(MageObject::getManaValue)
+ .sum();
+ return super.getMessage(game) + " (selected total mana value " + selectedValue + ")";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TheShatteredStatesEra.java b/Mage.Sets/src/mage/cards/t/TheShatteredStatesEra.java
index 69b38aa04b7..4b3ee17b6d5 100644
--- a/Mage.Sets/src/mage/cards/t/TheShatteredStatesEra.java
+++ b/Mage.Sets/src/mage/cards/t/TheShatteredStatesEra.java
@@ -8,9 +8,9 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.GainControlTargetEffect;
import mage.abilities.keyword.HasteAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SagaChapter;
@@ -22,20 +22,22 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TheShatteredStatesEra extends CardImpl {
+public final class TheShatteredStatesEra extends TransformingDoubleFacedCard {
public TheShatteredStatesEra(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.n.NamelessConqueror.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{4}{R}",
+ "Nameless Conqueror",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SAMURAI}, "R"
+ );
+ // The Shattered States Era
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I — Gain control of target creature until end of turn. Untap it. It gains haste until end of turn.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new Effects(
new GainControlTargetEffect(Duration.EndOfTurn),
new UntapTargetEffect().setText("Untap it."),
@@ -47,19 +49,27 @@ public final class TheShatteredStatesEra extends CardImpl {
// II — Creatures you control get +1/+0 until end of turn.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_II, new BoostControlledEffect(
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_II, new BoostControlledEffect(
1, 0, Duration.EndOfTurn
)
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_III,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_III,
new ExileSagaAndReturnTransformedEffect()
);
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Nameless Conqueror
+ this.getRightHalfCard().setPT(3, 3);
+
+ // Trample
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
+
+ // Haste
+ this.getRightHalfCard().addAbility(HasteAbility.getInstance());
}
private TheShatteredStatesEra(final TheShatteredStatesEra card) {
diff --git a/Mage.Sets/src/mage/cards/t/TheTombOfAclazotz.java b/Mage.Sets/src/mage/cards/t/TheTombOfAclazotz.java
deleted file mode 100644
index 18e338ca97f..00000000000
--- a/Mage.Sets/src/mage/cards/t/TheTombOfAclazotz.java
+++ /dev/null
@@ -1,283 +0,0 @@
-package mage.cards.t;
-
-import mage.MageIdentifier;
-import mage.MageObject;
-import mage.MageObjectReference;
-import mage.abilities.Ability;
-import mage.abilities.SpellAbility;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.effects.AsThoughEffectImpl;
-import mage.abilities.effects.ContinuousEffectImpl;
-import mage.abilities.effects.ReplacementEffectImpl;
-import mage.abilities.effects.common.counter.AddCounterEnteringCreatureEffect;
-import mage.abilities.mana.BlackManaAbility;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.counters.CounterType;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.stack.Spell;
-import mage.game.stack.StackObject;
-import mage.target.targetpointer.FixedTarget;
-import mage.util.CardUtil;
-import mage.util.SubTypes;
-import mage.watchers.Watcher;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * @author jeffwadsworth
- */
-public class TheTombOfAclazotz extends CardImpl {
-
- public TheTombOfAclazotz(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, null);
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.CAVE);
-
- // this is the second face of Tarrian's Journal
- this.nightCard = true;
-
- // {T}: Add {B}.
- this.addAbility(new BlackManaAbility());
-
- // You may cast a creature spell from your graveyard this turn. If you do, it enters with a finality counter on it and is a Vampire in addition to its other types.
- Ability castSpellAbility = new SimpleActivatedAbility(new TheTombOfAclazotzEffect(), new TapSourceCost());
- castSpellAbility.setIdentifier(MageIdentifier.TheTombOfAclazotzWatcher);
- castSpellAbility.addWatcher(new TheTombOfAclazotzWatcher());
- this.addAbility(castSpellAbility);
-
- }
-
- private TheTombOfAclazotz(final TheTombOfAclazotz card) {
- super(card);
- }
-
- @Override
- public TheTombOfAclazotz copy() {
- return new TheTombOfAclazotz(this);
- }
-}
-
-class TheTombOfAclazotzEffect extends AsThoughEffectImpl {
-
- TheTombOfAclazotzEffect() {
- super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
- staticText = "You may cast a creature spell from your graveyard this turn. If you do, it enters with a finality counter on it and is a Vampire in addition to its other types. (If a creature with a finality counter on it would die, exile it instead.)";
- }
-
- private TheTombOfAclazotzEffect(final TheTombOfAclazotzEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return true;
- }
-
- @Override
- public TheTombOfAclazotzEffect copy() {
- return new TheTombOfAclazotzEffect(this);
- }
-
- @Override
- public void init(Ability source, Game game) {
- super.init(source, game);
- TheTombOfAclazotzWatcher watcher = game.getState().getWatcher(TheTombOfAclazotzWatcher.class);
- if (watcher != null) {
- watcher.addPlayable(source, game);
- watcher.addPlayFromAnywhereEffect(this.getId());
- }
- }
-
- @Override
- public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
- throw new IllegalArgumentException("Wrong code usage: can't call applies method on empty affectedAbility");
- }
-
- @Override
- public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) {
- TheTombOfAclazotzWatcher watcher = game.getState().getWatcher(TheTombOfAclazotzWatcher.class);
- if (watcher == null
- || !watcher.checkPermission(playerId, source, game)
- || game.getState().getZone(objectId) != Zone.GRAVEYARD) {
- return false;
- }
- Card card = game.getCard(objectId);
- return card != null
- && affectedAbility instanceof SpellAbility
- && card.getOwnerId().equals(playerId)
- && card.isCreature(game);
- }
-}
-
-class TheTombOfAclazotzWatcher extends Watcher {
-
- private final Map> morMap = new HashMap<>();
- private UUID playFromAnywhereEffectId;
-
- TheTombOfAclazotzWatcher() {
- super(WatcherScope.GAME);
- }
-
- @Override
- public void watch(GameEvent event, Game game) {
- if (GameEvent.EventType.CAST_SPELL.equals(event.getType())
- && event.hasApprovingIdentifier(MageIdentifier.TheTombOfAclazotzWatcher)) {
- Spell target = game.getSpell(event.getTargetId());
- Card card = target.getCard();
- if (card != null) {
- game.getState().addEffect(new AddCounterEnteringCreatureEffect(new MageObjectReference(target.getCard(), game),
- CounterType.FINALITY.createInstance(), Outcome.Neutral),
- target.getSpellAbility());
- game.getState().addEffect(new AddSubtypeEnteringCreatureEffect(new MageObjectReference(target.getCard(), game), SubType.VAMPIRE, Outcome.Benefit), card.getSpellAbility());
- // Rule 728.2 we must insure the effect is used (creature is cast successfully) before discarding the play effect
- UUID playEffectId = this.getPlayFromAnywhereEffect();
- if (playEffectId != null
- && game.getContinuousEffects().getApplicableAsThoughEffects(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, game).listIterator().next().getId().equals(playEffectId)) {
- // discard the play effect
- game.getContinuousEffects().getApplicableAsThoughEffects(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, game).listIterator().next().discard();
- }
- }
- }
- }
-
- boolean checkPermission(UUID playerId, Ability source, Game game) {
- if (!playerId.equals(source.getControllerId())) {
- return false;
- }
- MageObjectReference mor = new MageObjectReference(
- source.getSourceId(), source.getStackMomentSourceZCC(), game
- );
- return morMap.computeIfAbsent(mor, m -> new HashMap<>()).getOrDefault(playerId, 0) > 0;
- }
-
- void addPlayable(Ability source, Game game) {
- MageObjectReference mor = new MageObjectReference(
- source.getSourceId(), source.getStackMomentSourceZCC(), game
- );
- morMap.computeIfAbsent(mor, m -> new HashMap<>())
- .compute(source.getControllerId(), CardUtil::setOrIncrementValue);
- }
-
- void addPlayFromAnywhereEffect(UUID uuid) {
- playFromAnywhereEffectId = uuid;
- }
-
- UUID getPlayFromAnywhereEffect() {
- return playFromAnywhereEffectId;
- }
-
- @Override
- public void reset() {
- morMap.clear();
- super.reset();
- }
-
-}
-
-class AddSubtypeEnteringCreatureEffect extends ReplacementEffectImpl {
-
- private final MageObjectReference mor;
- private final SubType subType;
-
- AddSubtypeEnteringCreatureEffect(MageObjectReference mor, SubType subType, Outcome outcome) {
- super(Duration.WhileOnBattlefield, outcome);
- this.mor = mor;
- this.subType = subType;
- }
-
- private AddSubtypeEnteringCreatureEffect(final AddSubtypeEnteringCreatureEffect effect) {
- super(effect);
- this.mor = effect.mor;
- this.subType = effect.subType;
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.CAST_SPELL_LATE;
- }
-
- @Override
- public boolean applies(GameEvent event, Ability source, Game game) {
- MageObject spell = game.getObject(event.getSourceId());
- return spell != null && mor.refersTo(spell, game);
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- Spell target = game.getSpell(event.getSourceId());
- if (target != null) {
- AddCardSubTypeEnteringTargetEffect effect = new AddCardSubTypeEnteringTargetEffect(mor, subType, Duration.WhileOnBattlefield);
- effect.setTargetPointer(new FixedTarget(target, game));
- game.addEffect(effect, source);
- }
- return false;
- }
-
- @Override
- public AddSubtypeEnteringCreatureEffect copy() {
- return new AddSubtypeEnteringCreatureEffect(this);
- }
-}
-
-class AddCardSubTypeEnteringTargetEffect extends ContinuousEffectImpl {
-
- private final SubType addedSubType;
- private final MageObjectReference mor;
- private Card card;
-
- AddCardSubTypeEnteringTargetEffect(MageObjectReference mor, SubType addedSubType, Duration duration) {
- super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
- this.addedSubType = addedSubType;
- this.mor = mor;
- }
-
- protected AddCardSubTypeEnteringTargetEffect(final AddCardSubTypeEnteringTargetEffect effect) {
- super(effect);
- this.addedSubType = effect.addedSubType;
- this.mor = effect.mor;
- this.card = effect.card;
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Spell spell = game.getSpell(getTargetPointer().getFirst(game, source));
- MageObject target = game.getObject(getTargetPointer().getFirst(game, source));
- if (spell != null) {
- card = spell.getCard();
- }
- for (StackObject stackObject : game.getStack()) {
- if (stackObject instanceof Spell
- && target != null
- && target.equals(stackObject)
- && mor.refersTo(target, game)) {
- setCreatureSubtype(stackObject, addedSubType, game);
- setCreatureSubtype(((Spell) stackObject).getCard(), addedSubType, game);
- }
- }
- if (card != null
- && game.getPermanent(card.getId()) != null
- && game.getState().getZoneChangeCounter(card.getId()) == mor.getZoneChangeCounter() + 1) { // blinking, etc
- game.getPermanent(card.getId()).addSubType(game, addedSubType);
- }
- return true;
- }
-
- private void setCreatureSubtype(MageObject object, SubType subtype, Game game) {
- SubTypes subTypes = game.getState().getCreateMageObjectAttribute(object, game).getSubtype();
- if (!subTypes.contains(subtype)) {
- subTypes.add(subtype);
- }
- }
-
- @Override
- public AddCardSubTypeEnteringTargetEffect copy() {
- return new AddCardSubTypeEnteringTargetEffect(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/ThingInTheIce.java b/Mage.Sets/src/mage/cards/t/ThingInTheIce.java
index 149beca63ac..e0f3f72026d 100644
--- a/Mage.Sets/src/mage/cards/t/ThingInTheIce.java
+++ b/Mage.Sets/src/mage/cards/t/ThingInTheIce.java
@@ -1,24 +1,25 @@
package mage.cards.t;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
+import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
import mage.abilities.keyword.DefenderAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterSpell;
+import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import java.util.UUID;
@@ -26,36 +27,39 @@ import java.util.UUID;
/**
* @author fireshoes
*/
-public final class ThingInTheIce extends CardImpl {
+public final class ThingInTheIce extends TransformingDoubleFacedCard {
private static final FilterSpell filter = new FilterSpell("an instant or sorcery spell");
+ private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("non-Horror creatures");
static {
filter.add(Predicates.or(
CardType.INSTANT.getPredicate(),
CardType.SORCERY.getPredicate()));
+ filter2.add(Predicates.not(SubType.HORROR.getPredicate()));
}
private static final Condition condition = new SourceHasCounterCondition(CounterType.ICE, ComparisonType.EQUAL_TO, 0);
public ThingInTheIce(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
- this.subtype.add(SubType.HORROR);
- this.power = new MageInt(0);
- this.toughness = new MageInt(4);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HORROR}, "{1}{U}",
+ "Awoken Horror",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.KRAKEN, SubType.HORROR}, "U"
+ );
- this.secondSideCardClazz = mage.cards.a.AwokenHorror.class;
+ // Thing in the Ice
+ this.getLeftHalfCard().setPT(0, 4);
// Defender
- this.addAbility(DefenderAbility.getInstance());
+ this.getLeftHalfCard().addAbility(DefenderAbility.getInstance());
// Thing in the Ice enters the battlefield with four ice counters on it.
- this.addAbility(new EntersBattlefieldAbility(
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.ICE.createInstance(4)).setText("with four ice counters on it")
));
// Whenever you cast an instant or sorcery spell, remove an ice counter from Thing in the Ice. Then if it has no ice counters on it, transform it.
- this.addAbility(new TransformAbility());
Ability ability = new SpellCastControllerTriggeredAbility(
new RemoveCounterSourceEffect(CounterType.ICE.createInstance(1)), filter, false
);
@@ -63,7 +67,13 @@ public final class ThingInTheIce extends CardImpl {
new TransformSourceEffect(), condition,
"Then if it has no ice counters on it, transform it"
));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Awoken Horror
+ this.getRightHalfCard().setPT(7, 8);
+
+ // When this creature transforms into Awoken Horrow, return all non-Horror creatures to their owners' hands.
+ this.getRightHalfCard().addAbility(new TransformIntoSourceTriggeredAbility(new ReturnToHandFromBattlefieldAllEffect(filter2)));
}
private ThingInTheIce(final ThingInTheIce card) {
diff --git a/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java b/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java
index 7a5010aca01..d499844897d 100644
--- a/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java
+++ b/Mage.Sets/src/mage/cards/t/ThousandMoonsSmithy.java
@@ -1,16 +1,19 @@
package mage.cards.t;
-import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
+import mage.abilities.common.CastSpellPaidBySourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.common.TapTargetCost;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.constants.SuperType;
+import mage.filter.FilterSpell;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TappedPredicate;
@@ -22,36 +25,55 @@ import java.util.UUID;
/**
* @author Susucr
*/
-public final class ThousandMoonsSmithy extends CardImpl {
+public final class ThousandMoonsSmithy extends TransformingDoubleFacedCard {
public static final FilterControlledPermanent filter =
new FilterControlledPermanent("untapped artifacts and/or creatures you control");
+ private static final FilterSpell filter2 = new FilterSpell("an artifact or creature spell");
+
static {
filter.add(TappedPredicate.UNTAPPED);
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
CardType.ARTIFACT.getPredicate()
));
+ filter2.add(Predicates.or(
+ CardType.ARTIFACT.getPredicate(),
+ CardType.CREATURE.getPredicate()
+ ));
}
public ThousandMoonsSmithy(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{W}{W}");
- this.secondSideCardClazz = mage.cards.b.BarracksOfTheThousand.class;
-
- this.supertype.add(SuperType.LEGENDARY);
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}{W}{W}",
+ "Barracks of the Thousand",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.LAND}, new SubType[]{}, ""
+ );
+ // Thousand Moons Smithy
// When Thousand Moons Smithy enters the battlefield, create a white Gnome Soldier artifact creature token with "This creature's power and toughness are each equal to the number of artifacts and/or creatures you control."
- this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GnomeSoldierStarStarToken())));
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new GnomeSoldierStarStarToken())));
// At the beginning of your precombat main phase, you may tap five untapped artifacts and/or creatures you control. If you do, transform Thousand Moons Smithy.
- this.addAbility(new TransformAbility());
- this.addAbility(new BeginningOfFirstMainTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new BeginningOfFirstMainTriggeredAbility(
new DoIfCostPaid(
new TransformSourceEffect(),
new TapTargetCost(new TargetControlledPermanent(5, filter))
)
));
+
+ // Barracks of the Thousand
+ // (Transforms from Thousand Moons Smithy.)
+
+ // {T}: Add {W}.
+ this.getRightHalfCard().addAbility(new WhiteManaAbility());
+
+ // Whenever you cast an artifact or creature spell using mana produced by Barracks of the Thousand, create a white Gnome Soldier artifact creature token with "This creature's power and toughness are each equal to the number of artifacts and/or creatures you control."
+ this.getRightHalfCard().addAbility(new CastSpellPaidBySourceTriggeredAbility(
+ new CreateTokenEffect(new GnomeSoldierStarStarToken()),
+ filter2, false
+ ));
}
private ThousandMoonsSmithy(final ThousandMoonsSmithy card) {
diff --git a/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java b/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java
index 58d9fdb799e..4296d7dc735 100644
--- a/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java
+++ b/Mage.Sets/src/mage/cards/t/ThrabenGargoyle.java
@@ -1,39 +1,43 @@
-
package mage.cards.t;
-import java.util.UUID;
-
-import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.DefenderAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
-import mage.constants.Zone;
+
+import java.util.UUID;
/**
* @author fireshoes
*/
-public final class ThrabenGargoyle extends CardImpl {
+public final class ThrabenGargoyle extends TransformingDoubleFacedCard {
public ThrabenGargoyle(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}");
- this.subtype.add(SubType.GARGOYLE);
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GARGOYLE}, "{1}",
+ "Stonewing Antagonizer",
+ new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GARGOYLE, SubType.HORROR}, ""
+ );
- this.secondSideCardClazz = mage.cards.s.StonewingAntagonizer.class;
+ // Thraben Gargoyle
+ this.getLeftHalfCard().setPT(2, 2);
// Defender
- this.addAbility(DefenderAbility.getInstance());
+ this.getLeftHalfCard().addAbility(DefenderAbility.getInstance());
// {6}: Transform Thraben Gargoyle.
- this.addAbility(new TransformAbility());
- this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new GenericManaCost(6)));
+ this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new GenericManaCost(6)));
+
+ // Stonewing Antagonizer
+ this.getRightHalfCard().setPT(4, 2);
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
}
private ThrabenGargoyle(final ThrabenGargoyle card) {
diff --git a/Mage.Sets/src/mage/cards/t/ThrabenMilitia.java b/Mage.Sets/src/mage/cards/t/ThrabenMilitia.java
deleted file mode 100644
index d9998dc5920..00000000000
--- a/Mage.Sets/src/mage/cards/t/ThrabenMilitia.java
+++ /dev/null
@@ -1,40 +0,0 @@
-
-package mage.cards.t;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.abilities.keyword.TrampleAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-/**
- * @author nantuko
- */
-public final class ThrabenMilitia extends CardImpl {
-
- public ThrabenMilitia(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.SOLDIER);
- this.color.setWhite(true);
-
- // this card is the second face of double-faced card
- this.nightCard = true;
-
- this.power = new MageInt(5);
- this.toughness = new MageInt(4);
-
- this.addAbility(TrampleAbility.getInstance());
- }
-
- private ThrabenMilitia(final ThrabenMilitia card) {
- super(card);
- }
-
- @Override
- public ThrabenMilitia copy() {
- return new ThrabenMilitia(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/ThrabenSentry.java b/Mage.Sets/src/mage/cards/t/ThrabenSentry.java
index 7ccaf78bd07..c4e6be3c500 100644
--- a/Mage.Sets/src/mage/cards/t/ThrabenSentry.java
+++ b/Mage.Sets/src/mage/cards/t/ThrabenSentry.java
@@ -1,38 +1,41 @@
-
package mage.cards.t;
-import java.util.UUID;
-import mage.MageInt;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
+import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
+import java.util.UUID;
+
/**
* @author nantuko
*/
-public final class ThrabenSentry extends CardImpl {
+public final class ThrabenSentry extends TransformingDoubleFacedCard {
public ThrabenSentry(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.SOLDIER);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SOLDIER}, "{3}{W}",
+ "Thraben Militia",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SOLDIER}, "W"
+ );
- this.secondSideCardClazz = mage.cards.t.ThrabenMilitia.class;
+ // Thraben Sentry
+ this.getLeftHalfCard().setPT(2, 2);
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
-
- this.addAbility(VigilanceAbility.getInstance());
+ this.getLeftHalfCard().addAbility(VigilanceAbility.getInstance());
// Whenever another creature you control dies, you may transform Thraben Sentry.
- this.addAbility(new TransformAbility());
- this.addAbility(new DiesCreatureTriggeredAbility(new TransformSourceEffect(), true, StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL));
+ this.getLeftHalfCard().addAbility(new DiesCreatureTriggeredAbility(new TransformSourceEffect(), true, StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL));
+
+ // Thraben Militia
+ this.getRightHalfCard().setPT(5, 4);
+
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
}
private ThrabenSentry(final ThrabenSentry card) {
diff --git a/Mage.Sets/src/mage/cards/t/ThroneOfTheGrimCaptain.java b/Mage.Sets/src/mage/cards/t/ThroneOfTheGrimCaptain.java
index 9a668ec3be6..8df9d2898d1 100644
--- a/Mage.Sets/src/mage/cards/t/ThroneOfTheGrimCaptain.java
+++ b/Mage.Sets/src/mage/cards/t/ThroneOfTheGrimCaptain.java
@@ -2,27 +2,32 @@ package mage.cards.t;
import mage.MageObject;
import mage.abilities.Ability;
+import mage.abilities.assignment.common.SubTypeAssignment;
+import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.assignment.common.SubTypeAssignment;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.MillCardsControllerEffect;
-import mage.abilities.keyword.CraftAbility;
+import mage.abilities.effects.common.SacrificeOpponentsEffect;
+import mage.abilities.keyword.*;
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.TargetController;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetCardInExile;
import mage.target.common.TargetCardInGraveyardBattlefieldOrStack;
+import mage.util.CardUtil;
import java.util.Objects;
import java.util.Set;
@@ -32,19 +37,41 @@ import java.util.stream.Collectors;
/**
* @author TheElk801
*/
-public final class ThroneOfTheGrimCaptain extends CardImpl {
+public final class ThroneOfTheGrimCaptain extends TransformingDoubleFacedCard {
public ThroneOfTheGrimCaptain(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.secondSideCardClazz = mage.cards.t.TheGrimCaptain.class;
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}",
+ "The Grim Captain",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SKELETON, SubType.SPIRIT, SubType.PIRATE}, "B"
+ );
+ // Throne of the Grim Captain
// {T}: Mill two cards.
- this.addAbility(new SimpleActivatedAbility(new MillCardsControllerEffect(2), new TapSourceCost()));
+ this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new MillCardsControllerEffect(2), new TapSourceCost()));
// Craft with a Dinosaur, a Merfolk, a Pirate, and a Vampire {4}
- this.addAbility(new CraftAbility("{4}", "a Dinosaur, a Merfolk, a Pirate, and a Vampire", new ThroneOfTheGrimCaptainTarget()));
+ this.getLeftHalfCard().addAbility(new CraftAbility("{4}", "a Dinosaur, a Merfolk, a Pirate, and a Vampire", new ThroneOfTheGrimCaptainTarget()));
+
+ // The Grim Captain
+ this.getRightHalfCard().setPT(7, 7);
+
+ // Menace
+ this.getRightHalfCard().addAbility(new MenaceAbility(false));
+
+ // Trample
+ this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
+
+ // Lifelink
+ this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
+
+ // Hexproof
+ this.getRightHalfCard().addAbility(HexproofAbility.getInstance());
+
+ // Whenever The Grim Captain attacks, each opponent sacrifices a nonland permanent. Then you may put an exiled creature card used to craft The Grim Captain onto the battlefield under your control tapped and attacking.
+ Ability ability = new AttacksTriggeredAbility(new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_NON_LAND));
+ ability.addEffect(new TheGrimCaptainEffect());
+ this.getRightHalfCard().addAbility(ability);
}
private ThroneOfTheGrimCaptain(final ThroneOfTheGrimCaptain card) {
@@ -109,3 +136,46 @@ class ThroneOfTheGrimCaptainTarget extends TargetCardInGraveyardBattlefieldOrSta
return subtypeAssigner.getRoleCount(cards, game) <= 4;
}
}
+
+class TheGrimCaptainEffect extends OneShotEffect {
+
+ TheGrimCaptainEffect() {
+ super(Outcome.Benefit);
+ staticText = "Then you may put an exiled creature card used to craft {this} " +
+ "onto the battlefield under your control tapped and attacking";
+ }
+
+ private TheGrimCaptainEffect(final TheGrimCaptainEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public TheGrimCaptainEffect copy() {
+ return new TheGrimCaptainEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player == null) {
+ return false;
+ }
+ TargetCard target = new TargetCardInExile(
+ 0, 1, StaticFilters.FILTER_CARD_CREATURE,
+ CardUtil.getExileZoneId(game, source, -2)
+ );
+ target.withNotTarget(true);
+ player.choose(outcome, target, source, game);
+ Card card = game.getCard(target.getFirstTarget());
+ if (card == null) {
+ return false;
+ }
+ player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
+ Permanent permanent = CardUtil.getPermanentFromCardPutToBattlefield(card, game);
+ if (permanent == null) {
+ return false;
+ }
+ game.getCombat().addAttackingCreature(card.getId(), game);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/t/TirelessHauler.java b/Mage.Sets/src/mage/cards/t/TirelessHauler.java
index 4f3cb398b9a..ec32a2f125e 100644
--- a/Mage.Sets/src/mage/cards/t/TirelessHauler.java
+++ b/Mage.Sets/src/mage/cards/t/TirelessHauler.java
@@ -1,10 +1,10 @@
package mage.cards.t;
-import mage.MageInt;
import mage.abilities.keyword.DayboundAbility;
+import mage.abilities.keyword.NightboundAbility;
import mage.abilities.keyword.VigilanceAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@@ -13,22 +13,32 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TirelessHauler extends CardImpl {
+public final class TirelessHauler extends TransformingDoubleFacedCard {
public TirelessHauler(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{G}",
+ "Dire-Strain Brawler",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
+ );
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(4);
- this.toughness = new MageInt(5);
- this.secondSideCardClazz = mage.cards.d.DireStrainBrawler.class;
+ // Tireless Hauler
+ this.getLeftHalfCard().setPT(4, 5);
// Vigilance
- this.addAbility(VigilanceAbility.getInstance());
+ this.getLeftHalfCard().addAbility(VigilanceAbility.getInstance());
// Daybound
- this.addAbility(new DayboundAbility());
+ this.getLeftHalfCard().addAbility(new DayboundAbility());
+
+ // Dire-Strain Brawler
+ this.getRightHalfCard().setPT(6, 6);
+
+ // Vigilance
+ this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
+
+ // Nightbound
+ this.getRightHalfCard().addAbility(new NightboundAbility());
}
private TirelessHauler(final TirelessHauler card) {
diff --git a/Mage.Sets/src/mage/cards/t/TithingBlade.java b/Mage.Sets/src/mage/cards/t/TithingBlade.java
index 4ef97edc81b..409425b040d 100644
--- a/Mage.Sets/src/mage/cards/t/TithingBlade.java
+++ b/Mage.Sets/src/mage/cards/t/TithingBlade.java
@@ -1,11 +1,16 @@
package mage.cards.t;
+import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.SacrificeOpponentsEffect;
import mage.abilities.keyword.CraftAbility;
-import mage.cards.CardImpl;
+import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
@@ -13,22 +18,34 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TithingBlade extends CardImpl {
+public final class TithingBlade extends TransformingDoubleFacedCard {
public TithingBlade(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{B}");
- this.secondSideCardClazz = mage.cards.c.ConsumingSepulcher.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{1}{B}",
+ "Consuming Sepulcher",
+ new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "B"
+ );
+ // Tithing Blade
// When Tithing Blade enters the battlefield, each opponent sacrifices a creature.
- this.addAbility(new EntersBattlefieldTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(
new SacrificeOpponentsEffect(StaticFilters.FILTER_PERMANENT_CREATURE)
));
// Craft with creature {4}{B}
- this.addAbility(new CraftAbility(
+ this.getLeftHalfCard().addAbility(new CraftAbility(
"{4}{B}", "creature", "another creature you control " +
"or a creature card in your graveyard", CardType.CREATURE.getPredicate())
);
+
+ // Consuming Sepulcher
+ // At the beginning of your upkeep, each opponent loses 1 life and you gain 1 life.
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(
+ new LoseLifeOpponentsEffect(1)
+ );
+ ability.addEffect(new GainLifeEffect(1).concatBy("and"));
+ this.getRightHalfCard().addAbility(ability);
}
private TithingBlade(final TithingBlade card) {
diff --git a/Mage.Sets/src/mage/cards/t/TormentedPariah.java b/Mage.Sets/src/mage/cards/t/TormentedPariah.java
index 7d5997a1c5c..9dfea2e28e3 100644
--- a/Mage.Sets/src/mage/cards/t/TormentedPariah.java
+++ b/Mage.Sets/src/mage/cards/t/TormentedPariah.java
@@ -1,10 +1,9 @@
package mage.cards.t;
-import mage.MageInt;
+import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@@ -13,22 +12,26 @@ import java.util.UUID;
/**
* @author nantuko
*/
-public final class TormentedPariah extends CardImpl {
+public final class TormentedPariah extends TransformingDoubleFacedCard {
public TormentedPariah(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WARRIOR);
- this.subtype.add(SubType.WEREWOLF);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARRIOR, SubType.WEREWOLF}, "{3}{R}",
+ "Rampaging Werewolf",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R"
+ );
- this.secondSideCardClazz = mage.cards.r.RampagingWerewolf.class;
-
- this.power = new MageInt(3);
- this.toughness = new MageInt(2);
+ // Tormented Pariah
+ this.getLeftHalfCard().setPT(3, 2);
// At the beginning of each upkeep, if no spells were cast last turn, transform Tormented Pariah.
- this.addAbility(new TransformAbility());
- this.addAbility(new WerewolfFrontTriggeredAbility());
+ this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
+
+ // Rampaging Werewolf
+ this.getRightHalfCard().setPT(6, 4);
+
+ // At the beginning of each upkeep, if a player cast two or more spells last turn, transform Rampaging Werewolf.
+ this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private TormentedPariah(final TormentedPariah card) {
diff --git a/Mage.Sets/src/mage/cards/t/TovolarDireOverlord.java b/Mage.Sets/src/mage/cards/t/TovolarDireOverlord.java
index 38c837a9a2b..704e701d151 100644
--- a/Mage.Sets/src/mage/cards/t/TovolarDireOverlord.java
+++ b/Mage.Sets/src/mage/cards/t/TovolarDireOverlord.java
@@ -1,19 +1,26 @@
package mage.cards.t;
-import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
+import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.DayboundAbility;
+import mage.abilities.keyword.NightboundAbility;
+import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
-import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
@@ -28,41 +35,68 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TovolarDireOverlord extends CardImpl {
+public final class TovolarDireOverlord extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterControlledPermanent("you control three or more Wolves and/or Werewolves");
+ private static final FilterPermanent filter2 = new FilterControlledPermanent("a Wolf or Werewolf you control");
static {
filter.add(Predicates.or(
SubType.WOLF.getPredicate(),
SubType.WEREWOLF.getPredicate()
));
+ filter2.add(Predicates.or(
+ SubType.WOLF.getPredicate(),
+ SubType.WEREWOLF.getPredicate()
+ ));
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 2);
private static final Hint hint = new ValueHint("Wolves and Werewolves you control", new PermanentsOnBattlefieldCount(filter));
public TovolarDireOverlord(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
+ super(ownerId, setInfo,
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{1}{R}{G}",
+ "Tovolar, the Midnight Scourge",
+ new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "RG"
+ );
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
- this.secondSideCardClazz = mage.cards.t.TovolarTheMidnightScourge.class;
+ // Tovolar, Dire Overlord
+ this.getLeftHalfCard().setPT(3, 3);
// Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card.
- this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
- new DrawCardSourceControllerEffect(1), filter,
+ this.getLeftHalfCard().addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
+ new DrawCardSourceControllerEffect(1), filter2,
false, SetTargetPointer.NONE, true
).setTriggerPhrase("Whenever a Wolf or Werewolf you control deals combat damage to a player, "));
// At the beginning of your upkeep, if you control three or more Wolves and/or Werewolves, it becomes night. Then transform any number of Human Werewolves you control.
- this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TovolarDireOverlordEffect()).withInterveningIf(condition).addHint(hint));
+ this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new TovolarDireOverlordEffect()).withInterveningIf(condition).addHint(hint));
// Daybound
- this.addAbility(new DayboundAbility());
+ this.getLeftHalfCard().addAbility(new DayboundAbility());
+
+ // Tovolar, the Midnight Scourge
+ this.getRightHalfCard().setPT(4, 4);
+
+ // Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card.
+ this.getRightHalfCard().addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
+ new DrawCardSourceControllerEffect(1), filter2,
+ false, SetTargetPointer.NONE, true
+ ));
+
+ // {X}{R}{G}: Target Wolf or Werewolf you control gets +X/+0 and gains trample until end of turn.
+ Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn
+ ).setText("Target Wolf or Werewolf you control gets +X/+0"), new ManaCostsImpl<>("{X}{R}{G}"));
+ ability.addEffect(new BoostTargetEffect(
+ GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn
+ ).setText("and gains trample until end of turn"));
+ ability.addTarget(new TargetPermanent(filter2));
+ this.getRightHalfCard().addAbility(ability);
+
+ // Nightbound
+ this.getRightHalfCard().addAbility(new NightboundAbility());
}
private TovolarDireOverlord(final TovolarDireOverlord card) {
diff --git a/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java b/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java
deleted file mode 100644
index 4f6a6f75d0a..00000000000
--- a/Mage.Sets/src/mage/cards/t/TovolarTheMidnightScourge.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package mage.cards.t;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.DealsDamageToAPlayerAllTriggeredAbility;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.dynamicvalue.common.GetXValue;
-import mage.abilities.dynamicvalue.common.StaticValue;
-import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.effects.common.continuous.BoostTargetEffect;
-import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
-import mage.abilities.keyword.NightboundAbility;
-import mage.abilities.keyword.TrampleAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.*;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.Predicates;
-import mage.target.TargetPermanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class TovolarTheMidnightScourge extends CardImpl {
-
- private static final FilterPermanent filter = new FilterControlledPermanent("a Wolf or Werewolf you control");
-
- static {
- filter.add(Predicates.or(
- SubType.WOLF.getPredicate(),
- SubType.WEREWOLF.getPredicate()
- ));
- }
-
- public TovolarTheMidnightScourge(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.supertype.add(SuperType.LEGENDARY);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
- this.color.setRed(true);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Whenever a Wolf or Werewolf you control deals combat damage to a player, draw a card.
- this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(
- new DrawCardSourceControllerEffect(1), filter,
- false, SetTargetPointer.NONE, true
- ));
-
- // {X}{R}{G}: Target Wolf or Werewolf you control gets +X/+0 and gains trample until end of turn.
- Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(
- TrampleAbility.getInstance(), Duration.EndOfTurn
- ).setText("Target Wolf or Werewolf you control gets +X/+0"), new ManaCostsImpl<>("{X}{R}{G}"));
- ability.addEffect(new BoostTargetEffect(
- GetXValue.instance, StaticValue.get(0), Duration.EndOfTurn
- ).setText("and gains trample until end of turn"));
- ability.addTarget(new TargetPermanent(filter));
- this.addAbility(ability);
-
- // Nightbound
- this.addAbility(new NightboundAbility());
- }
-
- private TovolarTheMidnightScourge(final TovolarTheMidnightScourge card) {
- super(card);
- }
-
- @Override
- public TovolarTheMidnightScourge copy() {
- return new TovolarTheMidnightScourge(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TovolarsHuntmaster.java b/Mage.Sets/src/mage/cards/t/TovolarsHuntmaster.java
index 4e075bb75b4..b6e3580e7c3 100644
--- a/Mage.Sets/src/mage/cards/t/TovolarsHuntmaster.java
+++ b/Mage.Sets/src/mage/cards/t/TovolarsHuntmaster.java
@@ -1,36 +1,78 @@
package mage.cards.t;
-import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.FightTargetsEffect;
import mage.abilities.keyword.DayboundAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.NightboundAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
+import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.permanent.token.WolfToken;
+import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TovolarsHuntmaster extends CardImpl {
+public final class TovolarsHuntmaster extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter
+ = new FilterControlledPermanent("another Wolf or Werewolf you control");
+
+ static {
+ filter.add(AnotherPredicate.instance);
+ filter.add(Predicates.or(
+ SubType.WOLF.getPredicate(),
+ SubType.WEREWOLF.getPredicate()
+ ));
+ }
public TovolarsHuntmaster(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{4}{G}{G}",
+ "Tovolar's Packleader",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
+ );
- this.subtype.add(SubType.HUMAN);
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(6);
- this.toughness = new MageInt(6);
- this.secondSideCardClazz = mage.cards.t.TovolarsPackleader.class;
+ // Tovolar's Huntmaster
+ this.getLeftHalfCard().setPT(6, 6);
// Whenever Tovolar's Huntmaster enters the battlefield, create two 2/2 green Wolf creature tokens.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WolfToken(), 2)));
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new WolfToken(), 2)));
// Daybound
- this.addAbility(new DayboundAbility());
+ this.getLeftHalfCard().addAbility(new DayboundAbility());
+
+ // Tovolar's Packleader
+ this.getRightHalfCard().setPT(7, 7);
+
+ // Whenever Tovolar's Packleader enters the battlefield or attacks, create two 2/2 green Wolf creature tokens.
+ this.getRightHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
+ new CreateTokenEffect(new WolfToken(), 2)
+ ));
+
+ // {2}{G}{G}: Another target Wolf or Werewolf you control fights target creature you don't control.
+ Ability ability = new SimpleActivatedAbility(new FightTargetsEffect().setText(
+ "another target Wolf or Werewolf you control fights target creature you don't control"
+ ), new ManaCostsImpl<>("{2}{G}{G}"));
+ ability.addTarget(new TargetPermanent(filter));
+ ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
+ this.getRightHalfCard().addAbility(ability);
+
+ // Nightbound
+ this.getRightHalfCard().addAbility(new NightboundAbility());
}
private TovolarsHuntmaster(final TovolarsHuntmaster card) {
diff --git a/Mage.Sets/src/mage/cards/t/TovolarsPackleader.java b/Mage.Sets/src/mage/cards/t/TovolarsPackleader.java
deleted file mode 100644
index de4fc98fa8e..00000000000
--- a/Mage.Sets/src/mage/cards/t/TovolarsPackleader.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package mage.cards.t;
-
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.FightTargetsEffect;
-import mage.abilities.keyword.NightboundAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.filter.FilterPermanent;
-import mage.filter.StaticFilters;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.AnotherPredicate;
-import mage.game.permanent.token.WolfToken;
-import mage.target.TargetPermanent;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class TovolarsPackleader extends CardImpl {
-
- private static final FilterPermanent filter
- = new FilterControlledPermanent("another Wolf or Werewolf you control");
-
- static {
- filter.add(AnotherPredicate.instance);
- filter.add(Predicates.or(
- SubType.WOLF.getPredicate(),
- SubType.WEREWOLF.getPredicate()
- ));
- }
-
- public TovolarsPackleader(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
-
- this.subtype.add(SubType.WEREWOLF);
- this.power = new MageInt(7);
- this.toughness = new MageInt(7);
- this.color.setGreen(true);
- this.nightCard = true;
-
- // Whenever Tovolar's Packleader enters the battlefield or attacks, create two 2/2 green Wolf creature tokens.
- this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(
- new CreateTokenEffect(new WolfToken(), 2)
- ));
-
- // {2}{G}{G}: Another target Wolf or Werewolf you control fights target creature you don't control.
- Ability ability = new SimpleActivatedAbility(new FightTargetsEffect().setText(
- "another target Wolf or Werewolf you control fights target creature you don't control"
- ), new ManaCostsImpl<>("{2}{G}{G}"));
- ability.addTarget(new TargetPermanent(filter));
- ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CREATURE_YOU_DONT_CONTROL));
- this.addAbility(ability);
-
- // Nightbound
- this.addAbility(new NightboundAbility());
- }
-
- private TovolarsPackleader(final TovolarsPackleader card) {
- super(card);
- }
-
- @Override
- public TovolarsPackleader copy() {
- return new TovolarsPackleader(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TownGossipmonger.java b/Mage.Sets/src/mage/cards/t/TownGossipmonger.java
index 1ebe153eed6..ca84a843ccc 100644
--- a/Mage.Sets/src/mage/cards/t/TownGossipmonger.java
+++ b/Mage.Sets/src/mage/cards/t/TownGossipmonger.java
@@ -1,15 +1,17 @@
package mage.cards.t;
-import mage.MageInt;
import mage.abilities.Ability;
+import mage.abilities.common.AttacksEachCombatStaticAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.common.TapTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
@@ -18,21 +20,31 @@ import java.util.UUID;
/**
* @author escplan9 (Derek Monturo - dmontur1 at gmail dot com)
*/
-public final class TownGossipmonger extends CardImpl {
+public final class TownGossipmonger extends TransformingDoubleFacedCard {
public TownGossipmonger(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
- this.subtype.add(SubType.HUMAN);
- this.power = new MageInt(1);
- this.toughness = new MageInt(1);
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN}, "{W}",
+ "Incited Rabble",
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN}, "R"
+ );
- this.secondSideCardClazz = mage.cards.i.IncitedRabble.class;
+ // Town Gossipmonger
+ this.getLeftHalfCard().setPT(1, 1);
// {T}, Tap an untapped creature you control: Transform Town Gossipmonger.
- this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new TransformSourceEffect(), new TapSourceCost());
ability.addCost(new TapTargetCost(StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Incited Rabble
+ this.getRightHalfCard().setPT(2, 3);
+
+ // Incited Rabble attacks each combat if able.
+ this.getRightHalfCard().addAbility(new AttacksEachCombatStaticAbility());
+
+ // {2}: Incited Rabble gets +1/+0 until end of turn.
+ this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new BoostSourceEffect(1, 0, Duration.EndOfTurn), new ManaCostsImpl<>("{2}")));
}
private TownGossipmonger(final TownGossipmonger card) {
diff --git a/Mage.Sets/src/mage/cards/t/TreasureCove.java b/Mage.Sets/src/mage/cards/t/TreasureCove.java
deleted file mode 100644
index 62aa078d389..00000000000
--- a/Mage.Sets/src/mage/cards/t/TreasureCove.java
+++ /dev/null
@@ -1,53 +0,0 @@
-
-package mage.cards.t;
-
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.SacrificeTargetCost;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.effects.common.DrawCardSourceControllerEffect;
-import mage.abilities.mana.ColorlessManaAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.target.common.TargetControlledPermanent;
-
-/**
- *
- * @author TheElk801
- */
-public final class TreasureCove extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Treasure");
-
- static {
- filter.add(SubType.TREASURE.getPredicate());
- }
-
- public TreasureCove(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
-
- this.nightCard = true;
-
- // {T}: Add {C}.
- this.addAbility(new ColorlessManaAbility());
-
- // {T}, Sacrifice a Treasure: Draw a card.
- Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new TapSourceCost());
- ability.addCost(new SacrificeTargetCost(filter));
- this.addAbility(ability);
- }
-
- private TreasureCove(final TreasureCove card) {
- super(card);
- }
-
- @Override
- public TreasureCove copy() {
- return new TreasureCove(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TreasureMap.java b/Mage.Sets/src/mage/cards/t/TreasureMap.java
index 224fbd8290d..bfaedc3b592 100644
--- a/Mage.Sets/src/mage/cards/t/TreasureMap.java
+++ b/Mage.Sets/src/mage/cards/t/TreasureMap.java
@@ -4,19 +4,23 @@ import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
+import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.keyword.ScryEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.counters.CounterType;
+import mage.filter.common.FilterControlledPermanent;
import mage.game.permanent.token.TreasureToken;
import java.util.UUID;
@@ -24,17 +28,24 @@ import java.util.UUID;
/**
* @author TheElk801
*/
-public final class TreasureMap extends CardImpl {
+public final class TreasureMap extends TransformingDoubleFacedCard {
private static final Condition condition = new SourceHasCounterCondition(CounterType.LANDMARK, 3);
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("a Treasure");
+
+ static {
+ filter.add(SubType.TREASURE.getPredicate());
+ }
public TreasureMap(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
-
- this.secondSideCardClazz = mage.cards.t.TreasureCove.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{2}",
+ "Treasure Cove",
+ new CardType[]{CardType.LAND}, new SubType[]{}, ""
+ );
+ // Treasure Map
// {1}, {T}: Scry 1. Put a landmark counter on Treasure Map. Then if there are three or more landmark counters on it, remove those counters, transform Treasure Map, and create three colorless Treasure artifact tokens with "{T}, Sacrifice this artifact: Add one mana of any color."
- this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new ScryEffect(1, false), new ManaCostsImpl<>("{1}"));
ability.addCost(new TapSourceCost());
ability.addEffect(new AddCountersSourceEffect(CounterType.LANDMARK.createInstance()));
@@ -42,7 +53,16 @@ public final class TreasureMap extends CardImpl {
new RemoveAllCountersSourceEffect(CounterType.LANDMARK), condition, "Then if there are three or " +
"more landmark counters on it, remove those counters, transform {this}, and create three Treasure tokens"
).addEffect(new TransformSourceEffect()).addEffect(new CreateTokenEffect(new TreasureToken(), 3)));
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
+
+ // Treasure Cove
+ // {T}: Add {C}.
+ this.getRightHalfCard().addAbility(new ColorlessManaAbility());
+
+ // {T}, Sacrifice a Treasure: Draw a card.
+ Ability ability2 = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new TapSourceCost());
+ ability2.addCost(new SacrificeTargetCost(filter));
+ this.getRightHalfCard().addAbility(ability2);
}
private TreasureMap(final TreasureMap card) {
diff --git a/Mage.Sets/src/mage/cards/t/TributeToHorobi.java b/Mage.Sets/src/mage/cards/t/TributeToHorobi.java
index 5ae827f0d1c..94b70c92b3c 100644
--- a/Mage.Sets/src/mage/cards/t/TributeToHorobi.java
+++ b/Mage.Sets/src/mage/cards/t/TributeToHorobi.java
@@ -1,15 +1,22 @@
package mage.cards.t;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SagaAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.CreateTokenAllEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.effects.common.continuous.GainControlAllEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.HasteAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SagaChapter;
-import mage.constants.SubType;
-import mage.constants.TargetController;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
+import mage.filter.FilterPermanent;
+import mage.filter.StaticFilters;
+import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.permanent.token.RatRogueToken;
import java.util.UUID;
@@ -17,28 +24,53 @@ import java.util.UUID;
/**
* @author weirddan455
*/
-public final class TributeToHorobi extends CardImpl {
+public final class TributeToHorobi extends TransformingDoubleFacedCard {
+
+ private static final FilterPermanent filter = new FilterPermanent(SubType.RAT, "Rat tokens");
+
+ static {
+ filter.add(TokenPredicate.TRUE);
+ }
public TributeToHorobi(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
-
- this.subtype.add(SubType.SAGA);
- this.secondSideCardClazz = mage.cards.e.EchoOfDeathsWail.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{1}{B}",
+ "Echo of Death's Wail",
+ new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SPIRIT}, "B"
+ );
+ // Tribute to Horobi
// (As this Saga enters and after your draw step, add a lore counter.)
- SagaAbility sagaAbility = new SagaAbility(this);
+ SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I, II — Each opponent creates a 1/1 black Rat Rouge creature token.
sagaAbility.addChapterEffect(
- this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
+ this.getLeftHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II,
new CreateTokenAllEffect(new RatRogueToken(), TargetController.OPPONENT)
);
// III — Exile this Saga, then return it to the battlefield transformed under your control.
- this.addAbility(new TransformAbility());
- sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
+ sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
- this.addAbility(sagaAbility);
+ this.getLeftHalfCard().addAbility(sagaAbility);
+
+ // Echo of Death's Wail
+ this.getRightHalfCard().setPT(3, 3);
+
+ // Flying
+ this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
+
+ // Haste
+ this.getRightHalfCard().addAbility(HasteAbility.getInstance());
+
+ // When Echo of Death's Wail enters the battlefield, gain control of all Rat tokens.
+ this.getRightHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new GainControlAllEffect(Duration.Custom, filter)));
+
+ // Whenever Echo of Death's Wail attacks, you may sacrifice another creature. If you do, draw a card.
+ this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
+ new DrawCardSourceControllerEffect(1),
+ new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)
+ )));
}
private TributeToHorobi(final TributeToHorobi card) {
diff --git a/Mage.Sets/src/mage/cards/t/TwinbladeGeist.java b/Mage.Sets/src/mage/cards/t/TwinbladeGeist.java
index 3323597e51e..a85e49ad3bb 100644
--- a/Mage.Sets/src/mage/cards/t/TwinbladeGeist.java
+++ b/Mage.Sets/src/mage/cards/t/TwinbladeGeist.java
@@ -1,35 +1,57 @@
package mage.cards.t;
-import mage.MageInt;
-import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.DisturbAbility;
import mage.abilities.keyword.DoubleStrikeAbility;
-import mage.cards.CardImpl;
+import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardSetInfo;
+import mage.cards.TransformingDoubleFacedCard;
+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 TwinbladeGeist extends CardImpl {
+public final class TwinbladeGeist extends TransformingDoubleFacedCard {
public TwinbladeGeist(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ super(ownerId, setInfo,
+ new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SPIRIT, SubType.WARRIOR}, "{1}{W}",
+ "Twinblade Invocation",
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "W"
+ );
- this.subtype.add(SubType.SPIRIT);
- this.subtype.add(SubType.WARRIOR);
- this.power = new MageInt(1);
- this.toughness = new MageInt(1);
- this.secondSideCardClazz = mage.cards.t.TwinbladeInvocation.class;
+ // Twinblade Geist
+ this.getLeftHalfCard().setPT(1, 1);
// Double strike
- this.addAbility(DoubleStrikeAbility.getInstance());
+ this.getLeftHalfCard().addAbility(DoubleStrikeAbility.getInstance());
// Disturb {2}{W}
- this.addAbility(new DisturbAbility(this, "{2}{W}"));
+ this.getLeftHalfCard().addAbility(new DisturbAbility(this, "{2}{W}"));
+
+ // Twinblade Invocation
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
+ this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
+
+ // Enchanted creature has double strike.
+ this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(
+ DoubleStrikeAbility.getInstance(), AttachmentType.AURA
+ )));
+
+ // If Twinblade Invocation would be put into a graveyard from anywhere, exile it instead.
+ this.getRightHalfCard().addAbility(DisturbAbility.makeBackAbility());
}
private TwinbladeGeist(final TwinbladeGeist card) {
diff --git a/Mage.Sets/src/mage/cards/t/TwinbladeInvocation.java b/Mage.Sets/src/mage/cards/t/TwinbladeInvocation.java
deleted file mode 100644
index 1ade18bdba1..00000000000
--- a/Mage.Sets/src/mage/cards/t/TwinbladeInvocation.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package mage.cards.t;
-
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
-import mage.abilities.keyword.DisturbAbility;
-import mage.abilities.keyword.DoubleStrikeAbility;
-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 TwinbladeInvocation extends CardImpl {
-
- public TwinbladeInvocation(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
-
- this.subtype.add(SubType.AURA);
- this.color.setWhite(true);
- this.nightCard = true;
-
- // Enchant creature
- TargetPermanent auraTarget = new TargetCreaturePermanent();
- this.getSpellAbility().addTarget(auraTarget);
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- this.addAbility(new EnchantAbility(auraTarget));
-
- // Enchanted creature has double strike.
- this.addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect(
- DoubleStrikeAbility.getInstance(), AttachmentType.AURA
- )));
-
- // If Twinblade Invocation would be put into a graveyard from anywhere, exile it instead.
- this.addAbility(DisturbAbility.makeBackAbility());
- }
-
- private TwinbladeInvocation(final TwinbladeInvocation card) {
- super(card);
- }
-
- @Override
- public TwinbladeInvocation copy() {
- return new TwinbladeInvocation(this);
- }
-}
diff --git a/Mage.Sets/src/mage/cards/t/TwistsAndTurns.java b/Mage.Sets/src/mage/cards/t/TwistsAndTurns.java
index 76c33e1b534..7ad5ef13c07 100644
--- a/Mage.Sets/src/mage/cards/t/TwistsAndTurns.java
+++ b/Mage.Sets/src/mage/cards/t/TwistsAndTurns.java
@@ -3,19 +3,20 @@ package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.keyword.ExploreTargetEffect;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
+import mage.abilities.mana.GreenManaAbility;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.ComparisonType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
+import mage.cards.TransformingDoubleFacedCard;
+import mage.constants.*;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
@@ -28,7 +29,7 @@ import java.util.UUID;
/**
* @author xenohedron
*/
-public final class TwistsAndTurns extends CardImpl {
+public final class TwistsAndTurns extends TransformingDoubleFacedCard {
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(
new FilterControlledLandPermanent("you control seven or more lands"),
@@ -36,22 +37,36 @@ public final class TwistsAndTurns extends CardImpl {
);
public TwistsAndTurns(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{G}");
- this.secondSideCardClazz = mage.cards.m.MycoidMaze.class;
+ super(ownerId, setInfo,
+ new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "{G}",
+ "Mycoid Maze",
+ new CardType[]{CardType.LAND}, new SubType[]{SubType.CAVE}, ""
+ );
+ // Twists and Turns
// If a creature you control would explore, instead you scry 1, then that creature explores.
- this.addAbility(new SimpleStaticAbility(new TwistsAndTurnsReplacementEffect()));
+ this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new TwistsAndTurnsReplacementEffect()));
// When Twists and Turns enters the battlefield, target creature you control explores.
Ability ability = new EntersBattlefieldTriggeredAbility(new ExploreTargetEffect(false));
ability.addTarget(new TargetControlledCreaturePermanent());
- this.addAbility(ability);
+ this.getLeftHalfCard().addAbility(ability);
// When a land you control enters, if you control seven or more lands, transform Twists and Turns.
- this.addAbility(new TransformAbility());
- this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
+ this.getLeftHalfCard().addAbility(new EntersBattlefieldControlledTriggeredAbility(
new TransformSourceEffect(), StaticFilters.FILTER_LAND
).withInterveningIf(condition).setTriggerPhrase("When a land you control enters, "));
+
+ // Mycoid Maze
+ // {T}: Add {G}.
+ this.getRightHalfCard().addAbility(new GreenManaAbility());
+
+ // {3}{G}, {T}: Look at the top four cards of your library. You may reveal a creature card from among them and put that card into your hand. Put the rest on the bottom of your library in a random order.
+ Ability ability2 = new SimpleActivatedAbility(new LookLibraryAndPickControllerEffect(
+ 4, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM
+ ), new ManaCostsImpl<>("{3}{G}"));
+ ability2.addCost(new TapSourceCost());
+ this.getRightHalfCard().addAbility(ability2);
}
private TwistsAndTurns(final TwistsAndTurns card) {
diff --git a/Mage.Sets/src/mage/cards/v/VectorGlider.java b/Mage.Sets/src/mage/cards/v/VectorGlider.java
deleted file mode 100644
index bab0f279c24..00000000000
--- a/Mage.Sets/src/mage/cards/v/VectorGlider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package mage.cards.v;
-
-import mage.MageInt;
-import mage.abilities.keyword.FlyingAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.constants.SubType;
-
-import java.util.UUID;
-
-/**
- * @author TheElk801
- */
-public final class VectorGlider extends CardImpl {
-
- public VectorGlider(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
-
- this.subtype.add(SubType.SPIRIT);
- this.power = new MageInt(2);
- this.toughness = new MageInt(3);
- this.color.setBlue(true);
- this.nightCard = true;
-
- // Flying
- this.addAbility(FlyingAbility.getInstance());
- }
-
- private VectorGlider(final VectorGlider card) {
- super(card);
- }
-
- @Override
- public VectorGlider copy() {
- return new VectorGlider(this);
- }
-}
diff --git a/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java b/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java
index 1cc47ff9291..dd5e72509d3 100644
--- a/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java
+++ b/Mage.Sets/src/mage/sets/AvatarTheLastAirbender.java
@@ -61,14 +61,6 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
cards.add(new SetCardInfo("Avatar Destiny", 165, Rarity.RARE, mage.cards.a.AvatarDestiny.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Avatar Destiny", 333, Rarity.RARE, mage.cards.a.AvatarDestiny.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Avatar Enthusiasts", 11, Rarity.COMMON, mage.cards.a.AvatarEnthusiasts.class));
- cards.add(new SetCardInfo("Avatar Kuruk", 355, Rarity.MYTHIC, mage.cards.a.AvatarKuruk.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Kuruk", 61, Rarity.MYTHIC, mage.cards.a.AvatarKuruk.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Kyoshi", 186, Rarity.MYTHIC, mage.cards.a.AvatarKyoshi.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Kyoshi", 358, Rarity.MYTHIC, mage.cards.a.AvatarKyoshi.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Roku", 145, Rarity.MYTHIC, mage.cards.a.AvatarRoku.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Roku", 357, Rarity.MYTHIC, mage.cards.a.AvatarRoku.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Yangchen", 27, Rarity.MYTHIC, mage.cards.a.AvatarYangchen.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Yangchen", 354, Rarity.MYTHIC, mage.cards.a.AvatarYangchen.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Avatar's Wrath", 12, Rarity.RARE, mage.cards.a.AvatarsWrath.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Avatar's Wrath", 365, Rarity.RARE, mage.cards.a.AvatarsWrath.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Azula Always Lies", 84, Rarity.COMMON, mage.cards.a.AzulaAlwaysLies.class));
@@ -152,8 +144,6 @@ public final class AvatarTheLastAirbender extends ExpansionSet {
cards.add(new SetCardInfo("Fire Lord Azula", 220, Rarity.RARE, mage.cards.f.FireLordAzula.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fire Lord Azula", 313, Rarity.RARE, mage.cards.f.FireLordAzula.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fire Lord Azula", 334, Rarity.RARE, mage.cards.f.FireLordAzula.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Fire Lord Sozin", 117, Rarity.MYTHIC, mage.cards.f.FireLordSozin.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Fire Lord Sozin", 356, Rarity.MYTHIC, mage.cards.f.FireLordSozin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fire Lord Zuko", 221, Rarity.RARE, mage.cards.f.FireLordZuko.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fire Lord Zuko", 315, Rarity.RARE, mage.cards.f.FireLordZuko.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Fire Lord Zuko", 360, Rarity.RARE, mage.cards.f.FireLordZuko.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java b/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java
index e5f25cf5dd7..73a30ae2f1b 100644
--- a/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java
+++ b/Mage.Sets/src/mage/sets/AvatarTheLastAirbenderEternal.java
@@ -44,10 +44,6 @@ public final class AvatarTheLastAirbenderEternal extends ExpansionSet {
cards.add(new SetCardInfo("Appa, Aang's Companion", 268, Rarity.UNCOMMON, mage.cards.a.AppaAangsCompanion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Appa, the Vigilant", 62, Rarity.RARE, mage.cards.a.AppaTheVigilant.class));
cards.add(new SetCardInfo("Arcane Signet", 315, Rarity.RARE, mage.cards.a.ArcaneSignet.class));
- cards.add(new SetCardInfo("Avatar Kyoshi, Earthbender", 130, Rarity.MYTHIC, mage.cards.a.AvatarKyoshiEarthbender.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Kyoshi, Earthbender", 201, Rarity.MYTHIC, mage.cards.a.AvatarKyoshiEarthbender.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Roku, Firebender", 112, Rarity.MYTHIC, mage.cards.a.AvatarRokuFirebender.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Avatar Roku, Firebender", 191, Rarity.MYTHIC, mage.cards.a.AvatarRokuFirebender.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Azula, Ruthless Firebender", 101, Rarity.MYTHIC, mage.cards.a.AzulaRuthlessFirebender.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Azula, Ruthless Firebender", 184, Rarity.MYTHIC, mage.cards.a.AzulaRuthlessFirebender.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Baboon Spirit", 177, Rarity.RARE, mage.cards.b.BaboonSpirit.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/EldritchMoon.java b/Mage.Sets/src/mage/sets/EldritchMoon.java
index b92623e170a..8291b92aaab 100644
--- a/Mage.Sets/src/mage/sets/EldritchMoon.java
+++ b/Mage.Sets/src/mage/sets/EldritchMoon.java
@@ -110,7 +110,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Faith Unbroken", 24, Rarity.UNCOMMON, mage.cards.f.FaithUnbroken.class));
cards.add(new SetCardInfo("Faithbearer Paladin", 25, Rarity.COMMON, mage.cards.f.FaithbearerPaladin.class));
cards.add(new SetCardInfo("Falkenrath Reaver", 127, Rarity.COMMON, mage.cards.f.FalkenrathReaver.class));
- cards.add(new SetCardInfo("Fibrous Entangler", 174, Rarity.UNCOMMON, mage.cards.f.FibrousEntangler.class));
cards.add(new SetCardInfo("Field Creeper", 195, Rarity.COMMON, mage.cards.f.FieldCreeper.class));
cards.add(new SetCardInfo("Fiend Binder", 26, Rarity.COMMON, mage.cards.f.FiendBinder.class));
cards.add(new SetCardInfo("Final Iteration", 56, Rarity.RARE, mage.cards.f.FinalIteration.class));
diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java
index c75679dec65..e99d2973e0f 100644
--- a/Mage.Sets/src/mage/sets/FinalFantasy.java
+++ b/Mage.Sets/src/mage/sets/FinalFantasy.java
@@ -169,9 +169,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Emet-Selch, Unsundered", 539, Rarity.MYTHIC, mage.cards.e.EmetSelchUnsundered.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Esper Origins", 185, Rarity.RARE, mage.cards.e.EsperOrigins.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Esper Origins", 370, Rarity.RARE, mage.cards.e.EsperOrigins.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Esper Terra", 245, Rarity.MYTHIC, mage.cards.e.EsperTerra.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Esper Terra", 323, Rarity.MYTHIC, mage.cards.e.EsperTerra.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Esper Terra", 511, Rarity.MYTHIC, mage.cards.e.EsperTerra.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ether", 53, Rarity.UNCOMMON, mage.cards.e.Ether.class));
cards.add(new SetCardInfo("Evil Reawakened", 98, Rarity.UNCOMMON, mage.cards.e.EvilReawakened.class));
cards.add(new SetCardInfo("Excalibur II", 257, Rarity.RARE, mage.cards.e.ExcaliburII.class, NON_FULL_USE_VARIOUS));
@@ -516,8 +513,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("The Fire Crystal", 135, Rarity.RARE, mage.cards.t.TheFireCrystal.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Fire Crystal", 337, Rarity.RARE, mage.cards.t.TheFireCrystal.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Gold Saucer", 279, Rarity.UNCOMMON, mage.cards.t.TheGoldSaucer.class));
- cards.add(new SetCardInfo("The Lord Master of Hell", 219, Rarity.UNCOMMON, mage.cards.t.TheLordMasterOfHell.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Lord Master of Hell", 484, Rarity.UNCOMMON, mage.cards.t.TheLordMasterOfHell.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Lunar Whale", 60, Rarity.RARE, mage.cards.t.TheLunarWhale.class));
cards.add(new SetCardInfo("The Masamune", 264, Rarity.RARE, mage.cards.t.TheMasamune.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Masamune", 353, Rarity.RARE, mage.cards.t.TheMasamune.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/Innistrad.java b/Mage.Sets/src/mage/sets/Innistrad.java
index 6dc3be330df..e80a92a5568 100644
--- a/Mage.Sets/src/mage/sets/Innistrad.java
+++ b/Mage.Sets/src/mage/sets/Innistrad.java
@@ -222,7 +222,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Rage Thrower", 157, Rarity.UNCOMMON, mage.cards.r.RageThrower.class));
cards.add(new SetCardInfo("Rakish Heir", 158, Rarity.UNCOMMON, mage.cards.r.RakishHeir.class));
cards.add(new SetCardInfo("Rally the Peasants", 28, Rarity.UNCOMMON, mage.cards.r.RallyThePeasants.class));
- cards.add(new SetCardInfo("Rampaging Werewolf", 165, Rarity.COMMON, mage.cards.r.RampagingWerewolf.class));
cards.add(new SetCardInfo("Ranger's Guile", 201, Rarity.COMMON, mage.cards.r.RangersGuile.class));
cards.add(new SetCardInfo("Reaper from the Abyss", 112, Rarity.MYTHIC, mage.cards.r.ReaperFromTheAbyss.class));
cards.add(new SetCardInfo("Rebuke", 29, Rarity.COMMON, mage.cards.r.Rebuke.class));
@@ -271,7 +270,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Swamp", 257, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 258, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Think Twice", 83, Rarity.COMMON, mage.cards.t.ThinkTwice.class));
- cards.add(new SetCardInfo("Thraben Militia", 38, Rarity.COMMON, mage.cards.t.ThrabenMilitia.class));
cards.add(new SetCardInfo("Thraben Purebloods", 37, Rarity.COMMON, mage.cards.t.ThrabenPurebloods.class));
cards.add(new SetCardInfo("Thraben Sentry", 38, Rarity.COMMON, mage.cards.t.ThrabenSentry.class));
cards.add(new SetCardInfo("Tormented Pariah", 165, Rarity.COMMON, mage.cards.t.TormentedPariah.class));
diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
index 5c90a428a8b..c5764484c32 100644
--- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
+++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java
@@ -411,7 +411,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Toxrill, the Corrosive", 321, Rarity.MYTHIC, mage.cards.t.ToxrillTheCorrosive.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Traveling Minister", 39, Rarity.COMMON, mage.cards.t.TravelingMinister.class));
cards.add(new SetCardInfo("Twinblade Geist", 40, Rarity.UNCOMMON, mage.cards.t.TwinbladeGeist.class));
- cards.add(new SetCardInfo("Twinblade Invocation", 40, Rarity.UNCOMMON, mage.cards.t.TwinbladeInvocation.class));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 225, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 394, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Oddity", 225, Rarity.RARE, mage.cards.u.UlvenwaldOddity.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
index cb879bb5aca..f090016cd24 100644
--- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
+++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java
@@ -165,7 +165,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Devoted Grafkeeper", 218, Rarity.UNCOMMON, mage.cards.d.DevotedGrafkeeper.class));
cards.add(new SetCardInfo("Dig Up", 464, Rarity.RARE, mage.cards.d.DigUp.class));
cards.add(new SetCardInfo("Dire-Strain Anarchist", 448, Rarity.MYTHIC, mage.cards.d.DireStrainAnarchist.class));
- cards.add(new SetCardInfo("Dire-Strain Brawler", 203, Rarity.COMMON, mage.cards.d.DireStrainBrawler.class));
cards.add(new SetCardInfo("Dire-Strain Rampage", 219, Rarity.RARE, mage.cards.d.DireStrainRampage.class));
cards.add(new SetCardInfo("Diregraf Horde", 96, Rarity.COMMON, mage.cards.d.DiregrafHorde.class));
cards.add(new SetCardInfo("Diregraf Rebirth", 220, Rarity.UNCOMMON, mage.cards.d.DiregrafRebirth.class));
@@ -500,7 +499,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Tainted Adversary", 124, Rarity.MYTHIC, mage.cards.t.TaintedAdversary.class));
cards.add(new SetCardInfo("Tapping at the Window", 201, Rarity.COMMON, mage.cards.t.TappingAtTheWindow.class));
cards.add(new SetCardInfo("Tavern Ruffian", 163, Rarity.COMMON, mage.cards.t.TavernRuffian.class));
- cards.add(new SetCardInfo("Tavern Smasher", 163, Rarity.COMMON, mage.cards.t.TavernSmasher.class));
cards.add(new SetCardInfo("Teferi, Who Slows the Sunset", 245, Rarity.MYTHIC, mage.cards.t.TeferiWhoSlowsTheSunset.class));
cards.add(new SetCardInfo("Thalia, Guardian of Thraben", 305, Rarity.RARE, mage.cards.t.ThaliaGuardianOfThraben.class));
cards.add(new SetCardInfo("The Celestus", 252, Rarity.RARE, mage.cards.t.TheCelestus.class));
@@ -512,16 +510,13 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Tireless Hauler", 203, Rarity.COMMON, mage.cards.t.TirelessHauler.class));
cards.add(new SetCardInfo("Torens, Fist of the Angels", 516, Rarity.RARE, mage.cards.t.TorensFistOfTheAngels.class));
cards.add(new SetCardInfo("Tovolar's Huntmaster", 204, Rarity.RARE, mage.cards.t.TovolarsHuntmaster.class));
- cards.add(new SetCardInfo("Tovolar's Packleader", 204, Rarity.RARE, mage.cards.t.TovolarsPackleader.class));
cards.add(new SetCardInfo("Tovolar, Dire Overlord", 246, Rarity.RARE, mage.cards.t.TovolarDireOverlord.class));
- cards.add(new SetCardInfo("Tovolar, the Midnight Scourge", 246, Rarity.RARE, mage.cards.t.TovolarTheMidnightScourge.class));
cards.add(new SetCardInfo("Toxic Scorpion", 491, Rarity.COMMON, mage.cards.t.ToxicScorpion.class));
cards.add(new SetCardInfo("Toxrill, the Corrosive", 399, Rarity.MYTHIC, mage.cards.t.ToxrillTheCorrosive.class));
cards.add(new SetCardInfo("Traveling Minister", 306, Rarity.COMMON, mage.cards.t.TravelingMinister.class));
cards.add(new SetCardInfo("Triskaidekaphile", 81, Rarity.RARE, mage.cards.t.Triskaidekaphile.class));
cards.add(new SetCardInfo("Turn the Earth", 205, Rarity.UNCOMMON, mage.cards.t.TurnTheEarth.class));
cards.add(new SetCardInfo("Twinblade Geist", 307, Rarity.UNCOMMON, mage.cards.t.TwinbladeGeist.class));
- cards.add(new SetCardInfo("Twinblade Invocation", 307, Rarity.UNCOMMON, mage.cards.t.TwinbladeInvocation.class));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 492, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class));
cards.add(new SetCardInfo("Ulvenwald Oddity", 492, Rarity.RARE, mage.cards.u.UlvenwaldOddity.class));
cards.add(new SetCardInfo("Unblinking Observer", 82, Rarity.COMMON, mage.cards.u.UnblinkingObserver.class));
diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
index e852491ac69..95f70545fea 100644
--- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
+++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java
@@ -137,8 +137,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Deserted Beach", 281, Rarity.RARE, mage.cards.d.DesertedBeach.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Devious Cover-Up", 48, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class));
cards.add(new SetCardInfo("Devoted Grafkeeper", 218, Rarity.UNCOMMON, mage.cards.d.DevotedGrafkeeper.class));
- cards.add(new SetCardInfo("Dire-Strain Brawler", 203, Rarity.COMMON, mage.cards.d.DireStrainBrawler.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Dire-Strain Brawler", 305, Rarity.COMMON, mage.cards.d.DireStrainBrawler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dire-Strain Rampage", 219, Rarity.RARE, mage.cards.d.DireStrainRampage.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dire-Strain Rampage", 370, Rarity.RARE, mage.cards.d.DireStrainRampage.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Diregraf Horde", 96, Rarity.COMMON, mage.cards.d.DiregrafHorde.class));
@@ -390,8 +388,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Tapping at the Window", 201, Rarity.COMMON, mage.cards.t.TappingAtTheWindow.class));
cards.add(new SetCardInfo("Tavern Ruffian", 163, Rarity.COMMON, mage.cards.t.TavernRuffian.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tavern Ruffian", 296, Rarity.COMMON, mage.cards.t.TavernRuffian.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Tavern Smasher", 163, Rarity.COMMON, mage.cards.t.TavernSmasher.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Tavern Smasher", 296, Rarity.COMMON, mage.cards.t.TavernSmasher.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Teferi, Who Slows the Sunset", 245, Rarity.MYTHIC, mage.cards.t.TeferiWhoSlowsTheSunset.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Teferi, Who Slows the Sunset", 280, Rarity.MYTHIC, mage.cards.t.TeferiWhoSlowsTheSunset.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Celestus", 252, Rarity.RARE, mage.cards.t.TheCelestus.class, NON_FULL_USE_VARIOUS));
@@ -405,12 +401,8 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Tireless Hauler", 305, Rarity.COMMON, mage.cards.t.TirelessHauler.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tovolar's Huntmaster", 204, Rarity.RARE, mage.cards.t.TovolarsHuntmaster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tovolar's Huntmaster", 306, Rarity.RARE, mage.cards.t.TovolarsHuntmaster.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Tovolar's Packleader", 204, Rarity.RARE, mage.cards.t.TovolarsPackleader.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Tovolar's Packleader", 306, Rarity.RARE, mage.cards.t.TovolarsPackleader.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tovolar, Dire Overlord", 246, Rarity.RARE, mage.cards.t.TovolarDireOverlord.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tovolar, Dire Overlord", 311, Rarity.RARE, mage.cards.t.TovolarDireOverlord.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Tovolar, the Midnight Scourge", 246, Rarity.RARE, mage.cards.t.TovolarTheMidnightScourge.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Tovolar, the Midnight Scourge", 311, Rarity.RARE, mage.cards.t.TovolarTheMidnightScourge.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Triskaidekaphile", 342, Rarity.RARE, mage.cards.t.Triskaidekaphile.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Triskaidekaphile", 386, Rarity.RARE, mage.cards.t.Triskaidekaphile.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Triskaidekaphile", 81, Rarity.RARE, mage.cards.t.Triskaidekaphile.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/InnistradRemastered.java b/Mage.Sets/src/mage/sets/InnistradRemastered.java
index 25c1b8d8443..c8bf729dc13 100644
--- a/Mage.Sets/src/mage/sets/InnistradRemastered.java
+++ b/Mage.Sets/src/mage/sets/InnistradRemastered.java
@@ -58,8 +58,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Avacyn, Angel of Hope", 482, Rarity.MYTHIC, mage.cards.a.AvacynAngelOfHope.class, FULL_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Avacynian Priest", 12, Rarity.COMMON, mage.cards.a.AvacynianPriest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Avacynian Priest", 334, Rarity.COMMON, mage.cards.a.AvacynianPriest.class, RETRO_ART_USE_VARIOUS));
- cards.add(new SetCardInfo("Awoken Horror", 460, Rarity.RARE, mage.cards.a.AwokenHorror.class, RETRO_ART_USE_VARIOUS));
- cards.add(new SetCardInfo("Awoken Horror", 91, Rarity.RARE, mage.cards.a.AwokenHorror.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Balefire Dragon", 479, Rarity.MYTHIC, mage.cards.b.BalefireDragon.class, RETRO_ART));
cards.add(new SetCardInfo("Battleground Geist", 53, Rarity.COMMON, mage.cards.b.BattlegroundGeist.class));
cards.add(new SetCardInfo("Bedlam Reveler", 142, Rarity.RARE, mage.cards.b.BedlamReveler.class, NON_FULL_USE_VARIOUS));
@@ -271,8 +269,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Huntmaster of the Fells", 470, Rarity.RARE, mage.cards.h.HuntmasterOfTheFells.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Imprisoned in the Moon", 358, Rarity.COMMON, mage.cards.i.ImprisonedInTheMoon.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Imprisoned in the Moon", 69, Rarity.COMMON, mage.cards.i.ImprisonedInTheMoon.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Incited Rabble", 451, Rarity.UNCOMMON, mage.cards.i.IncitedRabble.class, RETRO_ART_USE_VARIOUS));
- cards.add(new SetCardInfo("Incited Rabble", 46, Rarity.UNCOMMON, mage.cards.i.IncitedRabble.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Indulgent Aristocrat", 118, Rarity.UNCOMMON, mage.cards.i.IndulgentAristocrat.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Indulgent Aristocrat", 384, Rarity.UNCOMMON, mage.cards.i.IndulgentAristocrat.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Infernal Grasp", 119, Rarity.UNCOMMON, mage.cards.i.InfernalGrasp.class, NON_FULL_USE_VARIOUS));
@@ -485,8 +481,6 @@ public class InnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Triskaidekaphobia", 391, Rarity.UNCOMMON, mage.cards.t.Triskaidekaphobia.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Twinblade Geist", 452, Rarity.UNCOMMON, mage.cards.t.TwinbladeGeist.class, RETRO_ART_USE_VARIOUS));
cards.add(new SetCardInfo("Twinblade Geist", 47, Rarity.UNCOMMON, mage.cards.t.TwinbladeGeist.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Twinblade Invocation", 452, Rarity.UNCOMMON, mage.cards.t.TwinbladeInvocation.class, RETRO_ART_USE_VARIOUS));
- cards.add(new SetCardInfo("Twinblade Invocation", 47, Rarity.UNCOMMON, mage.cards.t.TwinbladeInvocation.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulrich's Kindred", 176, Rarity.UNCOMMON, mage.cards.u.UlrichsKindred.class));
cards.add(new SetCardInfo("Ulvenwald Mysteries", 222, Rarity.UNCOMMON, mage.cards.u.UlvenwaldMysteries.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Mysteries", 423, Rarity.UNCOMMON, mage.cards.u.UlvenwaldMysteries.class, RETRO_ART_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/Ixalan.java b/Mage.Sets/src/mage/sets/Ixalan.java
index 1e979a91602..baec595aa4b 100644
--- a/Mage.Sets/src/mage/sets/Ixalan.java
+++ b/Mage.Sets/src/mage/sets/Ixalan.java
@@ -269,7 +269,6 @@ public final class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Spell Pierce", 81, Rarity.COMMON, mage.cards.s.SpellPierce.class));
cards.add(new SetCardInfo("Spell Swindle", 82, Rarity.RARE, mage.cards.s.SpellSwindle.class));
cards.add(new SetCardInfo("Spike-Tailed Ceratops", 209, Rarity.COMMON, mage.cards.s.SpikeTailedCeratops.class));
- cards.add(new SetCardInfo("Spires of Orazca", 249, Rarity.RARE, mage.cards.s.SpiresOfOrazca.class));
cards.add(new SetCardInfo("Spitfire Bastion", 173, Rarity.RARE, mage.cards.s.SpitfireBastion.class));
cards.add(new SetCardInfo("Spreading Rot", 125, Rarity.COMMON, mage.cards.s.SpreadingRot.class));
cards.add(new SetCardInfo("Star of Extinction", 161, Rarity.MYTHIC, mage.cards.s.StarOfExtinction.class));
@@ -302,7 +301,6 @@ public final class Ixalan extends ExpansionSet {
cards.add(new SetCardInfo("Tishana's Wayfinder", 211, Rarity.COMMON, mage.cards.t.TishanasWayfinder.class));
cards.add(new SetCardInfo("Tishana, Voice of Thunder", 230, Rarity.MYTHIC, mage.cards.t.TishanaVoiceOfThunder.class));
cards.add(new SetCardInfo("Tocatli Honor Guard", 42, Rarity.RARE, mage.cards.t.TocatliHonorGuard.class));
- cards.add(new SetCardInfo("Treasure Cove", 250, Rarity.RARE, mage.cards.t.TreasureCove.class));
cards.add(new SetCardInfo("Treasure Map", 250, Rarity.RARE, mage.cards.t.TreasureMap.class));
cards.add(new SetCardInfo("Trove of Temptation", 171, Rarity.UNCOMMON, mage.cards.t.TroveOfTemptation.class));
cards.add(new SetCardInfo("Unclaimed Territory", 258, Rarity.UNCOMMON, mage.cards.u.UnclaimedTerritory.class));
diff --git a/Mage.Sets/src/mage/sets/IxalanPromos.java b/Mage.Sets/src/mage/sets/IxalanPromos.java
index afd1c3095dc..66d82454e9e 100644
--- a/Mage.Sets/src/mage/sets/IxalanPromos.java
+++ b/Mage.Sets/src/mage/sets/IxalanPromos.java
@@ -112,7 +112,6 @@ public class IxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Sorcerous Spyglass", "248s", Rarity.RARE, mage.cards.s.SorcerousSpyglass.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spell Swindle", "82p", Rarity.RARE, mage.cards.s.SpellSwindle.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Spell Swindle", "82s", Rarity.RARE, mage.cards.s.SpellSwindle.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Spires of Orazca", "249s", Rarity.RARE, mage.cards.s.SpiresOfOrazca.class));
cards.add(new SetCardInfo("Spitfire Bastion", "173s", Rarity.RARE, mage.cards.s.SpitfireBastion.class));
cards.add(new SetCardInfo("Star of Extinction", "161p", Rarity.MYTHIC, mage.cards.s.StarOfExtinction.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Star of Extinction", "161s", Rarity.MYTHIC, mage.cards.s.StarOfExtinction.class, NON_FULL_USE_VARIOUS));
@@ -127,7 +126,6 @@ public class IxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Tishana, Voice of Thunder", "230s", Rarity.MYTHIC, mage.cards.t.TishanaVoiceOfThunder.class));
cards.add(new SetCardInfo("Tocatli Honor Guard", "42p", Rarity.RARE, mage.cards.t.TocatliHonorGuard.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tocatli Honor Guard", "42s", Rarity.RARE, mage.cards.t.TocatliHonorGuard.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Treasure Cove", "250s", Rarity.RARE, mage.cards.t.TreasureCove.class));
cards.add(new SetCardInfo("Treasure Map", "250s", Rarity.RARE, mage.cards.t.TreasureMap.class));
cards.add(new SetCardInfo("Unclaimed Territory", 258, Rarity.UNCOMMON, mage.cards.u.UnclaimedTerritory.class));
cards.add(new SetCardInfo("Vance's Blasting Cannons", "173s", Rarity.RARE, mage.cards.v.VancesBlastingCannons.class));
diff --git a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java
index 8fb66058d82..81e349639fa 100644
--- a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java
+++ b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java
@@ -48,13 +48,9 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Ambitious Assault", 133, Rarity.COMMON, mage.cards.a.AmbitiousAssault.class));
cards.add(new SetCardInfo("Ancestral Katana", 1, Rarity.COMMON, mage.cards.a.AncestralKatana.class));
cards.add(new SetCardInfo("Anchor to Reality", 45, Rarity.UNCOMMON, mage.cards.a.AnchorToReality.class));
- cards.add(new SetCardInfo("Animus of Night's Reach", 109, Rarity.UNCOMMON, mage.cards.a.AnimusOfNightsReach.class));
cards.add(new SetCardInfo("Ao, the Dawn Sky", 2, Rarity.MYTHIC, mage.cards.a.AoTheDawnSky.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ao, the Dawn Sky", 406, Rarity.MYTHIC, mage.cards.a.AoTheDawnSky.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ao, the Dawn Sky", 433, Rarity.MYTHIC, mage.cards.a.AoTheDawnSky.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Architect of Restoration", 34, Rarity.RARE, mage.cards.a.ArchitectOfRestoration.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Architect of Restoration", 354, Rarity.RARE, mage.cards.a.ArchitectOfRestoration.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Architect of Restoration", 442, Rarity.RARE, mage.cards.a.ArchitectOfRestoration.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Armguard Familiar", 46, Rarity.COMMON, mage.cards.a.ArmguardFamiliar.class));
cards.add(new SetCardInfo("Asari Captain", 215, Rarity.UNCOMMON, mage.cards.a.AsariCaptain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Asari Captain", 327, Rarity.UNCOMMON, mage.cards.a.AsariCaptain.class, NON_FULL_USE_VARIOUS));
@@ -118,18 +114,12 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Dokuchi Shadow-Walker", 94, Rarity.COMMON, mage.cards.d.DokuchiShadowWalker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dokuchi Silencer", 340, Rarity.UNCOMMON, mage.cards.d.DokuchiSilencer.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dokuchi Silencer", 95, Rarity.UNCOMMON, mage.cards.d.DokuchiSilencer.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Dragon-Kami's Egg", 181, Rarity.RARE, mage.cards.d.DragonKamisEgg.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Dragon-Kami's Egg", 358, Rarity.RARE, mage.cards.d.DragonKamisEgg.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Dragon-Kami's Egg", 473, Rarity.RARE, mage.cards.d.DragonKamisEgg.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dragonfly Suit", 9, Rarity.COMMON, mage.cards.d.DragonflySuit.class));
cards.add(new SetCardInfo("Dragonspark Reactor", 137, Rarity.UNCOMMON, mage.cards.d.DragonsparkReactor.class));
cards.add(new SetCardInfo("Dramatist's Puppet", 244, Rarity.COMMON, mage.cards.d.DramatistsPuppet.class));
cards.add(new SetCardInfo("Eater of Virtue", 245, Rarity.RARE, mage.cards.e.EaterOfVirtue.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Eater of Virtue", 401, Rarity.RARE, mage.cards.e.EaterOfVirtue.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Eater of Virtue", 496, Rarity.RARE, mage.cards.e.EaterOfVirtue.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Echo of Death's Wail", 124, Rarity.RARE, mage.cards.e.EchoOfDeathsWail.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Echo of Death's Wail", 356, Rarity.RARE, mage.cards.e.EchoOfDeathsWail.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Echo of Death's Wail", 462, Rarity.RARE, mage.cards.e.EchoOfDeathsWail.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ecologist's Terrarium", 246, Rarity.COMMON, mage.cards.e.EcologistsTerrarium.class));
cards.add(new SetCardInfo("Eiganjo Exemplar", 10, Rarity.COMMON, mage.cards.e.EiganjoExemplar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Eiganjo Exemplar", 309, Rarity.COMMON, mage.cards.e.EiganjoExemplar.class, NON_FULL_USE_VARIOUS));
@@ -166,7 +156,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Forest", 292, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 301, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_UST_VARIOUS));
cards.add(new SetCardInfo("Forest", 302, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_UST_VARIOUS));
- cards.add(new SetCardInfo("Fragment of Konda", 12, Rarity.UNCOMMON, mage.cards.f.FragmentOfKonda.class));
cards.add(new SetCardInfo("Futurist Operative", 333, Rarity.UNCOMMON, mage.cards.f.FuturistOperative.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Futurist Operative", 53, Rarity.UNCOMMON, mage.cards.f.FuturistOperative.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Futurist Sentinel", 54, Rarity.COMMON, mage.cards.f.FuturistSentinel.class));
@@ -283,9 +272,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Kappa Tech-Wrecker", 198, Rarity.UNCOMMON, mage.cards.k.KappaTechWrecker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kappa Tech-Wrecker", 348, Rarity.UNCOMMON, mage.cards.k.KappaTechWrecker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kindled Fury", 151, Rarity.COMMON, mage.cards.k.KindledFury.class));
- cards.add(new SetCardInfo("Kirin-Touched Orochi", 212, Rarity.RARE, mage.cards.k.KirinTouchedOrochi.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Kirin-Touched Orochi", 360, Rarity.RARE, mage.cards.k.KirinTouchedOrochi.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Kirin-Touched Orochi", 482, Rarity.RARE, mage.cards.k.KirinTouchedOrochi.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kitsune Ace", 22, Rarity.COMMON, mage.cards.k.KitsuneAce.class));
cards.add(new SetCardInfo("Kodama of the West Tree", 199, Rarity.MYTHIC, mage.cards.k.KodamaOfTheWestTree.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kodama of the West Tree", 392, Rarity.MYTHIC, mage.cards.k.KodamaOfTheWestTree.class, NON_FULL_USE_VARIOUS));
@@ -362,7 +348,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Mukotai Soulripper", 113, Rarity.RARE, mage.cards.m.MukotaiSoulripper.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mukotai Soulripper", 381, Rarity.RARE, mage.cards.m.MukotaiSoulripper.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mukotai Soulripper", 458, Rarity.RARE, mage.cards.m.MukotaiSoulripper.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Nameless Conqueror", 162, Rarity.COMMON, mage.cards.n.NamelessConqueror.class));
cards.add(new SetCardInfo("Naomi, Pillar of Order", 229, Rarity.UNCOMMON, mage.cards.n.NaomiPillarOfOrder.class));
cards.add(new SetCardInfo("Nashi, Moon Sage's Scion", 114, Rarity.MYTHIC, mage.cards.n.NashiMoonSagesScion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nashi, Moon Sage's Scion", 343, Rarity.MYTHIC, mage.cards.n.NashiMoonSagesScion.class, NON_FULL_USE_VARIOUS));
@@ -377,9 +362,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Ninja's Kunai", 252, Rarity.COMMON, mage.cards.n.NinjasKunai.class));
cards.add(new SetCardInfo("Norika Yamazaki, the Poet", 31, Rarity.UNCOMMON, mage.cards.n.NorikaYamazakiThePoet.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Norika Yamazaki, the Poet", 311, Rarity.UNCOMMON, mage.cards.n.NorikaYamazakiThePoet.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("O-Kagachi Made Manifest", 227, Rarity.MYTHIC, mage.cards.o.OKagachiMadeManifest.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("O-Kagachi Made Manifest", 362, Rarity.MYTHIC, mage.cards.o.OKagachiMadeManifest.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("O-Kagachi Made Manifest", 489, Rarity.MYTHIC, mage.cards.o.OKagachiMadeManifest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ogre-Head Helm", 155, Rarity.RARE, mage.cards.o.OgreHeadHelm.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ogre-Head Helm", 387, Rarity.RARE, mage.cards.o.OgreHeadHelm.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ogre-Head Helm", 470, Rarity.RARE, mage.cards.o.OgreHeadHelm.class, NON_FULL_USE_VARIOUS));
@@ -448,7 +430,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Seismic Wave", 161, Rarity.UNCOMMON, mage.cards.s.SeismicWave.class));
cards.add(new SetCardInfo("Selfless Samurai", 312, Rarity.UNCOMMON, mage.cards.s.SelflessSamurai.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Selfless Samurai", 35, Rarity.UNCOMMON, mage.cards.s.SelflessSamurai.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Seshiro's Living Legacy", 210, Rarity.COMMON, mage.cards.s.SeshirosLivingLegacy.class));
cards.add(new SetCardInfo("Seven-Tail Mentor", 313, Rarity.COMMON, mage.cards.s.SevenTailMentor.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Seven-Tail Mentor", 36, Rarity.COMMON, mage.cards.s.SevenTailMentor.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shigeki, Jukai Visionary", 206, Rarity.RARE, mage.cards.s.ShigekiJukaiVisionary.class, NON_FULL_USE_VARIOUS));
@@ -560,7 +541,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Unstoppable Ogre", 169, Rarity.COMMON, mage.cards.u.UnstoppableOgre.class));
cards.add(new SetCardInfo("Upriser Renegade", 170, Rarity.UNCOMMON, mage.cards.u.UpriserRenegade.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Upriser Renegade", 324, Rarity.UNCOMMON, mage.cards.u.UpriserRenegade.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Vector Glider", 66, Rarity.COMMON, mage.cards.v.VectorGlider.class));
cards.add(new SetCardInfo("Virus Beetle", 128, Rarity.COMMON, mage.cards.v.VirusBeetle.class));
cards.add(new SetCardInfo("Voltage Surge", 171, Rarity.COMMON, mage.cards.v.VoltageSurge.class));
cards.add(new SetCardInfo("Walking Skyscraper", 263, Rarity.UNCOMMON, mage.cards.w.WalkingSkyscraper.class));
diff --git a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java
index bdb35c96f02..da9af323fd4 100644
--- a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java
+++ b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java
@@ -139,7 +139,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Archfiend of Depravity", 55711, Rarity.RARE, mage.cards.a.ArchfiendOfDepravity.class));
cards.add(new SetCardInfo("Archfiend of Ifnir", 64422, Rarity.RARE, mage.cards.a.ArchfiendOfIfnir.class));
cards.add(new SetCardInfo("Archipelagore", 81005, Rarity.UNCOMMON, mage.cards.a.Archipelagore.class));
- cards.add(new SetCardInfo("Architect of Restoration", 97897, Rarity.RARE, mage.cards.a.ArchitectOfRestoration.class));
cards.add(new SetCardInfo("Archmage Emeritus", 90016, Rarity.RARE, mage.cards.a.ArchmageEmeritus.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Archmage Emeritus", 90018, Rarity.RARE, mage.cards.a.ArchmageEmeritus.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Archmage's Charm", 91233, Rarity.RARE, mage.cards.a.ArchmagesCharm.class, RETRO_ART));
@@ -705,7 +704,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Dragon Broodmother", 32553, Rarity.MYTHIC, mage.cards.d.DragonBroodmother.class));
cards.add(new SetCardInfo("Dragon Fodder", 55898, Rarity.COMMON, mage.cards.d.DragonFodder.class));
cards.add(new SetCardInfo("Dragon Throne of Tarkir", 54565, Rarity.RARE, mage.cards.d.DragonThroneOfTarkir.class));
- cards.add(new SetCardInfo("Dragon-Kami's Egg", 98051, Rarity.RARE, mage.cards.d.DragonKamisEgg.class));
cards.add(new SetCardInfo("Dragonkin Berserker", 88310, Rarity.RARE, mage.cards.d.DragonkinBerserker.class));
cards.add(new SetCardInfo("Dragonlord Dromoka", 102319, Rarity.MYTHIC, mage.cards.d.DragonlordDromoka.class));
cards.add(new SetCardInfo("Dragonlord's Servant", 55884, Rarity.UNCOMMON, mage.cards.d.DragonlordsServant.class));
@@ -751,7 +749,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Eater of Hope", 51918, Rarity.RARE, mage.cards.e.EaterOfHope.class));
cards.add(new SetCardInfo("Eater of Virtue", 98111, Rarity.RARE, mage.cards.e.EaterOfVirtue.class));
cards.add(new SetCardInfo("Ebondeath, Dracolich", 92692, Rarity.MYTHIC, mage.cards.e.EbondeathDracolich.class));
- cards.add(new SetCardInfo("Echo of Death's Wail", 97969, Rarity.RARE, mage.cards.e.EchoOfDeathsWail.class));
cards.add(new SetCardInfo("Echo of Eons", 95469, Rarity.RARE, mage.cards.e.EchoOfEons.class));
cards.add(new SetCardInfo("Ecological Appreciation", 90166, Rarity.MYTHIC, mage.cards.e.EcologicalAppreciation.class));
cards.add(new SetCardInfo("Eerie Ultimatum", 80895, Rarity.RARE, mage.cards.e.EerieUltimatum.class));
@@ -1456,7 +1453,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Kiora, Behemoth Beckoner", 78027, Rarity.UNCOMMON, mage.cards.k.KioraBehemothBeckoner.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kiora, the Crashing Wave", 59651, Rarity.MYTHIC, mage.cards.k.KioraTheCrashingWave.class));
cards.add(new SetCardInfo("Kird Ape", 31383, Rarity.UNCOMMON, mage.cards.k.KirdApe.class));
- cards.add(new SetCardInfo("Kirin-Touched Orochi", 98047, Rarity.RARE, mage.cards.k.KirinTouchedOrochi.class));
cards.add(new SetCardInfo("Kitchen Finks", 36166, Rarity.UNCOMMON, mage.cards.k.KitchenFinks.class));
cards.add(new SetCardInfo("Kiyomaro, First to Stand", 32015, Rarity.RARE, mage.cards.k.KiyomaroFirstToStand.class));
cards.add(new SetCardInfo("Kjeldoran Outpost", 23952, Rarity.RARE, mage.cards.k.KjeldoranOutpost.class, RETRO_ART_USE_VARIOUS));
@@ -1891,7 +1887,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Nymris, Oona's Trickster", 86342, Rarity.RARE, mage.cards.n.NymrisOonasTrickster.class));
cards.add(new SetCardInfo("Nyx Lotus", 79917, Rarity.RARE, mage.cards.n.NyxLotus.class));
cards.add(new SetCardInfo("Nyxbloom Ancient", 79965, Rarity.MYTHIC, mage.cards.n.NyxbloomAncient.class));
- cards.add(new SetCardInfo("O-Kagachi Made Manifest", 98101, Rarity.MYTHIC, mage.cards.o.OKagachiMadeManifest.class));
cards.add(new SetCardInfo("Oakhame Ranger", 78738, Rarity.UNCOMMON, mage.cards.o.OakhameRanger.class));
cards.add(new SetCardInfo("Oath of Druids", 36092, Rarity.RARE, mage.cards.o.OathOfDruids.class, RETRO_ART));
cards.add(new SetCardInfo("Ob Nixilis Reignited", 62509, Rarity.MYTHIC, mage.cards.o.ObNixilisReignited.class));
diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
index 5ecd2b35156..dcbc79570b2 100644
--- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
+++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java
@@ -83,7 +83,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Breach the Multiverse", 358, Rarity.RARE, mage.cards.b.BreachTheMultiverse.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Breach the Multiverse", 94, Rarity.RARE, mage.cards.b.BreachTheMultiverse.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Burning Sun's Fury", 133, Rarity.COMMON, mage.cards.b.BurningSunsFury.class));
- cards.add(new SetCardInfo("Burnished Dunestomper", 43, Rarity.COMMON, mage.cards.b.BurnishedDunestomper.class));
cards.add(new SetCardInfo("Captive Weird", 49, Rarity.UNCOMMON, mage.cards.c.CaptiveWeird.class));
cards.add(new SetCardInfo("Chandra, Hope's Beacon", 134, Rarity.MYTHIC, mage.cards.c.ChandraHopesBeacon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Chandra, Hope's Beacon", 321, Rarity.MYTHIC, mage.cards.c.ChandraHopesBeacon.class, NON_FULL_USE_VARIOUS));
diff --git a/Mage.Sets/src/mage/sets/SecretLairDrop.java b/Mage.Sets/src/mage/sets/SecretLairDrop.java
index 8ddc45650b0..ef42c67d20f 100644
--- a/Mage.Sets/src/mage/sets/SecretLairDrop.java
+++ b/Mage.Sets/src/mage/sets/SecretLairDrop.java
@@ -1606,7 +1606,6 @@ public class SecretLairDrop extends ExpansionSet {
cards.add(new SetCardInfo("Howl of the Night Pack", 1610, Rarity.RARE, mage.cards.h.HowlOfTheNightPack.class));
cards.add(new SetCardInfo("Second Harvest", 1611, Rarity.RARE, mage.cards.s.SecondHarvest.class));
cards.add(new SetCardInfo("Tovolar, Dire Overlord", 1612, Rarity.RARE, mage.cards.t.TovolarDireOverlord.class));
- cards.add(new SetCardInfo("Tovolar, the Midnight Scourge", 1612, Rarity.RARE, mage.cards.t.TovolarTheMidnightScourge.class));
cards.add(new SetCardInfo("Brash Taunter", 1614, Rarity.RARE, mage.cards.b.BrashTaunter.class));
cards.add(new SetCardInfo("Goblin Chieftain", 1615, Rarity.RARE, mage.cards.g.GoblinChieftain.class));
cards.add(new SetCardInfo("Goblin Ringleader", 1616, Rarity.RARE, mage.cards.g.GoblinRingleader.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
index b1ab94baf3f..e669ecada40 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistrad.java
@@ -53,7 +53,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Autumnal Gloom", 194, Rarity.UNCOMMON, mage.cards.a.AutumnalGloom.class));
cards.add(new SetCardInfo("Avacyn's Judgment", 145, Rarity.RARE, mage.cards.a.AvacynsJudgment.class));
cards.add(new SetCardInfo("Avacynian Missionaries", 6, Rarity.UNCOMMON, mage.cards.a.AvacynianMissionaries.class));
- cards.add(new SetCardInfo("Awoken Horror", 92, Rarity.RARE, mage.cards.a.AwokenHorror.class));
cards.add(new SetCardInfo("Behind the Scenes", 100, Rarity.UNCOMMON, mage.cards.b.BehindTheScenes.class));
cards.add(new SetCardInfo("Behold the Beyond", 101, Rarity.MYTHIC, mage.cards.b.BeholdTheBeyond.class));
cards.add(new SetCardInfo("Biting Rain", 102, Rarity.UNCOMMON, mage.cards.b.BitingRain.class));
@@ -162,7 +161,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Howlpack Wolf", 164, Rarity.COMMON, mage.cards.h.HowlpackWolf.class));
cards.add(new SetCardInfo("Hulking Devil", 165, Rarity.COMMON, mage.cards.h.HulkingDevil.class));
cards.add(new SetCardInfo("Humble the Brute", 23, Rarity.UNCOMMON, mage.cards.h.HumbleTheBrute.class));
- cards.add(new SetCardInfo("Incited Rabble", 46, Rarity.UNCOMMON, mage.cards.i.IncitedRabble.class));
cards.add(new SetCardInfo("Incorrigible Youths", 166, Rarity.UNCOMMON, mage.cards.i.IncorrigibleYouths.class));
cards.add(new SetCardInfo("Indulgent Aristocrat", 118, Rarity.UNCOMMON, mage.cards.i.IndulgentAristocrat.class));
cards.add(new SetCardInfo("Inexorable Blob", 212, Rarity.RARE, mage.cards.i.InexorableBlob.class));
@@ -286,7 +284,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Stitchwing Skaab", 90, Rarity.UNCOMMON, mage.cards.s.StitchwingSkaab.class));
cards.add(new SetCardInfo("Stoic Builder", 231, Rarity.COMMON, mage.cards.s.StoicBuilder.class));
cards.add(new SetCardInfo("Stone Quarry", 279, Rarity.UNCOMMON, mage.cards.s.StoneQuarry.class));
- cards.add(new SetCardInfo("Stonewing Antagonizer", 266, Rarity.UNCOMMON, mage.cards.s.StonewingAntagonizer.class));
cards.add(new SetCardInfo("Stormrider Spirit", 91, Rarity.COMMON, mage.cards.s.StormriderSpirit.class));
cards.add(new SetCardInfo("Strength of Arms", 40, Rarity.COMMON, mage.cards.s.StrengthOfArms.class));
cards.add(new SetCardInfo("Stromkirk Mentor", 137, Rarity.COMMON, mage.cards.s.StromkirkMentor.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java
index 5b8d000489d..ce30b925824 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistradPromos.java
@@ -31,7 +31,6 @@ public class ShadowsOverInnistradPromos extends ExpansionSet {
cards.add(new SetCardInfo("Arlinn Kord", "243s", Rarity.MYTHIC, mage.cards.a.ArlinnKord.class));
cards.add(new SetCardInfo("Asylum Visitor", "99s", Rarity.RARE, mage.cards.a.AsylumVisitor.class));
cards.add(new SetCardInfo("Avacyn's Judgment", "145s", Rarity.RARE, mage.cards.a.AvacynsJudgment.class));
- cards.add(new SetCardInfo("Awoken Horror", "92s", Rarity.RARE, mage.cards.a.AwokenHorror.class));
cards.add(new SetCardInfo("Behold the Beyond", "101s", Rarity.MYTHIC, mage.cards.b.BeholdTheBeyond.class));
cards.add(new SetCardInfo("Brain in a Jar", "252s", Rarity.RARE, mage.cards.b.BrainInAJar.class));
cards.add(new SetCardInfo("Burn from Within", "148s", Rarity.RARE, mage.cards.b.BurnFromWithin.class));
diff --git a/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java b/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java
index 76f45de065e..b89f2c0e090 100644
--- a/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java
+++ b/Mage.Sets/src/mage/sets/ShadowsOverInnistradRemastered.java
@@ -41,7 +41,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Arlinn Kord", 230, Rarity.MYTHIC, mage.cards.a.ArlinnKord.class));
cards.add(new SetCardInfo("Assembled Alphas", 141, Rarity.RARE, mage.cards.a.AssembledAlphas.class));
cards.add(new SetCardInfo("Avacyn's Judgment", 142, Rarity.RARE, mage.cards.a.AvacynsJudgment.class));
- cards.add(new SetCardInfo("Awoken Horror", 95, Rarity.RARE, mage.cards.a.AwokenHorror.class));
cards.add(new SetCardInfo("Bedlam Reveler", 143, Rarity.RARE, mage.cards.b.BedlamReveler.class));
cards.add(new SetCardInfo("Biting Rain", 99, Rarity.UNCOMMON, mage.cards.b.BitingRain.class));
cards.add(new SetCardInfo("Blessed Alliance", 14, Rarity.UNCOMMON, mage.cards.b.BlessedAlliance.class));
@@ -172,7 +171,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("Humble the Brute", 34, Rarity.UNCOMMON, mage.cards.h.HumbleTheBrute.class));
cards.add(new SetCardInfo("Imprisoned in the Moon", 74, Rarity.COMMON, mage.cards.i.ImprisonedInTheMoon.class));
cards.add(new SetCardInfo("Incendiary Flow", 163, Rarity.COMMON, mage.cards.i.IncendiaryFlow.class));
- cards.add(new SetCardInfo("Incited Rabble", 53, Rarity.UNCOMMON, mage.cards.i.IncitedRabble.class));
cards.add(new SetCardInfo("Indulgent Aristocrat", 118, Rarity.UNCOMMON, mage.cards.i.IndulgentAristocrat.class));
cards.add(new SetCardInfo("Ingenious Skaab", 75, Rarity.COMMON, mage.cards.i.IngeniousSkaab.class));
cards.add(new SetCardInfo("Insatiable Gorgers", 164, Rarity.COMMON, mage.cards.i.InsatiableGorgers.class));
diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java
index fafa25de836..d08d8c01a82 100644
--- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java
+++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java
@@ -62,8 +62,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Another Chance", 90, Rarity.COMMON, mage.cards.a.AnotherChance.class));
cards.add(new SetCardInfo("Armored Kincaller", 174, Rarity.COMMON, mage.cards.a.ArmoredKincaller.class));
cards.add(new SetCardInfo("Attentive Sunscribe", 4, Rarity.COMMON, mage.cards.a.AttentiveSunscribe.class));
- cards.add(new SetCardInfo("Barracks of the Thousand", 357, Rarity.RARE, mage.cards.b.BarracksOfTheThousand.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Barracks of the Thousand", 39, Rarity.RARE, mage.cards.b.BarracksOfTheThousand.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bartolome del Presidio", 224, Rarity.UNCOMMON, mage.cards.b.BartolomeDelPresidio.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bartolome del Presidio", 301, Rarity.UNCOMMON, mage.cards.b.BartolomeDelPresidio.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Bartolome del Presidio", 409, Rarity.UNCOMMON, mage.cards.b.BartolomeDelPresidio.class, NON_FULL_USE_VARIOUS));
@@ -123,7 +121,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Colossadactyl", 180, Rarity.UNCOMMON, mage.cards.c.Colossadactyl.class));
cards.add(new SetCardInfo("Compass Gnome", 250, Rarity.COMMON, mage.cards.c.CompassGnome.class));
cards.add(new SetCardInfo("Confounding Riddle", 50, Rarity.UNCOMMON, mage.cards.c.ConfoundingRiddle.class));
- cards.add(new SetCardInfo("Consuming Sepulcher", 128, Rarity.COMMON, mage.cards.c.ConsumingSepulcher.class));
cards.add(new SetCardInfo("Contested Game Ball", 251, Rarity.UNCOMMON, mage.cards.c.ContestedGameBall.class));
cards.add(new SetCardInfo("Corpses of the Lost", 366, Rarity.RARE, mage.cards.c.CorpsesOfTheLost.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Corpses of the Lost", 98, Rarity.RARE, mage.cards.c.CorpsesOfTheLost.class, NON_FULL_USE_VARIOUS));
@@ -245,8 +242,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Kutzil's Flanker", 355, Rarity.RARE, mage.cards.k.KutzilsFlanker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kutzil, Malamet Exemplar", 232, Rarity.UNCOMMON, mage.cards.k.KutzilMalametExemplar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kutzil, Malamet Exemplar", 304, Rarity.UNCOMMON, mage.cards.k.KutzilMalametExemplar.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Locus of Enlightenment", 362, Rarity.MYTHIC, mage.cards.l.LocusOfEnlightenment.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Locus of Enlightenment", 55, Rarity.MYTHIC, mage.cards.l.LocusOfEnlightenment.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Lodestone Needle", 62, Rarity.UNCOMMON, mage.cards.l.LodestoneNeedle.class));
cards.add(new SetCardInfo("Magmatic Galleon", 157, Rarity.RARE, mage.cards.m.MagmaticGalleon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Magmatic Galleon", 376, Rarity.RARE, mage.cards.m.MagmaticGalleon.class, NON_FULL_USE_VARIOUS));
@@ -274,7 +269,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Mountain", 290, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_UST_VARIOUS));
cards.add(new SetCardInfo("Mountain", 399, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 400, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Mycoid Maze", 217, Rarity.UNCOMMON, mage.cards.m.MycoidMaze.class));
cards.add(new SetCardInfo("Nicanzil, Current Conductor", 236, Rarity.UNCOMMON, mage.cards.n.NicanzilCurrentConductor.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nicanzil, Current Conductor", 306, Rarity.UNCOMMON, mage.cards.n.NicanzilCurrentConductor.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nurturing Bristleback", 203, Rarity.COMMON, mage.cards.n.NurturingBristleback.class));
@@ -412,18 +406,12 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("The Enigma Jewel", 55, Rarity.MYTHIC, mage.cards.t.TheEnigmaJewel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Everflowing Well", 363, Rarity.RARE, mage.cards.t.TheEverflowingWell.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Everflowing Well", 56, Rarity.RARE, mage.cards.t.TheEverflowingWell.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Grim Captain", 266, Rarity.RARE, mage.cards.t.TheGrimCaptain.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Grim Captain", 313, Rarity.RARE, mage.cards.t.TheGrimCaptain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Millennium Calendar", 257, Rarity.MYTHIC, mage.cards.t.TheMillenniumCalendar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Millennium Calendar", 388, Rarity.MYTHIC, mage.cards.t.TheMillenniumCalendar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Mycotyrant", 235, Rarity.MYTHIC, mage.cards.t.TheMycotyrant.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Mycotyrant", 305, Rarity.MYTHIC, mage.cards.t.TheMycotyrant.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Myriad Pools", 363, Rarity.RARE, mage.cards.t.TheMyriadPools.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Myriad Pools", 56, Rarity.RARE, mage.cards.t.TheMyriadPools.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Skullspore Nexus", 212, Rarity.MYTHIC, mage.cards.t.TheSkullsporeNexus.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Skullspore Nexus", 340, Rarity.MYTHIC, mage.cards.t.TheSkullsporeNexus.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Tomb of Aclazotz", 126, Rarity.RARE, mage.cards.t.TheTombOfAclazotz.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Tomb of Aclazotz", 371, Rarity.RARE, mage.cards.t.TheTombOfAclazotz.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thousand Moons Crackshot", 37, Rarity.COMMON, mage.cards.t.ThousandMoonsCrackshot.class));
cards.add(new SetCardInfo("Thousand Moons Infantry", 38, Rarity.COMMON, mage.cards.t.ThousandMoonsInfantry.class));
cards.add(new SetCardInfo("Thousand Moons Smithy", 357, Rarity.RARE, mage.cards.t.ThousandMoonsSmithy.class, NON_FULL_USE_VARIOUS));
@@ -438,8 +426,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Tishana's Tidebinder", 335, Rarity.RARE, mage.cards.t.TishanasTidebinder.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tishana's Tidebinder", 81, Rarity.RARE, mage.cards.t.TishanasTidebinder.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tithing Blade", 128, Rarity.COMMON, mage.cards.t.TithingBlade.class));
- cards.add(new SetCardInfo("Treasure Cove", 267, Rarity.RARE, mage.cards.t.TreasureCove.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("Treasure Cove", 391, Rarity.RARE, mage.cards.t.TreasureCove.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Treasure Map", 267, Rarity.RARE, mage.cards.t.TreasureMap.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Treasure Map", 391, Rarity.RARE, mage.cards.t.TreasureMap.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Triumphant Chomp", 170, Rarity.UNCOMMON, mage.cards.t.TriumphantChomp.class));
diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalanCommander.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalanCommander.java
index 14f9f6d5b44..007c3f2c2a7 100644
--- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalanCommander.java
+++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalanCommander.java
@@ -1,4 +1,3 @@
-
package mage.sets;
import mage.cards.ExpansionSet;
@@ -284,10 +283,8 @@ public final class TheLostCavernsOfIxalanCommander extends ExpansionSet {
cards.add(new SetCardInfo("Terramorphic Expanse", 360, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class));
cards.add(new SetCardInfo("Tetzin, Gnome Champion", 13, Rarity.RARE, mage.cards.t.TetzinGnomeChampion.class));
cards.add(new SetCardInfo("Thassa, God of the Sea", 176, Rarity.MYTHIC, mage.cards.t.ThassaGodOfTheSea.class));
- cards.add(new SetCardInfo("The Golden-Gear Colossus", 13, Rarity.RARE, mage.cards.t.TheGoldenGearColossus.class));
cards.add(new SetCardInfo("The Indomitable", 43, Rarity.RARE, mage.cards.t.TheIndomitable.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Indomitable", 75, Rarity.RARE, mage.cards.t.TheIndomitable.class, NON_FULL_USE_VARIOUS));
- cards.add(new SetCardInfo("The Grim Captain's Locker", 82, Rarity.RARE, mage.cards.t.TheGrimCaptainsLocker.class));
cards.add(new SetCardInfo("Thieving Skydiver", 177, Rarity.RARE, mage.cards.t.ThievingSkydiver.class));
cards.add(new SetCardInfo("Thought Vessel", 118, Rarity.UNCOMMON, mage.cards.t.ThoughtVessel.class));
cards.add(new SetCardInfo("Thriving Bluff", 361, Rarity.COMMON, mage.cards.t.ThrivingBluff.class));
diff --git a/Mage.Sets/src/mage/sets/XLNTreasureChest.java b/Mage.Sets/src/mage/sets/XLNTreasureChest.java
index 1c6259b6f31..817853ecfa6 100644
--- a/Mage.Sets/src/mage/sets/XLNTreasureChest.java
+++ b/Mage.Sets/src/mage/sets/XLNTreasureChest.java
@@ -27,10 +27,8 @@ public class XLNTreasureChest extends ExpansionSet {
cards.add(new SetCardInfo("Legion's Landing", 22, Rarity.RARE, mage.cards.l.LegionsLanding.class));
cards.add(new SetCardInfo("Primal Amulet", 243, Rarity.RARE, mage.cards.p.PrimalAmulet.class));
cards.add(new SetCardInfo("Search for Azcanta", 74, Rarity.RARE, mage.cards.s.SearchForAzcanta.class));
- cards.add(new SetCardInfo("Spires of Orazca", 249, Rarity.RARE, mage.cards.s.SpiresOfOrazca.class));
cards.add(new SetCardInfo("Spitfire Bastion", 173, Rarity.RARE, mage.cards.s.SpitfireBastion.class));
cards.add(new SetCardInfo("Thaumatic Compass", 249, Rarity.RARE, mage.cards.t.ThaumaticCompass.class));
- cards.add(new SetCardInfo("Treasure Cove", 250, Rarity.RARE, mage.cards.t.TreasureCove.class));
cards.add(new SetCardInfo("Treasure Map", 250, Rarity.RARE, mage.cards.t.TreasureMap.class));
cards.add(new SetCardInfo("Vance's Blasting Cannons", 173, Rarity.RARE, mage.cards.v.VancesBlastingCannons.class));
}