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)); }