public void addAndUnfreeze(SpellAbility ability) {
        ability.getRestrictions().abilityActivated();
        if (ability.getRestrictions().getActivationNumberSacrifice() != -1 &&
                ability.getRestrictions().getNumberTurnActivations() >= ability.getRestrictions().getActivationNumberSacrifice()) {
            ability.getSourceCard().addExtrinsicKeyword("At the beginning of the end step, sacrifice CARDNAME.");
        }
        // triggered abilities should go on the frozen stack
        if (!ability.isTrigger())
            frozen = false;

        this.add(ability);

        // if the ability is a spell, but not a copied spell and its not already on the stack zone, move there
        if (ability.isSpell()) {
            Card source = ability.getSourceCard();
            if (!source.isCopiedSpell() && !AllZone.getZone(source).is(Constant.Zone.Stack))
                AllZone.getGameAction().moveToStack(source);
        }

        if (ability.isTrigger())
            unfreezeStack();
    }