private static String tapOrUntapStackDescription(AbilityFactory af, SpellAbility sa) {
        // when getStackDesc is called, just build exactly what is happening
        StringBuilder sb = new StringBuilder();

        HashMap<String, String> params = af.getMapParams();

        if (sa instanceof Ability_Sub)
            sb.append(" ");
        else
            sb.append(sa.getSourceCard()).append(" - ");

        sb.append("Tap or untap ");

        ArrayList<Card> tgtCards;
        Target tgt = af.getAbTgt();
        if (tgt != null)
            tgtCards = tgt.getTargetCards();
        else {
            tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa);
        }

        Iterator<Card> it = tgtCards.iterator();
        while (it.hasNext()) {
            sb.append(it.next());
            if (it.hasNext()) sb.append(", ");
        }

        sb.append(".");

        Ability_Sub subAb = sa.getSubAbility();
        if (subAb != null)
            sb.append(subAb.getStackDescription());

        return sb.toString();
    }