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); }