forked from External/mage
convert transforming "E" cards to single class file
This commit is contained in:
parent
bb69fe2595
commit
9d9896bd4c
44 changed files with 788 additions and 1377 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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}");
|
||||
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.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.ELDER);
|
||||
this.subtype.add(SubType.WIZARD);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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> — 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) {
|
||||
|
|
|
|||
|
|
@ -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 owner’s 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() {
|
||||
|
|
@ -90,13 +116,181 @@ class EyeOfOjerTaqTarget extends TargetCardInGraveyardBattlefieldOrStack {
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue