From ddabfacbe7ecd2367ff6bbbd5eaee7b293268786 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 16 Mar 2022 09:56:55 -0400 Subject: [PATCH] refactored a few more remove instances --- Mage.Sets/src/mage/cards/g/GrinningTotem.java | 2 +- Mage.Sets/src/mage/cards/m/ManaSeverance.java | 65 +++++++++--------- Mage.Sets/src/mage/cards/s/SecretSalvage.java | 53 ++++++--------- .../src/mage/cards/s/SelectiveMemory.java | 39 +++++------ .../src/mage/cards/t/ThadaAdelAcquisitor.java | 68 +++++-------------- .../src/mage/cards/u/UncageTheMenagerie.java | 67 ++++++------------ Mage.Sets/src/mage/cards/w/WildResearch.java | 56 +++++++-------- 7 files changed, 133 insertions(+), 217 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GrinningTotem.java b/Mage.Sets/src/mage/cards/g/GrinningTotem.java index 68f87f212e3..65c4191f305 100644 --- a/Mage.Sets/src/mage/cards/g/GrinningTotem.java +++ b/Mage.Sets/src/mage/cards/g/GrinningTotem.java @@ -78,7 +78,7 @@ class GrinningTotemSearchAndExileEffect extends OneShotEffect { } TargetCardInLibrary targetCard = new TargetCardInLibrary(); you.searchLibrary(targetCard, source, game, targetOpponent.getId()); - Card card = targetOpponent.getLibrary().remove(targetCard.getFirstTarget(), game); + Card card = targetOpponent.getLibrary().getCard(targetCard.getFirstTarget(), game); if (card != null) { UUID exileZoneId = CardUtil.getCardExileZoneId(game, source); you.moveCardsToExile(card, source, game, true, exileZoneId, CardUtil.getSourceName(game, source)); diff --git a/Mage.Sets/src/mage/cards/m/ManaSeverance.java b/Mage.Sets/src/mage/cards/m/ManaSeverance.java index 52200030945..0699e19cfd5 100644 --- a/Mage.Sets/src/mage/cards/m/ManaSeverance.java +++ b/Mage.Sets/src/mage/cards/m/ManaSeverance.java @@ -1,78 +1,75 @@ package mage.cards.m; -import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.effects.SearchEffect; -import mage.cards.Card; +import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.common.FilterLandCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author nick.myers */ public final class ManaSeverance extends CardImpl { - + public ManaSeverance(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{1}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}"); + // Search your library for any number of land cards and remove them from the game. // Shuffle your library afterwards. this.getSpellAbility().addEffect(new ManaSeveranceEffect()); } - + private ManaSeverance(final ManaSeverance card) { super(card); } - + @Override public ManaSeverance copy() { return new ManaSeverance(this); } - + } -class ManaSeveranceEffect extends SearchEffect { - +class ManaSeveranceEffect extends OneShotEffect { + public ManaSeveranceEffect() { - super(new TargetCardInLibrary(0, Integer.MAX_VALUE, new FilterLandCard()), Outcome.Exile); + super(Outcome.Benefit); this.staticText = "search your library for any number of land cards, exile them, then shuffle"; } - + public ManaSeveranceEffect(final ManaSeveranceEffect effect) { super(effect); } - + @Override public ManaSeveranceEffect copy() { return new ManaSeveranceEffect(this); } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - if (controller.searchLibrary(target, source, game)) { - if (!target.getTargets().isEmpty()) { - for (UUID cardId : target.getTargets()) { - Card card = controller.getLibrary().getCard(cardId, game); - if (card != null) { - controller.moveCardToExileWithInfo(card, null, "", source, game, Zone.LIBRARY, true); - } - } - } - } - controller.shuffleLibrary(source, game); - return true; + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; } - return false; + TargetCardInLibrary target = new TargetCardInLibrary( + 0, Integer.MAX_VALUE, StaticFilters.FILTER_CARD_LANDS + ); + player.searchLibrary(target, source, game); + Cards cards = new CardsImpl(target.getTargets()); + cards.retainZone(Zone.LIBRARY, game); + player.moveCards(cards, Zone.EXILED, source, game); + player.shuffleLibrary(source, game); + return true; } } diff --git a/Mage.Sets/src/mage/cards/s/SecretSalvage.java b/Mage.Sets/src/mage/cards/s/SecretSalvage.java index 21c94daad82..928cb2b2fed 100644 --- a/Mage.Sets/src/mage/cards/s/SecretSalvage.java +++ b/Mage.Sets/src/mage/cards/s/SecretSalvage.java @@ -1,9 +1,11 @@ package mage.cards.s; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.*; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -23,13 +25,15 @@ import java.util.UUID; */ public final class SecretSalvage extends CardImpl { + private static final FilterCard filter = new FilterNonlandCard("nonland card from your graveyard"); + public SecretSalvage(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}"); // Exile target nonland card from your graveyard. Search your library for any number of cards with the same name as that card, // reveal them, and put them into your hand. Then shuffle your library. getSpellAbility().addEffect(new SecretSalvageEffect()); - getSpellAbility().addTarget(new TargetCardInYourGraveyard(new FilterNonlandCard("nonland card from your graveyard"))); + getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter)); } private SecretSalvage(final SecretSalvage card) { @@ -46,8 +50,9 @@ class SecretSalvageEffect extends OneShotEffect { public SecretSalvageEffect() { super(Outcome.DrawCard); - staticText = "Exile target nonland card from your graveyard. Search your library for any number of cards with the same name as that card, " - + "reveal them, put them into your hand, then shuffle"; + staticText = "Exile target nonland card from your graveyard. " + + "Search your library for any number of cards with the same name as that card, " + + "reveal them, put them into your hand, then shuffle"; } public SecretSalvageEffect(final SecretSalvageEffect effect) { @@ -62,34 +67,16 @@ class SecretSalvageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = source.getSourceObject(game); - if (controller != null && sourceObject != null) { - Card targetCard = game.getCard(getTargetPointer().getFirst(game, source)); - if (targetCard != null) { - controller.moveCards(targetCard, Zone.EXILED, source, game); - - String nameToSearch = CardUtil.getCardNameForSameNameSearch(targetCard); - FilterCard nameFilter = new FilterCard(); - nameFilter.add(new NamePredicate(nameToSearch)); - - TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, nameFilter); - if (controller.searchLibrary(target, source, game)) { - if (!target.getTargets().isEmpty()) { - Cards cards = new CardsImpl(); - for (UUID cardId : target.getTargets()) { - Card card = controller.getLibrary().remove(cardId, game); - if (card != null) { - cards.add(card); - } - } - controller.revealCards(sourceObject.getIdName(), cards, game); - controller.moveCards(cards, Zone.HAND, source, game); - } - controller.shuffleLibrary(source, game); - return true; - } - } + Card targetCard = game.getCard(getTargetPointer().getFirst(game, source)); + if (controller == null || targetCard == null) { + return false; } - return false; + controller.moveCards(targetCard, Zone.EXILED, source, game); + String nameToSearch = CardUtil.getCardNameForSameNameSearch(targetCard); + FilterCard nameFilter = new FilterCard("card named " + nameToSearch); + nameFilter.add(new NamePredicate(nameToSearch)); + return new SearchLibraryPutInHandEffect(new TargetCardInLibrary( + 0, Integer.MAX_VALUE, nameFilter + ), true, true).apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/s/SelectiveMemory.java b/Mage.Sets/src/mage/cards/s/SelectiveMemory.java index e4b7d72c035..09a967673d7 100644 --- a/Mage.Sets/src/mage/cards/s/SelectiveMemory.java +++ b/Mage.Sets/src/mage/cards/s/SelectiveMemory.java @@ -1,28 +1,28 @@ - package mage.cards.s; -import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.filter.common.FilterNonlandCard; +import mage.constants.Zone; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author North */ public final class SelectiveMemory extends CardImpl { public SelectiveMemory(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{U}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}"); // Search your library for any number of nonland cards and exile them. Then shuffle your library. this.getSpellAbility().addEffect(new SelectiveMemoryEffect()); @@ -57,20 +57,17 @@ class SelectiveMemoryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if (player != null) { - TargetCardInLibrary target = new TargetCardInLibrary(0, Integer.MAX_VALUE, new FilterNonlandCard()); - if (player.searchLibrary(target, source, game)) { - for (UUID targetId : target.getTargets()) { - Card card = player.getLibrary().remove(targetId, game); - if (card != null) { - card.moveToExile(null, "", source, game); - } - } - } - - player.shuffleLibrary(source, game); - return true; + if (player == null) { + return false; } - return false; + TargetCardInLibrary target = new TargetCardInLibrary( + 0, Integer.MAX_VALUE, StaticFilters.FILTER_CARDS_NON_LAND + ); + player.searchLibrary(target, source, game); + Cards cards = new CardsImpl(target.getTargets()); + cards.retainZone(Zone.LIBRARY, game); + player.moveCards(cards, Zone.EXILED, source, game); + player.shuffleLibrary(source, game); + return true; } } diff --git a/Mage.Sets/src/mage/cards/t/ThadaAdelAcquisitor.java b/Mage.Sets/src/mage/cards/t/ThadaAdelAcquisitor.java index bf02e7fc12b..3a3603ebe46 100644 --- a/Mage.Sets/src/mage/cards/t/ThadaAdelAcquisitor.java +++ b/Mage.Sets/src/mage/cards/t/ThadaAdelAcquisitor.java @@ -1,33 +1,29 @@ - package mage.cards.t; -import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; -import mage.abilities.effects.AsThoughEffectImpl; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.asthought.PlayFromNotOwnHandZoneTargetEffect; import mage.abilities.keyword.IslandwalkAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; -import mage.filter.common.FilterArtifactCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; -import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; /** - * * @author jeffwadsworth */ public final class ThadaAdelAcquisitor extends CardImpl { public ThadaAdelAcquisitor(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{U}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.MERFOLK); this.subtype.add(SubType.ROGUE); @@ -39,7 +35,9 @@ public final class ThadaAdelAcquisitor extends CardImpl { this.addAbility(new IslandwalkAbility()); // Whenever Thada Adel, Acquisitor deals combat damage to a player, search that player's library for an artifact card and exile it. Then that player shuffles their library. Until end of turn, you may play that card. - this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ThadaAdelAcquisitorEffect(), false, true)); + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + new ThadaAdelAcquisitorEffect(), false, true + )); } private ThadaAdelAcquisitor(final ThadaAdelAcquisitor card) { @@ -67,22 +65,16 @@ class ThadaAdelAcquisitorEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player damagedPlayer = game.getPlayer(targetPointer.getFirst(game, source)); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller == null || damagedPlayer == null || sourceObject == null) { + if (controller == null || damagedPlayer == null) { return false; } - TargetCardInLibrary target = new TargetCardInLibrary(new FilterArtifactCard()); - if (controller.searchLibrary(target, source, game, damagedPlayer.getId())) { - if (!target.getTargets().isEmpty()) { - Card card = damagedPlayer.getLibrary().remove(target.getFirstTarget(), game); - if (card != null) { - controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName(), source, game, Zone.LIBRARY, true); - ContinuousEffect effect = new ThadaAdelPlayFromExileEffect(); - effect.setTargetPointer(new FixedTarget(card.getId())); - game.addEffect(effect, source); - } - } - } + TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_ARTIFACT); + controller.searchLibrary(target, source, game, damagedPlayer.getId()); + Card card = damagedPlayer.getLibrary().getCard(target.getFirstTarget(), game); + PlayFromNotOwnHandZoneTargetEffect.exileAndPlayFromExile( + game, source, card, TargetController.YOU, Duration.EndOfTurn, + false, false, false + ); damagedPlayer.shuffleLibrary(source, game); return true; } @@ -92,31 +84,3 @@ class ThadaAdelAcquisitorEffect extends OneShotEffect { return new ThadaAdelAcquisitorEffect(this); } } - -class ThadaAdelPlayFromExileEffect extends AsThoughEffectImpl { - - public ThadaAdelPlayFromExileEffect() { - super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit); - staticText = "You may play this card from exile"; - } - - public ThadaAdelPlayFromExileEffect(final ThadaAdelPlayFromExileEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public ThadaAdelPlayFromExileEffect copy() { - return new ThadaAdelPlayFromExileEffect(this); - } - - @Override - public boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game) { - return source.isControlledBy(affectedControllerId) - && sourceId.equals(getTargetPointer().getFirst(game, source)); - } -} diff --git a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java index 7e2e932ed09..a1be7320058 100644 --- a/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java +++ b/Mage.Sets/src/mage/cards/u/UncageTheMenagerie.java @@ -2,15 +2,18 @@ package mage.cards.u; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.cards.*; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import mage.util.CardUtil; import java.util.UUID; @@ -46,7 +49,8 @@ class UncageTheMenagerieEffect extends OneShotEffect { public UncageTheMenagerieEffect() { super(Outcome.DrawCard); - this.staticText = "Search your library for up to X creature cards with different names that each have mana value X, reveal them, put them into your hand, then shuffle."; + this.staticText = "Search your library for up to X creature cards with different names " + + "that each have mana value X, reveal them, put them into your hand, then shuffle."; } public UncageTheMenagerieEffect(final UncageTheMenagerieEffect effect) { @@ -60,38 +64,15 @@ class UncageTheMenagerieEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(source.getControllerId()); - Card sourceCard = game.getCard(source.getSourceId()); - if (player == null || sourceCard == null) { - return false; - } - - int xValue = source.getManaCostsToPay().getX(); - - UncageTheMenagerieTarget target = new UncageTheMenagerieTarget(xValue); - if (player.searchLibrary(target, source, game)) { - if (!target.getTargets().isEmpty()) { - Cards cards = new CardsImpl(); - for (UUID cardId : target.getTargets()) { - Card card = player.getLibrary().remove(cardId, game); - if (card != null) { - cards.add(card); - } - } - player.revealCards(sourceCard.getIdName(), cards, game); - player.moveCards(cards, Zone.HAND, source, game); - } - player.shuffleLibrary(source, game); - return true; - } - player.shuffleLibrary(source, game); - return false; + return new SearchLibraryPutInHandEffect(new UncageTheMenagerieTarget( + source.getManaCostsToPay().getX()), true, true + ).apply(game, source); } } class UncageTheMenagerieTarget extends TargetCardInLibrary { - private int xValue; + private final int xValue; public UncageTheMenagerieTarget(int xValue) { super(0, xValue, new FilterCreatureCard(xValue + " creature cards with different names with mana value " + xValue)); @@ -110,21 +91,15 @@ class UncageTheMenagerieTarget extends TargetCardInLibrary { @Override public boolean canTarget(UUID playerId, UUID id, Ability source, Cards cards, Game game) { - Card card = cards.get(id, game); - if (card != null) { - for (UUID targetId : this.getTargets()) { - Card iCard = game.getCard(targetId); - if (iCard != null && iCard.getName().equals(card.getName())) { - return false; - } - } - - if (!(card.isCreature(game) && card.getManaValue() == xValue)) { - return false; - } - - return filter.match(card, playerId, game); + if (!super.canTarget(playerId, id, source, cards, game)) { + return false; } - return false; + Card card = cards.get(id, game); + return card.getManaValue() == xValue + && this + .getTargets() + .stream() + .map(game::getCard) + .noneMatch(c -> CardUtil.haveSameNames(c, card)); } } diff --git a/Mage.Sets/src/mage/cards/w/WildResearch.java b/Mage.Sets/src/mage/cards/w/WildResearch.java index 6a0ede40b72..51e5ebbbbda 100644 --- a/Mage.Sets/src/mage/cards/w/WildResearch.java +++ b/Mage.Sets/src/mage/cards/w/WildResearch.java @@ -1,8 +1,5 @@ - package mage.cards.w; -import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; @@ -10,39 +7,42 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.FilterCard; +import mage.filter.common.FilterEnchantmentCard; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** - * * @author emerald000 */ public final class WildResearch extends CardImpl { - private static final FilterCard filterEnchantment = new FilterCard("enchantment card"); + private static final FilterCard filterEnchantment = new FilterEnchantmentCard(); private static final FilterCard filterInstant = new FilterCard("instant card"); static { - filterEnchantment.add(CardType.ENCHANTMENT.getPredicate()); filterInstant.add(CardType.INSTANT.getPredicate()); } public WildResearch(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}"); // {1}{W}: Search your library for an enchantment card and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WildResearchEffect(filterEnchantment), new ManaCostsImpl<>("{1}{W}"))); + this.addAbility(new SimpleActivatedAbility( + new WildResearchEffect(filterEnchantment), new ManaCostsImpl<>("{1}{W}") + )); // {1}{U}: Search your library for an instant card and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WildResearchEffect(filterInstant), new ManaCostsImpl<>("{1}{U}"))); - + this.addAbility(new SimpleActivatedAbility( + new WildResearchEffect(filterInstant), new ManaCostsImpl<>("{1}{U}") + )); } private WildResearch(final WildResearch card) { @@ -61,11 +61,12 @@ class WildResearchEffect extends OneShotEffect { WildResearchEffect(FilterCard filter) { super(Outcome.DrawCard); - this.staticText = "Search your library for an " + filter.getMessage() + " and reveal that card. Put it into your hand, then discard a card at random. Then shuffle."; + this.staticText = "Search your library for an " + filter.getMessage() + " and reveal that card. " + + "Put it into your hand, then discard a card at random. Then shuffle."; this.filter = filter; } - WildResearchEffect(final WildResearchEffect effect) { + private WildResearchEffect(final WildResearchEffect effect) { super(effect); this.filter = effect.filter; } @@ -78,23 +79,18 @@ class WildResearchEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - TargetCardInLibrary target = new TargetCardInLibrary(filter); - if (controller.searchLibrary(target, source, game)) { - if (!target.getTargets().isEmpty()) { - Card card = controller.getLibrary().remove(target.getFirstTarget(), game); - if (card != null) { - controller.moveCards(card, Zone.HAND, source, game); - Cards cards = new CardsImpl(card); - controller.revealCards(sourceObject.getIdName(), cards, game, true); - } - } - } - controller.discardOne(true, false, source, game); - controller.shuffleLibrary(source, game); - return true; + if (controller == null) { + return false; } - return false; + TargetCardInLibrary target = new TargetCardInLibrary(filter); + controller.searchLibrary(target, source, game); + Card card = controller.getLibrary().getCard(target.getFirstTarget(), game); + if (card != null) { + controller.revealCards(source, new CardsImpl(card), game); + controller.moveCards(card, Zone.HAND, source, game); + } + controller.discardOne(true, false, source, game); + controller.shuffleLibrary(source, game); + return true; } }