diff --git a/Mage.Sets/src/mage/cards/a/AtzalCaveOfEternity.java b/Mage.Sets/src/mage/cards/a/AtzalCaveOfEternity.java deleted file mode 100644 index 73362456eba..00000000000 --- a/Mage.Sets/src/mage/cards/a/AtzalCaveOfEternity.java +++ /dev/null @@ -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; - - // (Transforms from Journey to Eternity.) - - // {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); - } -} diff --git a/Mage.Sets/src/mage/cards/b/BraskasFinalAeon.java b/Mage.Sets/src/mage/cards/b/BraskasFinalAeon.java deleted file mode 100644 index a59cb3fc942..00000000000 --- a/Mage.Sets/src/mage/cards/b/BraskasFinalAeon.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HaukensInsight.java b/Mage.Sets/src/mage/cards/h/HaukensInsight.java deleted file mode 100644 index d2b944a5f9e..00000000000 --- a/Mage.Sets/src/mage/cards/h/HaukensInsight.java +++ /dev/null @@ -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 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); - } -} diff --git a/Mage.Sets/src/mage/cards/h/HowlpackPiper.java b/Mage.Sets/src/mage/cards/h/HowlpackPiper.java index 428c959de9e..1cd474f789b 100644 --- a/Mage.Sets/src/mage/cards/h/HowlpackPiper.java +++ b/Mage.Sets/src/mage/cards/h/HowlpackPiper.java @@ -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)); diff --git a/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java b/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java index b1e66fe84e1..9d15910563e 100644 --- a/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java +++ b/Mage.Sets/src/mage/cards/i/InvasionOfAmonkhet.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java deleted file mode 100644 index 66e1b793d62..00000000000 --- a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/j/JaceVrynsProdigy.java b/Mage.Sets/src/mage/cards/j/JaceVrynsProdigy.java index 7c8eb721011..3e2d9e76ffa 100644 --- a/Mage.Sets/src/mage/cards/j/JaceVrynsProdigy.java +++ b/Mage.Sets/src/mage/cards/j/JaceVrynsProdigy.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/j/JacobHaukenInspector.java b/Mage.Sets/src/mage/cards/j/JacobHaukenInspector.java index c71aedd5f2c..de6b8119722 100644 --- a/Mage.Sets/src/mage/cards/j/JacobHaukenInspector.java +++ b/Mage.Sets/src/mage/cards/j/JacobHaukenInspector.java @@ -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 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); + } +} diff --git a/Mage.Sets/src/mage/cards/j/JadeSeedstones.java b/Mage.Sets/src/mage/cards/j/JadeSeedstones.java index 55cde970259..9fc5a8264fe 100644 --- a/Mage.Sets/src/mage/cards/j/JadeSeedstones.java +++ b/Mage.Sets/src/mage/cards/j/JadeSeedstones.java @@ -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"; + } +} diff --git a/Mage.Sets/src/mage/cards/j/JadeheartAttendant.java b/Mage.Sets/src/mage/cards/j/JadeheartAttendant.java deleted file mode 100644 index fddf0981f84..00000000000 --- a/Mage.Sets/src/mage/cards/j/JadeheartAttendant.java +++ /dev/null @@ -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"; - } -} diff --git a/Mage.Sets/src/mage/cards/j/JechtReluctantGuardian.java b/Mage.Sets/src/mage/cards/j/JechtReluctantGuardian.java index 5cb0bcea09c..79a0a08458f 100644 --- a/Mage.Sets/src/mage/cards/j/JechtReluctantGuardian.java +++ b/Mage.Sets/src/mage/cards/j/JechtReluctantGuardian.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/j/JerrenCorruptedBishop.java b/Mage.Sets/src/mage/cards/j/JerrenCorruptedBishop.java index 606bec7fe1e..1c3ece7ad3e 100644 --- a/Mage.Sets/src/mage/cards/j/JerrenCorruptedBishop.java +++ b/Mage.Sets/src/mage/cards/j/JerrenCorruptedBishop.java @@ -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; } diff --git a/Mage.Sets/src/mage/cards/j/JetfireAirGuardian.java b/Mage.Sets/src/mage/cards/j/JetfireAirGuardian.java deleted file mode 100644 index 4b13db01518..00000000000 --- a/Mage.Sets/src/mage/cards/j/JetfireAirGuardian.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/j/JetfireIngeniousScientist.java b/Mage.Sets/src/mage/cards/j/JetfireIngeniousScientist.java index 14fe70380a6..e3280a8e28d 100644 --- a/Mage.Sets/src/mage/cards/j/JetfireIngeniousScientist.java +++ b/Mage.Sets/src/mage/cards/j/JetfireIngeniousScientist.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/j/JillShivasDominant.java b/Mage.Sets/src/mage/cards/j/JillShivasDominant.java index c115eba3121..7f4874f9200 100644 --- a/Mage.Sets/src/mage/cards/j/JillShivasDominant.java +++ b/Mage.Sets/src/mage/cards/j/JillShivasDominant.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/j/JinGitaxias.java b/Mage.Sets/src/mage/cards/j/JinGitaxias.java index 6fd9909cef0..4bf0fed7d17 100644 --- a/Mage.Sets/src/mage/cards/j/JinGitaxias.java +++ b/Mage.Sets/src/mage/cards/j/JinGitaxias.java @@ -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 owner’s 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 owner’s 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; + } +} diff --git a/Mage.Sets/src/mage/cards/j/JoshuaPhoenixsDominant.java b/Mage.Sets/src/mage/cards/j/JoshuaPhoenixsDominant.java index bcc50be49c0..9db4bba6ead 100644 --- a/Mage.Sets/src/mage/cards/j/JoshuaPhoenixsDominant.java +++ b/Mage.Sets/src/mage/cards/j/JoshuaPhoenixsDominant.java @@ -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 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 + ")"; + } +} diff --git a/Mage.Sets/src/mage/cards/j/JourneyToEternity.java b/Mage.Sets/src/mage/cards/j/JourneyToEternity.java index f3759a3341d..132be3c70e8 100644 --- a/Mage.Sets/src/mage/cards/j/JourneyToEternity.java +++ b/Mage.Sets/src/mage/cards/j/JourneyToEternity.java @@ -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) { diff --git a/Mage.Sets/src/mage/cards/j/JuganDefendsTheTemple.java b/Mage.Sets/src/mage/cards/j/JuganDefendsTheTemple.java index 0ccc1720602..39115c686df 100644 --- a/Mage.Sets/src/mage/cards/j/JuganDefendsTheTemple.java +++ b/Mage.Sets/src/mage/cards/j/JuganDefendsTheTemple.java @@ -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 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; + } +} diff --git a/Mage.Sets/src/mage/cards/o/OrmendahlTheCorrupter.java b/Mage.Sets/src/mage/cards/o/OrmendahlTheCorrupter.java deleted file mode 100644 index 146362a66fb..00000000000 --- a/Mage.Sets/src/mage/cards/o/OrmendahlTheCorrupter.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/p/PhoenixWardenOfFire.java b/Mage.Sets/src/mage/cards/p/PhoenixWardenOfFire.java deleted file mode 100644 index 9a9ff1da417..00000000000 --- a/Mage.Sets/src/mage/cards/p/PhoenixWardenOfFire.java +++ /dev/null @@ -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 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 + ")"; - } -} diff --git a/Mage.Sets/src/mage/cards/r/RemnantOfTheRisingStar.java b/Mage.Sets/src/mage/cards/r/RemnantOfTheRisingStar.java deleted file mode 100644 index dc9338acb2e..00000000000 --- a/Mage.Sets/src/mage/cards/r/RemnantOfTheRisingStar.java +++ /dev/null @@ -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 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; - } -} diff --git a/Mage.Sets/src/mage/cards/s/ShivaWardenOfIce.java b/Mage.Sets/src/mage/cards/s/ShivaWardenOfIce.java deleted file mode 100644 index cf667f30444..00000000000 --- a/Mage.Sets/src/mage/cards/s/ShivaWardenOfIce.java +++ /dev/null @@ -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); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TheGreatSynthesis.java b/Mage.Sets/src/mage/cards/t/TheGreatSynthesis.java deleted file mode 100644 index 160a80da2a6..00000000000 --- a/Mage.Sets/src/mage/cards/t/TheGreatSynthesis.java +++ /dev/null @@ -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 (front face up). - 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; - } -} diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index d9fb797677d..3dab8e5d1bf 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/FromTheVaultTransform.java b/Mage.Sets/src/mage/sets/FromTheVaultTransform.java index 81cd9785d69..62a3e359808 100644 --- a/Mage.Sets/src/mage/sets/FromTheVaultTransform.java +++ b/Mage.Sets/src/mage/sets/FromTheVaultTransform.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java index c8ecba6c6f8..23c384560f6 100644 --- a/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java +++ b/Mage.Sets/src/mage/sets/InnistradCrimsonVow.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java index 95d3a13e58d..b1a8f30d67c 100644 --- a/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java +++ b/Mage.Sets/src/mage/sets/InnistradDoubleFeature.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java index b29263fa60c..1131b6fded8 100644 --- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java +++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java index bc12d2625af..94f0a945e1f 100644 --- a/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java +++ b/Mage.Sets/src/mage/sets/KamigawaNeonDynasty.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java index 96604e13741..24bbd1d3763 100644 --- a/Mage.Sets/src/mage/sets/MagicOnlinePromos.java +++ b/Mage.Sets/src/mage/sets/MagicOnlinePromos.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/MagicOrigins.java b/Mage.Sets/src/mage/sets/MagicOrigins.java index b63aa10a45c..c60aa9569b0 100644 --- a/Mage.Sets/src/mage/sets/MagicOrigins.java +++ b/Mage.Sets/src/mage/sets/MagicOrigins.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/MagicOriginsPromos.java b/Mage.Sets/src/mage/sets/MagicOriginsPromos.java index 07480981180..b39ec6967bf 100644 --- a/Mage.Sets/src/mage/sets/MagicOriginsPromos.java +++ b/Mage.Sets/src/mage/sets/MagicOriginsPromos.java @@ -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)); - } + } } diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java index cbef8d4b348..1631fa13cc1 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachine.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachine.java @@ -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, diff --git a/Mage.Sets/src/mage/sets/PioneerMasters.java b/Mage.Sets/src/mage/sets/PioneerMasters.java index 7e1e7b012f8..a005bf3fede 100644 --- a/Mage.Sets/src/mage/sets/PioneerMasters.java +++ b/Mage.Sets/src/mage/sets/PioneerMasters.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java index 1de7bb9051a..6c7e984848d 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java index 10e4b17f1fb..f66423ec8ec 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalanPromos.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/SanDiegoComicCon2015.java b/Mage.Sets/src/mage/sets/SanDiegoComicCon2015.java index ebe390ac11f..1a93d94e571 100644 --- a/Mage.Sets/src/mage/sets/SanDiegoComicCon2015.java +++ b/Mage.Sets/src/mage/sets/SanDiegoComicCon2015.java @@ -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)); diff --git a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java index 65e022f8f0a..0ae3beab53e 100644 --- a/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/TheLostCavernsOfIxalan.java @@ -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 ); diff --git a/Mage.Sets/src/mage/sets/Transformers.java b/Mage.Sets/src/mage/sets/Transformers.java index 36bf14c5221..ec7a51985fe 100644 --- a/Mage.Sets/src/mage/sets/Transformers.java +++ b/Mage.Sets/src/mage/sets/Transformers.java @@ -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));