/// <summary>
        /// Applies damage to the defender
        /// </summary>
        private static void ApplyDamage(ref Unit attacker, int atkEqpSlot, ref Unit defender, EncounterData eData)
        {
            Equipment   attackerEquipment = attacker.weapons[atkEqpSlot];
            EquipmentVO equipmentVO       = attackerEquipment.vo;

            eData.AddLog(INDENT + attacker.vo.uid + "(" + attacker.hp + "/" +
                         attacker.vo.hp + ")" + " uses " + equipmentVO.uid + " on " +
                         defender.vo.uid + " (" + defender.hp + "/" + defender.vo.hp + ")");

            // calculate the damage
            int damage = attacker.GetDamage(atkEqpSlot) - defender.GetDamageReduction();

            // Prevent damage from rolling negative and healing the enemy
            if (damage < 0)
            {
                damage = 0;
            }

            int    numShots  = equipmentVO.numShotsPerAttack;
            double hitChance = attacker.GetHitChance(atkEqpSlot);

            // do the num shots
            for (int i = 0; i < numShots; i++)
            {
                // expend some ammo
                int ammoUsed = 1;
                attackerEquipment.remainingAmmo -= ammoUsed;
                if (attackerEquipment.remainingAmmo <= 0)
                {
                    eData.AddLog(INDENT + equipmentVO.uid + " OUT OF AMMO!!");
                    break;
                }

                if (!DoesShotHit(hitChance, 0))
                {
                    eData.AddLog(INDENT + "MISS: AMMO REMAINING: " +
                                 attacker.vo.uid + " " + attackerEquipment.remainingAmmo);
                    continue;
                }

                // apply the damage
                defender.hp -= damage;

                eData.AddLog(INDENT + "DAMAGE: " + defender.vo.uid +
                             " -" + damage + " (" + defender.hp + "/" + defender.vo.hp + " HP)" +
                             " AMMO REMAINING: " + attacker.vo.uid + "(" + attackerEquipment.remainingAmmo +
                             "/" + attackerEquipment.vo.ammoCapacity + ")");

                // prevent it from going negative.
                if (defender.hp <= 0)
                {
                    defender.hp = 0;

                    eData.AddLog(INDENT + defender.vo.uid + " DESTROYED!!");
                    break;
                }
            }
        }
        /// <summary>
        /// Handle the attack between 2 combatants
        /// </summary>
        public static void HandleAttack(ref Unit attacker, int atkEqpSlot, ref Unit defender, int defEqpSlot)
        {
            EncounterData eData = CombatEncounterController.GetInstance().CurrentEncounter;

            eData.AddLog("ATTACK");

            ApplyDamage(ref attacker, atkEqpSlot, ref defender, eData);


            // Unit is dead so no counter attack.
            if (defender.hp <= 0)
            {
                return;
            }

            eData.AddLog("COUNTER-ATTACK");
            ApplyDamage(ref defender, defEqpSlot, ref attacker, eData);
        }