public static void dealAssignedDamage() {
        // This function handles both Regular and First Strike combat assignment
        Player player = AllZone.getCombat().getDefendingPlayer();

        boolean bFirstStrike = AllZone.getPhase().is(Constant.Phase.Combat_FirstStrikeDamage);

        HashMap<Card, Integer> defMap = AllZone.getCombat().getDefendingDamageMap();

        for (Entry<Card, Integer> entry : defMap.entrySet()) {
            player.addCombatDamage(entry.getValue(), entry.getKey());
        }

        CardList unblocked = new CardList(bFirstStrike ? AllZone.getCombat().getUnblockedAttackers() :
                AllZone.getCombat().getUnblockedFirstStrikeAttackers());

        for (int j = 0; j < unblocked.size(); j++) {
            if (bFirstStrike)
                CombatUtil.checkUnblockedAttackers(unblocked.get(j));
            else {
                if (!unblocked.getCard(j).hasFirstStrike() && !unblocked.getCard(j).hasDoubleStrike())
                    CombatUtil.checkUnblockedAttackers(unblocked.get(j));
            }
        }

        // this can be much better below here...

        CardList combatants = new CardList();
        combatants.addAll(AllZone.getCombat().getAttackers());
        combatants.addAll(AllZone.getCombat().getAllBlockers());
        combatants.addAll(AllZone.getCombat().getDefendingPlaneswalkers());

        Card c;
        for (int i = 0; i < combatants.size(); i++) {
            c = combatants.get(i);

            // if no assigned damage to resolve, move to next
            if (c.getTotalAssignedDamage() == 0)
                continue;

            Map<Card, Integer> assignedDamageMap = c.getAssignedDamageMap();
            HashMap<Card, Integer> damageMap = new HashMap<Card, Integer>();

            for (Entry<Card, Integer> entry : assignedDamageMap.entrySet()) {
                Card crd = entry.getKey();
                damageMap.put(crd, entry.getValue());
            }
            c.addCombatDamage(damageMap);

            damageMap.clear();
            c.clearAssignedDamage();
        }

        //This was deeper before, but that resulted in the stack entry acting like before.

    }