Exemple #1
0
        private void UpdateSuperCharging(float elapsed)
        {
            foreach (var player in Game.GetPlayers())
            {
                if (player == Player)
                {
                    continue;
                }

                var position = player.GetWorldPosition();
                var angles   = new float[] { MathExtension.ToRadians(25), MathExtension.ToRadians(65) };
                if (Player.FacingDirection < 0)
                {
                    angles = ScriptHelper.Flip(angles, FlipDirection.Horizontal);
                }

                if (ScriptHelper.IntersectCircle(player.GetAABB(), Position, ChargeHitRange) &&
                    !chargedPlayers.Contains(player.UniqueID))
                {
                    Game.PlayEffect(EffectName.Electric, position);
                    Game.PlaySound("ElectricSparks", position);
                    var direction = RandomHelper.Direction(angles[0], angles[1], true);
                    player.SetLinearVelocity(direction * 15f);
                    ScriptHelper.ExecuteSingleCommand(player, PlayerCommandType.Fall);
                    chargedPlayers.Add(player.UniqueID);
                }
            }

            var area = Player.GetAABB();

            area.Grow(4);
            foreach (var obj in Game.GetObjectsByArea(area))
            {
                if (obj.UniqueID == Player.UniqueID || chargedObjects.Contains(obj.UniqueID) || ScriptHelper.IsPlayer(obj))
                {
                    continue;
                }

                if (ScriptHelper.IsDynamicObject(obj) || RayCastHelper.ObjectsBulletCanDestroy.Contains(obj.Name))
                {
                    if (ScriptHelper.IntersectCircle(obj.GetWorldPosition(), Position, ChargeHitRange))
                    {
                        var v = obj.GetLinearVelocity();
                        obj.SetLinearVelocity(v + Vector2.UnitX * Player.FacingDirection * 25);
                        ScriptHelper.DealDamage(obj, 3);
                        chargedObjects.Add(obj.UniqueID);
                    }
                }
            }

            Game.PlayEffect(EffectName.FireNodeTrailAir, Position + new Vector2(-4, -4));
            Game.PlayEffect(EffectName.FireNodeTrailAir, Position + new Vector2(4, -4));

            m_chargeTimer += elapsed;
            if (m_chargeTimer >= 1500)
            {
                StopSuperCharge();
                m_chargeTimer = 0f;
            }
        }
Exemple #2
0
        public void OnPlayerDeath(IPlayer player, PlayerDeathArgs args)
        {
            if (player.GetHitEffect() == PlayerHitEffect.Metal && args.Removed)
            {
                var deathPosition = player.GetWorldPosition();
                var effects       = new List <Tuple <string, int> >()
                {
                    Tuple.Create(EffectName.BulletHitMetal, 1),
                    Tuple.Create(EffectName.Steam, 2),
                    Tuple.Create(EffectName.Electric, 4),
                };

                foreach (var effect in effects)
                {
                    var effectName = effect.Item1;
                    var count      = effect.Item2;

                    for (var i = 0; i < count; i++)
                    {
                        var position = player.GetWorldPosition();
                        position.X += RandomHelper.Between(-10, 10);
                        position.Y += RandomHelper.Between(-10, 10);
                        Game.PlayEffect(effectName, position);
                    }
                }

                Game.TriggerExplosion(deathPosition);

                for (var i = 0; i < 4; i++)
                {
                    var debrisLinearVelocity = RandomHelper.Direction(15, 165) * 10;
                    var debris = Game.CreateObject(RandomHelper.GetItem(DebrisList),
                                                   deathPosition,
                                                   0f,
                                                   debrisLinearVelocity,
                                                   0f);
                    debris.SetMaxFire();

                    Game.CreateObject(RandomHelper.GetItem(DebrisList),
                                      deathPosition,
                                      0f,
                                      debrisLinearVelocity * -Vector2.UnitX,
                                      0f);

                    if (RandomHelper.Between(0, 100) < 50)
                    {
                        Game.CreateObject(RandomHelper.GetItem(WiringTubeList),
                                          deathPosition,
                                          0f,
                                          RandomHelper.Direction(0, 180) * 6,
                                          0f);
                    }
                }
            }
        }
        public override void OnProjectileHit(ProjectileHitArgs args)
        {
            base.OnProjectileHit(args);

            var hitObject = GetObject(args);

            if (!args.IsPlayer && hitObject.GetBodyType() == BodyType.Static)
            {
                return;
            }

            var angles = new float[] { MathExtension.ToRadians(35), MathExtension.ToRadians(70) };
            var angle  = MathExtension.NormalizeAngle(ScriptHelper.GetAngle(Instance.Direction));

            if (angle > MathHelper.PIOver2 && angle <= MathExtension.PI_3Over2)
            {
                angles = ScriptHelper.Flip(angles, FlipDirection.Horizontal);
            }

            var position      = Instance.Position;
            var pushDirection = Instance.Direction;
            var upDirection   = RandomHelper.Direction(angles[0], angles[1], true);
            var modifiers     = GetForceModifier();
            var velocity      = hitObject.GetLinearVelocity();

            if (args.IsPlayer)
            {
                velocity += Instance.Direction * 4 + upDirection * 14 * modifiers;
                hitObject.SetLinearVelocity(MathExtension.ClampMagnitude(velocity, 15));
            }
            else
            {
                var mass      = hitObject.GetMass();
                var magnitude = MathHelper.Clamp(1f / mass / 7f, 3, 30) * modifiers;
                velocity += Instance.Direction * magnitude + upDirection * magnitude / 10;
                hitObject.SetLinearVelocity(velocity);
                //ScriptHelper.LogDebug(hitObject.Name, mass, magnitude);
            }

            //if (Game.IsEditorTest)
            //{
            //    ScriptHelper.RunIn(() =>
            //    {
            //        if (args.IsPlayer)
            //            Game.DrawText(modifiers.ToString(), position);
            //        Game.DrawLine(position, position + pushDirection * 3);
            //        Game.DrawLine(position, position + upDirection * 3, Color.Yellow);
            //        Game.DrawLine(position, position + velocity, Color.Green);
            //    }, 2000);
            //}
        }
Exemple #4
0
        private void SelfDestruct()
        {
            m_destroyed = true;
            var effects = new List <Tuple <string, int> >()
            {
                Tuple.Create(EffectName.BulletHitMetal, 1),
                Tuple.Create(EffectName.Steam, 2),
                Tuple.Create(EffectName.Electric, 4),
            };

            foreach (var effect in effects)
            {
                var effectName = effect.Item1;
                var count      = effect.Item2;

                for (var i = 0; i < count; i++)
                {
                    var position = RandomHelper.WithinArea(Player.GetAABB());
                    Game.PlayEffect(effectName, position);
                }
            }

            for (var i = 0; i < 4; i++)
            {
                var debrisLinearVelocity = RandomHelper.Direction(15, 165) * 10;
                var debris = Game.CreateObject(RandomHelper.GetItem(DebrisList),
                                               Position,
                                               0f,
                                               debrisLinearVelocity,
                                               0f);
                debris.SetMaxFire();

                Game.CreateObject(RandomHelper.GetItem(DebrisList),
                                  Position,
                                  0f,
                                  debrisLinearVelocity * -Vector2.UnitX,
                                  0f);

                if (RandomHelper.Boolean())
                {
                    Game.CreateObject(RandomHelper.GetItem(WiringTubeList),
                                      Position,
                                      0f,
                                      RandomHelper.Direction(0, 180) * 6,
                                      0f);
                }
            }

            Game.TriggerExplosion(Position);
        }
Exemple #5
0
        private void DeflectBullet(IProjectile projectile, Vector2 normal)
        {
            var reflectVec = Vector2.Reflect(projectile.Direction, normal)
                             + RandomHelper.Direction(-65, 65);
            var direction = projectile.Direction.X > 0 ? 1 : -1;
            var position  = projectile.Position - direction * Vector2.UnitX * 5;
            var powerup   = ProjectilePowerup.None;

            if (projectile.PowerupBounceActive)
            {
                powerup = ProjectilePowerup.Bouncing;
            }
            if (projectile.PowerupFireActive)
            {
                powerup = ProjectilePowerup.Fire;
            }

            Game.SpawnProjectile(projectile.ProjectileItem, position, reflectVec, powerup);
        }