convert transforming "T" cards to single class file

part of #14099
This commit is contained in:
jmlundeen 2025-12-05 09:49:07 -06:00
parent 7cd68d9620
commit 5b2629f0dc
99 changed files with 1946 additions and 3425 deletions

View file

@ -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:<br>"
+ 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("<br>"));
}
@Override
public AnimusOfNightsReachHint copy() {
return instance;
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<UUID> 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 + ")";
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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. <i>(If a creature with a finality counter on it would die, exile it instead.)</i>";
}
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<MageObjectReference, Map<UUID, Integer>> 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);
}
}

View file

@ -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) {

View file

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

View file

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

View file

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

View file

@ -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) {

View file

@ -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) {

View file

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

View file

@ -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) {

View file

@ -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<MageObject> {
.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;
}
}

View file

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

View file

@ -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) {

View file

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

View file

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

View file

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

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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:<br>"
+ 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("<br>"));
}
@Override
public AnimusOfNightsReachHint copy() {
return instance;
}
}

View file

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

View file

@ -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) {

View file

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

View file

@ -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) {

View file

@ -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<UUID> 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 + ")";
}
}

View file

@ -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) {

View file

@ -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. <i>(If a creature with a finality counter on it would die, exile it instead.)</i>";
}
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<MageObjectReference, Map<UUID, Integer>> 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);
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

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

View file

@ -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) {

View file

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

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

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

View file

@ -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) {

View file

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

View file

@ -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) {

View file

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

View file

@ -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) {

View file

@ -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) {

View file

@ -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) {

View file

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

View file

@ -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) {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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