/// <summary> /// Applies the effects of a DelayedAbility to all of its targets. /// </summary> /// <param name="ability">The DelayedAbility to apply.</param> /// <param name="targets">The CombatEntity targets of the DelayedAbility.</param> private void ApplyEffects(DelayedAbility ability, IEnumerable <CombatEntity> targets) { foreach (var target in targets) { var damage = DamageCalculator.GetTotalDamage(ability.StoredDamage, target); int healing = ability.StoredHealing; healing += target.Resources.MaxHealth * ability.BaseAbility.PercentHeal / 100; target.Resources.CurrentHealth += healing; target.Resources.CurrentHealth -= DamageCalculator.GetDamageTypesAsInt(damage); if (target.Resources.CurrentHealth > 0) { _statusEffectManager.Apply(target, ability.Actor, ability.BaseAbility.AppliedStatusEffects, ability.IsCrit); } else { _statusEffectManager.RemoveAll(target); } } if (ability.BaseAbility.SelfAppliedStatusEffects.Any()) { _statusEffectManager.Apply(ability.Actor, ability.Actor, ability.BaseAbility.SelfAppliedStatusEffects, ability.IsCrit); } }
/// <summary> /// Activates the effects of a DelayedAbility on its target formation, returning an IEnumerable of /// CombatEntities affected by the DelayedAbility. /// </summary> /// <param name="ability">The DelayedAbility to activate the effects of.</param> /// <returns></returns> public IEnumerable <CombatEntity> PerformDelayedAbility(DelayedAbility ability) { var affectedEntities = new List <CombatEntity>(); var targetPosition = ability.TargetPosition; if (ability.BaseAbility.IsPositionStatic) { targetPosition = ability.BaseAbility.CenterOfTargets; } var targets = FormationTargeter.GetTargets(ability.BaseAbility, targetPosition, ability.TargetFormation); if (targets == null || targets.Count() == 0) { return(affectedEntities); } ApplyEffects(ability, targets); return(targets); }