convert transforming "E" cards to single class file

This commit is contained in:
jmlundeen 2025-11-28 22:34:15 -06:00
parent bb69fe2595
commit 9d9896bd4c
44 changed files with 788 additions and 1377 deletions

View file

@ -1,59 +0,0 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.ControllerLifeCount;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AngelicEnforcer extends CardImpl {
public AngelicEnforcer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ANGEL);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
this.color.setWhite(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// You have hexproof.
this.addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(HexproofAbility.getInstance())));
// Angelic Enforcer's power and toughness are each equal to your life total.
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(
ControllerLifeCount.instance
).setText("{this}'s power and toughness are each equal to your life total")));
// Whenever Angelic Enforcer attacks, double your life total.
this.addAbility(new AttacksTriggeredAbility(new GainLifeEffect(
ControllerLifeCount.instance
).setText("double your life total")));
}
private AngelicEnforcer(final AngelicEnforcer card) {
super(card);
}
@Override
public AngelicEnforcer copy() {
return new AngelicEnforcer(this);
}
}

View file

@ -1,241 +0,0 @@
package mage.cards.a;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.choices.Choice;
import mage.choices.ChoiceCardType;
import mage.constants.*;
import mage.game.ExileZone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.*;
import java.util.stream.Collectors;
import mage.abilities.SpellAbility;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
/**
* @author jeffwadsworth
*/
public class ApexObservatory extends CardImpl {
public ApexObservatory(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, null);
this.nightCard = true;
// Apex Observatory enters the battlefield tapped.
this.addAbility(new EntersBattlefieldTappedAbility());
// As it enters, choose a card type shared among two exiled cards used to craft it.
this.addAbility(new AsEntersBattlefieldAbility(new ChooseCardTypeEffect()));
// The next spell you cast this turn of the chosen type can be cast without paying its mana cost.
this.addAbility(new SimpleActivatedAbility(new ApexObservatoryEffect(), new TapSourceCost()));
}
private ApexObservatory(final ApexObservatory card) {
super(card);
}
@Override
public ApexObservatory copy() {
return new ApexObservatory(this);
}
}
class ChooseCardTypeEffect extends OneShotEffect {
public ChooseCardTypeEffect() {
super(Outcome.Neutral);
staticText = "choose a card type shared among two exiled cards used to craft it.";
}
protected ChooseCardTypeEffect(final ChooseCardTypeEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject mageObject = game.getPermanentEntering(source.getSourceId());
List<CardType> exiledCardsCardType = new ArrayList<>();
if (mageObject == null) {
mageObject = game.getObject(source);
}
if (controller != null && mageObject != null) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent == null) {
return false;
}
// chase the exile zone down...
ExileZone exileZone = game.getState().getExile().getExileZone(CardUtil.getExileZoneId(game, source, game.getState().getZoneChangeCounter(mageObject.getId()) - 1));
if (exileZone == null) {
return false;
}
for (Card card : exileZone.getCards(game)) {
exiledCardsCardType.addAll(card.getCardType(game));
}
Choice cardTypeChoice = new ChoiceCardType();
cardTypeChoice.getChoices().clear();
cardTypeChoice.getChoices().addAll(exiledCardsCardType.stream().map(CardType::toString).collect(Collectors.toList()));
// find only card types that each card shares; some cards have more than 1 card type
Map<String, Integer> cardTypeCounts = new HashMap<>();
for (String cardType : cardTypeChoice.getChoices()) {
cardTypeCounts.put(cardType, 0);
}
for (Card c : exileZone.getCards(game)) {
for (CardType cardType : c.getCardType(game)) {
if (cardTypeCounts.containsKey(cardType.toString())) {
cardTypeCounts.put(cardType.toString(), cardTypeCounts.get(cardType.toString()) + 1);
}
}
}
List<String> sharedCardTypes = new ArrayList<>();
int numExiledCards = exileZone.getCards(game).size();
for (Map.Entry<String, Integer> entry : cardTypeCounts.entrySet()) {
if (entry.getValue() == numExiledCards) {
sharedCardTypes.add(entry.getKey());
}
}
// handle situations like the double-faced instant/land Jwari Disruption // Jwari Ruins
if (sharedCardTypes.isEmpty()) {
game.informPlayers(mageObject.getIdName() + " No exiled cards shared a type in exile, so nothing is done.");
if (mageObject instanceof Permanent) {
((Permanent) mageObject).addInfo("chosen type", CardUtil.addToolTipMarkTags("No exiled cards have the same card type."), game);
}
return false;
}
cardTypeChoice.getChoices().retainAll(sharedCardTypes);
if (controller.choose(Outcome.Benefit, cardTypeChoice, game)) {
if (!game.isSimulation()) {
game.informPlayers(mageObject.getName() + ": " + controller.getLogName() + " has chosen " + cardTypeChoice.getChoice());
}
game.getState().setValue("ApexObservatoryType_" + source.getSourceId().toString(), cardTypeChoice.getChoice());
if (mageObject instanceof Permanent) {
((Permanent) mageObject).addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen card type: " + cardTypeChoice.getChoice()), game);
}
return true;
}
}
return false;
}
@Override
public ChooseCardTypeEffect copy() {
return new ChooseCardTypeEffect(this);
}
}
class ApexObservatoryEffect extends OneShotEffect {
ApexObservatoryEffect() {
super(Outcome.Benefit);
staticText = "The next spell you cast this turn of the chosen type can be cast without paying its mana cost.";
}
private ApexObservatoryEffect(final ApexObservatoryEffect effect) {
super(effect);
}
@Override
public ApexObservatoryEffect copy() {
return new ApexObservatoryEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
String chosenCardType = (String) game.getState().getValue("ApexObservatoryType_" + source.getSourceId().toString());
if (chosenCardType == null) {
return false;
}
game.addEffect(new ApexObservatoryCastWithoutManaEffect(chosenCardType, source.getControllerId()), source);
return true;
}
}
class ApexObservatoryCastWithoutManaEffect extends CostModificationEffectImpl {
private final String chosenCardType;
private final UUID playerId;
private boolean used = false;
ApexObservatoryCastWithoutManaEffect(String chosenCardType, UUID playerId) {
super(Duration.EndOfTurn, Outcome.Benefit, CostModificationType.SET_COST);
this.chosenCardType = chosenCardType;
this.playerId = playerId;
staticText = "The next spell you cast this turn of the chosen type can be cast without paying its mana cost";
}
private ApexObservatoryCastWithoutManaEffect(final ApexObservatoryCastWithoutManaEffect effect) {
super(effect);
this.chosenCardType = effect.chosenCardType;
this.playerId = effect.playerId;
this.used = effect.used;
}
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
// Ask the player if they want to use the effect
Player controller = game.getPlayer(playerId);
if (controller != null) {
MageObject spell = abilityToModify.getSourceObject(game);
if (spell != null && !game.isSimulation()) {
String message = "Cast " + spell.getIdName() + " without paying its mana cost?";
if (controller.chooseUse(Outcome.Benefit, message, source, game)) {
// Set the cost to zero
abilityToModify.getManaCostsToPay().clear();
// Mark as used
used = true;
game.informPlayers(controller.getLogName() + " casts " + spell.getIdName() + " without paying its mana cost.");
return true;
} else {
// Player chose not to use the effect
return false;
}
}
}
return false;
}
@Override
public ApexObservatoryCastWithoutManaEffect copy() {
return new ApexObservatoryCastWithoutManaEffect(this);
}
@Override
public boolean isInactive(Ability source, Game game) {
return used || super.isInactive(source, game);
}
@Override
public boolean applies(Ability ability, Ability source, Game game) {
if (used) {
return false;
}
if (!ability.isControlledBy(playerId)) {
return false;
}
if (!(ability instanceof SpellAbility)) {
return false;
}
MageObject object = game.getObject(ability.getSourceId());
if (object != null && object.getCardType(game).stream()
.anyMatch(cardType -> cardType.toString().equals(chosenCardType))) {
return true;
}
return false;
}
}

View file

@ -1,34 +0,0 @@
package mage.cards.a;
import mage.MageInt;
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 AwokenDemon extends CardImpl {
public AwokenDemon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.DEMON);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.color.setBlack(true);
this.nightCard = true;
}
private AwokenDemon(final AwokenDemon card) {
super(card);
}
@Override
public AwokenDemon copy() {
return new AwokenDemon(this);
}
}

View file

@ -1,45 +1,45 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.LimitedTimesPerTurnActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
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;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EcstaticAwakener extends CardImpl {
public final class EcstaticAwakener extends TransformingDoubleFacedCard {
public EcstaticAwakener(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "{B}",
"Awoken Demon",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "B"
);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
this.secondSideCardClazz = mage.cards.a.AwokenDemon.class;
// Ecstatic Awakener
this.getLeftHalfCard().setPT(1, 1);
// {2}{B}, Sacrifice another creature: Draw a card, then transform Ecstatic Awakener. Activate only once each turn.
this.addAbility(new TransformAbility());
Ability ability = new LimitedTimesPerTurnActivatedAbility(
Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl<>("{2}{B}")
);
ability.addEffect(new TransformSourceEffect().concatBy(", then"));
ability.addCost(new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Awoken Demon
this.getRightHalfCard().setPT(4, 4);
}
private EcstaticAwakener(final EcstaticAwakener card) {

View file

@ -1,19 +1,27 @@
package mage.cards.e;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.permanent.token.EdgarMarkovsCoffinVampireToken;
import mage.players.Player;
import java.util.UUID;
@ -21,28 +29,39 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class EdgarCharmedGroom extends CardImpl {
public final class EdgarCharmedGroom extends TransformingDoubleFacedCard {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.VAMPIRE, "Vampires");
private static final Condition condition = new SourceHasCounterCondition(CounterType.BLOODLINE, 3);
public EdgarCharmedGroom(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.NOBLE}, "{2}{W}{B}",
"Edgar Markov's Coffin",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "WB"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.NOBLE);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.e.EdgarMarkovsCoffin.class;
// Edgar, Charmed Groom
this.getLeftHalfCard().setPT(4, 4);
// Other Vampires you control get +1/+1.
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostControlledEffect(
1, 1, Duration.WhileOnBattlefield, filter, true
)));
// When Edgar, Charmed Groom dies, return it to the battlefield transformed under its owner's control.
this.addAbility(new TransformAbility());
this.addAbility(new DiesSourceTriggeredAbility(new EdgarCharmedGroomEffect()));
this.getLeftHalfCard().addAbility(new DiesSourceTriggeredAbility(new EdgarCharmedGroomEffect()));
// Edgar Markov's Coffin
// At the beginning of your upkeep, create a 1/1 white and black Vampire creature token with lifelink and put a bloodline counter on Edgar Markov's Coffin. Then if there are three or more bloodline counters on it, remove those counters and transform it.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new EdgarMarkovsCoffinVampireToken()));
ability.addEffect(new AddCountersSourceEffect(CounterType.BLOODLINE.createInstance()).concatBy("and"));
ability.addEffect(new ConditionalOneShotEffect(
new RemoveAllCountersSourceEffect(CounterType.BLOODLINE), condition,
"Then if there are three or more bloodline counters on it, remove those counters and transform it"
).addEffect(new TransformSourceEffect()));
this.getRightHalfCard().addAbility(ability);
}
private EdgarCharmedGroom(final EdgarCharmedGroom card) {

View file

@ -1,54 +0,0 @@
package mage.cards.e;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.SourceHasCounterCondition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.RemoveAllCountersSourceEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.game.permanent.token.EdgarMarkovsCoffinVampireToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EdgarMarkovsCoffin extends CardImpl {
private static final Condition condition = new SourceHasCounterCondition(CounterType.BLOODLINE, 3);
public EdgarMarkovsCoffin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.color.setWhite(true);
this.color.setBlack(true);
this.nightCard = true;
// At the beginning of your upkeep, create a 1/1 white and black Vampire creature token with lifelink and put a bloodline counter on Edgar Markov's Coffin. Then if there are three or more bloodline counters on it, remove those counters and transform it.
Ability ability = new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new EdgarMarkovsCoffinVampireToken()));
ability.addEffect(new AddCountersSourceEffect(CounterType.BLOODLINE.createInstance()).concatBy("and"));
ability.addEffect(new ConditionalOneShotEffect(
new RemoveAllCountersSourceEffect(CounterType.BLOODLINE), condition,
"Then if there are three or more bloodline counters on it, remove those counters and transform it"
).addEffect(new TransformSourceEffect()));
this.addAbility(ability);
}
private EdgarMarkovsCoffin(final EdgarMarkovsCoffin card) {
super(card);
}
@Override
public EdgarMarkovsCoffin copy() {
return new EdgarMarkovsCoffin(this);
}
}

View file

@ -1,21 +1,24 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledSpellsEffect;
import mage.abilities.keyword.ConvokeAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.PersistAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.filter.common.FilterNonlandCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AbilityPredicate;
@ -25,7 +28,7 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class EirduCarrierOfDawn extends CardImpl {
public final class EirduCarrierOfDawn extends TransformingDoubleFacedCard {
private static final FilterNonlandCard filter = new FilterNonlandCard("creature spells you cast");
@ -35,29 +38,45 @@ public final class EirduCarrierOfDawn extends CardImpl {
}
public EirduCarrierOfDawn(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELEMENTAL, SubType.GOD}, "{3}{W}{W}",
"Isilu, Carrier of Twilight",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELEMENTAL, SubType.GOD}, "B"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ELEMENTAL);
this.subtype.add(SubType.GOD);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
this.secondSideCardClazz = mage.cards.i.IsiluCarrierOfTwilight.class;
// Eirdu, Carrier of Dawn
this.getLeftHalfCard().setPT(5, 5);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
this.getLeftHalfCard().addAbility(LifelinkAbility.getInstance());
// Creature spells you cast have convoke.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(new ConvokeAbility(), filter)));
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledSpellsEffect(new ConvokeAbility(), filter)));
// At the beginning of your first main phase, you may pay {B}. If you do, transform Eirdu.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfFirstMainTriggeredAbility(
new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{B}"))
));
Ability ability = new BeginningOfFirstMainTriggeredAbility(new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{B}")));
this.getLeftHalfCard().addAbility(ability);
// Isilu, Carrier of Twilight
this.getRightHalfCard().setPT(5, 5);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Lifelink
this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
// Each other nontoken creature you control has persist.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
new PersistAbility(), Duration.WhileControlled,
StaticFilters.FILTER_CONTROLLED_CREATURE_NON_TOKEN, true
).setText("each other nontoken creature you control has persist")));
// At the beginning of your first main phase, you may pay {W}. If you do, transform Isilu.
this.getRightHalfCard().addAbility(new BeginningOfFirstMainTriggeredAbility(new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{W}"))));
}
private EirduCarrierOfDawn(final EirduCarrierOfDawn card) {

View file

@ -1,20 +1,22 @@
package mage.cards.e;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.common.DealsDamageToAPlayerAttachedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostEquippedEffect;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.IntimidateAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import java.util.Optional;
import java.util.UUID;
@ -22,28 +24,43 @@ import java.util.UUID;
/**
* @author BetaSteward
*/
public final class ElbrusTheBindingBlade extends CardImpl {
public final class ElbrusTheBindingBlade extends TransformingDoubleFacedCard {
public ElbrusTheBindingBlade(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{7}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.EQUIPMENT);
this.secondSideCardClazz = mage.cards.w.WithengarUnbound.class;
this.addAbility(new TransformAbility());
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.EQUIPMENT}, "{7}",
"Withengar Unbound",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "B"
);
// Elbrus, the Binding Blade
// Equipped creature gets +1/+0.
this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 0)));
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 0)));
// When equipped creature deals combat damage to a player, unattach Elbrus, the Binding Blade, then transform it.
Ability ability = new DealsDamageToAPlayerAttachedTriggeredAbility(
new ElbrusTheBindingBladeEffect(), "equipped", false
);
ability.addEffect(new TransformSourceEffect(true).concatBy(", then"));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Equip {1}
this.addAbility(new EquipAbility(1, false));
this.getLeftHalfCard().addAbility(new EquipAbility(1, false));
// Withengar Unbound
this.getRightHalfCard().setPT(13, 13);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Intimidate
this.getRightHalfCard().addAbility(IntimidateAbility.getInstance());
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Whenever a player loses the game, put thirteen +1/+1 counters on Withengar Unbound.
this.getRightHalfCard().addAbility(new WithengarUnboundTriggeredAbility());
}
private ElbrusTheBindingBlade(final ElbrusTheBindingBlade card) {
@ -59,7 +76,7 @@ public final class ElbrusTheBindingBlade extends CardImpl {
class ElbrusTheBindingBladeEffect extends OneShotEffect {
ElbrusTheBindingBladeEffect() {
super(Outcome.BecomeCreature);
staticText = "unattach {this}, then transform it";
staticText = "unattach {this}";
}
private ElbrusTheBindingBladeEffect(final ElbrusTheBindingBladeEffect effect) {
@ -77,3 +94,30 @@ class ElbrusTheBindingBladeEffect extends OneShotEffect {
return new ElbrusTheBindingBladeEffect(this);
}
}
class WithengarUnboundTriggeredAbility extends TriggeredAbilityImpl {
WithengarUnboundTriggeredAbility() {
super(Zone.BATTLEFIELD, new mage.abilities.effects.common.counter.AddCountersSourceEffect(CounterType.P1P1.createInstance(13)), false);
setTriggerPhrase("Whenever a player loses the game, ");
}
private WithengarUnboundTriggeredAbility(final WithengarUnboundTriggeredAbility ability) {
super(ability);
}
@Override
public WithengarUnboundTriggeredAbility copy() {
return new WithengarUnboundTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.LOST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return true;
}
}

View file

@ -1,65 +1,104 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.SourceDealsDamageToYouTriggeredAbility;
import mage.abilities.costs.Cost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DestroyAllEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.keyword.IncubateEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EleshNorn extends CardImpl {
public final class EleshNorn extends TransformingDoubleFacedCard {
private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("other creatures");
private static final FilterPermanent argentFilter = new FilterPermanent("other permanents except for artifacts, lands, and Phyrexians");
static {
filter.add(AnotherPredicate.instance);
argentFilter.add(Predicates.not(CardType.ARTIFACT.getPredicate()));
argentFilter.add(Predicates.not(CardType.LAND.getPredicate()));
argentFilter.add(Predicates.not(SubType.PHYREXIAN.getPredicate()));
argentFilter.add(AnotherPredicate.instance);
}
public EleshNorn(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.PRAETOR}, "{2}{W}{W}",
"The Argent Etchings",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "W"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.PRAETOR);
this.power = new MageInt(3);
this.toughness = new MageInt(5);
this.secondSideCardClazz = mage.cards.t.TheArgentEtchings.class;
// Elesh Norn
this.getLeftHalfCard().setPT(3, 5);
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
this.getLeftHalfCard().addAbility(VigilanceAbility.getInstance());
// Whenever a source an opponent controls deals damage to you or a permanent you control, that source's controller loses 2 life unless they pay {1}.
this.addAbility(new SourceDealsDamageToYouTriggeredAbility(new EleshNornEffect(), StaticFilters.FILTER_PERMANENT, false));
this.getLeftHalfCard().addAbility(new SourceDealsDamageToYouTriggeredAbility(new EleshNornEffect(), StaticFilters.FILTER_PERMANENT, false));
// {2}{W}, Sacrifice three other creatures: Exile Elesh Norn, 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<>("{2}{W}")
);
ability.addCost(new SacrificeTargetCost(3, filter));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// The Argent Etchings
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I -- Incubate 2 five times, then transform all Incubator tokens you control.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, new TheArgentEtchingsEffect());
// II -- Creatures you control get +1/+1 and gain double strike until end of turn.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_II,
new BoostControlledEffect(1, 1, Duration.EndOfTurn)
.setText("creatures you control get +1/+1"),
new GainAbilityControlledEffect(
DoubleStrikeAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("and gain double strike until end of turn")
);
// III -- Destroy all other permanents except for artifacts, lands, and Phyrexians. Exile The Argent Etchings, then return it to the battlefield.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_III,
new DestroyAllEffect(argentFilter),
new ExileSourceAndReturnFaceUpEffect()
);
this.getRightHalfCard().addAbility(sagaAbility);
}
private EleshNorn(final EleshNorn card) {
@ -103,3 +142,39 @@ class EleshNornEffect extends OneShotEffect {
return player.loseLife(2, game, source, false) > 0;
}
}
class TheArgentEtchingsEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.INCUBATOR);
static {
filter.add(TokenPredicate.TRUE);
}
TheArgentEtchingsEffect() {
super(Outcome.Benefit);
staticText = "incubate 2 five times, then transform all Incubator tokens you control";
}
private TheArgentEtchingsEffect(final TheArgentEtchingsEffect effect) {
super(effect);
}
@Override
public TheArgentEtchingsEffect copy() {
return new TheArgentEtchingsEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
for (int i = 0; i < 5; i++) {
IncubateEffect.doIncubate(2, game, source);
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(
filter, source.getControllerId(), source, game
)) {
permanent.transform(source, game);
}
return true;
}
}

View file

@ -1,40 +1,66 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
import mage.abilities.effects.common.combat.CantBlockSourceEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.constants.SuperType;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class ElusiveTormentor extends CardImpl {
public final class ElusiveTormentor extends TransformingDoubleFacedCard {
public ElusiveTormentor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.VAMPIRE, SubType.WIZARD}, "{2}{B}{B}",
"Insidious Mist",
new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELEMENTAL}, "U"
);
this.secondSideCardClazz = mage.cards.i.InsidiousMist.class;
// Elusive Tormentor
this.getLeftHalfCard().setPT(4, 4);
// {1}, Discard a card: Transform Elusive Tormentor.
this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new TransformSourceEffect(), new GenericManaCost(1));
ability.addCost(new DiscardCardCost());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Insidious Mist
this.getRightHalfCard().setPT(0, 1);
// Hexproof
this.getRightHalfCard().addAbility(HexproofAbility.getInstance());
// Indestructible
this.getRightHalfCard().addAbility(IndestructibleAbility.getInstance());
// Insidious Mist can't block and can't be blocked.
Ability staticAbility = new SimpleStaticAbility(new CantBlockSourceEffect(Duration.WhileOnBattlefield));
staticAbility.addEffect(new CantBeBlockedSourceEffect().setText("and can't be blocked"));
this.getRightHalfCard().addAbility(staticAbility);
// Whenever Insidious Mist attacks and isn't blocked, you may pay {2}{B}. If you do, transform it.
this.getRightHalfCard().addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new DoIfCostPaid(
new TransformSourceEffect().setText("transform it"), new ManaCostsImpl<>("{2}{B}"), "Pay {2}{B} to transform?"
)));
}
private ElusiveTormentor(final ElusiveTormentor card) {

View file

@ -1,48 +1,66 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.condition.common.MyTurnCondition;
import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.effects.common.replacement.GraveyardFromAnywhereExileReplacementEffect;
import mage.abilities.effects.common.ruleModifying.PlayFromGraveyardControllerEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
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 java.util.UUID;
/**
* @author balazskristof
*/
public final class EmetSelchUnsundered extends CardImpl {
public final class EmetSelchUnsundered extends TransformingDoubleFacedCard {
public EmetSelchUnsundered(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ELDER);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(2);
this.toughness = new MageInt(4);
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDER, SubType.WIZARD}, "{1}{U}{B}",
"Hades, Sorcerer of Eld",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR}, ""
);
this.secondSideCardClazz = mage.cards.h.HadesSorcererOfEld.class;
// Emet-Selch, Unsundered
this.getLeftHalfCard().setPT(2, 4);
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
this.getLeftHalfCard().addAbility(VigilanceAbility.getInstance());
// Whenever Emet-Selch enters or attacks, draw a card, then discard a card.
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new DrawDiscardControllerEffect(1, 1)));
this.getLeftHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new DrawDiscardControllerEffect(1, 1)));
// At the beginning of your upkeep, if there are fourteen or more cards in your graveyard, you may transform Emet-Selch.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(
new TransformSourceEffect(),
true
).withInterveningIf(new CardsInControllerGraveyardCondition(14)));
this.addAbility(new TransformAbility());
).withInterveningIf(new CardsInControllerGraveyardCondition(14))); // assumption: condition counts all cards
// Hades, Sorcerer of Eld
this.getRightHalfCard().setPT(6, 6);
this.getRightHalfCard().getColor().setBlue(true);
this.getRightHalfCard().getColor().setBlack(true);
// Vigilance
this.getRightHalfCard().addAbility(VigilanceAbility.getInstance());
// Echo of the Lost -- During your turn, you may play cards from your graveyard.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new ConditionalAsThoughEffect(
PlayFromGraveyardControllerEffect.playCards(), MyTurnCondition.instance
).setText("during your turn, you may play cards from your graveyard")).withFlavorWord("Echo of the Lost"));
// If a card or token would be put into your graveyard from anywhere, exile it instead.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GraveyardFromAnywhereExileReplacementEffect(true, true)));
}
private EmetSelchUnsundered(final EmetSelchUnsundered card) {

View file

@ -1,20 +1,19 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.common.ControllerLifeCount;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
@ -25,28 +24,48 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class EnduringAngel extends CardImpl {
public final class EnduringAngel extends TransformingDoubleFacedCard {
public EnduringAngel(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}{W}");
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL}, "{2}{W}{W}{W}",
"Angelic Enforcer",
new SuperType[]{}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ANGEL}, "W"
);
this.subtype.add(SubType.ANGEL);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.a.AngelicEnforcer.class;
// Enduring Angel
this.getLeftHalfCard().setPT(3, 3);
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// Double strike
this.addAbility(DoubleStrikeAbility.getInstance());
this.getLeftHalfCard().addAbility(DoubleStrikeAbility.getInstance());
// You have hexproof.
this.addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(HexproofAbility.getInstance())));
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(HexproofAbility.getInstance())));
// If your life total would be reduced to 0 or less, instead transform Enduring Angel and your life total becomes 3. Then if Enduring Angel didn't transform this way, you lose the game.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleStaticAbility(new EnduringAngelEffect()));
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(new EnduringAngelEffect()));
// Angelic Enforcer
this.getRightHalfCard().setPT(0, 0);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// You have hexproof.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(HexproofAbility.getInstance())));
// Angelic Enforcer's power and toughness are each equal to your life total.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(
ControllerLifeCount.instance
).setText("{this}'s power and toughness are each equal to your life total")));
// Whenever Angelic Enforcer attacks, double your life total.
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new GainLifeEffect(
ControllerLifeCount.instance
).setText("double your life total")));
}
private EnduringAngel(final EnduringAngel card) {

View file

@ -4,40 +4,46 @@ import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.keyword.ScryEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FirstStrikeAbility;
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 java.util.UUID;
/**
* @author TheElk801
*/
public final class EraOfEnlightenment extends CardImpl {
public final class EraOfEnlightenment extends TransformingDoubleFacedCard {
public EraOfEnlightenment(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{1}{W}",
"Hand of Enlightenment",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.MONK}, "W"
);
this.subtype.add(SubType.SAGA);
this.secondSideCardClazz = mage.cards.h.HandOfEnlightenment.class;
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// Era of Enlightenment
SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I Scry 2.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new ScryEffect(2));
sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_I, new ScryEffect(2));
// II You gain 2 life.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new GainLifeEffect(2));
sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_II, new GainLifeEffect(2));
// 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.getLeftHalfCard().addAbility(sagaAbility);
this.addAbility(sagaAbility);
// Hand of Enlightenment
this.getRightHalfCard().setPT(2, 2);
// First strike
this.getRightHalfCard().addAbility(FirstStrikeAbility.getInstance());
}
private EraOfEnlightenment(final EraOfEnlightenment card) {

View file

@ -1,21 +1,27 @@
package mage.cards.e;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.condition.common.CastFromGraveyardSourceCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.keyword.SurveilEffect;
import mage.abilities.effects.mana.BasicManaEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.cards.CardsImpl;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
import mage.counters.Counters;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.players.Player;
@ -25,20 +31,48 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class EsperOrigins extends CardImpl {
public final class EsperOrigins extends TransformingDoubleFacedCard {
public EsperOrigins(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{G}");
this.secondSideCardClazz = mage.cards.s.SummonEsperMaduin.class;
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.SORCERY}, new SubType[]{}, "{1}{G}",
"Summon: Esper Maduin",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SAGA, SubType.ELEMENTAL}, "G"
);
// Esper Origins
// Surveil 2. You gain 2 life. If this spell was cast from a graveyard, exile it, then put it onto the battlefield transformed under its owner's control with a finality counter on it.
this.getSpellAbility().addEffect(new SurveilEffect(2, false));
this.getSpellAbility().addEffect(new GainLifeEffect(2));
this.getSpellAbility().addEffect(new EsperOriginsEffect());
this.addAbility(new TransformAbility());
this.getLeftHalfCard().getSpellAbility().addEffect(new SurveilEffect(2, false));
this.getLeftHalfCard().getSpellAbility().addEffect(new GainLifeEffect(2));
this.getLeftHalfCard().getSpellAbility().addEffect(new EsperOriginsEffect());
// Flashback {3}{G}
this.addAbility(new FlashbackAbility(this, new ManaCostsImpl<>("{3}{G}")));
this.getLeftHalfCard().addAbility(new FlashbackAbility(this.getLeftHalfCard(), new ManaCostsImpl<>("{3}{G}")));
// Summon: Esper Maduin
this.getRightHalfCard().setPT(4, 4);
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I -- Reveal the top card of your library. If it's a permanent card, put it into your hand.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, new SummonEsperMaduinEffect());
// II -- Add {G}{G}.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_II, new BasicManaEffect(Mana.GreenMana(2)));
// III -- Other creatures you control get +2/+2 and gain trample until end of turn.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_III,
new BoostControlledEffect(
2, 2, Duration.EndOfTurn, true
).setText("other creatures you control get +2/+2"),
new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENT_CREATURE, true
).setText("and gain trample until end of turn")
);
this.getRightHalfCard().addAbility(sagaAbility.withShowSacText(true));
}
private EsperOrigins(final EsperOrigins card) {
@ -89,3 +123,37 @@ class EsperOriginsEffect extends OneShotEffect {
return true;
}
}
class SummonEsperMaduinEffect extends OneShotEffect {
SummonEsperMaduinEffect() {
super(Outcome.Benefit);
staticText = "reveal the top card of your library. If it's a permanent card, put it into your hand";
}
private SummonEsperMaduinEffect(final SummonEsperMaduinEffect effect) {
super(effect);
}
@Override
public SummonEsperMaduinEffect copy() {
return new SummonEsperMaduinEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Card card = player.getLibrary().getFromTop(game);
if (card == null) {
return false;
}
player.revealCards(source, new CardsImpl(card), game);
if (card.isPermanent(game)) {
player.moveCards(card, Zone.HAND, source, game);
}
return true;
}
}

View file

@ -1,16 +1,17 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.*;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
@ -21,27 +22,40 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class EtaliPrimalConqueror extends CardImpl {
public final class EtaliPrimalConqueror extends TransformingDoubleFacedCard {
public EtaliPrimalConqueror(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDER, SubType.DINOSAUR}, "{5}{R}{R}",
"Etali, Primal Sickness",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.ELDER, SubType.DINOSAUR}, "RG"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ELDER);
this.subtype.add(SubType.DINOSAUR);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
this.secondSideCardClazz = mage.cards.e.EtaliPrimalSickness.class;
// Etali, Primal Conqueror
this.getLeftHalfCard().setPT(7, 7);
// Trample
this.addAbility(TrampleAbility.getInstance());
this.getLeftHalfCard().addAbility(TrampleAbility.getInstance());
// When Etali, Primal Conqueror enters the battlefield, each player exiles cards from the top of their library until they exile a nonland card. You may cast any number of spells from among the nonland cards exiled this way without paying their mana costs.
this.addAbility(new EntersBattlefieldTriggeredAbility(new EtaliPrimalConquerorEffect()));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new EtaliPrimalConquerorEffect()));
// {9}{G/P}: Transform Etali. Activate only as a sorcery.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{9}{G/P}")));
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{9}{G/P}")));
// Etali, Primal Sickness
this.getRightHalfCard().setPT(11, 11);
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Indestructible
this.getRightHalfCard().addAbility(IndestructibleAbility.getInstance());
// Whenever Etali, Primal Sickness deals combat damage to a player, they get that many poison counters.
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new EtaliPrimalSicknessEffect(), false, true
));
}
private EtaliPrimalConqueror(final EtaliPrimalConqueror card) {
@ -97,3 +111,27 @@ class EtaliPrimalConquerorEffect extends OneShotEffect {
return true;
}
}
class EtaliPrimalSicknessEffect extends OneShotEffect {
EtaliPrimalSicknessEffect() {
super(Outcome.Benefit);
staticText = "they get that many poison counters";
}
private EtaliPrimalSicknessEffect(final EtaliPrimalSicknessEffect effect) {
super(effect);
}
@Override
public EtaliPrimalSicknessEffect copy() {
return new EtaliPrimalSicknessEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
int damage = (Integer) getValue("damage");
return player != null && player.addCounters(CounterType.POISON.createInstance(damage), source.getControllerId(), source, game);
}
}

View file

@ -1,83 +0,0 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.TrampleAbility;
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.counters.CounterType;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EtaliPrimalSickness extends CardImpl {
public EtaliPrimalSickness(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.ELDER);
this.subtype.add(SubType.DINOSAUR);
this.power = new MageInt(11);
this.toughness = new MageInt(11);
this.color.setRed(true);
this.color.setGreen(true);
this.nightCard = true;
// Trample
this.addAbility(TrampleAbility.getInstance());
// Indestructible
this.addAbility(IndestructibleAbility.getInstance());
// Whenever Etali, Primal Sickness deals combat damage to a player, they get that many poison counters.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new EtaliPrimalSicknessEffect(), false, true
));
}
private EtaliPrimalSickness(final EtaliPrimalSickness card) {
super(card);
}
@Override
public EtaliPrimalSickness copy() {
return new EtaliPrimalSickness(this);
}
}
class EtaliPrimalSicknessEffect extends OneShotEffect {
EtaliPrimalSicknessEffect() {
super(Outcome.Benefit);
staticText = "they get that many poison counters";
}
private EtaliPrimalSicknessEffect(final EtaliPrimalSicknessEffect effect) {
super(effect);
}
@Override
public EtaliPrimalSicknessEffect copy() {
return new EtaliPrimalSicknessEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
int damage = (Integer) getValue("damage");
return player.addCounters(CounterType.POISON.createInstance(damage), source.getControllerId(), source, game);
}
}

View file

@ -1,18 +1,20 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
@ -23,31 +25,40 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class ExdeathVoidWarlock extends CardImpl {
public final class ExdeathVoidWarlock extends TransformingDoubleFacedCard {
private static final Condition condition = new CardsInControllerGraveyardCondition(6, StaticFilters.FILTER_CARD_PERMANENTS);
private static final Hint hint = new ValueHint(
"Permanent cards in your graveyard",
new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_PERMANENT)
);
private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_PERMANENTS);
public ExdeathVoidWarlock(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SPIRIT, SubType.WARLOCK}, "{1}{B}{G}",
"Neo Exdeath, Dimension's End",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.SPIRIT, SubType.AVATAR}, "BG"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SPIRIT);
this.subtype.add(SubType.WARLOCK);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.n.NeoExdeathDimensionsEnd.class;
// Exdeath, Void Warlock
this.getLeftHalfCard().setPT(3, 3);
// When Exdeath enters, you gain 3 life.
this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(3)));
// At the beginning of your end step, if there are six or more permanent cards in your graveyard, transform Exdeath.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(condition).addHint(hint));
// Neo Exdeath, Dimension's End
this.getRightHalfCard().setPT(0, 3);
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Neo Exdeath's power is equal to the number of permanent cards in your graveyard.
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new SetBasePowerSourceEffect(xValue)));
}
private ExdeathVoidWarlock(final ExdeathVoidWarlock card) {

View file

@ -1,67 +0,0 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.game.permanent.token.EldraziHorrorToken;
/**
*
* @author LevelX2
*/
public final class ExtricatorOfFlesh extends CardImpl {
private static final FilterControlledCreaturePermanent filterNonEldrazi = new FilterControlledCreaturePermanent("non-Eldrazi creature");
private static final FilterControlledPermanent filterEldrazi = new FilterControlledPermanent(SubType.ELDRAZI, "Eldrazi");
static {
filterNonEldrazi.add(Predicates.not(SubType.ELDRAZI.getPredicate()));
}
public ExtricatorOfFlesh(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(3);
this.toughness = new MageInt(5);
// this card is the second face of double-faced card
this.nightCard = true;
// Eldrazi you control have vigilance
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, filterEldrazi)));
// {2}, {T}, Sacrifice a non-Eldrazi creature: Create a 3/2 colorless Eldrazi Horror creature token.
Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new EldraziHorrorToken()), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(filterNonEldrazi));
this.addAbility(ability);
}
private ExtricatorOfFlesh(final ExtricatorOfFlesh card) {
super(card);
}
@Override
public ExtricatorOfFlesh copy() {
return new ExtricatorOfFlesh(this);
}
}

View file

@ -1,21 +1,29 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.DeliriumCondition;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.CardTypesInGraveyardCount;
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.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.permanent.token.EldraziHorrorToken;
@ -24,33 +32,49 @@ import java.util.UUID;
/**
* @author LevelX2
*/
public final class ExtricatorOfSin extends CardImpl {
public final class ExtricatorOfSin extends TransformingDoubleFacedCard {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another permanent");
private static final FilterControlledCreaturePermanent filterNonEldrazi = new FilterControlledCreaturePermanent("non-Eldrazi creature");
private static final FilterControlledPermanent filterEldrazi = new FilterControlledPermanent(SubType.ELDRAZI, "Eldrazi");
static {
filter.add(AnotherPredicate.instance);
filterNonEldrazi.add(Predicates.not(SubType.ELDRAZI.getPredicate()));
}
public ExtricatorOfSin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(0);
this.toughness = new MageInt(3);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "{2}{W}",
"Extricator Of Flesh",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.HORROR}, ""
);
this.secondSideCardClazz = mage.cards.e.ExtricatorOfFlesh.class;
// Extricator of Sin
this.getLeftHalfCard().setPT(0, 3);
// When Extricator of Sin enters the battlefield, you may sacrifice another permanent. If you do, create a 3/2 colorless Eldrazi Horror creature token.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(new CreateTokenEffect(new EldraziHorrorToken()),
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(new CreateTokenEffect(new EldraziHorrorToken()),
new SacrificeTargetCost(filter)), false));
// <i>Delirium</i> &mdash; At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, transform Extricator of Sin.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect())
// Delirium At the beginning of your upkeep, if there are four or more card types among cards in your graveyard, transform Extricator of Sin.
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new TransformSourceEffect())
.withInterveningIf(DeliriumCondition.instance)
.setAbilityWord(AbilityWord.DELIRIUM)
.addHint(CardTypesInGraveyardCount.YOU.getHint()));
// Extricator Of Flesh
this.getRightHalfCard().setPT(3, 5);
// Eldrazi you control have vigilance
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, filterEldrazi)));
// {2}, {T}, Sacrifice a non-Eldrazi creature: Create a 3/2 colorless Eldrazi Horror creature token.
Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new EldraziHorrorToken()), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(filterNonEldrazi));
this.getRightHalfCard().addAbility(ability);
}
private ExtricatorOfSin(final ExtricatorOfSin card) {

View file

@ -1,39 +1,69 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TapSourceEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
import mage.abilities.keyword.CraftAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.TargetController;
import mage.cards.TransformingDoubleFacedCard;
import mage.choices.Choice;
import mage.choices.ChoiceCardType;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.ExileZone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCardInGraveyardBattlefieldOrStack;
import mage.util.CardUtil;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* @author jeffwadsworth
*/
public class EyeOfOjerTaq extends CardImpl {
public final class EyeOfOjerTaq extends TransformingDoubleFacedCard {
public EyeOfOjerTaq(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
this.secondSideCardClazz = mage.cards.a.ApexObservatory.class;
super(ownerId, setInfo,
new SuperType[]{}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{3}",
"Apex Observatory",
new SuperType[]{}, new CardType[]{CardType.ARTIFACT}, new SubType[]{}, ""
);
// Eye of Ojer Taq
// {T}: Add one mana of any color.
this.addAbility(new AnyColorManaAbility());
this.getLeftHalfCard().addAbility(new AnyColorManaAbility());
// Craft with two that share a card type {6} ({6}, Exile this artifact, Exile the two from among other permanents you control
// and/or cards from your graveyard: Return this card transformed under its owners control. Craft only as a sorcery.)
this.addAbility(new CraftAbility(
// Craft with two that share a card type {6} ({6}, Exile this artifact, Exile the two 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.getLeftHalfCard().addAbility(new CraftAbility(
"{6}", "two that share a card type", new EyeOfOjerTaqTarget()
));
// Apex Observatory
// This artifact enters tapped. As it enters, choose a card type shared among two exiled cards used to craft it.
EntersBattlefieldEffect entersEffect = new EntersBattlefieldEffect(new TapSourceEffect(true)
.setText("{this} enters tapped"));
entersEffect.addEffect(new ChooseCardTypeEffect()
.concatBy("As it enters,"));
Ability observatoryAbility = new SimpleStaticAbility(entersEffect);
this.getRightHalfCard().addAbility(observatoryAbility);
// The next spell you cast this turn of the chosen type can be cast without paying its mana cost.
this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new ApexObservatoryEffect(), new TapSourceCost()));
}
private EyeOfOjerTaq(final EyeOfOjerTaq card) {
@ -44,20 +74,16 @@ public class EyeOfOjerTaq extends CardImpl {
public EyeOfOjerTaq copy() {
return new EyeOfOjerTaq(this);
}
}
class EyeOfOjerTaqTarget extends TargetCardInGraveyardBattlefieldOrStack {
private static final FilterCard filterCard
= new FilterCard();
private static final FilterControlledPermanent filterPermanent
= new FilterControlledPermanent();
private static final FilterCard filterCard = new FilterCard();
private static final FilterControlledPermanent filterPermanent = new FilterControlledPermanent();
static {
filterCard.add(TargetController.YOU.getOwnerPredicate());
filterPermanent.add(AnotherPredicate.instance);
}
EyeOfOjerTaqTarget() {
@ -81,22 +107,190 @@ class EyeOfOjerTaqTarget extends TargetCardInGraveyardBattlefieldOrStack {
Card cardObject = game.getCard(id);
return cardObject != null
&& this.getTargets()
.stream()
.map(game::getCard)
.noneMatch(c -> sharesCardtype(cardObject, c, game));
.stream()
.map(game::getCard)
.noneMatch(c -> sharesCardtype(cardObject, c, game));
}
public static boolean sharesCardtype(Card card1, Card card2, Game game) {
if (card1.getId().equals(card2.getId())) {
return false;
}
// this should be returned true, but the invert works.
// if you note the code logic issue, please speak up.
for (CardType type : card1.getCardType(game)) {
if (card2.getCardType(game).contains(type)) {
return false;
return false; // see comment in original code
}
}
return true;
}
}
class ChooseCardTypeEffect extends OneShotEffect {
public ChooseCardTypeEffect() {
super(Outcome.Neutral);
staticText = "choose a card type shared among two exiled cards used to craft it.";
}
protected ChooseCardTypeEffect(final ChooseCardTypeEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject mageObject = game.getPermanentEntering(source.getSourceId());
List<CardType> exiledCardsCardType = new ArrayList<>();
if (mageObject == null) {
mageObject = game.getObject(source);
}
if (controller != null && mageObject != null) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent == null) {
return false;
}
ExileZone exileZone = game.getState().getExile().getExileZone(CardUtil.getExileZoneId(game, source, game.getState().getZoneChangeCounter(mageObject.getId()) - 1));
if (exileZone == null) {
return false;
}
for (Card card : exileZone.getCards(game)) {
exiledCardsCardType.addAll(card.getCardType(game));
}
Choice cardTypeChoice = new ChoiceCardType();
cardTypeChoice.getChoices().clear();
cardTypeChoice.getChoices().addAll(exiledCardsCardType.stream().map(CardType::toString).collect(Collectors.toList()));
Map<String, Integer> cardTypeCounts = new HashMap<>();
for (String cardType : cardTypeChoice.getChoices()) {
cardTypeCounts.put(cardType, 0);
}
for (Card c : exileZone.getCards(game)) {
for (CardType cardType : c.getCardType(game)) {
if (cardTypeCounts.containsKey(cardType.toString())) {
cardTypeCounts.put(cardType.toString(), cardTypeCounts.get(cardType.toString()) + 1);
}
}
}
List<String> sharedCardTypes = new ArrayList<>();
int numExiledCards = exileZone.getCards(game).size();
for (Map.Entry<String, Integer> entry : cardTypeCounts.entrySet()) {
if (entry.getValue() == numExiledCards) {
sharedCardTypes.add(entry.getKey());
}
}
if (sharedCardTypes.isEmpty()) {
game.informPlayers(mageObject.getIdName() + " No exiled cards shared a type in exile, so nothing is done.");
if (mageObject instanceof Permanent) {
((Permanent) mageObject).addInfo("chosen type", CardUtil.addToolTipMarkTags("No exiled cards have the same card type."), game);
}
return false;
}
cardTypeChoice.getChoices().retainAll(sharedCardTypes);
if (controller.choose(Outcome.Benefit, cardTypeChoice, game)) {
if (!game.isSimulation()) {
game.informPlayers(mageObject.getName() + ": " + controller.getLogName() + " has chosen " + cardTypeChoice.getChoice());
}
game.getState().setValue("ApexObservatoryType_" + source.getSourceId().toString(), cardTypeChoice.getChoice());
if (mageObject instanceof Permanent) {
((Permanent) mageObject).addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen card type: " + cardTypeChoice.getChoice()), game);
}
return true;
}
}
return false;
}
@Override
public ChooseCardTypeEffect copy() {
return new ChooseCardTypeEffect(this);
}
}
class ApexObservatoryEffect extends OneShotEffect {
ApexObservatoryEffect() {
super(Outcome.Benefit);
staticText = "The next spell you cast this turn of the chosen type can be cast without paying its mana cost.";
}
private ApexObservatoryEffect(final ApexObservatoryEffect effect) {
super(effect);
}
@Override
public ApexObservatoryEffect copy() {
return new ApexObservatoryEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
String chosenCardType = (String) game.getState().getValue("ApexObservatoryType_" + source.getSourceId().toString());
if (chosenCardType == null) {
return false;
}
game.addEffect(new ApexObservatoryCastWithoutManaEffect(chosenCardType, source.getControllerId()), source);
return true;
}
}
class ApexObservatoryCastWithoutManaEffect extends CostModificationEffectImpl {
private final String chosenCardType;
private final UUID playerId;
private boolean used = false;
ApexObservatoryCastWithoutManaEffect(String chosenCardType, UUID playerId) {
super(Duration.EndOfTurn, Outcome.Benefit, CostModificationType.SET_COST);
this.chosenCardType = chosenCardType;
this.playerId = playerId;
staticText = "The next spell you cast this turn of the chosen type can be cast without paying its mana cost";
}
private ApexObservatoryCastWithoutManaEffect(final ApexObservatoryCastWithoutManaEffect effect) {
super(effect);
this.chosenCardType = effect.chosenCardType;
this.playerId = effect.playerId;
this.used = effect.used;
}
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
Player controller = game.getPlayer(playerId);
if (controller != null) {
MageObject spell = abilityToModify.getSourceObject(game);
if (spell != null && !game.isSimulation()) {
String message = "Cast " + spell.getIdName() + " without paying its mana cost?";
if (controller.chooseUse(Outcome.Benefit, message, source, game)) {
abilityToModify.getManaCostsToPay().clear();
used = true;
}
}
}
return true;
}
@Override
public boolean isInactive(Ability source, Game game) {
return used || super.isInactive(source, game);
}
@Override
public boolean applies(Ability ability, Ability source, Game game) {
if (used) {
return false;
}
if (!ability.isControlledBy(playerId)) {
return false;
}
if (!(ability instanceof SpellAbility)) {
return false;
}
MageObject object = game.getObject(ability.getSourceId());
return object != null && object.getCardType(game).stream()
.anyMatch(cardType -> cardType.toString().equals(chosenCardType));
}
@Override
public ApexObservatoryCastWithoutManaEffect copy() {
return new ApexObservatoryCastWithoutManaEffect(this);
}
}

View file

@ -1,55 +0,0 @@
package mage.cards.h;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.MyTurnCondition;
import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.effects.common.replacement.GraveyardFromAnywhereExileReplacementEffect;
import mage.abilities.effects.common.ruleModifying.PlayFromGraveyardControllerEffect;
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 java.util.UUID;
/**
* @author balazskristof
*/
public final class HadesSorcererOfEld extends CardImpl {
public HadesSorcererOfEld(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(6);
this.toughness = new MageInt(6);
this.color.setBlue(true);
this.color.setBlack(true);
this.nightCard = true;
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// Echo of the Lost -- During your turn you may play cards from your graveyard.
this.addAbility(new SimpleStaticAbility(new ConditionalAsThoughEffect(
PlayFromGraveyardControllerEffect.playCards(), MyTurnCondition.instance
).setText("during your turn, you may play cards from your graveyard")).withFlavorWord("Echo of the Lost"));
// If a card or token would be put into your graveyard from anywhere, exile it instead.
this.addAbility(new SimpleStaticAbility(new GraveyardFromAnywhereExileReplacementEffect(true, true)));
}
private HadesSorcererOfEld(final HadesSorcererOfEld card) {
super(card);
}
@Override
public HadesSorcererOfEld copy() {
return new HadesSorcererOfEld(this);
}
}

View file

@ -1,39 +0,0 @@
package mage.cards.h;
import mage.MageInt;
import mage.abilities.keyword.FirstStrikeAbility;
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 HandOfEnlightenment extends CardImpl {
public HandOfEnlightenment(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.MONK);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.color.setWhite(true);
this.nightCard = true;
// First strike
this.addAbility(FirstStrikeAbility.getInstance());
}
private HandOfEnlightenment(final HandOfEnlightenment card) {
super(card);
}
@Override
public HandOfEnlightenment copy() {
return new HandOfEnlightenment(this);
}
}

View file

@ -1,62 +0,0 @@
package mage.cards.i;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
import mage.abilities.effects.common.combat.CantBlockSourceEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class InsidiousMist extends CardImpl {
public InsidiousMist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(0);
this.toughness = new MageInt(1);
this.color.setBlue(true);
this.nightCard = true;
// Hexproof
this.addAbility(HexproofAbility.getInstance());
// Indestructible
this.addAbility(IndestructibleAbility.getInstance());
// Insideous Mist can't block and can't be blocked.
Ability ability = new SimpleStaticAbility(new CantBlockSourceEffect(Duration.WhileOnBattlefield));
ability.addEffect(new CantBeBlockedSourceEffect().setText("and can't be blocked"));
this.addAbility(ability);
// Whenever Insideous Mist attacks and isn't blocked, you may pay {2}{B}. If you do, transform it.
this.addAbility(new TransformAbility());
this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new DoIfCostPaid(new TransformSourceEffect()
.setText("transform it"), new ManaCostsImpl<>("{2}{B}"), "Pay {2}{B} to transform?")));
}
private InsidiousMist(final InsidiousMist card) {
super(card);
}
@Override
public InsidiousMist copy() {
return new InsidiousMist(this);
}
}

View file

@ -1,65 +0,0 @@
package mage.cards.i;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.PersistAbility;
import mage.abilities.triggers.BeginningOfFirstMainTriggeredAbility;
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 IsiluCarrierOfTwilight extends CardImpl {
public IsiluCarrierOfTwilight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ELEMENTAL);
this.subtype.add(SubType.GOD);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
this.color.setBlack(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
// Each other nontoken creature you control has persist.
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
new PersistAbility(), Duration.WhileControlled,
StaticFilters.FILTER_CONTROLLED_CREATURE_NON_TOKEN, true
).setText("each other nontoken creature you control has persist")));
// At the beginning of your first main phase, you may pay {W}. If you do, transform Isilu.
this.addAbility(new BeginningOfFirstMainTriggeredAbility(
new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{W}"))
));
}
private IsiluCarrierOfTwilight(final IsiluCarrierOfTwilight card) {
super(card);
}
@Override
public IsiluCarrierOfTwilight copy() {
return new IsiluCarrierOfTwilight(this);
}
}

View file

@ -1,52 +0,0 @@
package mage.cards.n;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.effects.common.continuous.SetBasePowerSourceEffect;
import mage.abilities.keyword.TrampleAbility;
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 java.util.UUID;
/**
* @author TheElk801
*/
public final class NeoExdeathDimensionsEnd extends CardImpl {
private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_PERMANENTS);
public NeoExdeathDimensionsEnd(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SPIRIT);
this.subtype.add(SubType.AVATAR);
this.power = new MageInt(0);
this.toughness = new MageInt(3);
this.nightCard = true;
this.color.setBlack(true);
this.color.setGreen(true);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Neo Exdeath's power is equal to the number of permanent cards in your graveyard.
this.addAbility(new SimpleStaticAbility(new SetBasePowerSourceEffect(xValue)));
}
private NeoExdeathDimensionsEnd(final NeoExdeathDimensionsEnd card) {
super(card);
}
@Override
public NeoExdeathDimensionsEnd copy() {
return new NeoExdeathDimensionsEnd(this);
}
}

View file

@ -1,103 +0,0 @@
package mage.cards.s;
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.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.mana.BasicManaEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class SummonEsperMaduin extends CardImpl {
public SummonEsperMaduin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.subtype.add(SubType.SAGA);
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.nightCard = true;
this.color.setGreen(true);
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this);
// I -- Reveal the top card of your library. If it's a permanent card, put it into your hand.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new SummonEsperMaduinEffect());
// II -- Add {G}{G}.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new BasicManaEffect(Mana.GreenMana(2)));
// III -- Other creatures you control get +2/+2 and gain trample until end of turn.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_III,
new BoostControlledEffect(
2, 2, Duration.EndOfTurn, true
).setText("other creatures you control get +2/+2"),
new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENT_CREATURE, true
).setText("and gain trample until end of turn")
);
this.addAbility(sagaAbility.withShowSacText(true));
}
private SummonEsperMaduin(final SummonEsperMaduin card) {
super(card);
}
@Override
public SummonEsperMaduin copy() {
return new SummonEsperMaduin(this);
}
}
class SummonEsperMaduinEffect extends OneShotEffect {
SummonEsperMaduinEffect() {
super(Outcome.Benefit);
staticText = "reveal the top card of your library. If it's a permanent card, put it into your hand";
}
private SummonEsperMaduinEffect(final SummonEsperMaduinEffect effect) {
super(effect);
}
@Override
public SummonEsperMaduinEffect copy() {
return new SummonEsperMaduinEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
Card card = player.getLibrary().getFromTop(game);
if (card == null) {
return false;
}
player.revealCards(source, new CardsImpl(card), game);
if (card.isPermanent(game)) {
player.moveCards(card, Zone.HAND, source, game);
}
return true;
}
}

View file

@ -1,118 +0,0 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DestroyAllEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.keyword.IncubateEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
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.filter.predicate.permanent.TokenPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TheArgentEtchings extends CardImpl {
private static final FilterPermanent filter
= new FilterPermanent("other permanents except for artifacts, lands, and Phyrexians");
static {
filter.add(Predicates.not(CardType.ARTIFACT.getPredicate()));
filter.add(Predicates.not(CardType.LAND.getPredicate()));
filter.add(Predicates.not(SubType.PHYREXIAN.getPredicate()));
filter.add(AnotherPredicate.instance);
}
public TheArgentEtchings(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.subtype.add(SubType.SAGA);
this.color.setWhite(true);
this.nightCard = true;
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// I -- Incubate 2 five times, then transform all Incubator tokens you control.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new TheArgentEtchingsEffect());
// II -- Creatures you control get +1/+1 and gain double strike until end of turn.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_II,
new BoostControlledEffect(1, 1, Duration.EndOfTurn)
.setText("creatures you control get +1/+1"),
new GainAbilityControlledEffect(
DoubleStrikeAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_CONTROLLED_CREATURE
).setText("and gain double strike until end of turn")
);
// III -- Destroy all other permanents except for artifacts, lands, and Phyrexians. Exile The Argent Etchings, then return it to the battlefield.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_III,
new DestroyAllEffect(filter),
new ExileSourceAndReturnFaceUpEffect()
);
this.addAbility(sagaAbility);
}
private TheArgentEtchings(final TheArgentEtchings card) {
super(card);
}
@Override
public TheArgentEtchings copy() {
return new TheArgentEtchings(this);
}
}
class TheArgentEtchingsEffect extends OneShotEffect {
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.INCUBATOR);
static {
filter.add(TokenPredicate.TRUE);
}
TheArgentEtchingsEffect() {
super(Outcome.Benefit);
staticText = "incubate 2 five times, then transform all Incubator tokens you control";
}
private TheArgentEtchingsEffect(final TheArgentEtchingsEffect effect) {
super(effect);
}
@Override
public TheArgentEtchingsEffect copy() {
return new TheArgentEtchingsEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
for (int i = 0; i < 5; i++) {
IncubateEffect.doIncubate(2, game, source);
}
for (Permanent permanent : game.getBattlefield().getActivePermanents(
filter, source.getControllerId(), source, game
)) {
permanent.transform(source, game);
}
return true;
}
}

View file

@ -1,81 +0,0 @@
package mage.cards.w;
import mage.MageInt;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.IntimidateAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import java.util.UUID;
/**
* @author BetaSteward
*/
public final class WithengarUnbound extends CardImpl {
public WithengarUnbound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.DEMON);
this.color.setBlack(true);
// this card is the second face of double-faced card
this.nightCard = true;
this.power = new MageInt(13);
this.toughness = new MageInt(13);
this.addAbility(FlyingAbility.getInstance());
this.addAbility(IntimidateAbility.getInstance());
this.addAbility(TrampleAbility.getInstance());
// Whenever a player loses the game, put thirteen +1/+1 counters on Withengar Unbound.
this.addAbility(new WithengarUnboundTriggeredAbility());
}
private WithengarUnbound(final WithengarUnbound card) {
super(card);
}
@Override
public WithengarUnbound copy() {
return new WithengarUnbound(this);
}
}
class WithengarUnboundTriggeredAbility extends TriggeredAbilityImpl {
WithengarUnboundTriggeredAbility() {
super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(13)), false);
setTriggerPhrase("Whenever a player loses the game, ");
}
private WithengarUnboundTriggeredAbility(final WithengarUnboundTriggeredAbility ability) {
super(ability);
}
@Override
public WithengarUnboundTriggeredAbility copy() {
return new WithengarUnboundTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.LOST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return true;
}
}

View file

@ -200,7 +200,6 @@ public final class DarkAscension extends ExpansionSet {
cards.add(new SetCardInfo("Wakedancer", 79, Rarity.UNCOMMON, mage.cards.w.Wakedancer.class));
cards.add(new SetCardInfo("Warden of the Wall", 153, Rarity.UNCOMMON, mage.cards.w.WardenOfTheWall.class));
cards.add(new SetCardInfo("Wild Hunger", 132, Rarity.COMMON, mage.cards.w.WildHunger.class));
cards.add(new SetCardInfo("Withengar Unbound", 147, Rarity.MYTHIC, mage.cards.w.WithengarUnbound.class));
cards.add(new SetCardInfo("Wolfbitten Captive", 133, Rarity.RARE, mage.cards.w.WolfbittenCaptive.class));
cards.add(new SetCardInfo("Wolfhunter's Quiver", 154, Rarity.UNCOMMON, mage.cards.w.WolfhuntersQuiver.class));
cards.add(new SetCardInfo("Wrack with Madness", 107, Rarity.COMMON, mage.cards.w.WrackWithMadness.class));

View file

@ -106,7 +106,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Enlightened Maniac", 58, Rarity.COMMON, mage.cards.e.EnlightenedManiac.class));
cards.add(new SetCardInfo("Erupting Dreadwolf", 142, Rarity.UNCOMMON, mage.cards.e.EruptingDreadwolf.class));
cards.add(new SetCardInfo("Eternal Scourge", 7, Rarity.RARE, mage.cards.e.EternalScourge.class));
cards.add(new SetCardInfo("Extricator of Flesh", 23, Rarity.UNCOMMON, mage.cards.e.ExtricatorOfFlesh.class));
cards.add(new SetCardInfo("Extricator of Sin", 23, Rarity.UNCOMMON, mage.cards.e.ExtricatorOfSin.class));
cards.add(new SetCardInfo("Exultant Cultist", 59, Rarity.COMMON, mage.cards.e.ExultantCultist.class));
cards.add(new SetCardInfo("Faith Unbroken", 24, Rarity.UNCOMMON, mage.cards.f.FaithUnbroken.class));

View file

@ -242,10 +242,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Gran Pulse Ochu", 189, Rarity.COMMON, mage.cards.g.GranPulseOchu.class));
cards.add(new SetCardInfo("Guadosalam, Farplane Gateway", 281, Rarity.COMMON, mage.cards.g.GuadosalamFarplaneGateway.class));
cards.add(new SetCardInfo("Gysahl Greens", 190, Rarity.COMMON, mage.cards.g.GysahlGreens.class));
cards.add(new SetCardInfo("Hades, Sorcerer of Eld", 218, Rarity.MYTHIC, mage.cards.h.HadesSorcererOfEld.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hades, Sorcerer of Eld", 394, Rarity.MYTHIC, mage.cards.h.HadesSorcererOfEld.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hades, Sorcerer of Eld", 483, Rarity.MYTHIC, mage.cards.h.HadesSorcererOfEld.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hades, Sorcerer of Eld", 539, Rarity.MYTHIC, mage.cards.h.HadesSorcererOfEld.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Haste Magic", 140, Rarity.COMMON, mage.cards.h.HasteMagic.class));
cards.add(new SetCardInfo("Hecteyes", 103, Rarity.COMMON, mage.cards.h.Hecteyes.class));
cards.add(new SetCardInfo("Hill Gigas", 141, Rarity.COMMON, mage.cards.h.HillGigas.class));
@ -352,8 +348,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Mountain", 575, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS));
cards.add(new SetCardInfo("Mysidian Elder", 145, Rarity.COMMON, mage.cards.m.MysidianElder.class));
cards.add(new SetCardInfo("Namazu Trader", 107, Rarity.COMMON, mage.cards.n.NamazuTrader.class));
cards.add(new SetCardInfo("Neo Exdeath, Dimension's End", 220, Rarity.UNCOMMON, mage.cards.n.NeoExdeathDimensionsEnd.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Neo Exdeath, Dimension's End", 485, Rarity.UNCOMMON, mage.cards.n.NeoExdeathDimensionsEnd.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nibelheim Aflame", 146, Rarity.MYTHIC, mage.cards.n.NibelheimAflame.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Nibelheim Aflame", 339, Rarity.MYTHIC, mage.cards.n.NibelheimAflame.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ninja's Blades", 108, Rarity.RARE, mage.cards.n.NinjasBlades.class));
@ -503,8 +497,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Summon: Brynhildr", 366, Rarity.RARE, mage.cards.s.SummonBrynhildr.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Choco/Mog", 35, Rarity.COMMON, mage.cards.s.SummonChocoMog.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Choco/Mog", 358, Rarity.COMMON, mage.cards.s.SummonChocoMog.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Esper Maduin", 185, Rarity.RARE, mage.cards.s.SummonEsperMaduin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Esper Maduin", 370, Rarity.RARE, mage.cards.s.SummonEsperMaduin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Esper Ramuh", 161, Rarity.UNCOMMON, mage.cards.s.SummonEsperRamuh.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Esper Ramuh", 367, Rarity.UNCOMMON, mage.cards.s.SummonEsperRamuh.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Summon: Fat Chocobo", 202, Rarity.COMMON, mage.cards.s.SummonFatChocobo.class, NON_FULL_USE_VARIOUS));

View file

@ -29,7 +29,6 @@ public final class FromTheVaultTransform extends ExpansionSet {
cards.add(new SetCardInfo("Chandra, Fire of Kaladesh", 6, Rarity.MYTHIC, mage.cards.c.ChandraFireOfKaladesh.class));
cards.add(new SetCardInfo("Delver of Secrets", 7, Rarity.MYTHIC, mage.cards.d.DelverOfSecrets.class));
cards.add(new SetCardInfo("Elbrus, the Binding Blade", 8, Rarity.MYTHIC, mage.cards.e.ElbrusTheBindingBlade.class));
cards.add(new SetCardInfo("Withengar Unbound", 8, Rarity.MYTHIC, mage.cards.w.WithengarUnbound.class));
cards.add(new SetCardInfo("Garruk Relentless", 9, Rarity.MYTHIC, mage.cards.g.GarrukRelentless.class));
cards.add(new SetCardInfo("Garruk, the Veil-Cursed", 9, Rarity.MYTHIC, mage.cards.g.GarrukTheVeilCursed.class));
cards.add(new SetCardInfo("Gisela, the Broken Blade", 10, Rarity.MYTHIC, mage.cards.g.GiselaTheBrokenBlade.class));

View file

@ -169,9 +169,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Drogskol Infantry", 10, Rarity.COMMON, mage.cards.d.DrogskolInfantry.class));
cards.add(new SetCardInfo("Dying to Serve", 109, Rarity.RARE, mage.cards.d.DyingToServe.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Dying to Serve", 370, Rarity.RARE, mage.cards.d.DyingToServe.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Edgar Markov's Coffin", 236, Rarity.RARE, mage.cards.e.EdgarMarkovsCoffin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Edgar Markov's Coffin", 311, Rarity.RARE, mage.cards.e.EdgarMarkovsCoffin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Edgar Markov's Coffin", 341, Rarity.RARE, mage.cards.e.EdgarMarkovsCoffin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Edgar's Awakening", 110, Rarity.UNCOMMON, mage.cards.e.EdgarsAwakening.class));
cards.add(new SetCardInfo("Edgar, Charmed Groom", 236, Rarity.RARE, mage.cards.e.EdgarCharmedGroom.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Edgar, Charmed Groom", 311, Rarity.RARE, mage.cards.e.EdgarCharmedGroom.class, NON_FULL_USE_VARIOUS));

View file

@ -38,7 +38,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Ancestral Anger", 409, Rarity.COMMON, mage.cards.a.AncestralAnger.class));
cards.add(new SetCardInfo("Ancient Lumberknot", 497, Rarity.UNCOMMON, mage.cards.a.AncientLumberknot.class));
cards.add(new SetCardInfo("Angelfire Ignition", 209, Rarity.RARE, mage.cards.a.AngelfireIgnition.class));
cards.add(new SetCardInfo("Angelic Enforcer", 17, Rarity.MYTHIC, mage.cards.a.AngelicEnforcer.class));
cards.add(new SetCardInfo("Angelic Quartermaster", 269, Rarity.UNCOMMON, mage.cards.a.AngelicQuartermaster.class));
cards.add(new SetCardInfo("Anje, Maid of Dishonor", 498, Rarity.RARE, mage.cards.a.AnjeMaidOfDishonor.class));
cards.add(new SetCardInfo("Apprentice Sharpshooter", 452, Rarity.COMMON, mage.cards.a.ApprenticeSharpshooter.class));
@ -53,7 +52,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Ashmouth Dragon", 159, Rarity.RARE, mage.cards.a.AshmouthDragon.class));
cards.add(new SetCardInfo("Augur of Autumn", 168, Rarity.RARE, mage.cards.a.AugurOfAutumn.class));
cards.add(new SetCardInfo("Avabruck Caretaker", 454, Rarity.MYTHIC, mage.cards.a.AvabruckCaretaker.class));
cards.add(new SetCardInfo("Awoken Demon", 100, Rarity.COMMON, mage.cards.a.AwokenDemon.class));
cards.add(new SetCardInfo("Baithook Angler", 42, Rarity.COMMON, mage.cards.b.BaithookAngler.class));
cards.add(new SetCardInfo("Ballista Watcher", 410, Rarity.UNCOMMON, mage.cards.b.BallistaWatcher.class));
cards.add(new SetCardInfo("Baneblade Scoundrel", 85, Rarity.UNCOMMON, mage.cards.b.BanebladeScoundrel.class));
@ -205,7 +203,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Eaten Alive", 99, Rarity.COMMON, mage.cards.e.EatenAlive.class));
cards.add(new SetCardInfo("Eccentric Farmer", 185, Rarity.COMMON, mage.cards.e.EccentricFarmer.class));
cards.add(new SetCardInfo("Ecstatic Awakener", 100, Rarity.COMMON, mage.cards.e.EcstaticAwakener.class));
cards.add(new SetCardInfo("Edgar Markov's Coffin", 503, Rarity.RARE, mage.cards.e.EdgarMarkovsCoffin.class));
cards.add(new SetCardInfo("Edgar's Awakening", 377, Rarity.UNCOMMON, mage.cards.e.EdgarsAwakening.class));
cards.add(new SetCardInfo("Edgar, Charmed Groom", 503, Rarity.RARE, mage.cards.e.EdgarCharmedGroom.class));
cards.add(new SetCardInfo("Electric Revelation", 135, Rarity.COMMON, mage.cards.e.ElectricRevelation.class));

View file

@ -44,8 +44,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Adeline, Resplendent Cathar", 312, Rarity.RARE, mage.cards.a.AdelineResplendentCathar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Angelfire Ignition", 209, Rarity.RARE, mage.cards.a.AngelfireIgnition.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Angelfire Ignition", 367, Rarity.RARE, mage.cards.a.AngelfireIgnition.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Angelic Enforcer", 17, Rarity.MYTHIC, mage.cards.a.AngelicEnforcer.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Angelic Enforcer", 327, Rarity.MYTHIC, mage.cards.a.AngelicEnforcer.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Arcane Infusion", 210, Rarity.UNCOMMON, mage.cards.a.ArcaneInfusion.class));
cards.add(new SetCardInfo("Archive Haunt", 68, Rarity.UNCOMMON, mage.cards.a.ArchiveHaunt.class));
cards.add(new SetCardInfo("Ardent Elementalist", 128, Rarity.COMMON, mage.cards.a.ArdentElementalist.class));
@ -57,7 +55,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Ashmouth Dragon", 358, Rarity.RARE, mage.cards.a.AshmouthDragon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Augur of Autumn", 168, Rarity.RARE, mage.cards.a.AugurOfAutumn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Augur of Autumn", 360, Rarity.RARE, mage.cards.a.AugurOfAutumn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Awoken Demon", 100, Rarity.COMMON, mage.cards.a.AwokenDemon.class));
cards.add(new SetCardInfo("Baithook Angler", 42, Rarity.COMMON, mage.cards.b.BaithookAngler.class));
cards.add(new SetCardInfo("Baneblade Scoundrel", 289, Rarity.UNCOMMON, mage.cards.b.BanebladeScoundrel.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Baneblade Scoundrel", 85, Rarity.UNCOMMON, mage.cards.b.BanebladeScoundrel.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 Demon", 107, Rarity.COMMON, mage.cards.a.AwokenDemon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Awoken Demon", 462, Rarity.COMMON, mage.cards.a.AwokenDemon.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));

View file

@ -192,7 +192,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Greater Tanuki", 189, Rarity.COMMON, mage.cards.g.GreaterTanuki.class));
cards.add(new SetCardInfo("Guardians of Oboro", 317, Rarity.COMMON, mage.cards.g.GuardiansOfOboro.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Guardians of Oboro", 56, Rarity.COMMON, mage.cards.g.GuardiansOfOboro.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hand of Enlightenment", 11, Rarity.COMMON, mage.cards.h.HandOfEnlightenment.class));
cards.add(new SetCardInfo("Harmonious Emergence", 190, Rarity.COMMON, mage.cards.h.HarmoniousEmergence.class));
cards.add(new SetCardInfo("Heiko Yamazaki, the General", 146, Rarity.UNCOMMON, mage.cards.h.HeikoYamazakiTheGeneral.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Heiko Yamazaki, the General", 321, Rarity.UNCOMMON, mage.cards.h.HeikoYamazakiTheGeneral.class, NON_FULL_USE_VARIOUS));

View file

@ -39,8 +39,6 @@ public final class LorwynEclipsed extends ExpansionSet {
cards.add(new SetCardInfo("Formidable Speaker", 366, Rarity.RARE, mage.cards.f.FormidableSpeaker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hallowed Fountain", 265, Rarity.RARE, mage.cards.h.HallowedFountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hallowed Fountain", 347, Rarity.RARE, mage.cards.h.HallowedFountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Isilu, Carrier of Twilight", 13, Rarity.MYTHIC, mage.cards.i.IsiluCarrierOfTwilight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Isilu, Carrier of Twilight", 286, Rarity.MYTHIC, mage.cards.i.IsiluCarrierOfTwilight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Morningtide's Light", 27, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Morningtide's Light", 301, Rarity.MYTHIC, mage.cards.m.MorningtidesLight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mutable Explorer", 186, Rarity.RARE, mage.cards.m.MutableExplorer.class, NON_FULL_USE_VARIOUS));

View file

@ -100,7 +100,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Angel of Suffering", 99767, Rarity.MYTHIC, mage.cards.a.AngelOfSuffering.class));
cards.add(new SetCardInfo("Angel of the Ruins", 90002, Rarity.RARE, mage.cards.a.AngelOfTheRuins.class));
cards.add(new SetCardInfo("Angelfire Ignition", 94080, Rarity.RARE, mage.cards.a.AngelfireIgnition.class));
cards.add(new SetCardInfo("Angelic Enforcer", 93888, Rarity.MYTHIC, mage.cards.a.AngelicEnforcer.class));
cards.add(new SetCardInfo("Angelic Sleuth", 99921, Rarity.RARE, mage.cards.a.AngelicSleuth.class));
cards.add(new SetCardInfo("Anger of the Gods", 102265, Rarity.RARE, mage.cards.a.AngerOfTheGods.class));
cards.add(new SetCardInfo("Angrath, Captain of Chaos", 72237, Rarity.UNCOMMON, mage.cards.a.AngrathCaptainOfChaos.class, NON_FULL_USE_VARIOUS));
@ -1315,7 +1314,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Inscription of Abundance", 83728, Rarity.RARE, mage.cards.i.InscriptionOfAbundance.class));
cards.add(new SetCardInfo("Inscription of Insight", 83802, Rarity.RARE, mage.cards.i.InscriptionOfInsight.class));
cards.add(new SetCardInfo("Inscription of Ruin", 83798, Rarity.RARE, mage.cards.i.InscriptionOfRuin.class));
cards.add(new SetCardInfo("Insidious Mist", 60472, Rarity.RARE, mage.cards.i.InsidiousMist.class));
cards.add(new SetCardInfo("Inspired Idea", 95307, Rarity.RARE, mage.cards.i.InspiredIdea.class));
cards.add(new SetCardInfo("Inspired Ultimatum", 80899, Rarity.RARE, mage.cards.i.InspiredUltimatum.class));
cards.add(new SetCardInfo("Inspiring Refrain", 90034, Rarity.RARE, mage.cards.i.InspiringRefrain.class));

View file

@ -146,8 +146,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Essence of Orthodoxy", 376, Rarity.RARE, mage.cards.e.EssenceOfOrthodoxy.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Etali, Primal Conqueror", 137, Rarity.RARE, mage.cards.e.EtaliPrimalConqueror.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Etali, Primal Conqueror", 298, Rarity.RARE, mage.cards.e.EtaliPrimalConqueror.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Etali, Primal Sickness", 137, Rarity.RARE, mage.cards.e.EtaliPrimalSickness.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Etali, Primal Sickness", 298, Rarity.RARE, mage.cards.e.EtaliPrimalSickness.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Etched Familiar", 101, Rarity.COMMON, mage.cards.e.EtchedFamiliar.class));
cards.add(new SetCardInfo("Etched Host Doombringer", 102, Rarity.COMMON, mage.cards.e.EtchedHostDoombringer.class));
cards.add(new SetCardInfo("Expedition Lookout", 56, Rarity.COMMON, mage.cards.e.ExpeditionLookout.class));
@ -427,9 +425,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("Terror of Towashi", 378, Rarity.RARE, mage.cards.t.TerrorOfTowashi.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thalia and The Gitrog Monster", 255, Rarity.MYTHIC, mage.cards.t.ThaliaAndTheGitrogMonster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thalia and The Gitrog Monster", 316, Rarity.MYTHIC, mage.cards.t.ThaliaAndTheGitrogMonster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Argent Etchings", 12, Rarity.MYTHIC, mage.cards.t.TheArgentEtchings.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Argent Etchings", 292, Rarity.MYTHIC, mage.cards.t.TheArgentEtchings.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Argent Etchings", 338, Rarity.MYTHIC, mage.cards.t.TheArgentEtchings.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Broken Sky", 241, Rarity.RARE, mage.cards.t.TheBrokenSky.class));
cards.add(new SetCardInfo("The Grand Evolution", 213, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Grand Evolution", 301, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));

View file

@ -142,7 +142,6 @@ public class PioneerMasters extends ExpansionSet {
cards.add(new SetCardInfo("Expedite", 374, Rarity.COMMON, mage.cards.e.Expedite.class));
cards.add(new SetCardInfo("Experiment One", 173, Rarity.UNCOMMON, mage.cards.e.ExperimentOne.class));
cards.add(new SetCardInfo("Exquisite Firecraft", 133, Rarity.RARE, mage.cards.e.ExquisiteFirecraft.class));
cards.add(new SetCardInfo("Extricator of Flesh", 12, Rarity.UNCOMMON, mage.cards.e.ExtricatorOfFlesh.class));
cards.add(new SetCardInfo("Extricator of Sin", 12, Rarity.UNCOMMON, mage.cards.e.ExtricatorOfSin.class));
cards.add(new SetCardInfo("Fall of the Hammer", 134, Rarity.COMMON, mage.cards.f.FallOfTheHammer.class));
cards.add(new SetCardInfo("Fallaji Archaeologist", 55, Rarity.COMMON, mage.cards.f.FallajiArchaeologist.class));

View file

@ -173,7 +173,6 @@ public final class ShadowsOverInnistrad extends ExpansionSet {
cards.add(new SetCardInfo("Inexorable Blob", 212, Rarity.RARE, mage.cards.i.InexorableBlob.class));
cards.add(new SetCardInfo("Inner Struggle", 167, Rarity.UNCOMMON, mage.cards.i.InnerStruggle.class));
cards.add(new SetCardInfo("Inquisitor's Ox", 24, Rarity.COMMON, mage.cards.i.InquisitorsOx.class));
cards.add(new SetCardInfo("Insidious Mist", 108, Rarity.RARE, mage.cards.i.InsidiousMist.class));
cards.add(new SetCardInfo("Insolent Neonate", 168, Rarity.COMMON, mage.cards.i.InsolentNeonate.class));
cards.add(new SetCardInfo("Inspiring Captain", 25, Rarity.COMMON, mage.cards.i.InspiringCaptain.class));
cards.add(new SetCardInfo("Intrepid Provisioner", 213, Rarity.COMMON, mage.cards.i.IntrepidProvisioner.class));

View file

@ -71,8 +71,6 @@ public class ShadowsOverInnistradPromos extends ExpansionSet {
cards.add(new SetCardInfo("Harness the Storm", "163s", Rarity.RARE, mage.cards.h.HarnessTheStorm.class));
cards.add(new SetCardInfo("Incorrigible Youths", 166, Rarity.UNCOMMON, mage.cards.i.IncorrigibleYouths.class));
cards.add(new SetCardInfo("Inexorable Blob", "212s", Rarity.RARE, mage.cards.i.InexorableBlob.class));
cards.add(new SetCardInfo("Insidious Mist", "108s", Rarity.RARE, mage.cards.i.InsidiousMist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Insidious Mist", 108, Rarity.RARE, mage.cards.i.InsidiousMist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Invocation of Saint Traft", "246s", Rarity.RARE, mage.cards.i.InvocationOfSaintTraft.class));
cards.add(new SetCardInfo("Jace, Unraveler of Secrets", "69s", Rarity.MYTHIC, mage.cards.j.JaceUnravelerOfSecrets.class));
cards.add(new SetCardInfo("Markov Dreadknight", "122s", Rarity.RARE, mage.cards.m.MarkovDreadknight.class, NON_FULL_USE_VARIOUS));

View file

@ -31,7 +31,6 @@ public final class TheLostCavernsOfIxalanCommander extends ExpansionSet {
cards.add(new SetCardInfo("Amulet of Vigor", 103, Rarity.RARE, mage.cards.a.AmuletOfVigor.class));
cards.add(new SetCardInfo("Angrath's Marauders", 215, Rarity.RARE, mage.cards.a.AngrathsMarauders.class));
cards.add(new SetCardInfo("Apex Altisaur", 232, Rarity.RARE, mage.cards.a.ApexAltisaur.class));
cards.add(new SetCardInfo("Apex Observatory", 15, Rarity.MYTHIC, mage.cards.a.ApexObservatory.class));
cards.add(new SetCardInfo("Arcane Signet", 104, Rarity.UNCOMMON, mage.cards.a.ArcaneSignet.class));
cards.add(new SetCardInfo("Arch of Orazca", 319, Rarity.RARE, mage.cards.a.ArchOfOrazca.class));
cards.add(new SetCardInfo("Archaeomancer's Map", 101, Rarity.RARE, mage.cards.a.ArchaeomancersMap.class));