public void CastSkill(Character.Character character, Skill skill)
        {
            if ((InputManager.MouseToMapVector - Player.Position).Length() > skill.Range)
            {
                currentPreCastSkill = null;
                return;
            }

            if (character.CanCastSkill(skill))
            {
                var affected = new List<Enemy>();

                character.Stats.Mana -= skill.ManaCost;
                character.StatusEffects.AddRange(skill.SelfEffects);
                skill.CooldownTimer = skill.Cooldown;

                #region Player Skills

                if (character.IsPlayer)
                {
                    #region Target effects

                    if (skill.AnimateAction)
                    {
                        character.StopMovement();
                        character.ActionState = ActionState.Attacking;
                        character.CharSprite.AnimateAction(AnimationType.Attack1);
                    }
                    if (skill.TargetArea == TargetArea.SelfArea)
                    {
                        affected = AliveEnemies.FindAll(e => (e.Position - character.Position).Length() <= skill.Range);
                    }
                    else if (skill.TargetArea == TargetArea.SingleTarget)
                    {
                        if (currentTarget is Enemy)
                            affected.Add(currentTarget as Enemy);
                    }

                    if (skill.DamageModificerPercentage > 0)
                    {
                        float damageBuff = skill.DamageModificerPercentage/100;
                        foreach (Enemy e in affected)
                        {
                            var damage = (int) (damageBuff*BattleHelper.CalculatePhysicalDamage(character, e));
                            var args = new AttackEventArgs(Player, e, -damage, false);
                            e.ChangeHealth(args, true);
                        }
                    }

                    if (skill.Damage > 0)
                    {
                        affected.ForEach(x =>
                        {
                            var args = new AttackEventArgs(Player, x, -skill.Damage, false);
                            x.ChangeHealth(args, true);
                        });
                    }

                    affected.ForEach(x => x.StatusEffects.AddRange(skill.TargetEffects));

                    #endregion

                    #region Caster animation effects

                    if (skill.CasterAnimation != null)
                    {
                        skill.CasterAnimation.Position = character.Position;
                        animations.Add(skill.CasterAnimation);
                    }

                    #endregion

                    #region Caster movement

                    if (skill.CasterMovement == CasterMovement.TeleportToTarget)
                    {
                        Player.Position = InputManager.MouseToMapVector;
                    }
                    else if (skill.CasterMovement == CasterMovement.Dash)
                    {
                        float mouseAngle = MapHelper.GetAngleBetweenPoints(Player.Position,
                            InputManager.MouseToMapVector);
                        Direction d = MapHelper.GetDirectionFromAngle(mouseAngle);
                        //Player.Dash(MapHelper.GetVectorFromDirection(d), (Player.Position - InputManager.MouseToMapVector).Length());
                    }

                    #endregion

                    #region Target animation effects

                    if (skill.TargetAnimation != null)
                    {
                        switch (skill.TargetArea)
                        {
                            case TargetArea.SelfArea:
                            case TargetArea.SingleTarget:
                            case TargetArea.RangedArea:
                                foreach (Enemy target in affected)
                                {
                                    var animation = new SpriteAnimation(skill.TargetAnimation.Texture,
                                        skill.TargetAnimation.SpriteFormat, skill.TargetAnimation.Interval);
                                    animation.Target = target;
                                    animations.Add(animation);
                                }
                                break;
                            case TargetArea.Self:
                                skill.TargetAnimation.Target = character;
                                animations.Add(skill.TargetAnimation);
                                break;
                            default:
                                break;
                        }
                    }

                    #endregion

                    currentPreCastSkill = null;
                }
                    #endregion

                    #region Enemy Skills

                #endregion
            }
        }