@Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { boolean revealed = player .isTopCardRevealed(); // by looking at the cards with scry you have not to reveal the // next card player.setTopCardRevealed(false); Cards cards = new CardsImpl(); int count = Math.min(scryNumber, player.getLibrary().size()); if (count == 0) { return true; } for (int i = 0; i < count; i++) { Card card = player.getLibrary().removeFromTop(game); cards.add(card); } TargetCard target1 = new TargetCard(Zone.LIBRARY, filter1); target1.setRequired(false); // move cards to the bottom of the library while (player.isInGame() && cards.size() > 0 && player.choose(Outcome.Detriment, cards, target1, game)) { Card card = cards.get(target1.getFirstTarget(), game); if (card != null) { cards.remove(card); player.moveCardToLibraryWithInfo( card, source.getSourceId(), game, Zone.LIBRARY, false, false); } target1.clearChosen(); } // move cards to the top of the library player.putCardsOnTopOfLibrary(cards, game, source, true); game.fireEvent( new GameEvent( GameEvent.EventType.SCRY, source.getControllerId(), source.getSourceId(), source.getControllerId())); player.setTopCardRevealed(revealed); return true; } return false; }