private static String untapStackDescription(AbilityFactory af, SpellAbility sa) {
        // when getStackDesc is called, just build exactly what is happening
        StringBuilder sb = new StringBuilder();
        final HashMap<String, String> params = af.getMapParams();
        Card hostCard = sa.getSourceCard();

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

        sb.append("Untap ");

        if (params.containsKey("UntapUpTo")) {
            sb.append("up to ").append(params.get("Amount")).append(" ");
            sb.append(params.get("UntapType")).append("s");
        } else {
            ArrayList<Card> tgtCards;
            Target tgt = af.getAbTgt();
            if (tgt != null)
                tgtCards = tgt.getTargetCards();
            else {
                tgtCards = AbilityFactory.getDefinedCards(hostCard, 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();
    }