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); }