public void playSpellAbilityForFree(final SpellAbility sa) {
        if (sa.getPayCosts() != null) {
            Target_Selection ts = new Target_Selection(sa.getTarget(), sa);
            Cost_Payment payment = new Cost_Payment(sa.getPayCosts(), sa);

            SpellAbility_Requirements req = new SpellAbility_Requirements(sa, ts, payment);
            req.setFree(true);
            req.fillRequirements();
        } else if (sa.getBeforePayMana() == null) {
            if (sa.isSpell()) {
                Card c = sa.getSourceCard();
                if (!c.isCopiedSpell())
                    AllZone.getGameAction().moveToStack(c);
            }
            boolean x = false;
            if (sa.getSourceCard().getManaCost().contains("X"))
                x = true;

            if (sa.isKickerAbility()) {
                Command paid1 = new Command() {
                    private static final long serialVersionUID = -6531785460264284794L;

                    public void execute() {
                        AllZone.getStack().add(sa);
                    }
                };
                AllZone.getInputControl().setInput(new Input_PayManaCost_Ability(sa.getAdditionalManaCost(), paid1));
            } else {
                AllZone.getStack().add(sa, x);
            }
        } else {
            sa.setManaCost("0"); // Beached As
            if (sa.isKickerAbility()) {
                sa.getBeforePayMana().setFree(false);
                sa.setManaCost(sa.getAdditionalManaCost());
            } else {
                sa.getBeforePayMana().setFree(true);
            }
            AllZone.getInputControl().setInput(sa.getBeforePayMana());
        }
    }