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