private CombatActionModel applyDamageAbilityEffectToCombatant(AbilityEffectType abilityEffectType, int abilityID,
                                                                      int abilityCombatantOwnerID, int abilityAmount, CombatantModel combatantModel, int turnsRemaining, bool isCrit)
        {
            StatModifiersDeltas statModifiersDeltas = combatantModel.StatModifiersDeltas;
            CombatActionType    combatActionType    = CombatActionType.None;
            int damageDeltaWithStatModifiers        = 0;

            switch (abilityEffectType)
            {
            case AbilityEffectType.MeleeDamage:
                damageDeltaWithStatModifiers = getDamageDeltaWithStatMod(statModifiersDeltas.ArmorStatModifiersDelta, abilityAmount);
                combatActionType             = CombatActionType.ReceiveMeleeDamage;
                break;

            case AbilityEffectType.SpellDamage:
                damageDeltaWithStatModifiers = getDamageDeltaWithStatMod(statModifiersDeltas.SpellResistStatModifiersDelta, abilityAmount);
                combatActionType             = CombatActionType.ReceiveSpellDamage;
                break;

            default:
                throw new Exception("Invalid AbilityEffectType");
            }
            combatantModel.SetCurrentHealth(combatantModel.CurrentHealth + damageDeltaWithStatModifiers);
            Logging.Log.Info("Combatant ID : " + combatantModel.ID + " on team " + combatantModel.TeamID +
                             " receives damage: " + damageDeltaWithStatModifiers + ".  New health = " + combatantModel.CurrentHealth);
            return(new CombatActionModel(
                       abilityCombatantOwnerID, combatActionType, abilityID, combatantModel.ID, damageDeltaWithStatModifiers,
                       turnsRemaining, isCrit));
        }
        private int getAbilityAmountWithStatMods(CombatantModel combatantModel, int abilityAmount, bool isAbilitySpellBased, out bool isCrit)
        {
            StatModifiersDeltas statModifiersDeltas = combatantModel.StatModifiersDeltas;
            int moddedAmount = abilityAmount;

            isCrit = false;
            if (isAbilitySpellBased)
            {
                moddedAmount += statModifiersDeltas.SpellDamageStatModifiersDelta;
                isCrit        = RandomGen.NextNormalizedFloat() < (combatantModel.SpellCritChanceNormalized + statModifiersDeltas.SpellCritStatModifiersDelta);
            }
            else
            {
                moddedAmount += statModifiersDeltas.MeleeDamageStatModifiersDelta;
                isCrit        = RandomGen.NextNormalizedFloat() < (combatantModel.MeleeCritChanceNormalized + statModifiersDeltas.MeleeDamageStatModifiersDelta);
            }

            if (isCrit)
            {
                moddedAmount = (int)((float)moddedAmount * CRITICAL_STRIKE_MULTIPLIER);
            }

            return(moddedAmount);
        }