public void ShowBulletsFlying(Point DamagePointOfOrigin, double DamageDirection, WeaponInfo Weapon)
        {
            if (Weapon == null)
                return;

            if (Weapon.VisibleBulletLines > 0)
                (1 + ((Weapon.VisibleBulletLines - 1).Random())).Times(
                    delegate
                    {
                        var VisibleBullet = new Shape().AttachTo(GetWarzone());

                        var RandomGray = (0x40 + 0x80.Random()).ToInt32();

                        VisibleBullet.graphics.lineStyle(1, RandomGray.ToGrayColor(), 1);


                        var BulletDirection = DamageDirection + (2.0.Random() - 1.0) * (Weapon.ArcRange * 0.75);
                        var BulletDropFromRange = 32 + (Weapon.Range / 2 - 32).Random();
                        var BulletDropFrom = DamagePointOfOrigin.MoveToArc(BulletDirection, BulletDropFromRange);

                        VisibleBullet.graphics.moveTo(BulletDropFrom.x, BulletDropFrom.y);

                        var BulletDropTo = DamagePointOfOrigin.MoveToArc(BulletDirection, BulletDropFromRange + (Weapon.Range.Random() / 2));

                        VisibleBullet.graphics.lineTo(BulletDropTo.x, BulletDropTo.y);

                        50.AtDelayDo(() => VisibleBullet.Orphanize());
                    }
                );
        }
        public void CreateExplosion(WeaponInfo ExplosiveWeaponType, Point Target, NetworkMode Mode)
        {
            Sounds.explosion.ToSoundAsset().play();

            if (Mode == NetworkMode.Local)
            {
                var Range = ExplosiveWeaponType.Range;

                foreach (var v in from i in AllMortals
                                  let p = i.ToPoint() - Target
                                  where p.length < Range
                                  select new { i, p })
                {
                    var Damage = (ExplosiveWeaponType.Damage * ((Range - v.p.length) / Range)).ToInt32();

                    if (NetworkAddDamageFromDirection != null)
                        NetworkAddDamageFromDirection(v.i.NetworkId, Damage, v.p.GetRotation().RadiansToDegrees());

                    v.i.AddDamageFromDirection(Damage, v.p.GetRotation());
                }
            }

            var a = new Animation(null, Images.Explosions.ani6);

            a.LastFrame +=
                delegate
                {
                    a.AnimationEnabled = false;
                    a.Orphanize();
                };


            a.MoveTo(Target).AttachTo(GetWarzone());
            a.AnimationEnabled = true;
        }
        private void DoSomeDamage(Point DamagePointOfOrigin, double DamageDirection, WeaponInfo Weapon)
        {

            ShowBulletsFlying(DamagePointOfOrigin, DamageDirection, Weapon);

            if (NetworkShowBulletsFlying != null)
                NetworkShowBulletsFlying(
                    DamagePointOfOrigin.x.ToInt32(),
                    DamagePointOfOrigin.y.ToInt32(),
                    DamageDirection.RadiansToDegrees(),
                    Weapon.NetworkId
                    );

            var AllMortals = this.AllMortals.ToArray();

            //Console.WriteLine("mortals in warzone: " + AllMortals.Length);

            foreach (var DeadManWalking in AllMortals)
            {
                var DamageThisDude = true;

                // why bother shooting itself?
                if (DeadManWalking == Ego)
                    if (!Weapon.CanHurtEgo)
                        DamageThisDude = false;

                if (!DeadManWalking.IsAlive)
                    DamageThisDude = false;

                if (DamageThisDude)
                {
                    var Location = new Point { x = DamagePointOfOrigin.x, y = DamagePointOfOrigin.y }.MoveToArc(DamageDirection, -32);
                    var Offset = new Point { y = DeadManWalking.y - Location.y, x = DeadManWalking.x - Location.x };
                    var Arc = Offset.GetRotation();
                    var Distance = Offset.length;

                    Func<double, double> Warp = i => i % (Math.PI * 2);

                    var LessThan = Arc < (Warp(DamageDirection) + Weapon.ArcRange);
                    var MoreThan = Arc > (Warp(DamageDirection) - Weapon.ArcRange);

                    var Hit = LessThan && MoreThan;

                    if (Distance < Weapon.Range)
                        if (Hit)
                        {
                            // calculate damage variation here based on hit approximity

                            DeadManWalking.AddDamageFromDirection(Weapon.Damage, Arc, true);

                            if (NetworkAddDamageFromDirection != null)
                                NetworkAddDamageFromDirection(
                                    DeadManWalking.NetworkId,
                                    Weapon.Damage,
                                    Arc.RadiansToDegrees()
                                );
                        }
                }

            }
        }