public void discard_madness(Card c) {
        // Whenever a card with madness is discarded, you may cast it for it's madness cost
        if (!c.hasMadness())
            return;

        final Card madness = c;
        final Ability cast = new Ability(madness, madness.getMadnessCost()) {
            @Override
            public void resolve() {
                playCardNoCost(madness);
                System.out.println("Madness cost paid");
            }
        };

        StringBuilder sb = new StringBuilder();
        sb.append(madness.getName()).append(" - Cast via Madness");
        cast.setStackDescription(sb.toString());

        final Ability activate = new Ability(madness, "0") {
            @Override
            public void resolve() {
                // pay madness cost here.
                if (madness.getOwner().isHuman()) {
                    if (GameActionUtil.showYesNoDialog(madness, madness + " - Discarded. Pay Madness Cost?")) {
                        if (cast.getManaCost().equals("0"))
                            AllZone.getStack().add(cast);
                        else
                            AllZone.getInputControl().setInput(new Input_PayManaCost(cast));
                    }
                } else     // computer will ALWAYS pay a madness cost if he has the mana.
                    ComputerUtil.playStack(cast);
            }
        };

        StringBuilder sbAct = new StringBuilder();
        sbAct.append(madness.getName()).append(" - Discarded. Pay Madness Cost?");
        activate.setStackDescription(sbAct.toString());

        AllZone.getStack().add(activate);
    }