Exemple #1
0
        public IAbility GetAutoAttackAbility(IGameUnit user, IGameUnit target)
        {
            if (user.Abilities == null || !user.Abilities.Any(x => x.CanCounterAttack))
            {
                return(null);
            }

            // Get all possible counter abilities for this user
            var counterAbilities = user.Abilities.Where(ability => ability.CanCounterAttack && user.CanUseAbility(ability) && AbilityRangeCalculator.CanAbilityTargetUnit(user, target, ability)).ToList();

            if (!counterAbilities.Any())
            {
                return(null);
            }
            // And pick the strongest one!
            var strongestAbility = counterAbilities.Select(ability =>
            {
                var abilityParams = new AbilityExecuteParameters(user, ability, target, new List <IGameMapObject> {
                    target
                }, target.MapPoint, _gameMap);
                var repeatCount = DamageCalculator.RepeatCount(ability, user, target);
                var results     = ability.AbilityEffects.Select(x => x.PreviewResults(abilityParams)).Sum(x => x.BaseDamage * x.HitRate) * repeatCount;
                return(new { Ability = ability, DamageScore = results });
            }).MaxBy(x => x.DamageScore).Ability;

            return(strongestAbility);
        }
        public List <MapPoint> GenerateRadiusPoints(IGameUnit unit, IAbility ability)
        {
            var points = AbilityRangeCalculator.GetMapPointsAbilityTargets(ability, unit).ToList();

            return(points);
        }