public bool Cast(ICharacterFinder characterFinder, IAbility ability, Vector2 targetPosition)
        {
            if (ActionPoints < ability.ActionPoints)
            {
                return(false);
            }

            bool didCast = ability.Cast(characterFinder, this, targetPosition);

            if (didCast)
            {
                ActionPoints -= ability.ActionPoints;
                AbilityCast?.Invoke(this, ability, targetPosition);
            }

            return(didCast);
        }
        public bool Cast(ICharacterFinder characterFinder, CharacterModel caster, Vector2 targetCenter)
        {
            if ((targetCenter - caster.Position).Norm > Range)
            {
                return(false);
            }

            IEnumerable <CharacterModel> targetCollection = characterFinder.GetCharactersOnLine(caster.Position, targetCenter)
                                                            .Where(target => TargetTypeExtensions.IsTargetAllowed(TargetTypes, caster, target))
                                                            .OrderBy(target => (caster.Position - target.Position).Norm)
                                                            .Take(TargetLimit);

            foreach (CharacterModel currentTarget in targetCollection)
            {
                Apply(currentTarget);
            }

            return(true);
        }
        public bool Cast(ICharacterFinder characterFinder, CharacterModel caster, Vector2 targetCenter)
        {
            if ((targetCenter - caster.Position).Norm > Range)
            {
                return(false);
            }

            List <CharacterModel> targetCollection = characterFinder
                                                     .GetCharactersAround(targetCenter, TargetWidth, TargetHeight, GetRotation(caster.Position, targetCenter))
                                                     .Where(target => TargetTypeExtensions.IsTargetAllowed(TargetTypes, caster, target)).ToList();

            if (TargetRequired && (targetCollection.Any() == false))
            {
                return(false);
            }

            foreach (CharacterModel currentTarget in targetCollection)
            {
                Apply(currentTarget);
            }

            return(true);
        }
 public void Initialize(ICharacterFinder characterFinder, INavigation navigation)
 {
     this.CharacterFinder = characterFinder;
     this.Navigation      = navigation;
 }