private void ResolveDamage(IEnumerable <PlayerDamage> damages, PlayerInterceptorDamage interceptorDamages) { if (!sittingDuck.CurrentExternalThreats.Any()) { return; } var damagesByThreat = new Dictionary <ExternalThreat, IList <PlayerDamage> >(); foreach (var damage in damages) { var threatsInRange = sittingDuck.CurrentExternalThreats.Where(threat => threat.CanBeTargetedBy(damage)).ToList(); switch (damage.PlayerDamageType.DamageTargetType()) { case DamageTargetType.All: foreach (var threat in threatsInRange) { AddToDamagesByThreat(threat, damage, damagesByThreat); } break; case DamageTargetType.Single: var threatHit = threatsInRange.OrderBy(threat => threat.TrackPosition).ThenBy(threat => threat.TimeAppears).FirstOrDefault(); if (threatHit != null) { AddToDamagesByThreat(threatHit, damage, damagesByThreat); } break; default: throw new InvalidOperationException(); } } if (interceptorDamages != null) { AddInterceptorDamages(interceptorDamages, damagesByThreat); } foreach (var threat in damagesByThreat.Keys) { threat.TakeDamage(damagesByThreat[threat]); } foreach (var threat in sittingDuck.CurrentExternalThreats) { threat.PerformEndOfComputeDamage(); } RemoveDefeatedExternalThreats(); }
private void AddInterceptorDamages(PlayerInterceptorDamage interceptorDamages, Dictionary <ExternalThreat, IList <PlayerDamage> > damagesByThreat) { var interceptorDamagesMultiple = interceptorDamages.MultipleDamage; var threatsHitByInterceptors = sittingDuck.CurrentExternalThreats.Where(threat => threat.CanBeTargetedBy(interceptorDamagesMultiple)).ToList(); if (threatsHitByInterceptors.Count() > 1) { foreach (var threat in threatsHitByInterceptors) { AddToDamagesByThreat(threat, interceptorDamagesMultiple, damagesByThreat); } } else if (threatsHitByInterceptors.Count() == 1) { AddToDamagesByThreat(threatsHitByInterceptors.Single(), interceptorDamages.SingleDamage, damagesByThreat); } }
private void AddInterceptorDamages( PlayerInterceptorDamage interceptorDamages, Dictionary <ExternalThreat, IList <PlayerDamage> > damagesByThreat) { var threatsHitByInterceptors = ThreatController.DamageableExternalThreats .Where(threat => threat.CanBeTargetedBy(interceptorDamages.MultipleDamage)) .ToList(); if (threatsHitByInterceptors.Any()) { var damageType = threatsHitByInterceptors.Count == 1 ? interceptorDamages.SingleDamage : interceptorDamages.MultipleDamage; foreach (var threat in threatsHitByInterceptors) { AddToDamagesByThreat(threat, damageType, damagesByThreat); } } }