コード例 #1
0
 public void TestAngleMath()
 {
     Assert.AreEqual(45, SpaceExtensions.AddToAngle(0, 45));
     Assert.AreEqual(1, SpaceExtensions.AddToAngle(360, 1));
     Assert.AreEqual(359, SpaceExtensions.AddToAngle(0, -1));
     Assert.AreEqual(359, SpaceExtensions.AddToAngle(360, -1));
 }
コード例 #2
0
        public override void FireInternal()
        {
            var targetAngle    = CalculateAngleToTarget();
            var sprayAngle     = SpaceExtensions.NormalizeQuantity(30.0f, targetAngle, true);
            var sprayIncrement = 5;
            var startAngle     = SpaceExtensions.AddToAngle(targetAngle, -sprayAngle / 2);
            var sprayedSoFar   = 0;

            Sound.Play("pistol");

            while (sprayedSoFar < sprayAngle)
            {
                sprayedSoFar += sprayIncrement;
                var angle  = SpaceExtensions.AddToAngle(startAngle, sprayedSoFar);
                var bullet = new Projectile(Holder.Left, Holder.Top, angle)
                {
                    Range = SpaceExtensions.NormalizeQuantity(8, angle), HealthPoints = HealthPoints, PlaySoundOnImpact = true
                };
                bullet.Speed.HitDetectionTypes.Remove(Holder.GetType());

                if (Holder.Target != null)
                {
                    bullet.Speed.HitDetectionTypes.Add(Holder.Target.GetType());
                }
                SpaceTime.CurrentSpaceTime.Add(bullet);
            }
        }
コード例 #3
0
        public override void FireInternal()
        {
            activeBlades.ForEach(b => { if (b.Lifetime.IsExpired == false)
                                        {
                                            b.Lifetime.Dispose();
                                        }
                                 });
            activeBlades.Clear();

            Sound.Play("sword");
            for (var i = 1; i < 1 + SpaceExtensions.NormalizeQuantity(Range, CalculateAngleToTarget()); i++)
            {
                var location  = Holder.Center().MoveTowards(CalculateAngleToTarget(), i);
                var newBounds = Rectangular.Create(location.Left - .5f, location.Top - .5f, 1, 1);
                if (SpaceTime.CurrentSpaceTime.IsInBounds(newBounds))
                {
                    var blade = new Blade()
                    {
                        Holder = this.Holder
                    };
                    var holderLocation = Holder.TopLeft();
                    blade.MoveTo(newBounds.Left, newBounds.Top);
                    SpaceTime.CurrentSpaceTime.Add(blade);
                    activeBlades.Add(blade);
                }
            }
        }
コード例 #4
0
        private void FireDoubleInternal(float x, float y, float angle) // :)
        {
            Sound.Play("thump");
            var rpg = new TimedMine(TimeSpan.FromSeconds(2))
            {
                Silent = true
            };

            rpg.MoveTo(x, y);
            var rpgSpeed = new SpeedTracker(rpg);

            rpgSpeed.HitDetectionTypes.Add(typeof(Wall));
            rpgSpeed.HitDetectionTypes.Add(typeof(Character));
            rpgSpeed.HitDetectionExclusions.Add(Holder);
            rpgSpeed.ImpactOccurred.SubscribeForLifetime((impact) =>
            {
                if (impact.ElementHit is IDestructible)
                {
                    var destructible = impact.ElementHit as IDestructible;
                    destructible.TakeDamage(5 * rpg.HealthPointsPerShrapnel);
                }

                rpg.Explode();
            }, rpg.Lifetime);

            new Force(rpgSpeed, SpaceExtensions.NormalizeQuantity(25, angle), angle);
            SpaceTime.CurrentSpaceTime.Add(rpg);
        }
コード例 #5
0
ファイル: Net.cs プロジェクト: VladCananau/PowerArgs
        public override void FireInternal()
        {
            Sound.Play("thrownet");

            var matterList = new List <NetMatter>();
            StructuralIntegrity <NetMatter> matterIntegrity = null;

            for (var y = 0; y < 3; y++)
            {
                for (var x = 0; x < 7; x++)
                {
                    var matter = new NetMatter();

                    var force   = new Force(matter.Speed, SpaceExtensions.NormalizeQuantity(45, CalculateAngleToTarget()), CalculateAngleToTarget());
                    var matterX = this.Holder.Left + 1 + x;
                    var matterY = this.Holder.Top - 1 + y;
                    matter.MoveTo(matterX, matterY, 1);
                    matterList.Add(matter);

                    matter.Speed.HitDetectionTypes.Add(typeof(Character));
                    matter.Speed.HitDetectionTypes.Add(typeof(Wall));

                    // wraps the character in the net if it hits them
                    matter.Speed.ImpactOccurred.SubscribeForLifetime((i) =>
                    {
                        if (i.ElementHit != Holder && i.ElementHit is Character)
                        {
                            Sound.Play("wrapped");
                            matterList.ForEach(m => m.Lifetime.Dispose());
                            matterList.Clear();
                            matterIntegrity.Lifetime.Dispose();
                            for (var newX = i.ElementHit.Left - 2; newX <= i.ElementHit.Left + 2; newX++)
                            {
                                for (var newY = i.ElementHit.Top - 1; newY <= i.ElementHit.Top + 1; newY++)
                                {
                                    var newMatter = new NetMatter();
                                    newMatter.MoveTo(newX, newY);
                                    matterList.Add(newMatter);
                                }
                            }

                            matterList.ForEach(m =>
                            {
                                m.Composite = matterList;
                                SpaceTime.CurrentSpaceTime.Add(m);
                            });
                        }
                    }, matter.Lifetime);
                }
            }

            matterList.ForEach(m =>
            {
                m.Composite = matterList;
                SpaceTime.CurrentSpaceTime.Add(m);
            });

            matterIntegrity = new StructuralIntegrity <NetMatter>(matterList);
            SpaceTime.CurrentSpaceTime.Add(matterIntegrity);
        }
コード例 #6
0
        public void Work()
        {
            var angleToTarget = Me.CalculateAngleTo(Me.Target);
            var oppositeAngle = angleToTarget;// SpaceExtensions.GetOppositeAngle(angleToTarget);
            var newLocation   = SpaceExtensions.MoveTowards(Me.TopLeft(), oppositeAngle, 1);
            var overlapCount  = SpaceTime.CurrentSpaceTime.Elements.Where(e => Rectangular.Create(newLocation.Left, newLocation.Top, 1, 1).OverlapPercentage(e) > 0).Count();

            if (overlapCount == 0)
            {
                Me.MoveTo(newLocation.Left, newLocation.Top);
            }
        }
コード例 #7
0
ファイル: Trigger.cs プロジェクト: floatas/PowerArgs
        public override void Evaluate()
        {
            if (MainCharacter.Current == null)
            {
                return;
            }

            var angle           = MainCharacter.Current.CalculateAngleTo(this);
            var normalizedRange = SpaceExtensions.NormalizeQuantity(Range, angle);

            if (this.CalculateDistanceTo(MainCharacter.Current) <= normalizedRange)
            {
                Fired.Fire(Id);
                Lifetime.Dispose();
            }
        }
コード例 #8
0
        public override void Evaluate()
        {
            var targets = SpaceTime.CurrentSpaceTime.Elements.Where(t => targetFilter(t))
                          .OrderBy(z => sourceEval().CalculateDistanceTo(z));

            foreach (var target in targets)
            {
                var route = SpaceExtensions.CalculateLineOfSight(sourceEval(), target, 1);

                if (route.Obstacles.Where(o => o is Wall).Count() == 0)
                {
                    TargetChanged.Fire(target);
                    return;
                }
            }

            TargetChanged.Fire(null);
        }
コード例 #9
0
        public void MoveUp()
        {
            if (FreeAimCursor != null)
            {
                FreeAimCursor.MoveBy(0, -1);
                return;
            }

            if (Speed.SpeedY < 0 && Math.Abs(Speed.SpeedY) > Math.Abs(Speed.SpeedX))
            {
                Speed.SpeedY = 0;
                Speed.SpeedX = 0;
            }
            else
            {
                Speed.SpeedY = -SpaceExtensions.NormalizeQuantity(PlayerMovementSpeed, 90);
                Speed.SpeedX = 0;
            }

            TrySendBounds();
        }
コード例 #10
0
        public void MoveRight()
        {
            if (FreeAimCursor != null)
            {
                FreeAimCursor.MoveBy(1, 0);
                return;
            }

            if (Speed.SpeedX > Math.Abs(Speed.SpeedY))
            {
                Speed.SpeedX = 0;
                Speed.SpeedY = 0;
            }
            else
            {
                Speed.SpeedX = SpaceExtensions.NormalizeQuantity(PlayerMovementSpeed, 0);
                Speed.SpeedY = 0;
            }

            TrySendBounds();
        }
コード例 #11
0
ファイル: Projectile.cs プロジェクト: VladCananau/PowerArgs
 public override void Initialize()
 {
     startLocation = this.Bounds;
     // todo - replace with bullet speed from config
     force = new Force(Speed, SpaceExtensions.NormalizeQuantity(Accelleration, angle), angle);
 }