示例#1
0
        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();
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
                }
            }
        }