public Input input_targetSpecific(final CardList choices, final boolean targeted, final boolean mandatory) {
        final SpellAbility sa = this.ability;
        final Target_Selection select = this;
        final Target tgt = this.target;
        final SpellAbility_Requirements req = this.req;

        Input target = new Input() {
            private static final long serialVersionUID = -1091595663541356356L;

            @Override
            public void showMessage() {
                StringBuilder sb = new StringBuilder();
                sb.append("Targeted: ");
                sb.append(tgt.getTargetedString());
                sb.append("\n");
                sb.append(tgt.getVTSelection());

                AllZone.getDisplay().showMessage(sb.toString());

                // If reached Minimum targets, enable OK button
                if (!tgt.isMinTargetsChosen(sa.getSourceCard(), sa))
                    ButtonUtil.enableOnlyCancel();
                else
                    ButtonUtil.enableAll();

                if (mandatory)
                    ButtonUtil.disableCancel();
            }

            @Override
            public void selectButtonCancel() {
                select.setCancel(true);
                stop();
                req.finishedTargeting();
            }

            @Override
            public void selectButtonOK() {
                select.setDoneTarget(true);
                done();
            }

            @Override
            public void selectCard(Card card, PlayerZone zone) {
                // leave this in temporarily, there some seriously wrong things going on here
                if (targeted && !CardFactoryUtil.canTarget(sa, card)) {
                    AllZone.getDisplay().showMessage("Cannot target this card (Shroud? Protection? Restrictions?).");
                } else if (choices.contains(card)) {
                    tgt.addTarget(card);
                    done();
                }
            }//selectCard()

            @Override
            public void selectPlayer(Player player) {
                if ((tgt.canTgtPlayer() || (tgt.canOnlyTgtOpponent() && player.equals(sa.getActivatingPlayer().getOpponent()))) &&
                        player.canTarget(sa.getSourceCard())) {
                    tgt.addTarget(player);
                    done();
                }
            }

            void done() {
                stop();

                select.chooseTargets();
            }
        };

        return target;
    }//input_targetSpecific()