Example #1
0
        ConcurrentBag <UnitCalculation> GetTargettedAttacks(UnitCalculation unitCalculation)
        {
            var attacks = new ConcurrentBag <UnitCalculation>();

            Parallel.ForEach(unitCalculation.EnemiesInRangeOf, (enemyAttack) =>
            {
                if (DamageService.CanDamage(enemyAttack, unitCalculation) && CollisionCalculator.Collides(unitCalculation.Position, unitCalculation.Unit.Radius, enemyAttack.Start, enemyAttack.End))
                {
                    attacks.Add(enemyAttack);
                }
            });

            return(attacks);
        }
        protected override UnitCalculation GetBestDpsReduction(UnitCommander commander, Weapon weapon, IEnumerable <UnitCalculation> primaryTargets, IEnumerable <UnitCalculation> secondaryTargets)
        {
            float splashRadius  = 0.3f;
            var   dpsReductions = new Dictionary <ulong, float>();

            foreach (var enemyAttack in primaryTargets)
            {
                float dpsReduction = 0;
                var   attackLine   = GetAttackLine(commander.UnitCalculation.Unit.Pos, enemyAttack.Unit.Pos);
                foreach (var splashedEnemy in secondaryTargets)
                {
                    if (CollisionCalculator.Collides(splashedEnemy.Position, splashedEnemy.Unit.Radius + splashRadius, attackLine.Start, attackLine.End))
                    {
                        dpsReduction += splashedEnemy.Dps / TimeToKill(weapon, splashedEnemy.Unit, SharkyUnitData.UnitData[(UnitTypes)splashedEnemy.Unit.UnitType]);
                    }
                }
                dpsReductions[enemyAttack.Unit.Tag] = dpsReduction;
            }

            var best = dpsReductions.OrderByDescending(x => x.Value).FirstOrDefault().Key;

            return(primaryTargets.FirstOrDefault(t => t.Unit.Tag == best));
        }