diff --git a/Mage.Sets/src/mage/sets/returntoravnica/EpicExperiment.java b/Mage.Sets/src/mage/sets/returntoravnica/EpicExperiment.java index e656a073fb..1014b5d1a2 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/EpicExperiment.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/EpicExperiment.java @@ -27,26 +27,26 @@ */ package mage.sets.returntoravnica; -import java.util.ArrayList; import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; import mage.filter.Filter; import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.common.FilterInstantOrSorceryCard; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.game.ExileZone; import mage.game.Game; import mage.players.Player; -import mage.target.common.TargetCardInExile; +import mage.target.TargetCard; /** * @@ -76,13 +76,6 @@ public class EpicExperiment extends CardImpl { class EpicExperimentEffect extends OneShotEffect { - private static final FilterCard filterStatic = new FilterCard(); - - static { - filterStatic.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), - new CardTypePredicate(CardType.SORCERY))); - } - public EpicExperimentEffect() { super(Outcome.PlayForFree); staticText = "Exile the top X cards of your library. For each instant and sorcery card with converted mana cost X or less among them, you may cast that card without paying its mana cost. Then put all cards exiled this way that weren't cast into your graveyard"; @@ -95,38 +88,38 @@ class EpicExperimentEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); + MageObject sourceObject = source.getSourceObject(game); if (controller != null && sourceObject != null) { // move cards from library to exile - for (int i = 0; i < source.getManaCostsToPay().getX(); i++) { - if (controller.getLibrary().size() > 0) { - Card topCard = controller.getLibrary().getFromTop(game); - controller.moveCardToExileWithInfo(topCard, source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); - } - } + controller.moveCardsToExile(controller.getLibrary().getTopCards(game, source.getManaCostsToPay().getX()), source, game, true, source.getSourceId(), sourceObject.getIdName()); // cast the possible cards without paying the mana ExileZone epicExperimentExileZone = game.getExile().getExileZone(source.getSourceId()); - FilterCard filter = filterStatic.copy(); + FilterCard filter = new FilterInstantOrSorceryCard(); filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, source.getManaCostsToPay().getX() + 1)); - filter.setMessage("instant and sorcery cards with converted mana cost "+ source.getManaCostsToPay().getX() +" or less"); - while (epicExperimentExileZone != null && epicExperimentExileZone.count(filter, game) > 0 - && controller.chooseUse(Outcome.PlayForFree, "Cast cards exiled with " + sourceObject.getLogName() + " without paying its mana cost?", source, game)) { - TargetCardInExile target = new TargetCardInExile(filter, source.getSourceId()); - while (epicExperimentExileZone.count(filter, game) > 0 && controller.choose(Outcome.PlayForFree, epicExperimentExileZone, target, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - if (controller.cast(card.getSpellAbility(), game, true)) { - game.getExile().removeCard(card, game); - } + filter.setMessage("instant and sorcery cards with converted mana cost " + source.getManaCostsToPay().getX() + " or less"); + Cards cardsToCast = new CardsImpl(); + if (epicExperimentExileZone == null) { + return true; + } + cardsToCast.addAll(epicExperimentExileZone.getCards(filter, source.getSourceId(), source.getControllerId(), game)); + while (cardsToCast.size() > 0) { + if (!controller.chooseUse(Outcome.PlayForFree, "Cast (another) a card exiled with " + sourceObject.getLogName() + " without paying its mana cost?", source, game)) { + break; + } + TargetCard targetCard = new TargetCard(1, Zone.EXILED, new FilterCard("instant or sorcery card to cast for free")); + if (controller.choose(Outcome.PlayForFree, cardsToCast, targetCard, game)) { + Card card = game.getCard(targetCard.getFirstTarget()); + if (card != null) { + if (controller.cast(card.getSpellAbility(), game, true)) { + cardsToCast.remove(card); + } else { + game.informPlayer(controller, "You're not able to cast " + card.getIdName() + " or you canceled the casting."); } - target.clearChosen(); + } } } // move cards not cast to graveyard - ExileZone exile = game.getExile().getExileZone(source.getSourceId()); - if (exile != null) { - controller.moveCards(exile, Zone.EXILED, Zone.GRAVEYARD, source, game); - } + controller.moveCards(game.getExile().getExileZone(source.getSourceId()).getCards(game), Zone.GRAVEYARD, source, game); return true; } return false;