def SLIVER_CARD_FROM_LIBRARY = new MagicCardFilterImpl() { public boolean accept(final MagicGame game,final MagicPlayer player,final MagicCard target) { return target.hasSubType(MagicSubType.Sliver); } public boolean acceptType(final MagicTargetType targetType) { return targetType == MagicTargetType.Library; } }; def A_SLIVER_CARD_FROM_LIBRARY = new MagicTargetChoice( SLIVER_CARD_FROM_LIBRARY, "a Sliver card" ); [ new MagicPermanentActivation( new MagicActivationHints(MagicTiming.Draw), "Search" ) { @Override public Iterable getCostEvent(final MagicPermanent source) { return [ new MagicPayManaCostEvent(source, "{3}") ]; } @Override public MagicEvent getPermanentEvent(final MagicPermanent source, final MagicPayedCost payedCost) { return new MagicEvent( source, this, "PN searches his or her library for a Sliver card, reveal it, put it into his or her hand, and shuffle his or her library." ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { game.addEvent(new MagicSearchIntoHandEvent( event, A_SLIVER_CARD_FROM_LIBRARY )); } }, new MagicPermanentActivation( new MagicActivationHints(MagicTiming.Removal), "Control" ) { @Override public Iterable getCostEvent(final MagicPermanent source) { return [ new MagicPayManaCostEvent(source, "{3}") ]; } @Override public MagicEvent getPermanentEvent(final MagicPermanent source, final MagicPayedCost payedCost) { return new MagicEvent( source, MagicTargetChoice.Negative("target Sliver"), MagicExileTargetPicker.create(), this, "PN gains control of target Sliver\$." ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { event.processTargetPermanent(game, { final MagicPermanent perm -> game.doAction(new MagicGainControlAction( event.getPlayer(), perm )); }); } } ]