convert transforming "J" cards to single class file

part of #14099
This commit is contained in:
jmlundeen 2025-12-01 08:14:25 -06:00
parent ba32691556
commit e0770c8aa5
40 changed files with 763 additions and 1240 deletions

View file

@ -1,51 +0,0 @@
package mage.cards.a;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SuperType;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInYourGraveyard;
/**
*
* @author LevelX2
*/
public final class AtzalCaveOfEternity extends CardImpl {
public AtzalCaveOfEternity(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
this.supertype.add(SuperType.LEGENDARY);
this.nightCard = true;
// <i>(Transforms from Journey to Eternity.)</i>
// {t}: Add one mana of any color.
this.addAbility(new AnyColorManaAbility());
// {3}{B}{G}, {T}: Return target creature card from your graveyard to the battlefield.
Ability ability = new SimpleActivatedAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), new ManaCostsImpl<>("{3}{B}{G}"));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.addAbility(ability);
}
private AtzalCaveOfEternity(final AtzalCaveOfEternity card) {
super(card);
}
@Override
public AtzalCaveOfEternity copy() {
return new AtzalCaveOfEternity(this);
}
}

View file

@ -1,61 +0,0 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.SacrificeOpponentsEffect;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BraskasFinalAeon extends CardImpl {
public BraskasFinalAeon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SAGA);
this.subtype.add(SubType.NIGHTMARE);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
this.nightCard = true;
this.color.setBlack(true);
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this);
// I, II -- Jecht Beam -- Each opponent discards a card and you draw a card.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability -> {
ability.addEffect(new DiscardEachPlayerEffect(TargetController.OPPONENT));
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and you"));
ability.withFlavorWord("Jecht Beam");
});
// III -- Ultimate Jecht Shot -- Each opponent sacrifices two creatures of their choice.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, ability -> {
ability.addEffect(new SacrificeOpponentsEffect(2, StaticFilters.FILTER_PERMANENT_CREATURES));
ability.withFlavorWord("Ultimate Jecht Shot");
});
this.addAbility(sagaAbility.withShowSacText(true));
// Menace
this.addAbility(new MenaceAbility());
}
private BraskasFinalAeon(final BraskasFinalAeon card) {
super(card);
}
@Override
public BraskasFinalAeon copy() {
return new BraskasFinalAeon(this);
}
}

View file

@ -1,202 +0,0 @@
package mage.cards.h;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import mage.MageIdentifier;
import mage.MageObject;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.game.ExileZone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import mage.watchers.Watcher;
/**
*
* @author weirddan455
*/
public final class HaukensInsight extends CardImpl {
public HaukensInsight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.color.setBlue(true);
// Back half of Jacob Hauken, Inspector
this.nightCard = true;
// At the beginning of your upkeep, exile the top card of your library face down. You may look at that card for as long as it remains exiled.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new HaukensInsightExileEffect()));
// Once during each of your turns, you may play a land or cast a spell from among the cards exiled with this permanent without paying its mana cost.
this.addAbility(new SimpleStaticAbility(new HaukensInsightPlayEffect())
.setIdentifier(MageIdentifier.HaukensInsightWatcher),
new HaukensInsightWatcher());
}
private HaukensInsight(final HaukensInsight card) {
super(card);
}
@Override
public HaukensInsight copy() {
return new HaukensInsight(this);
}
}
class HaukensInsightExileEffect extends OneShotEffect {
HaukensInsightExileEffect() {
super(Outcome.Benefit);
staticText = "exile the top card of your library face down. You may look at that card for as long as it remains exiled";
}
private HaukensInsightExileEffect(final HaukensInsightExileEffect effect) {
super(effect);
}
@Override
public HaukensInsightExileEffect copy() {
return new HaukensInsightExileEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = controller.getLibrary().getFromTop(game);
if (card != null) {
UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getStackMomentSourceZCC());
MageObject sourceObject = source.getSourceObject(game);
String exileName = sourceObject == null ? null : sourceObject.getIdName();
card.setFaceDown(true, game);
controller.moveCardsToExile(card, source, game, false, exileId, exileName);
if (game.getState().getZone(card.getId()) == Zone.EXILED) {
card.setFaceDown(true, game);
HaukensInsightLookEffect effect = new HaukensInsightLookEffect(controller.getId());
effect.setTargetPointer(new FixedTarget(card, game));
game.addEffect(effect, source);
return true;
}
}
}
return false;
}
}
class HaukensInsightLookEffect extends AsThoughEffectImpl {
private final UUID authorizedPlayerId;
public HaukensInsightLookEffect(UUID authorizedPlayerId) {
super(AsThoughEffectType.LOOK_AT_FACE_DOWN, Duration.EndOfGame, Outcome.Benefit);
this.authorizedPlayerId = authorizedPlayerId;
}
private HaukensInsightLookEffect(final HaukensInsightLookEffect effect) {
super(effect);
this.authorizedPlayerId = effect.authorizedPlayerId;
}
@Override
public HaukensInsightLookEffect copy() {
return new HaukensInsightLookEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
UUID cardId = getTargetPointer().getFirst(game, source);
if (cardId == null) {
this.discard(); // card is no longer in the origin zone, effect can be discarded
}
return affectedControllerId.equals(authorizedPlayerId)
&& objectId.equals(cardId);
}
}
class HaukensInsightPlayEffect extends AsThoughEffectImpl {
HaukensInsightPlayEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.PlayForFree);
staticText = "Once during each of your turns, you may play a land or cast a spell from among the cards exiled with this permanent without paying its mana cost";
}
private HaukensInsightPlayEffect(final HaukensInsightPlayEffect effect) {
super(effect);
}
@Override
public HaukensInsightPlayEffect copy() {
return new HaukensInsightPlayEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (affectedControllerId.equals(source.getControllerId()) && game.isActivePlayer(source.getControllerId())) {
Player controller = game.getPlayer(source.getControllerId());
HaukensInsightWatcher watcher = game.getState().getWatcher(HaukensInsightWatcher.class);
Permanent sourceObject = game.getPermanent(source.getSourceId());
if (controller != null && watcher != null && sourceObject != null && !watcher.isAbilityUsed(new MageObjectReference(sourceObject, game))) {
UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), game.getState().getZoneChangeCounter(source.getSourceId()));
ExileZone exileZone = game.getExile().getExileZone(exileId);
if (exileZone != null && exileZone.contains(CardUtil.getMainCardId(game, objectId))) {
allowCardToPlayWithoutMana(objectId, source, affectedControllerId, MageIdentifier.HaukensInsightWatcher, game);
return true;
}
}
}
return false;
}
}
class HaukensInsightWatcher extends Watcher {
private final Set<MageObjectReference> usedFrom = new HashSet<>();
public HaukensInsightWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SPELL_CAST || event.getType() == GameEvent.EventType.LAND_PLAYED) {
if (event.hasApprovingIdentifier(MageIdentifier.HaukensInsightWatcher)) {
usedFrom.add(event.getApprovingObject().getApprovingMageObjectReference());
}
}
}
@Override
public void reset() {
super.reset();
usedFrom.clear();
}
public boolean isAbilityUsed(MageObjectReference mor) {
return usedFrom.contains(mor);
}
}

View file

@ -55,9 +55,7 @@ public final class HowlpackPiper extends TransformingDoubleFacedCard {
// Wildsong Howler
this.getRightHalfCard().setPT(4, 4);
// Whenever this creature enters the battlefield or transforms into Wildsong Howler, look at the top six cards of your library.
// You may reveal a creature card from among them and put it into your hand.
// Put the rest on the bottom of your library in a random order.
// Whenever this creature enters the battlefield or transforms into Wildsong Howler, look at the top six cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
this.getRightHalfCard().addAbility(new TransformsOrEntersTriggeredAbility(
new LookLibraryAndPickControllerEffect(6, 1, StaticFilters.FILTER_CARD_CREATURE_A, PutCards.HAND, PutCards.BOTTOM_RANDOM),
false));

View file

@ -3,6 +3,7 @@ package mage.cards.i;
import mage.MageObject;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SiegeAbility;
import mage.abilities.effects.OneShotEffect;
@ -54,7 +55,7 @@ public final class InvasionOfAmonkhet extends TransformingDoubleFacedCard {
this.getRightHalfCard().setPT(4, 4);
// You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types.
this.getRightHalfCard().addAbility(new mage.abilities.common.EntersBattlefieldAbility(new LazotepConvertCopyEffect(), true));
this.getRightHalfCard().addAbility(new EntersBattlefieldAbility(new LazotepConvertCopyEffect(), true));
}
private InvasionOfAmonkhet(final InvasionOfAmonkhet card) {

View file

@ -1,60 +0,0 @@
package mage.cards.j;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.MayCastTargetCardEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
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 mage.game.command.emblems.JaceTelepathUnboundEmblem;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class JaceTelepathUnbound extends CardImpl {
public JaceTelepathUnbound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.JACE);
this.color.setBlue(true);
this.nightCard = true;
this.setStartingLoyalty(5);
// +1: Up to one target creature gets -2/-0 until your next turn.
Ability ability = new LoyaltyAbility(new BoostTargetEffect(
-2, 0, Duration.UntilYourNextTurn
).setText("Up to one target creature gets -2/-0 until your next turn"), 1);
ability.addTarget(new TargetCreaturePermanent(0, 1));
this.addAbility(ability);
// -3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.
ability = new LoyaltyAbility(new MayCastTargetCardEffect(Duration.EndOfTurn, true), -3);
ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD));
this.addAbility(ability);
// 9: You get an emblem with "Whenever you cast a spell, target opponent mills five cards."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new JaceTelepathUnboundEmblem()), -9));
}
private JaceTelepathUnbound(final JaceTelepathUnbound card) {
super(card);
}
@Override
public JaceTelepathUnbound copy() {
return new JaceTelepathUnbound(this);
}
}

View file

@ -1,7 +1,7 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.CardsInControllerGraveyardCondition;
@ -9,39 +9,61 @@ import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.MayCastTargetCardEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.command.emblems.JaceTelepathUnboundEmblem;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class JaceVrynsProdigy extends CardImpl {
public final class JaceVrynsProdigy extends TransformingDoubleFacedCard {
private static final Condition condition = new CardsInControllerGraveyardCondition(5);
public JaceVrynsProdigy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(0);
this.toughness = new MageInt(2);
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WIZARD}, "{1}{U}",
"Jace, Telepath Unbound",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.JACE}, "U");
this.secondSideCardClazz = mage.cards.j.JaceTelepathUnbound.class;
// Jace, Vryn's Prodigy (front)
this.getLeftHalfCard().setPT(0, 2);
// {T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battefield transformed under his owner's control.
this.addAbility(new TransformAbility());
// {T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battlefield transformed under his owner's control.
Ability ability = new SimpleActivatedAbility(
new DrawDiscardControllerEffect(1, 1), new TapSourceCost()
);
ability.addEffect(new ConditionalOneShotEffect(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.HE), condition
));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Jace, Telepath Unbound (back)
this.getRightHalfCard().setStartingLoyalty(5);
// +1: Up to one target creature gets -2/-0 until your next turn.
Ability pwAbility = new LoyaltyAbility(new BoostTargetEffect(
-2, 0, Duration.UntilYourNextTurn
).setText("Up to one target creature gets -2/-0 until your next turn"), 1);
pwAbility.addTarget(new TargetCreaturePermanent(0, 1));
this.getRightHalfCard().addAbility(pwAbility);
// -3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.
pwAbility = new LoyaltyAbility(new MayCastTargetCardEffect(Duration.EndOfTurn, true), -3);
pwAbility.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY_FROM_YOUR_GRAVEYARD));
this.getRightHalfCard().addAbility(pwAbility);
// 9: You get an emblem with "Whenever you cast a spell, target opponent mills five cards." (emblem class unchanged)
this.getRightHalfCard().addAbility(new LoyaltyAbility(new GetEmblemEffect(new JaceTelepathUnboundEmblem()), -9));
}
private JaceVrynsProdigy(final JaceVrynsProdigy card) {

View file

@ -1,49 +1,65 @@
package mage.cards.j;
import java.util.UUID;
import mage.MageInt;
import mage.MageIdentifier;
import mage.MageObject;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.Card;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.game.ExileZone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCardInHand;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import mage.watchers.Watcher;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
/**
*
* @author weirddan455
*/
public final class JacobHaukenInspector extends CardImpl {
public final class JacobHaukenInspector extends TransformingDoubleFacedCard {
public JacobHaukenInspector(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ADVISOR}, "{1}{U}",
"Hauken's Insight",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{}, "U");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ADVISOR);
this.power = new MageInt(0);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.h.HaukensInsight.class;
// Jacob Hauken, Inspector
this.getLeftHalfCard().setPT(0, 2);
// {T}: Draw a card, then exile a card from your hand face down. You may look at that card for as long as it remains exiled. You may pay {4}{U}{U}. If you do, transform Jacob Hauken, Inspector.
this.addAbility(new TransformAbility());
Ability ability = new SimpleActivatedAbility(new JacobHaukenInspectorExileEffect(), new TapSourceCost());
ability.addEffect(new DoIfCostPaid(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{U}{U}")));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Hauken's Insight
// At the beginning of your upkeep, exile the top card of your library face down. You may look at that card for as long as it remains exiled.
this.getRightHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new HaukensInsightExileEffect()));
// Once during each of your turns, you may play a land or cast a spell from among the cards exiled with this permanent without paying its mana cost.
Ability playAbility = new SimpleStaticAbility(new HaukensInsightPlayEffect())
.setIdentifier(MageIdentifier.HaukensInsightWatcher);
playAbility.addWatcher(new HaukensInsightWatcher());
this.getRightHalfCard().addAbility(playAbility);
}
private JacobHaukenInspector(final JacobHaukenInspector card) {
@ -135,3 +151,146 @@ class JacobHaukenInspectorLookEffect extends AsThoughEffectImpl {
&& objectId.equals(cardId);
}
}
class HaukensInsightExileEffect extends OneShotEffect {
HaukensInsightExileEffect() {
super(Outcome.Benefit);
staticText = "exile the top card of your library face down. You may look at that card for as long as it remains exiled";
}
private HaukensInsightExileEffect(final HaukensInsightExileEffect effect) {
super(effect);
}
@Override
public HaukensInsightExileEffect copy() {
return new HaukensInsightExileEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = controller.getLibrary().getFromTop(game);
if (card != null) {
UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getStackMomentSourceZCC());
MageObject sourceObject = source.getSourceObject(game);
String exileName = sourceObject == null ? null : sourceObject.getIdName();
card.setFaceDown(true, game);
controller.moveCardsToExile(card, source, game, false, exileId, exileName);
if (game.getState().getZone(card.getId()) == Zone.EXILED) {
card.setFaceDown(true, game);
HaukensInsightLookEffect effect = new HaukensInsightLookEffect(controller.getId());
effect.setTargetPointer(new FixedTarget(card, game));
game.addEffect(effect, source);
return true;
}
}
}
return false;
}
}
class HaukensInsightLookEffect extends AsThoughEffectImpl {
private final UUID authorizedPlayerId;
public HaukensInsightLookEffect(UUID authorizedPlayerId) {
super(AsThoughEffectType.LOOK_AT_FACE_DOWN, Duration.EndOfGame, Outcome.Benefit);
this.authorizedPlayerId = authorizedPlayerId;
}
private HaukensInsightLookEffect(final HaukensInsightLookEffect effect) {
super(effect);
this.authorizedPlayerId = effect.authorizedPlayerId;
}
@Override
public HaukensInsightLookEffect copy() {
return new HaukensInsightLookEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
UUID cardId = getTargetPointer().getFirst(game, source);
if (cardId == null) {
this.discard(); // card is no longer in the origin zone, effect can be discarded
}
return affectedControllerId.equals(authorizedPlayerId)
&& objectId.equals(cardId);
}
}
class HaukensInsightPlayEffect extends AsThoughEffectImpl {
HaukensInsightPlayEffect() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.WhileOnBattlefield, Outcome.PlayForFree);
staticText = "Once during each of your turns, you may play a land or cast a spell from among the cards exiled with this permanent without paying its mana cost";
}
private HaukensInsightPlayEffect(final HaukensInsightPlayEffect effect) {
super(effect);
}
@Override
public HaukensInsightPlayEffect copy() {
return new HaukensInsightPlayEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (affectedControllerId.equals(source.getControllerId()) && game.isActivePlayer(source.getControllerId())) {
Player controller = game.getPlayer(source.getControllerId());
HaukensInsightWatcher watcher = game.getState().getWatcher(HaukensInsightWatcher.class);
Permanent sourceObject = game.getPermanent(source.getSourceId());
if (controller != null && watcher != null && sourceObject != null && !watcher.isAbilityUsed(new MageObjectReference(sourceObject, game))) {
UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), game.getState().getZoneChangeCounter(source.getSourceId()));
ExileZone exileZone = game.getExile().getExileZone(exileId);
if (exileZone != null && exileZone.contains(CardUtil.getMainCardId(game, objectId))) {
allowCardToPlayWithoutMana(objectId, source, affectedControllerId, MageIdentifier.HaukensInsightWatcher, game);
return true;
}
}
}
return false;
}
}
class HaukensInsightWatcher extends Watcher {
private final Set<MageObjectReference> usedFrom = new HashSet<>();
public HaukensInsightWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
if (event.getType() == GameEvent.EventType.SPELL_CAST || event.getType() == GameEvent.EventType.LAND_PLAYED) {
if (event.hasApprovingIdentifier(MageIdentifier.HaukensInsightWatcher)) {
usedFrom.add(event.getApprovingObject().getApprovingMageObjectReference());
}
}
}
@Override
public void reset() {
super.reset();
usedFrom.clear();
}
public boolean isAbilityUsed(MageObjectReference mor) {
return usedFrom.contains(mor);
}
}

View file

@ -1,36 +1,54 @@
package mage.cards.j;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.counter.DistributeCountersEffect;
import mage.abilities.keyword.CraftAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.ExileZone;
import mage.game.Game;
import mage.target.common.TargetCreaturePermanentAmount;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class JadeSeedstones extends CardImpl {
public final class JadeSeedstones extends TransformingDoubleFacedCard {
public JadeSeedstones(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}{G}");
this.secondSideCardClazz = mage.cards.j.JadeheartAttendant.class;
super(ownerId, setInfo,
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{3}{G}",
"Jadeheart Attendant",
new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GOLEM}, "G");
// Jade Seedstones
// When Jade Seedstones enters the battlefield, distribute three +1/+1 counters among one, two, or three target creatures you control.
Ability ability = new EntersBattlefieldTriggeredAbility(new DistributeCountersEffect());
ability.addTarget(new TargetCreaturePermanentAmount(3, StaticFilters.FILTER_CONTROLLED_CREATURES));
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Craft with creature {5}{G}{G}
this.addAbility(new CraftAbility(
"{5}{G}{G}", "creature", "another creature you control " +
"or a creature card in your graveyard", CardType.CREATURE.getPredicate())
this.getLeftHalfCard().addAbility(new CraftAbility(
"{5}{G}{G}", "creature", "another creature you control or a creature card in your graveyard", CardType.CREATURE.getPredicate())
);
// Jadeheart Attendant
this.getRightHalfCard().setPT(7, 7);
// When Jadeheart Attendant enters the battlefield, you gain life equal to the mana value of the exiled card used to craft it.
this.getRightHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(JadeheartAttendantValue.instance)
.setText("you gain life equal to the mana value of the exiled card used to craft it")));
}
private JadeSeedstones(final JadeSeedstones card) {
@ -42,3 +60,36 @@ public final class JadeSeedstones extends CardImpl {
return new JadeSeedstones(this);
}
}
enum JadeheartAttendantValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(game, sourceAbility, -2));
return exileZone != null
? exileZone
.getCards(game)
.stream()
.mapToInt(MageObject::getManaValue)
.sum()
: 0;
}
@Override
public JadeheartAttendantValue copy() {
return this;
}
@Override
public String getMessage() {
return "";
}
@Override
public String toString() {
return "1";
}
}

View file

@ -1,80 +0,0 @@
package mage.cards.j;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.ExileZone;
import mage.game.Game;
import mage.util.CardUtil;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class JadeheartAttendant extends CardImpl {
public JadeheartAttendant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "");
this.subtype.add(SubType.GOLEM);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
this.nightCard = true;
this.color.setGreen(true);
// When Jadeheart Attendant enters the battlefield, you gain life equal to the mana value of the exiled card used to craft it.
this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(JadeheartAttendantValue.instance)
.setText("you gain life equal to the mana value of the exiled card used to craft it")));
}
private JadeheartAttendant(final JadeheartAttendant card) {
super(card);
}
@Override
public JadeheartAttendant copy() {
return new JadeheartAttendant(this);
}
}
enum JadeheartAttendantValue implements DynamicValue {
instance;
@Override
public int calculate(Game game, Ability sourceAbility, Effect effect) {
ExileZone exileZone = game
.getExile()
.getExileZone(CardUtil.getExileZoneId(game, sourceAbility, -2));
return exileZone != null
? exileZone
.getCards(game)
.stream()
.mapToInt(MageObject::getManaValue)
.sum()
: 0;
}
@Override
public JadeheartAttendantValue copy() {
return this;
}
@Override
public String getMessage() {
return "";
}
@Override
public String toString() {
return "1";
}
}

View file

@ -1,43 +1,64 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.SacrificeOpponentsEffect;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class JechtReluctantGuardian extends CardImpl {
public final class JechtReluctantGuardian extends TransformingDoubleFacedCard {
public JechtReluctantGuardian(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARRIOR}, "{3}{B}",
"Braska's Final Aeon",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SAGA, SubType.NIGHTMARE}, "B");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.b.BraskasFinalAeon.class;
// Jecht, Reluctant Guardian
this.getLeftHalfCard().setPT(4, 3);
// Menace
this.addAbility(new MenaceAbility());
this.getLeftHalfCard().addAbility(new MenaceAbility());
// Whenever Jecht deals combat damage to a player, you may exile it, then return it to the battlefield transformed under its owner's control.
this.addAbility(new TransformAbility());
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
this.getLeftHalfCard().addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED)
.setText("exile it, then return it to the battlefield transformed under its owner's control"), true
));
// Braska's Final Aeon
this.getRightHalfCard().setPT(7, 7);
// (As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I, II -- Jecht Beam -- Each opponent discards a card and you draw a card.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability -> {
ability.addEffect(new DiscardEachPlayerEffect(TargetController.OPPONENT));
ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and you"));
ability.withFlavorWord("Jecht Beam");
});
// III -- Ultimate Jecht Shot -- Each opponent sacrifices two creatures of their choice.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, ability -> {
ability.addEffect(new SacrificeOpponentsEffect(2, StaticFilters.FILTER_PERMANENT_CREATURES));
ability.withFlavorWord("Ultimate Jecht Shot");
});
this.getRightHalfCard().addAbility(sagaAbility.withShowSacText(true));
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility());
}
private JechtReluctantGuardian(final JechtReluctantGuardian card) {

View file

@ -1,24 +1,23 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.*;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
@ -33,35 +32,45 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class JerrenCorruptedBishop extends CardImpl {
public final class JerrenCorruptedBishop extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.HUMAN);
public JerrenCorruptedBishop(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "{2}{B}",
"Ormendahl, the Corrupter",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.DEMON}, "B");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.CLERIC);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
this.secondSideCardClazz = mage.cards.o.OrmendahlTheCorrupter.class;
// Jerren, Corrupted Bishop
this.getLeftHalfCard().setPT(2, 3);
// Whenever Jerren, Corrupted Bishop enters the battlefield or another nontoken Human you control dies, you lose 1 life and create a 1/1 white Human creature token.
this.addAbility(new JerrenCorruptedBishopTriggeredAbility());
this.getLeftHalfCard().addAbility(new JerrenCorruptedBishopTriggeredAbility());
// {2}: Target Human you control gains lifelink until end of turn.
Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(
LifelinkAbility.getInstance(), Duration.EndOfTurn
), new GenericManaCost(2));
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
// At the beginning of your end step, if you have exactly 13 life, you may pay {4}{B}{B}. If you do, transform Jerren.
this.addAbility(new TransformAbility());
this.addAbility(new BeginningOfEndStepTriggeredAbility(TargetController.YOU, new DoIfCostPaid(
this.getLeftHalfCard().addAbility(ability);
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(TargetController.YOU, new DoIfCostPaid(
new TransformSourceEffect(), new ManaCostsImpl<>("{4}{B}{B}")
), false, JerrenCorruptedBishopCondition.instance));
// Ormendahl, the Corrupter
this.getRightHalfCard().setPT(6, 6);
// Flying, Trample, Lifelink
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
// Sacrifice another creature: Draw a card.
this.getRightHalfCard().addAbility(new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1),
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)
));
}
private JerrenCorruptedBishop(final JerrenCorruptedBishop card) {
@ -125,7 +134,6 @@ class JerrenCorruptedBishopTriggeredAbility extends TriggeredAbilityImpl {
&& zEvent.getTarget().isControlledBy(getControllerId())
&& !(zEvent.getTarget() instanceof PermanentToken)
&& zEvent.getTarget().hasSubtype(SubType.HUMAN, game);
default:
return false;
}

View file

@ -1,58 +0,0 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.keyword.AdaptEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LivingMetalAbility;
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 TheElk801
*/
public final class JetfireAirGuardian extends CardImpl {
public JetfireAirGuardian(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.color.setBlue(true);
this.nightCard = true;
// Living metal
this.addAbility(new LivingMetalAbility());
// Flying
this.addAbility(FlyingAbility.getInstance());
// {U}{U}{U}: Convert Jetfire, then adapt 3.
Ability ability = new SimpleActivatedAbility(
new TransformSourceEffect()
.setText("convert {this}"),
new ManaCostsImpl<>("{U}{U}{U}")
);
ability.addEffect(new AdaptEffect(3).concatBy(", then"));
this.addAbility(ability);
}
private JetfireAirGuardian(final JetfireAirGuardian card) {
super(card);
}
@Override
public JetfireAirGuardian copy() {
return new JetfireAirGuardian(this);
}
}

View file

@ -1,18 +1,20 @@
package mage.cards.j;
import mage.MageInt;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.VariableCost;
import mage.abilities.costs.common.RemoveVariableCountersTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.keyword.AdaptEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LivingMetalAbility;
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
@ -30,22 +32,22 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class JetfireIngeniousScientist extends CardImpl {
public final class JetfireIngeniousScientist extends TransformingDoubleFacedCard {
public JetfireIngeniousScientist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}{U}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{4}{U}",
"Jetfire, Air Guardian",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "U");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ROBOT);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.j.JetfireAirGuardian.class;
// Jetfire, Ingenious Scientist
this.getLeftHalfCard().setPT(3, 4);
// More Than Meets the Eye {3}{U}
this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{3}{U}"));
this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{3}{U}"));
// Flying
this.addAbility(FlyingAbility.getInstance());
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
// Remove one or more +1/+1 counters from among artifacts you control: Target player adds that much {C}. This mana can't be spent to cast nonartifact spells. Convert Jetfire.
Ability ability = new SimpleActivatedAbility(
@ -57,7 +59,25 @@ public final class JetfireIngeniousScientist extends CardImpl {
);
ability.addEffect(new TransformSourceEffect().setText("convert {this}"));
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Jetfire, Air Guardian
this.getRightHalfCard().setPT(3, 4);
// Living metal
this.getRightHalfCard().addAbility(new LivingMetalAbility());
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// {U}{U}{U}: Convert Jetfire, then adapt 3.
Ability backAbility = new SimpleActivatedAbility(
new TransformSourceEffect()
.setText("convert {this}"),
new ManaCostsImpl<>("{U}{U}{U}")
);
backAbility.addEffect(new AdaptEffect(3).concatBy(", then"));
this.getRightHalfCard().addAbility(backAbility);
}
private JetfireIngeniousScientist(final JetfireIngeniousScientist card) {

View file

@ -1,61 +1,82 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.effects.common.TapAllEffect;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterLandPermanent;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class JillShivasDominant extends CardImpl {
public final class JillShivasDominant extends TransformingDoubleFacedCard {
private static final FilterPermanent filter = new FilterNonlandPermanent("other target nonland permanent");
private static final FilterPermanent filterFront = new FilterNonlandPermanent("other target nonland permanent");
private static final FilterPermanent filterLandsOpponents = new FilterLandPermanent("lands your opponents control");
static {
filter.add(AnotherPredicate.instance);
filterFront.add(AnotherPredicate.instance);
filterLandsOpponents.add(TargetController.OPPONENT.getControllerPredicate());
}
public JillShivasDominant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.NOBLE, SubType.WARRIOR}, "{2}{U}",
"Shiva, Warden of Ice",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SAGA, SubType.ELEMENTAL}, "U");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.NOBLE);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.secondSideCardClazz = mage.cards.s.ShivaWardenOfIce.class;
// Jill, Shiva's Dominant (front)
this.getLeftHalfCard().setPT(2, 2);
// When Jill enters, return up to one other target nonland permanent to its owner's hand.
Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect());
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
ability.addTarget(new TargetPermanent(0, 1, filterFront));
this.getLeftHalfCard().addAbility(ability);
// {3}{U}{U}, {T}: Exile Jill, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery.
this.addAbility(new TransformAbility());
ability = new ActivateAsSorceryActivatedAbility(
Ability transformAbility = new ActivateAsSorceryActivatedAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED), new ManaCostsImpl<>("{3}{U}{U}")
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);
transformAbility.addCost(new TapSourceCost());
this.getLeftHalfCard().addAbility(transformAbility);
// Shiva, Warden of Ice (back)
this.getRightHalfCard().setPT(4, 5);
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I, II -- Mesmerize -- Target creature can't be blocked this turn.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, sagaChapterAbility -> {
sagaChapterAbility.addEffect(new CantBeBlockedTargetEffect(Duration.EndOfTurn));
sagaChapterAbility.addTarget(new TargetCreaturePermanent());
sagaChapterAbility.withFlavorWord("Mesmerize");
});
// III -- Cold Snap -- Tap all lands your opponents control. Exile Shiva, then return it to the battlefield.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, sagaChapterAbility -> {
sagaChapterAbility.addEffect(new TapAllEffect(filterLandsOpponents));
sagaChapterAbility.addEffect(new ExileSourceAndReturnFaceUpEffect());
sagaChapterAbility.withFlavorWord("Cold Snap");
});
this.getRightHalfCard().addAbility(sagaAbility);
}
private JillShivasDominant(final JillShivasDominant card) {

View file

@ -1,58 +1,92 @@
package mage.cards.j;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.common.CardsInHandCondition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.dynamicvalue.common.CardsInControllerHandCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect;
import mage.abilities.keyword.WardAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.UUID;
public class JinGitaxias extends CardImpl {
public class JinGitaxias extends TransformingDoubleFacedCard {
private static final FilterSpell filter = new FilterSpell("a noncreature spell with mana value 3 or greater");
private static final FilterCreaturePermanent filterNonPhyrexian = new FilterCreaturePermanent("non-Phyrexian creatures");
static {
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
filter.add(new ManaValuePredicate(ComparisonType.MORE_THAN, 2));
filterNonPhyrexian.add(Predicates.not(SubType.PHYREXIAN.getPredicate()));
}
public JinGitaxias(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.addSubType(SubType.PHYREXIAN);
this.addSubType(SubType.PRAETOR);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
this.secondSideCardClazz = mage.cards.t.TheGreatSynthesis.class;
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.PRAETOR}, "{3}{U}{U}",
"The Great Synthesis",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "U");
//Ward {2}
this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false));
// Jin-Gitaxias
this.getLeftHalfCard().setPT(5, 5);
//Whenever you cast a noncreature spell with mana value 3 or greater, draw a card.
this.addAbility(new SpellCastControllerTriggeredAbility(
new DrawCardSourceControllerEffect(1),
filter, false
// Ward {2}
this.getLeftHalfCard().addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false));
// Whenever you cast a noncreature spell with mana value 3 or greater, draw a card.
this.getLeftHalfCard().addAbility(new SpellCastControllerTriggeredAbility(
new DrawCardSourceControllerEffect(1), filter, false
));
//{3}{U}: Exile Jin-Gitaxias, then return it to the battlefield transformed under its owners control. Activate
//only as a sorcery and only if you have seven or more cards in hand.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateIfConditionActivatedAbility(
// {3}{U}: Exile Jin-Gitaxias, then return it to the battlefield transformed under its owners control. Activate only as a sorcery and only if you have seven or more cards in hand.
this.getLeftHalfCard().addAbility(new ActivateIfConditionActivatedAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED),
new ManaCostsImpl<>("{3}{U}"),
new CardsInHandCondition(ComparisonType.MORE_THAN, 6)
).setTiming(TimingRule.SORCERY));
// The Great Synthesis
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I Draw cards equal to the number of cards in your hand. You have no maximum hand size for as long as you control The Great Synthesis.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I,
new DrawCardSourceControllerEffect(CardsInControllerHandCount.ANY)
.setText("draw cards equal to the number of cards in your hand"),
new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.WhileOnBattlefield,
MaximumHandSizeControllerEffect.HandSizeModification.SET)
.setText("you have no maximum hand size for as long as you control {this}"));
// II Return all non-Phyrexian creatures to their owners' hands.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_II, new ReturnToHandFromBattlefieldAllEffect(filterNonPhyrexian));
// III You may cast any number of spells from your hand without paying their mana cost. Exile The Great Synthesis, then return it to the battlefield (front face up).
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_III,
new TheGreatSynthesisCastEffect(),
new ExileSourceAndReturnFaceUpEffect()
);
this.getRightHalfCard().addAbility(sagaAbility);
}
private JinGitaxias(final JinGitaxias card) {
@ -64,3 +98,30 @@ public class JinGitaxias extends CardImpl {
return new JinGitaxias(this);
}
}
class TheGreatSynthesisCastEffect extends OneShotEffect {
public TheGreatSynthesisCastEffect() {
super(Outcome.PlayForFree);
this.staticText = "you may cast any number of spells from your hand without paying their mana costs";
}
private TheGreatSynthesisCastEffect(final TheGreatSynthesisCastEffect effect) {
super(effect);
}
@Override
public TheGreatSynthesisCastEffect copy() {
return new TheGreatSynthesisCastEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
Cards cards = controller.getHand();
CardUtil.castMultipleWithAttributeForFree(controller, source, game, cards, StaticFilters.FILTER_CARD);
return true;
}
}

View file

@ -1,49 +1,82 @@
package mage.cards.j;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DamagePlayersEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.discard.DiscardAndDrawThatManyEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.target.common.TargetCardInYourGraveyard;
import mage.util.CardUtil;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class JoshuaPhoenixsDominant extends CardImpl {
public final class JoshuaPhoenixsDominant extends TransformingDoubleFacedCard {
public JoshuaPhoenixsDominant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.NOBLE, SubType.WIZARD}, "{1}{R}{W}",
"Phoenix, Warden of Fire",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.SAGA, SubType.PHOENIX}, "RW");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.NOBLE);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.p.PhoenixWardenOfFire.class;
// Joshua, Phoenix's Dominant
this.getLeftHalfCard().setPT(3, 4);
// When Joshua enters, discard up to two cards, then draw that many cards.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DiscardAndDrawThatManyEffect(2)));
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new DiscardAndDrawThatManyEffect(2)));
// {3}{R}{W}, {T}: Exile Joshua, 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<>("{3}{R}{W}")
);
ability.addCost(new TapSourceCost());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Phoenix, Warden of Fire
this.getRightHalfCard().setPT(4, 4);
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I, II -- Rising Flames -- Phoenix deals 2 damage to each opponent.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, chapter -> {
chapter.addEffect(new DamagePlayersEffect(2, TargetController.OPPONENT));
chapter.withFlavorWord("Rising Flames");
});
// III -- Flames of Rebirth -- Return any number of target creature cards with total mana value 6 or less from your graveyard to the battlefield. Exile Phoenix, then return it to the battlefield.
sagaAbility.addChapterEffect(this.getRightHalfCard(), SagaChapter.CHAPTER_III, chapter -> {
chapter.addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
chapter.addEffect(new ExileSourceAndReturnFaceUpEffect());
chapter.addTarget(new PhoenixWardenOfFireTarget());
chapter.withFlavorWord("Flames of Rebirth");
});
this.getRightHalfCard().addAbility(sagaAbility);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Lifelink
this.getRightHalfCard().addAbility(LifelinkAbility.getInstance());
}
private JoshuaPhoenixsDominant(final JoshuaPhoenixsDominant card) {
@ -55,3 +88,53 @@ public final class JoshuaPhoenixsDominant extends CardImpl {
return new JoshuaPhoenixsDominant(this);
}
}
class PhoenixWardenOfFireTarget extends TargetCardInYourGraveyard {
private static final FilterCard filterStatic = new FilterCreatureCard(
"creature cards with total mana value 6 or less from your graveyard"
);
PhoenixWardenOfFireTarget() {
super(0, Integer.MAX_VALUE, filterStatic, false);
}
private PhoenixWardenOfFireTarget(final PhoenixWardenOfFireTarget target) {
super(target);
}
@Override
public PhoenixWardenOfFireTarget copy() {
return new PhoenixWardenOfFireTarget(this);
}
@Override
public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) {
return super.canTarget(playerId, id, source, game)
&& CardUtil.checkCanTargetTotalValueLimit(
this.getTargets(), id, MageObject::getManaValue, 6, game
);
}
@Override
public Set<UUID> possibleTargets(UUID sourceControllerId, Ability source, Game game) {
return CardUtil.checkPossibleTargetsTotalValueLimit(
this.getTargets(),
super.possibleTargets(sourceControllerId, source, game),
MageObject::getManaValue, 6, game
);
}
@Override
public String getMessage(Game game) {
// shows selected total
int selectedValue = this
.getTargets()
.stream()
.map(game::getObject)
.filter(Objects::nonNull)
.mapToInt(MageObject::getManaValue)
.sum();
return super.getMessage(game) + " (selected total mana value " + selectedValue + ")";
}
}

View file

@ -3,47 +3,60 @@ package mage.cards.j;
import mage.abilities.Ability;
import mage.abilities.common.DiesAttachedTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
* @author LevelX2
*/
public final class JourneyToEternity extends CardImpl {
public final class JourneyToEternity extends TransformingDoubleFacedCard {
public JourneyToEternity(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}{G}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA}, "{1}{B}{G}",
"Atzal, Cave of Eternity",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.LAND}, new SubType[]{}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.AURA);
this.secondSideCardClazz = mage.cards.a.AtzalCaveOfEternity.class;
// Enchant creature you control
// Journey to Eternity
TargetPermanent auraTarget = new TargetPermanent(StaticFilters.FILTER_PERMANENT_CREATURE_CONTROLLED);
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.addAbility(new EnchantAbility(auraTarget));
this.getLeftHalfCard().getSpellAbility().addTarget(auraTarget);
this.getLeftHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
this.getLeftHalfCard().addAbility(new EnchantAbility(auraTarget));
// When enchanted creature dies, return it to the battlefield under your control, then return Journey to Eternity to the battlefield transformed under your control.
this.addAbility(new TransformAbility());
Ability ability = new DiesAttachedTriggeredAbility(new ReturnToBattlefieldUnderYourControlAttachedEffect("it"), "enchanted creature");
ability.addEffect(new JourneyToEternityReturnTransformedSourceEffect());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// Atzal, Cave of Eternity
// {T}: Add one mana of any color.
this.getRightHalfCard().addAbility(new AnyColorManaAbility());
// {3}{B}{G}, {T}: Return target creature card from your graveyard to the battlefield.
Ability backAbility = new SimpleActivatedAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), new ManaCostsImpl<>("{3}{B}{G}"));
backAbility.addCost(new TapSourceCost());
backAbility.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD));
this.getRightHalfCard().addAbility(backAbility);
}
private JourneyToEternity(final JourneyToEternity card) {

View file

@ -1,51 +1,104 @@
package mage.cards.j;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SagaChapter;
import mage.constants.SubType;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.permanent.ModifiedPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.HumanMonkToken;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class JuganDefendsTheTemple extends CardImpl {
public final class JuganDefendsTheTemple extends TransformingDoubleFacedCard {
private static final FilterPermanent filterModified = new FilterControlledCreaturePermanent();
static {
filterModified.add(ModifiedPredicate.instance);
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filterModified, ComparisonType.MORE_THAN, 4);
private static final Hint hint = new ValueHint("Modified creatures you control", new PermanentsOnBattlefieldCount(filterModified));
public JuganDefendsTheTemple(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
super(ownerId, setInfo,
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "{2}{G}",
"Remnant of the Rising Star",
new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, new SubType[]{SubType.DRAGON, SubType.SPIRIT}, "G");
this.subtype.add(SubType.SAGA);
this.secondSideCardClazz = mage.cards.r.RemnantOfTheRisingStar.class;
// Jugan Defends the Temple
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
SagaAbility sagaAbility = new SagaAbility(this.getLeftHalfCard());
// I Create a 1/1 green Human Monk creature token with "{T}: Add {G}."
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, new CreateTokenEffect(new HumanMonkToken()));
sagaAbility.addChapterEffect(this.getLeftHalfCard(), SagaChapter.CHAPTER_I, new CreateTokenEffect(new HumanMonkToken()));
// II Put a +1/+1 counter on each of up to two target creatures.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
this.getLeftHalfCard(), SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new AddCountersTargetEffect(CounterType.P1P1.createInstance()),
new TargetPermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES)
);
// 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);
// Remnant of the Rising Star
this.getRightHalfCard().setPT(2, 2);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever another creature you control enters, you may pay {X}. When you do, put X +1/+1 counters on that creature.
this.getRightHalfCard().addAbility(new EntersBattlefieldControlledTriggeredAbility(
new RemnantOfTheRisingStarEffect(), StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
));
// As long as you control five or more modified creatures, Remnant of the Rising Star gets +5/+5 and has trample.
Ability staticAbility = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(5, 5, Duration.WhileOnBattlefield),
condition, "as long as you control five or more modified creatures, {this} gets +5/+5"
));
staticAbility.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(TrampleAbility.getInstance()), condition, "and has trample"
));
this.getRightHalfCard().addAbility(staticAbility.addHint(hint));
}
private JuganDefendsTheTemple(final JuganDefendsTheTemple card) {
@ -57,3 +110,45 @@ public final class JuganDefendsTheTemple extends CardImpl {
return new JuganDefendsTheTemple(this);
}
}
class RemnantOfTheRisingStarEffect extends OneShotEffect {
RemnantOfTheRisingStarEffect() {
super(Outcome.Benefit);
staticText = "you may pay {X}. When you do, put X +1/+1 counters on that creature";
}
private RemnantOfTheRisingStarEffect(final RemnantOfTheRisingStarEffect effect) {
super(effect);
}
@Override
public RemnantOfTheRisingStarEffect copy() {
return new RemnantOfTheRisingStarEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
ManaCosts<ManaCost> cost = new ManaCostsImpl<>("{X}");
if (player == null || !player.chooseUse(
Outcome.BoostCreature, "Pay " + cost.getText() + "?", source, game
)) {
return false;
}
int xValue = player.announceX(0, Integer.MAX_VALUE, "Announce the value for {X} (pay to add counters)", game, source, true);
cost.add(new GenericManaCost(xValue));
if (!cost.pay(source, game, source, source.getControllerId(), false, null)) {
return false;
}
Permanent permanent = (Permanent) getValue("permanentEnteringBattlefield");
if (permanent == null) {
return false;
}
game.fireReflexiveTriggeredAbility(new ReflexiveTriggeredAbility(
new AddCountersTargetEffect(CounterType.P1P1.createInstance(xValue))
.setTargetPointer(new FixedTarget(permanent, game)), false
), source);
return true;
}
}

View file

@ -1,59 +0,0 @@
package mage.cards.o;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
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 mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class OrmendahlTheCorrupter extends CardImpl {
public OrmendahlTheCorrupter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.DEMON);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
this.color.setBlack(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Trample
this.addAbility(TrampleAbility.getInstance());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
// Sacrifice another creature: Draw a card.
this.addAbility(new SimpleActivatedAbility(
new DrawCardSourceControllerEffect(1),
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)
));
}
private OrmendahlTheCorrupter(final OrmendahlTheCorrupter card) {
super(card);
}
@Override
public OrmendahlTheCorrupter copy() {
return new OrmendahlTheCorrupter(this);
}
}

View file

@ -1,125 +0,0 @@
package mage.cards.p;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.DamagePlayersEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreatureCard;
import mage.game.Game;
import mage.target.common.TargetCardInYourGraveyard;
import mage.util.CardUtil;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class PhoenixWardenOfFire extends CardImpl {
public PhoenixWardenOfFire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SAGA);
this.subtype.add(SubType.PHOENIX);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.nightCard = true;
this.color.setRed(true);
this.color.setWhite(true);
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// I, II -- Rising Flames -- Phoenix deals 2 damage to each opponent.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability -> {
ability.addEffect(new DamagePlayersEffect(2, TargetController.OPPONENT));
ability.withFlavorWord("Rising Flames");
});
// III -- Flames of Rebirth -- Return any number of target creature cards with total mana value 6 or less from your graveyard to the battlefield. Exile Phoenix, then return it to the battlefield.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, ability -> {
ability.addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
ability.addEffect(new ExileSourceAndReturnFaceUpEffect());
ability.addTarget(new PhoenixWardenOfFireTarget());
ability.withFlavorWord("Flames of Rebirth");
});
this.addAbility(sagaAbility);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
}
private PhoenixWardenOfFire(final PhoenixWardenOfFire card) {
super(card);
}
@Override
public PhoenixWardenOfFire copy() {
return new PhoenixWardenOfFire(this);
}
}
class PhoenixWardenOfFireTarget extends TargetCardInYourGraveyard {
private static final FilterCard filterStatic = new FilterCreatureCard(
"creature cards with total mana value 6 or less from your graveyard"
);
PhoenixWardenOfFireTarget() {
super(0, Integer.MAX_VALUE, filterStatic, false);
}
private PhoenixWardenOfFireTarget(final PhoenixWardenOfFireTarget target) {
super(target);
}
@Override
public PhoenixWardenOfFireTarget copy() {
return new PhoenixWardenOfFireTarget(this);
}
@Override
public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) {
return super.canTarget(playerId, id, source, game)
&& CardUtil.checkCanTargetTotalValueLimit(
this.getTargets(), id, MageObject::getManaValue, 6, game
);
}
@Override
public Set<UUID> possibleTargets(UUID sourceControllerId, Ability source, Game game) {
return CardUtil.checkPossibleTargetsTotalValueLimit(
this.getTargets(),
super.possibleTargets(sourceControllerId, source, game),
MageObject::getManaValue, 6, game
);
}
@Override
public String getMessage(Game game) {
// shows selected total
int selectedValue = this
.getTargets()
.stream()
.map(game::getObject)
.filter(Objects::nonNull)
.mapToInt(MageObject::getManaValue)
.sum();
return super.getMessage(game) + " (selected total mana value " + selectedValue + ")";
}
}

View file

@ -1,134 +0,0 @@
package mage.cards.r;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.permanent.ModifiedPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class RemnantOfTheRisingStar extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent();
static {
filter.add(ModifiedPredicate.instance);
}
private static final Condition condition
= new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.MORE_THAN, 4);
private static final Hint hint
= new ValueHint("Modified creatures you control", new PermanentsOnBattlefieldCount(filter));
public RemnantOfTheRisingStar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.subtype.add(SubType.DRAGON);
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
this.color.setGreen(true);
this.nightCard = true;
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever another creature you control enters, you may pay {X}. When you do, put X +1/+1 counters on that creature.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(
new RemnantOfTheRisingStarEffect(), StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
));
// As long as you control five or more modified creatures, Remnant of the Rising Star gets +5/+5 and has trample.
Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostSourceEffect(5, 5, Duration.WhileOnBattlefield),
condition, "as long as you control five or more modified creatures, {this} gets +5/+5"
));
ability.addEffect(new ConditionalContinuousEffect(
new GainAbilitySourceEffect(TrampleAbility.getInstance()), condition, "and has trample"
));
this.addAbility(ability.addHint(hint));
}
private RemnantOfTheRisingStar(final RemnantOfTheRisingStar card) {
super(card);
}
@Override
public RemnantOfTheRisingStar copy() {
return new RemnantOfTheRisingStar(this);
}
}
class RemnantOfTheRisingStarEffect extends OneShotEffect {
RemnantOfTheRisingStarEffect() {
super(Outcome.Benefit);
staticText = "you may pay {X}. When you do, put X +1/+1 counters on that creature";
}
private RemnantOfTheRisingStarEffect(final RemnantOfTheRisingStarEffect effect) {
super(effect);
}
@Override
public RemnantOfTheRisingStarEffect copy() {
return new RemnantOfTheRisingStarEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
ManaCosts<ManaCost> cost = new ManaCostsImpl<>("{X}");
if (player == null || !player.chooseUse(
Outcome.BoostCreature, "Pay " + cost.getText() + "?", source, game
)) {
return false;
}
int xValue = player.announceX(0, Integer.MAX_VALUE, "Announce the value for {X} (pay to add counters)", game, source, true);
cost.add(new GenericManaCost(xValue));
if (!cost.pay(source, game, source, source.getControllerId(), false, null)) {
return false;
}
Permanent permanent = (Permanent) getValue("permanentEnteringBattlefield");
if (permanent == null) {
return false;
}
game.fireReflexiveTriggeredAbility(new ReflexiveTriggeredAbility(
new AddCountersTargetEffect(CounterType.P1P1.createInstance(xValue))
.setTargetPointer(new FixedTarget(permanent, game)), false
), source);
return true;
}
}

View file

@ -1,66 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.TapAllEffect;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterLandPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class ShivaWardenOfIce extends CardImpl {
private static final FilterPermanent filter = new FilterLandPermanent("lands your opponents control");
static {
filter.add(TargetController.OPPONENT.getControllerPredicate());
}
public ShivaWardenOfIce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.SAGA);
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(4);
this.toughness = new MageInt(5);
this.nightCard = true;
this.color.setBlue(true);
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// I, II -- Mesmerize -- Target creature can't be blocked this turn.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_II, ability -> {
ability.addEffect(new CantBeBlockedTargetEffect(Duration.EndOfTurn));
ability.addTarget(new TargetCreaturePermanent());
ability.withFlavorWord("Mesmerize");
});
// III -- Cold Snap -- Tap all lands your opponents control. Exile Shiva, then return it to the battlefield.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, ability -> {
ability.addEffect(new TapAllEffect(filter));
ability.addEffect(new ExileSourceAndReturnFaceUpEffect());
ability.withFlavorWord("Cold Snap");
});
this.addAbility(sagaAbility);
}
private ShivaWardenOfIce(final ShivaWardenOfIce card) {
super(card);
}
@Override
public ShivaWardenOfIce copy() {
return new ShivaWardenOfIce(this);
}
}

View file

@ -1,99 +0,0 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.dynamicvalue.common.CardsInControllerHandCount;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
import java.util.UUID;
public class TheGreatSynthesis extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("non-Phyrexian creatures");
static {
filter.add(Predicates.not(SubType.PHYREXIAN.getPredicate()));
}
public TheGreatSynthesis(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.addSubType(SubType.SAGA);
this.color.setBlue(true);
this.nightCard = true;
//(As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
//I Draw cards equal to the number of cards in your hand. You have no maximum hand size for as long as you
//control The Great Synthesis.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_I,
new DrawCardSourceControllerEffect(CardsInControllerHandCount.ANY)
.setText("draw cards equal to the number of cards in your hand"),
new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.WhileOnBattlefield,
MaximumHandSizeControllerEffect.HandSizeModification.SET)
.setText("you have no maximum hand size for as long as you control {this}"));
//II Return all non-Phyrexian creatures to their owners' hands.
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_II, new ReturnToHandFromBattlefieldAllEffect(filter));
//III You may cast any number of spells from your hand without paying their mana cost. Exile The Great
//Synthesis, then return it to the battlefield <i>(front face up)</i>.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_III,
new TheGreatSynthesisCastEffect(),
new ExileSourceAndReturnFaceUpEffect()
);
this.addAbility(sagaAbility);
}
private TheGreatSynthesis(final TheGreatSynthesis card) {
super(card);
}
@Override
public TheGreatSynthesis copy() {
return new TheGreatSynthesis(this);
}
}
class TheGreatSynthesisCastEffect extends OneShotEffect {
public TheGreatSynthesisCastEffect() {
super(Outcome.PlayForFree);
this.staticText = "you may cast any number of spells from your hand without paying their mana costs";
}
private TheGreatSynthesisCastEffect(final TheGreatSynthesisCastEffect effect) {
super(effect);
}
@Override
public TheGreatSynthesisCastEffect copy() {
return new TheGreatSynthesisCastEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
Cards cards = controller.getHand();
CardUtil.castMultipleWithAttributeForFree(controller, source, game, cards, StaticFilters.FILTER_CARD);
return true;
}
}

View file

@ -81,9 +81,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Blazing Bomb", 130, Rarity.COMMON, mage.cards.b.BlazingBomb.class));
cards.add(new SetCardInfo("Blitzball Shot", 176, Rarity.COMMON, mage.cards.b.BlitzballShot.class));
cards.add(new SetCardInfo("Blitzball", 254, Rarity.COMMON, mage.cards.b.Blitzball.class));
cards.add(new SetCardInfo("Braska's Final Aeon", 104, Rarity.RARE, mage.cards.b.BraskasFinalAeon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Braska's Final Aeon", 363, Rarity.RARE, mage.cards.b.BraskasFinalAeon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Braska's Final Aeon", 448, Rarity.RARE, mage.cards.b.BraskasFinalAeon.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Buster Sword", 255, Rarity.MYTHIC, mage.cards.b.BusterSword.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Buster Sword", 351, Rarity.MYTHIC, mage.cards.b.BusterSword.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Cactuar", 177, Rarity.UNCOMMON, mage.cards.c.Cactuar.class));
@ -362,10 +359,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Phantom Train", 110, Rarity.UNCOMMON, mage.cards.p.PhantomTrain.class));
cards.add(new SetCardInfo("Phoenix Down", 29, Rarity.UNCOMMON, mage.cards.p.PhoenixDown.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Phoenix Down", 578, Rarity.UNCOMMON, mage.cards.p.PhoenixDown.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Phoenix, Warden of Fire", 229, Rarity.RARE, mage.cards.p.PhoenixWardenOfFire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Phoenix, Warden of Fire", 397, Rarity.RARE, mage.cards.p.PhoenixWardenOfFire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Phoenix, Warden of Fire", 494, Rarity.RARE, mage.cards.p.PhoenixWardenOfFire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Phoenix, Warden of Fire", 542, Rarity.RARE, mage.cards.p.PhoenixWardenOfFire.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 294, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS));
cards.add(new SetCardInfo("Plains", 295, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS));
cards.add(new SetCardInfo("Plains", 296, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_BFZ_VARIOUS));
@ -457,10 +450,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Shinryu, Transcendent Rival", 384, Rarity.RARE, mage.cards.s.ShinryuTranscendentRival.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shinryu, Transcendent Rival", 455, Rarity.RARE, mage.cards.s.ShinryuTranscendentRival.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shinryu, Transcendent Rival", 529, Rarity.RARE, mage.cards.s.ShinryuTranscendentRival.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shiva, Warden of Ice", 378, Rarity.RARE, mage.cards.s.ShivaWardenOfIce.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shiva, Warden of Ice", 438, Rarity.RARE, mage.cards.s.ShivaWardenOfIce.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shiva, Warden of Ice", 523, Rarity.RARE, mage.cards.s.ShivaWardenOfIce.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Shiva, Warden of Ice", 58, Rarity.RARE, mage.cards.s.ShivaWardenOfIce.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sidequest: Card Collection", 73, Rarity.UNCOMMON, mage.cards.s.SidequestCardCollection.class));
cards.add(new SetCardInfo("Sidequest: Catch a Fish", 31, Rarity.UNCOMMON, mage.cards.s.SidequestCatchAFish.class));
cards.add(new SetCardInfo("Sidequest: Hunt the Mark", 119, Rarity.UNCOMMON, mage.cards.s.SidequestHuntTheMark.class, NON_FULL_USE_VARIOUS));

View file

@ -1,4 +1,3 @@
package mage.sets;
import mage.cards.ExpansionSet;
@ -33,7 +32,6 @@ public final class FromTheVaultTransform extends ExpansionSet {
cards.add(new SetCardInfo("Gisela, the Broken Blade", 10, Rarity.MYTHIC, mage.cards.g.GiselaTheBrokenBlade.class));
cards.add(new SetCardInfo("Huntmaster of the Fells", 11, Rarity.MYTHIC, mage.cards.h.HuntmasterOfTheFells.class));
cards.add(new SetCardInfo("Jace, Vryn's Prodigy", 12, Rarity.MYTHIC, mage.cards.j.JaceVrynsProdigy.class));
cards.add(new SetCardInfo("Jace, Telepath Unbound", 12, Rarity.MYTHIC, mage.cards.j.JaceTelepathUnbound.class));
cards.add(new SetCardInfo("Kytheon, Hero of Akros", 13, Rarity.MYTHIC, mage.cards.k.KytheonHeroOfAkros.class));
cards.add(new SetCardInfo("Gideon, Battle-Forged", 13, Rarity.MYTHIC, mage.cards.g.GideonBattleForged.class));
cards.add(new SetCardInfo("Liliana, Heretical Healer", 14, Rarity.MYTHIC, mage.cards.l.LilianaHereticalHealer.class));

View file

@ -227,9 +227,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Hallowed Haunting", 349, Rarity.MYTHIC, mage.cards.h.HallowedHaunting.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hamlet Vanguard", 201, Rarity.RARE, mage.cards.h.HamletVanguard.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hamlet Vanguard", 389, Rarity.RARE, mage.cards.h.HamletVanguard.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hauken's Insight", 320, Rarity.MYTHIC, mage.cards.h.HaukensInsight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hauken's Insight", 332, Rarity.MYTHIC, mage.cards.h.HaukensInsight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hauken's Insight", 65, Rarity.MYTHIC, mage.cards.h.HaukensInsight.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Headless Rider", 118, Rarity.RARE, mage.cards.h.HeadlessRider.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Headless Rider", 372, Rarity.RARE, mage.cards.h.HeadlessRider.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Henrika Domnathi", 119, Rarity.MYTHIC, mage.cards.h.HenrikaDomnathi.class, NON_FULL_USE_VARIOUS));

View file

@ -276,7 +276,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Hamlet Vanguard", 468, Rarity.RARE, mage.cards.h.HamletVanguard.class));
cards.add(new SetCardInfo("Harvesttide Infiltrator", 143, Rarity.COMMON, mage.cards.h.HarvesttideInfiltrator.class));
cards.add(new SetCardInfo("Harvesttide Sentry", 186, Rarity.COMMON, mage.cards.h.HarvesttideSentry.class));
cards.add(new SetCardInfo("Hauken's Insight", 332, Rarity.MYTHIC, mage.cards.h.HaukensInsight.class));
cards.add(new SetCardInfo("Haunted Ridge", 263, Rarity.RARE, mage.cards.h.HauntedRidge.class));
cards.add(new SetCardInfo("Headless Rider", 385, Rarity.RARE, mage.cards.h.HeadlessRider.class));
cards.add(new SetCardInfo("Hedgewitch's Mask", 23, Rarity.COMMON, mage.cards.h.HedgewitchsMask.class));
@ -397,7 +396,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Ollenbock Escort", 294, Rarity.UNCOMMON, mage.cards.o.OllenbockEscort.class));
cards.add(new SetCardInfo("Ominous Roost", 65, Rarity.UNCOMMON, mage.cards.o.OminousRoost.class));
cards.add(new SetCardInfo("Organ Hoarder", 66, Rarity.COMMON, mage.cards.o.OrganHoarder.class));
cards.add(new SetCardInfo("Ormendahl, the Corrupter", 109, Rarity.MYTHIC, mage.cards.o.OrmendahlTheCorrupter.class));
cards.add(new SetCardInfo("Otherworldly Gaze", 67, Rarity.COMMON, mage.cards.o.OtherworldlyGaze.class));
cards.add(new SetCardInfo("Outland Liberator", 190, Rarity.UNCOMMON, mage.cards.o.OutlandLiberator.class));
cards.add(new SetCardInfo("Overcharged Amalgam", 338, Rarity.RARE, mage.cards.o.OverchargedAmalgam.class));

View file

@ -300,8 +300,6 @@ public final class InnistradMidnightHunt extends ExpansionSet {
cards.add(new SetCardInfo("Olivia's Midnight Ambush", 118, Rarity.COMMON, mage.cards.o.OliviasMidnightAmbush.class));
cards.add(new SetCardInfo("Ominous Roost", 65, Rarity.UNCOMMON, mage.cards.o.OminousRoost.class));
cards.add(new SetCardInfo("Organ Hoarder", 66, Rarity.COMMON, mage.cards.o.OrganHoarder.class));
cards.add(new SetCardInfo("Ormendahl, the Corrupter", 109, Rarity.MYTHIC, mage.cards.o.OrmendahlTheCorrupter.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ormendahl, the Corrupter", 316, Rarity.MYTHIC, mage.cards.o.OrmendahlTheCorrupter.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Otherworldly Gaze", 67, Rarity.COMMON, mage.cards.o.OtherworldlyGaze.class));
cards.add(new SetCardInfo("Outland Liberator", 190, Rarity.UNCOMMON, mage.cards.o.OutlandLiberator.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Outland Liberator", 303, Rarity.UNCOMMON, mage.cards.o.OutlandLiberator.class, NON_FULL_USE_VARIOUS));

View file

@ -420,9 +420,6 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Reinforced Ronin", 158, Rarity.UNCOMMON, mage.cards.r.ReinforcedRonin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Reinforced Ronin", 323, Rarity.UNCOMMON, mage.cards.r.ReinforcedRonin.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Reito Sentinel", 256, Rarity.UNCOMMON, mage.cards.r.ReitoSentinel.class));
cards.add(new SetCardInfo("Remnant of the Rising Star", 194, Rarity.MYTHIC, mage.cards.r.RemnantOfTheRisingStar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Remnant of the Rising Star", 359, Rarity.MYTHIC, mage.cards.r.RemnantOfTheRisingStar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Remnant of the Rising Star", 475, Rarity.MYTHIC, mage.cards.r.RemnantOfTheRisingStar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Repel the Vile", 33, Rarity.COMMON, mage.cards.r.RepelTheVile.class));
cards.add(new SetCardInfo("Replication Specialist", 76, Rarity.UNCOMMON, mage.cards.r.ReplicationSpecialist.class));
cards.add(new SetCardInfo("Return to Action", 121, Rarity.COMMON, mage.cards.r.ReturnToAction.class));

View file

@ -966,7 +966,7 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Forest", 40050, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 40060, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 40094, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 53875, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_ZEN_VARIOUS ));
cards.add(new SetCardInfo("Forest", 53875, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_ZEN_VARIOUS));
cards.add(new SetCardInfo("Forest", 58261, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 73628, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Forest", 81872, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS));
@ -1343,7 +1343,7 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Island", 40052, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 40062, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 40100, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 53881, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_ZEN_VARIOUS ));
cards.add(new SetCardInfo("Island", 53881, Rarity.LAND, mage.cards.basiclands.Island.class, FULL_ART_ZEN_VARIOUS));
cards.add(new SetCardInfo("Island", 58255, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 73634, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 81846, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
@ -1767,7 +1767,7 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Mountain", 40054, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 40064, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 40096, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 53877, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_ZEN_VARIOUS ));
cards.add(new SetCardInfo("Mountain", 53877, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_ZEN_VARIOUS));
cards.add(new SetCardInfo("Mountain", 58259, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 73630, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Mountain", 81864, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS));
@ -2026,7 +2026,7 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Plains", 40066, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 40098, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 48582, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 53879, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_ZEN_VARIOUS ));
cards.add(new SetCardInfo("Plains", 53879, Rarity.LAND, mage.cards.basiclands.Plains.class, FULL_ART_ZEN_VARIOUS));
cards.add(new SetCardInfo("Plains", 58253, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 73626, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Plains", 81830, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS));
@ -2192,7 +2192,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Reliquary Tower", 69250, Rarity.UNCOMMON, mage.cards.r.ReliquaryTower.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Reliquary Tower", 86146, Rarity.UNCOMMON, mage.cards.r.ReliquaryTower.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Remand", 31429, Rarity.UNCOMMON, mage.cards.r.Remand.class));
cards.add(new SetCardInfo("Remnant of the Rising Star", 98063, Rarity.MYTHIC, mage.cards.r.RemnantOfTheRisingStar.class));
cards.add(new SetCardInfo("Remove Soul", 35130, Rarity.COMMON, mage.cards.r.RemoveSoul.class, FULL_ART));
cards.add(new SetCardInfo("Renata, Called to the Hunt", 79859, Rarity.UNCOMMON, mage.cards.r.RenataCalledToTheHunt.class));
cards.add(new SetCardInfo("Render Silent", 48576, Rarity.RARE, mage.cards.r.RenderSilent.class));
@ -2632,7 +2631,7 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Swamp", 40058, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 40068, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 40092, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 53883, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_ZEN_VARIOUS ));
cards.add(new SetCardInfo("Swamp", 53883, Rarity.LAND, mage.cards.basiclands.Swamp.class, FULL_ART_ZEN_VARIOUS));
cards.add(new SetCardInfo("Swamp", 58257, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 73632, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Swamp", 81856, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS));

View file

@ -164,7 +164,6 @@ public final class MagicOrigins extends ExpansionSet {
cards.add(new SetCardInfo("Island", 259, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Island", 260, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Jace's Sanctum", 61, Rarity.RARE, mage.cards.j.JacesSanctum.class));
cards.add(new SetCardInfo("Jace, Telepath Unbound", 60, Rarity.MYTHIC, mage.cards.j.JaceTelepathUnbound.class));
cards.add(new SetCardInfo("Jace, Vryn's Prodigy", 60, Rarity.MYTHIC, mage.cards.j.JaceVrynsProdigy.class));
cards.add(new SetCardInfo("Jayemdae Tome", 231, Rarity.UNCOMMON, mage.cards.j.JayemdaeTome.class));
cards.add(new SetCardInfo("Jhessian Thief", 62, Rarity.UNCOMMON, mage.cards.j.JhessianThief.class));

View file

@ -43,7 +43,6 @@ public class MagicOriginsPromos extends ExpansionSet {
cards.add(new SetCardInfo("Hixus, Prison Warden", 19, Rarity.RARE, mage.cards.h.HixusPrisonWarden.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Hixus, Prison Warden", "19s", Rarity.RARE, mage.cards.h.HixusPrisonWarden.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Honored Hierarch", "182s", Rarity.RARE, mage.cards.h.HonoredHierarch.class));
cards.add(new SetCardInfo("Jace, Telepath Unbound", "60s", Rarity.MYTHIC, mage.cards.j.JaceTelepathUnbound.class));
cards.add(new SetCardInfo("Jace, Vryn's Prodigy", "60s", Rarity.MYTHIC, mage.cards.j.JaceVrynsProdigy.class));
cards.add(new SetCardInfo("Knight of the White Orchid", "21s", Rarity.RARE, mage.cards.k.KnightOfTheWhiteOrchid.class));
cards.add(new SetCardInfo("Kothophed, Soul Hoarder", 104, Rarity.RARE, mage.cards.k.KothophedSoulHoarder.class, NON_FULL_USE_VARIOUS));
@ -73,5 +72,5 @@ public class MagicOriginsPromos extends ExpansionSet {
cards.add(new SetCardInfo("Tragic Arrogance", "38s", Rarity.RARE, mage.cards.t.TragicArrogance.class));
cards.add(new SetCardInfo("Vryn Wingmare", "40s", Rarity.RARE, mage.cards.v.VrynWingmare.class));
cards.add(new SetCardInfo("Willbreaker", "84s", Rarity.RARE, mage.cards.w.Willbreaker.class));
}
}
}

View file

@ -394,9 +394,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
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));
cards.add(new SetCardInfo("The Grand Evolution", 342, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Synthesis", 294, Rarity.MYTHIC, mage.cards.t.TheGreatSynthesis.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Synthesis", 339, Rarity.MYTHIC, mage.cards.t.TheGreatSynthesis.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Synthesis", 65, Rarity.MYTHIC, mage.cards.t.TheGreatSynthesis.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 169, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 299, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 341, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
@ -478,10 +475,10 @@ public final class MarchOfTheMachine extends ExpansionSet {
.forEach(cardInfo -> inBoosterMap.put("MUL_" + cardInfo.getCardNumber(), cardInfo));
}
@Override
public BoosterCollator createCollator() {
return new MarchOfTheMachineCollator();
}
@Override
public BoosterCollator createCollator() {
return new MarchOfTheMachineCollator();
}
}
// Booster collation info from https://www.lethe.xyz/mtg/collation/mom.html
@ -557,7 +554,7 @@ class MarchOfTheMachineCollator implements BoosterCollator {
AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC,
AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC,
AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC,
AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC,
AABBBCCC, AABBBCCC, AABBBCCC, AABBBCCC,
AAABBCCC, AAABBCCC, AAABBCCC, AAABBCCC, AAABBCCC,
AAABBCCC, AAABBCCC,
AAABBBCC, AAABBBCC, AAABBBCC, AAABBBCC, AAABBBCC,
@ -574,7 +571,7 @@ class MarchOfTheMachineCollator implements BoosterCollator {
private final RarityConfiguration uncommonRuns = new RarityConfiguration(
RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU,
RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU,
RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU,
RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU, RuUUU,
URUUU, URUUU, URUUU, URUUU, URUUU, URUUU, URUUU, URUUU, URUUU, URUUU,
URUUU, URUUU, URUUU, URUUU, URUUU,
UuRUU, UuRUU, UuRUU, UuRUU, UuRUU, UuRUU, UuRUU, UuRUU, UuRUU, UuRUU,

View file

@ -205,7 +205,6 @@ public class PioneerMasters extends ExpansionSet {
cards.add(new SetCardInfo("Izzet Guildgate", 267, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class));
cards.add(new SetCardInfo("Jace, Architect of Thought", 329, Rarity.MYTHIC, mage.cards.j.JaceArchitectOfThought.class));
cards.add(new SetCardInfo("Jace, Memory Adept", 330, Rarity.MYTHIC, mage.cards.j.JaceMemoryAdept.class));
cards.add(new SetCardInfo("Jace, Telepath Unbound", 60, Rarity.MYTHIC, mage.cards.j.JaceTelepathUnbound.class));
cards.add(new SetCardInfo("Jace, Vryn's Prodigy", 60, Rarity.MYTHIC, mage.cards.j.JaceVrynsProdigy.class));
cards.add(new SetCardInfo("Jarad's Orders", 390, Rarity.RARE, mage.cards.j.JaradsOrders.class));
cards.add(new SetCardInfo("Jhessian Thief", 61, Rarity.UNCOMMON, mage.cards.j.JhessianThief.class));

View file

@ -45,7 +45,6 @@ public final class RivalsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Aquatic Incursion", 32, Rarity.UNCOMMON, mage.cards.a.AquaticIncursion.class));
cards.add(new SetCardInfo("Arch of Orazca", 185, Rarity.RARE, mage.cards.a.ArchOfOrazca.class));
cards.add(new SetCardInfo("Arterial Flow", 62, Rarity.UNCOMMON, mage.cards.a.ArterialFlow.class));
cards.add(new SetCardInfo("Atzal, Cave of Eternity", 160, Rarity.RARE, mage.cards.a.AtzalCaveOfEternity.class));
cards.add(new SetCardInfo("Atzocan Seer", 153, Rarity.UNCOMMON, mage.cards.a.AtzocanSeer.class));
cards.add(new SetCardInfo("Awakened Amalgam", 175, Rarity.RARE, mage.cards.a.AwakenedAmalgam.class));
cards.add(new SetCardInfo("Azor's Gateway", 176, Rarity.MYTHIC, mage.cards.a.AzorsGateway.class));

View file

@ -25,7 +25,6 @@ public class RivalsOfIxalanPromos extends ExpansionSet {
cards.add(new SetCardInfo("Angrath, the Flame-Chained", "152s", Rarity.MYTHIC, mage.cards.a.AngrathTheFlameChained.class));
cards.add(new SetCardInfo("Arch of Orazca", "185p", Rarity.RARE, mage.cards.a.ArchOfOrazca.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Arch of Orazca", "185s", Rarity.RARE, mage.cards.a.ArchOfOrazca.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Atzal, Cave of Eternity", "160s", Rarity.RARE, mage.cards.a.AtzalCaveOfEternity.class));
cards.add(new SetCardInfo("Awakened Amalgam", "175s", Rarity.RARE, mage.cards.a.AwakenedAmalgam.class));
cards.add(new SetCardInfo("Azor's Gateway", "176s", Rarity.MYTHIC, mage.cards.a.AzorsGateway.class));
cards.add(new SetCardInfo("Azor, the Lawbringer", "154s", Rarity.MYTHIC, mage.cards.a.AzorTheLawbringer.class));

View file

@ -22,7 +22,6 @@ public class SanDiegoComicCon2015 extends ExpansionSet {
cards.add(new SetCardInfo("Chandra, Fire of Kaladesh", 135, Rarity.MYTHIC, mage.cards.c.ChandraFireOfKaladesh.class));
cards.add(new SetCardInfo("Gideon, Battle-Forged", 23, Rarity.MYTHIC, mage.cards.g.GideonBattleForged.class));
cards.add(new SetCardInfo("Jace, Telepath Unbound", 60, Rarity.MYTHIC, mage.cards.j.JaceTelepathUnbound.class));
cards.add(new SetCardInfo("Jace, Vryn's Prodigy", 60, Rarity.MYTHIC, mage.cards.j.JaceVrynsProdigy.class));
cards.add(new SetCardInfo("Kytheon, Hero of Akros", 23, Rarity.MYTHIC, mage.cards.k.KytheonHeroOfAkros.class));
cards.add(new SetCardInfo("Liliana, Defiant Necromancer", 106, Rarity.MYTHIC, mage.cards.l.LilianaDefiantNecromancer.class));

View file

@ -232,7 +232,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Itzquinth, Firstborn of Gishath", 331, Rarity.UNCOMMON, mage.cards.i.ItzquinthFirstbornOfGishath.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ixalli's Lorekeeper", 194, Rarity.UNCOMMON, mage.cards.i.IxallisLorekeeper.class));
cards.add(new SetCardInfo("Jade Seedstones", 195, Rarity.UNCOMMON, mage.cards.j.JadeSeedstones.class));
cards.add(new SetCardInfo("Jadeheart Attendant", 195, Rarity.UNCOMMON, mage.cards.j.JadeheartAttendant.class));
cards.add(new SetCardInfo("Jadelight Spelunker", 196, Rarity.RARE, mage.cards.j.JadelightSpelunker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Jadelight Spelunker", 382, Rarity.RARE, mage.cards.j.JadelightSpelunker.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Jadelight Spelunker", 403, Rarity.RARE, mage.cards.j.JadelightSpelunker.class, NON_FULL_USE_VARIOUS));
@ -556,15 +555,15 @@ class TheLostCavernsOfIxalanCollator implements BoosterCollator {
// 1.3875 B uncommons (111 / 80)
// 1.3875 C uncommons (111 / 80)
private final RarityConfiguration uncommonRuns = new RarityConfiguration(
BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC,
BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC,
BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC,
BCC,
BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC,
BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC,
BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC,
BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC,
BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC,
BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC, BCC,
BCC,
BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC,
BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC,
BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC, BBC,
BBC,
ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC,
ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC,
ABC, ABC, ABC, ABC, ABC, ABC, ABC, ABC
);

View file

@ -24,7 +24,6 @@ public final class Transformers extends ExpansionSet {
cards.add(new SetCardInfo("Cyclonus, the Saboteur", 9, Rarity.MYTHIC, mage.cards.c.CyclonusTheSaboteur.class));
cards.add(new SetCardInfo("Flamewar, Brash Veteran", 10, Rarity.MYTHIC, mage.cards.f.FlamewarBrashVeteran.class));
cards.add(new SetCardInfo("Goldbug, Humanity's Ally", 11, Rarity.MYTHIC, mage.cards.g.GoldbugHumanitysAlly.class));
cards.add(new SetCardInfo("Jetfire, Air Guardian", 3, Rarity.MYTHIC, mage.cards.j.JetfireAirGuardian.class));
cards.add(new SetCardInfo("Jetfire, Ingenious Scientist", 3, Rarity.MYTHIC, mage.cards.j.JetfireIngeniousScientist.class));
cards.add(new SetCardInfo("Megatron, Destructive Force", 12, Rarity.MYTHIC, mage.cards.m.MegatronDestructiveForce.class));
cards.add(new SetCardInfo("Megatron, Tyrant", 12, Rarity.MYTHIC, mage.cards.m.MegatronTyrant.class));