void createMagic(Sprite caster, Scene scene, MagicArgs args, int count, double angle, double width)
 {
     Animation magic = new Animation() { Code = args.Code, Coordinate = args.Coordinate, Z = args.Z };
     EventHandler handler = null;
     magic.Disposed += handler = delegate {
         magic.Disposed -= handler;
         scene.RemoveAnimation(magic);
     };
     scene.AddAnimation(magic);
     double radian = Global.GetRadian(angle);
     double x = width * Math.Cos(radian) + magic.Coordinate.X;
     double y = width * Math.Sin(radian) + magic.Coordinate.Y;
     magic.Coordinate = new Point(x, y);
     //捕获圆范围内将要伤害的精灵表
     for (int i = 0; i < scene.sprites.Count; i++) {
         if (scene.sprites[i].IsVisible && caster.IsHostileTo(scene.sprites[i].Camp)) {
             if (scene.sprites[i].InCircle(Scene.GetGameCoordinate(magic.Coordinate), args.Radius)) {
                 Targets.Add(scene.sprites[i]);
             }
         }
     }
     //对精灵表中所有精灵进行魔法/技能伤害
     foreach (Sprite sprite in Targets) {
         caster.CastingToHurt(sprite, args);
     }
     Targets.Clear();
 }
 public override void Run(Sprite caster, Scene scene, MagicArgs args)
 {
     double angle = Global.GetAngle(Global.GetRadian(Scene.GetWindowCoordinate(caster.Coordinate), args.Target)) + 180;
     double singleAngle = 360 / args.Number;
     for (int i = 0; i < args.Number; i++) {
         Animation magic = new Animation() { Code = args.Code, Coordinate = args.Coordinate, Z = args.Z };
         EventHandler handler = null;
         magic.Disposed += handler = delegate {
             magic.Disposed -= handler;
             magic.Dispose();
             scene.RemoveAnimation(magic);
         };
         scene.AddAnimation(magic);
         magic.RenderTransform = new RotateTransform() {
             CenterX = magic.Center.X,
             CenterY = magic.Center.Y,
             Angle = angle + singleAngle * i
         };
     }
     //捕获十字(圆)范围内将要伤害的精灵表
     for (int i = 0; i < scene.sprites.Count; i++) {
         if (scene.sprites[i].IsVisible && caster.IsHostileTo(scene.sprites[i].Camp)) {
             if (scene.sprites[i].InCircle(Scene.GetGameCoordinate(args.Coordinate), args.Radius)) {
                 Targets.Add(scene.sprites[i]);
             }
         }
     }
     //对精灵表中所有精灵进行魔法/技能伤害
     foreach (Sprite sprite in Targets) {
         caster.CastingToHurt(sprite, args);
     }
     Targets.Clear();
 }
 public override void Run(Sprite caster, Scene scene, MagicArgs args)
 {
     Animation magic = new Animation() { Code = args.Code, Coordinate = args.Coordinate, Z = args.Z };
     EventHandler handler = null;
     magic.Disposed += handler = delegate {
         magic.Disposed -= handler;
         scene.RemoveAnimation(magic);
     };
     scene.AddAnimation(magic);
     Animation animation = new Animation() { Code = 11, Coordinate = args.Coordinate };
     EventHandler animationHandler = null;
     animation.Disposed += animationHandler = delegate {
         animation.Disposed -= animationHandler;
         scene.RemoveAnimation(animation);
     };
     scene.AddAnimation(animation);
     //捕获圆范围内将要伤害的精灵表
     for (int i = 0; i < scene.sprites.Count; i++) {
         if (scene.sprites[i].IsVisible && caster.IsHostileTo(scene.sprites[i].Camp)) {
             if (scene.sprites[i].InCircle(Scene.GetGameCoordinate(args.Coordinate), args.Radius)) {
                 Targets.Add(scene.sprites[i]);
             }
         }
     }
     int count = 0;
     int number = args.Number;
     EventHandler timerHandler = null;
     DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(350) };
     timer.Tick += timerHandler = delegate {
         if (count == args.Number) {
             timer.Tick -= timerHandler;
             timer.Stop();
             Targets.Clear();
         } else {
             count++;
             if (count > 1) {
                 args.SpecialEffect = SpecialEffects.None;
                 scene.Shake(15, 10);
             }
             //对精灵表中所有精灵进行魔法/技能伤害
             foreach (Sprite sprite in Targets) {
                 caster.CastingToHurt(sprite, args);
             }
         }
     };
     timer.Start();
 }
 public override void Run(Sprite caster, Scene scene, MagicArgs args)
 {
     double angle = Global.GetAngle(Global.GetRadian(Scene.GetWindowCoordinate(caster.Coordinate), args.Target)) + 180;
     Point p0 = new Point(args.Coordinate.X, args.Coordinate.Y - 20);
     Point p1 = new Point(args.Coordinate.X + args.Radius * Math.Cos(Global.GetRadian(angle)), args.Coordinate.Y + args.Radius * Math.Sin(Global.GetRadian(angle)));
     int count = 0;
     int number = args.Number;
     EventHandler handler = null;
     DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(80) };
     timer.Tick += handler = delegate {
         if (count == args.Number - 1) {
             timer.Tick -= handler;
             timer.Stop();
         } else {
             count++;
             Animation magic = new Animation() { Code = args.Code, Coordinate = args.Coordinate, Z = args.Z };
             EventHandler otherHandler = null;
             magic.Disposed += otherHandler = delegate {
                 magic.Disposed -= otherHandler;
                 scene.RemoveAnimation(magic);
             };
             scene.AddAnimation(magic);
             magic.RenderTransform = new RotateTransform() {
                 CenterX = magic.Center.X,
                 CenterY = magic.Center.Y,
                 Angle = angle
             };
             EventHandler moveHandler = null;
             magic.MoveCompleted += moveHandler = delegate {
                 magic.MoveCompleted -= moveHandler;
                 magic.Dispose();
             };
             magic.Move(p0, p1, 1, MoveModes.Normal);
         }
     };
     timer.Start();
     //捕获多边形范围内将要伤害的精灵表
     for (int i = 0; i < scene.sprites.Count; i++) {
         if (scene.sprites[i].IsVisible && caster.IsHostileTo(scene.sprites[i].Camp)) {
             if (scene.sprites[i].InPolygon(Global.GetRectRange(angle, p0, p1, args.Radius / 10))) {
                 Targets.Add(scene.sprites[i]);
             }
         }
     }
     //对精灵表中所有精灵进行魔法/技能伤害
     foreach (Sprite sprite in Targets) {
         caster.CastingToHurt(sprite, args);
     }
     Targets.Clear();
 }
 public override void Run(Sprite caster, Scene scene, MagicArgs args)
 {
     double angle = Global.GetAngle(Global.GetRadian(Scene.GetWindowCoordinate(caster.Coordinate), args.Target)) + 180;
     double singleAngle = 18;
     double startAngle = angle - ((args.Number - 1) / 2 * singleAngle);
     double endAngle = angle + ((args.Number - 1) / 2 * singleAngle);
     for (int i = 0; i < args.Number; i++) {
         double otherAngle = startAngle + singleAngle * i;
         Animation magic = new Animation() { Code = args.Code, Coordinate = args.Coordinate, Z = args.Z };
         EventHandler magicHandler = null;
         magic.Disposed += magicHandler = delegate {
             magic.Disposed -= magicHandler;
             scene.RemoveAnimation(magic);
         };
         scene.AddAnimation(magic);
         Point p = new Point(args.Coordinate.X + args.Radius * Math.Cos(Global.GetRadian(otherAngle)), args.Coordinate.Y + args.Radius * Math.Sin(Global.GetRadian(otherAngle)));
         EventHandler moveHandler = null;
         magic.MoveCompleted += moveHandler = delegate {
             magic.MoveCompleted -= moveHandler;
             magic.Dispose();
         };
         magic.Move(magic.Coordinate, p, 1.3, MoveModes.Normal);
     }
     double s0 = 0, s1 = 1, e0 = 0, e1 = 0;
     if (startAngle < 180 && endAngle > 180) {
         s0 = startAngle; e0 = 180; s1 = -180; e1 = endAngle - 360;
     } else if (startAngle >= 180) {
         s0 = startAngle - 360; e0 = endAngle - 360;
     } else {
         s0 = startAngle; e0 = endAngle;
     }
     for (int i = 0; i < scene.sprites.Count; i++) {
         if (scene.sprites[i].IsVisible && caster.IsHostileTo(scene.sprites[i].Camp)) {
             double spriteAngle = Global.GetAngle(Global.GetRadian(Scene.GetWindowCoordinate(scene.sprites[i].Coordinate), args.Coordinate));
             if ((spriteAngle >= s0 && spriteAngle <= e0) || (spriteAngle >= s1 && spriteAngle <= e1)) {
                 Targets.Add(scene.sprites[i]);
             }
         }
     }
     //对精灵表中所有精灵进行魔法/技能伤害
     foreach (Sprite sprite in Targets) {
         caster.CastingToHurt(sprite, args);
     }
     Targets.Clear();
 }
 public override void Run(Sprite caster, Scene scene, MagicArgs args)
 {
     Animation magic = new Animation() { Code = args.Code, Coordinate = args.Coordinate, Z = args.Z };
     EventHandler handler = null;
     magic.Disposed += handler = delegate {
         magic.Disposed -= handler;
         scene.RemoveAnimation(magic);
     };
     scene.AddAnimation(magic);
     scene.Wave(args.Coordinate);
     for (int i = 0; i < scene.sprites.Count; i++) {
         if (scene.sprites[i].IsVisible && caster.IsHostileTo(scene.sprites[i].Camp)) {
             if (scene.sprites[i].InCircle(Scene.GetGameCoordinate(args.Coordinate), args.Radius)) {
                 Targets.Add(scene.sprites[i]);
             }
         }
     }
     //对精灵表中所有精灵进行魔法/技能伤害
     foreach (Sprite sprite in Targets) {
         caster.CastingToHurt(sprite, args);
     }
     Targets.Clear();
 }