Ejemplo n.º 1
0
        public override void Setup(JsonValue settings)
        {
            base.Setup(settings);

            var ac = 0.1f;

            SpawnProjectile = (entity, item) => {
                var aim  = entity.GetComponent <AimComponent>();
                var from = aim.Center;
                var am   = aim.RealAim;
                var a    = MathUtils.Angle(am.X - from.X, am.Y - from.Y);

                entity.GetComponent <AudioEmitterComponent>().EmitRandomized("item_laser_player");

                var cnt      = 1;
                var accurate = false;

                if (entity is Player pl)
                {
                    var e = new PlayerShootEvent {
                        Player = pl
                    };

                    entity.HandleEvent(e);

                    cnt     += e.Times - 1;
                    accurate = e.Accurate;
                }

                for (var i = 0; i < cnt; i++)
                {
                    var addition = 0f;

                    if (accurate)
                    {
                        addition = (i - (int)(cnt * 0.5f)) * 0.2f + Rnd.Float(-ac / 2f, ac / 2f);
                    }
                    else if (cnt == 1 || i > 0)
                    {
                        addition = Rnd.Float(-ac / 2f, ac / 2f);
                    }

                    var laser = Laser.Make(entity, a, addition, item, damage: (item.Scourged ? 1.5f : 1f));

                    laser.Position      = from;
                    laser.PlayerRotated = true;
                    laser.Damage       *= 1.2f;
                    laser.Recalculate();
                }
            };
        }
Ejemplo n.º 2
0
        public override void Update(float dt)
        {
            base.Update(dt);

            if (!Attract)
            {
                return;
            }

            foreach (var p in Area.Tagged[Tags.Player])
            {
                var dx = p.DxTo(this);
                var dy = p.DyTo(this);

                var d = MathUtils.Distance(dx, dy);

                if (d <= 24)
                {
                    AnimationUtil.Explosion(Center);
                    Done = true;
                    Callback();

                    Camera.Instance.Shake(20);
                    Engine.Instance.Flash = 2;

                    var ba = GetComponent <SensorBodyComponent>();
                    ba.Velocity = ba.Knockback = Vector2.Zero;

                    var bb = p.GetComponent <SensorBodyComponent>();
                    bb.Velocity = bb.Knockback = Vector2.Zero;

                    return;
                }

                var a     = MathUtils.Angle(dx, dy);
                var force = 360 * dt;

                if (d <= 64)
                {
                    force *= 2;
                }

                p.GetComponent <RectBodyComponent>().Velocity += new Vector2((float)Math.Cos(a) * force, (float)Math.Sin(a) * force);
                a += (float)Math.PI;
                GetComponent <SensorBodyComponent>().Velocity += new Vector2((float)Math.Cos(a) * force, (float)Math.Sin(a) * force);
            }
        }
Ejemplo n.º 3
0
        public override void Setup(JsonValue settings)
        {
            base.Setup(settings);

            modifiers = Items.ParseUses(settings["modifiers"]);

            if (modifiers != null)
            {
                foreach (var m in modifiers)
                {
                    m.Item = Item;
                }
            }

            damage     = settings["damage"].Number(1);
            speed      = settings["speed"].Number(6);
            speedMax   = settings["speedm"].Number(10);
            range      = settings["range"].Number(0) * 0.5f;
            scaleMin   = settings["scale"].Number(1);
            scaleMax   = settings["scalem"].Number(1);
            slice      = settings["texture"].String("rect");
            toCursor   = settings["cursor"].Bool(false);
            toEnemy    = settings["tomb"].Bool(false);
            sfx        = settings["sfx"].String("item_gun_fire");
            sfx_number = settings["sfxn"].Int(0);
            ReloadSfx  = settings["rsfx"].Bool(false);
            manaUsage  = settings["mana"].Int(0);
            color      = settings["color"].String("");
            angleAdd   = settings["ang"].Number(0);

            if (manaUsage > 0)
            {
                manaDrop = settings["mdr"].Int(0);
            }

            if (slice == "default")
            {
                slice = "rect";
            }

            accuracy     = settings["accuracy"].Number(0).ToRadians();
            count        = settings["amount"].Int(1);
            prefab       = settings["prefab"].String("");
            light        = settings["light"].Bool(true);
            knockback    = settings["knockback"].Number(1);
            rect         = settings["rect"].Bool(false);
            wait         = settings["wait"].Bool(false);
            disableBoost = settings["dsb"].Bool(false);
            shells       = settings["shells"].Bool(true);
            emeralds     = settings["emeralds"].Bool(false);

            SpawnProjectile = (entity, item) => {
                if (manaUsage > 0)
                {
                    var mana = entity.GetComponent <ManaComponent>();

                    if (mana.Mana < manaUsage)
                    {
                        AnimationUtil.ActionFailed();
                        return;
                    }

                    mana.ModifyMana(-manaUsage);
                }

                if (emeralds)
                {
                    if (GlobalSave.Emeralds == 0)
                    {
                        AnimationUtil.ActionFailed();
                        TextParticle.Add(entity, Locale.Get("no_emeralds"));
                        return;
                    }

                    GlobalSave.Emeralds--;
                }

                var bad = entity is Creature c && !c.IsFriendly();
                var sl  = slice;

                if (bad)
                {
                    sl = "small";
                }

                entity.TryGetComponent <StatsComponent>(out var stats);

                if (sfx == "item_gun_fire")
                {
                    entity.GetComponent <AudioEmitterComponent>().EmitRandomizedPrefixed(sfx, 2, 0.5f, sz: 0.2f);
                }
                else
                {
                    if (sfx_number == 0)
                    {
                        entity.GetComponent <AudioEmitterComponent>().EmitRandomized(sfx, 0.5f, sz: 0.25f);
                    }
                    else
                    {
                        entity.GetComponent <AudioEmitterComponent>().EmitRandomizedPrefixed(sfx, sfx_number, 0.5f, sz: 0.25f);
                    }
                }

                var aim  = entity.GetComponent <AimComponent>();
                var from = toCursor ? entity.Center : aim.Center;
                var am   = toCursor ? entity.GetComponent <CursorComponent>().Cursor.GamePosition : aim.RealAim;

                if (toEnemy)
                {
                    var target = entity.Area.FindClosest(from, Tags.MustBeKilled, e => true);

                    if (target != null)
                    {
                        am = target.Center;
                    }
                }

                var a  = MathUtils.Angle(am.X - from.X, am.Y - from.Y);
                var pr = prefab.Length == 0 ? null : ProjectileRegistry.Get(prefab);
                var ac = accuracy;

                if (stats != null)
                {
                    ac /= stats.Accuracy;
                }

                var cnt      = count;
                var accurate = false;

                if (entity is Player pl)
                {
                    var e = new PlayerShootEvent {
                        Player = (Player)entity
                    };

                    entity.HandleEvent(e);

                    cnt     += e.Times - 1;
                    accurate = e.Accurate;

                    if (sl == "rect")
                    {
                        sl = pl.ProjectileTexture;
                    }
                }

                for (var i = 0; i < cnt; i++)
                {
                    var angle = a;

                    if (accurate)
                    {
                        angle += (i - (int)(cnt * 0.5f)) * 0.2f + Rnd.Float(-ac / 2f, ac / 2f);
                    }
                    else if (cnt == 1 || i > 0)
                    {
                        angle += Rnd.Float(-ac / 2f, ac / 2f);
                    }

                    angle += angleAdd * (float)Math.PI * 2;

                    var antiAngle  = angle - (float)Math.PI;
                    var projectile = Projectile.Make(entity, sl, angle, Rnd.Float(speed, speedMax), !rect, 0, null, Rnd.Float(scaleMin, scaleMax), damage * (item.Scourged ? 1.5f : 1f), Item);
                    projectile.Boost = !disableBoost;
                    projectile.Item  = item;

                    Camera.Instance.Push(antiAngle, 4f);
                    entity.GetComponent <RectBodyComponent>()?.KnockbackFrom(antiAngle, 0.4f * knockback);

                    var clr = bad ? Projectile.RedLight : ProjectileColor.Yellow;

                    if (!string.IsNullOrEmpty(color) && ProjectileColor.Colors.TryGetValue(color, out clr))
                    {
                        projectile.Color = clr;
                    }

                    if (light)
                    {
                        projectile.AddLight(32f, clr);
                    }

                    projectile.FlashTimer = 0.05f;

                    if (range > 0.01f)
                    {
                        if (Math.Abs(projectile.Range - (-1)) < 0.1f)
                        {
                            projectile.Range = range / speed;
                        }
                        else
                        {
                            projectile.Range += range / speed;
                        }
                    }

                    projectile.Center = from;

                    if (modifiers != null)
                    {
                        foreach (var m in modifiers)
                        {
                            if (m is ModifyProjectilesUse mpu)
                            {
                                mpu.ModifyProjectile(projectile);
                            }
                        }
                    }

                    pr?.Invoke(projectile);

                    if (wait && i == 0)
                    {
                        ProjectileDied = false;

                        if (prefab == "bk:axe")
                        {
                            projectile.OnDeath += (prj, e, t) => {
                                prj.OnDeath += (prj2, e2, t2) => ProjectileDied = true;
                            };
                        }
                        else
                        {
                            projectile.OnDeath += (prj, e, t) => ProjectileDied = true;
                        }
                    }

                    if (manaUsage > 0)
                    {
                        if (manaDrop == 0)
                        {
                            projectile.OnDeath += (prj, e, t) => {
                                PlaceMana(entity.Area, prj.Center);
                            };
                        }
                        else if (manaDrop == 1)
                        {
                            PlaceMana(entity.Area, entity.Center);
                        }
                        else
                        {
                            var where = entity.Center;

                            projectile.OnDeath += (prj, e, t) => {
                                PlaceMana(entity.Area, where);
                            };
                        }
                    }
                }

                if (shells)
                {
                    Timer.Add(() => {
                        var p = new ShellParticle(new Particle(Controllers.Destroy, new TexturedParticleRenderer {
                            Region = CommonAse.Particles.GetSlice("shell")
                        }));

                        p.Position = entity.Center;
                        p.Y       += Rnd.Float(-4, 10);

                        entity.Area.Add(p);

                        var f = (entity.CenterX > entity.GetComponent <CursorComponent>().Cursor.GamePosition.X ? 1 : -1);

                        p.Particle.Velocity =
                            new Vector2(f * Rnd.Float(40, 60), 0) + entity.GetAnyComponent <BodyComponent>().Velocity;

                        p.Particle.Angle         = 0;
                        p.Particle.Zv            = Rnd.Float(1.5f, 2.5f);
                        p.Particle.AngleVelocity = f * Rnd.Float(40, 70);

                        p.AddShadow();
                    }, 0.2f);
                }
            };
        }
Ejemplo n.º 4
0
        public override void Render(bool atBack, bool paused, float dt, bool shadow, int offset)
        {
            if (Hidden)
            {
                return;
            }

            var region = Item.Region;
            var owner  = Item.Owner;

            if (!atBack && !paused && !shadow)
            {
                var to = owner.GetComponent <AimComponent>().Aim;

                /*var dx = Nozzle.X - Origin.X;
                 * var dy = Nozzle.Y - Origin.Y;
                 *
                 * var a = MathUtils.Angle(dx, dy) + lastAngle;
                 * var d = MathUtils.Distance(dx, dy);
                 *
                 * to -= MathUtils.CreateVector(a, d);*/
                lastAngle = MathUtils.LerpAngle(lastAngle, owner.AngleTo(to) + Math.PI * 0.5f, dt * 24f);
            }

            var angle = atBack ? (float)Math.PI * (owner.GraphicsComponent.Flipped ? 0.25f : -0.25f) : (float)lastAngle;

            if (horizontal)
            {
                angle -= (float)Math.PI * 0.5f;
            }

            var pos = new Vector2(
                owner.CenterX + (owner.GraphicsComponent.Flipped ? -5 : 5) + (horizontal ? 0 : (region.Width / 2f) * (owner.GraphicsComponent.Flipped ? -1 : 1)),
                owner.CenterY + offset + (shadow ? owner.Height : 0)
                );

            var or     = Origin + new Vector2(0, currentMove);
            var fangle = shadow ? -angle : angle;
            var sc     = new Vector2(scale.X, shadow ? -scale.Y : scale.Y);

            if (!shadow && !atBack)
            {
                var dx = Nozzle.X - or.X;
                var dy = Nozzle.Y - or.Y;
                var a  = MathUtils.Angle(dx, dy) + angle;
                var d  = MathUtils.Distance(dx, dy);

                var aim = owner.GetComponent <AimComponent>();
                aim.Center = pos + MathUtils.CreateVector(a, d);

                d           = (aim.Aim - pos).Length();
                aim.RealAim = aim.Center + MathUtils.CreateVector(angle - (horizontal ? 0 : Math.PI / 2), d);
            }

            if (Item.Scourged)
            {
                var shader = Shaders.Entity;
                Shaders.Begin(shader);

                shader.Parameters["flash"].SetValue(1f);
                shader.Parameters["flashReplace"].SetValue(1f);
                shader.Parameters["flashColor"].SetValue(ItemGraphicsComponent.ScourgedColor);

                foreach (var d in MathUtils.Directions)
                {
                    Graphics.Render(region, pos + d, fangle, or, sc);
                }

                Shaders.End();
            }

            Graphics.Render(region, pos, fangle, or, sc);
        }
        public override void Render(bool shadow)
        {
            if (Hidden)
            {
                return;
            }

            var o = (shadow ? -1 : 1) * (offsets[Math.Min(offsets.Length - 1, Animation.Frame + Animation.StartFrame)] - 11);
            var s = GetComponent <StateComponent>().StateInstance;
            var w = !(s is Player.RollState || s is Player.SleepingState);
            var z = GetComponent <ZComponent>();

            // Render wings
            if (((Player)Entity).HasFlight)
            {
                var a = (float)(Math.Sin(Engine.Time * 5f) * 0.5f) * (shadow ? -1 : 1);

                if (!shadow)
                {
                    z.Z = -a * 3 + 4;
                }

                a -= (float)Math.PI / 4 * (shadow ? -1 : 1);
                var wy = shadow ? Entity.Height : 0;

                wy += GetComponent <ZComponent>().Z *(shadow ? 1 : -1);

                Graphics.Render(wing, Entity.Center + new Vector2(-1, wy), a, new Vector2(8),
                                shadow ? MathUtils.InvertY : Vector2.One);

                Graphics.Render(wing, Entity.Center + new Vector2(1, wy), -a, new Vector2(8),
                                shadow ? MathUtils.InvertXY : MathUtils.InvertX);
            }

            var g = shadow ? 0 : (int)z.Z;

            if (w)
            {
                GetComponent <WeaponComponent>().Render(shadow, o - g);
            }

            if (!shadow && InGameState.Multiplayer)
            {
                var pos    = Entity.Position + Offset;
                var shader = Shaders.Entity;
                Shaders.Begin(shader);

                shader.Parameters["flash"].SetValue(1f);
                shader.Parameters["flashReplace"].SetValue(1f);
                shader.Parameters["flashColor"].SetValue(Player.VectorTints[Entity.GetComponent <InputComponent>().Index]);

                foreach (var d in MathUtils.Directions)
                {
                    CallRender(pos + d, false);
                }

                Shaders.End();
            }

            var stopShader = StartShaders();

            SimpleRender(shadow);

            if (stopShader)
            {
                Shaders.End();
            }

            if (!shadow)
            {
                var aim = GetComponent <AimComponent>();

                if (aim.ShowLaserLine)
                {
                    var from    = aim.Center;
                    var to      = aim.RealAim;
                    var min     = 1f;
                    var closest = MathUtils.CreateVector(MathUtils.Angle(to.X - from.X, to.Y - from.Y), Display.UiWidth) + from;

                    Physics.World.RayCast((fixture, point, normal, fraction) => {
                        if (min > fraction && fixture.Body.UserData is BodyComponent b && RayShouldCollide(b.Entity))
                        {
                            min     = fraction;
                            closest = point;
                        }

                        return(min);
                    }, from, to);

                    Graphics.Batch.FillRectangle((int)closest.X - 1, (int)closest.Y - 1, 3, 3, AimLineColor);
                    Graphics.Batch.DrawLine(from, new Vector2((int)closest.X, (int)closest.Y), AimLineColor, 1);
                }
            }

            if (w)
            {
                GetComponent <ActiveWeaponComponent>().Render(shadow, o - g);
            }
        }
Ejemplo n.º 6
0
        public override void Render(bool atBack, bool paused, float dt, bool shadow, int offset)
        {
            if (Hidden)
            {
                return;
            }

            var s = dt * 10f;

            sx += (1 - sx) * s;
            sy += (1 - sy) * s;
            ox += (-ox) * s;
            oy += (-oy) * s;

            var region = Item.Region;
            var owner  = Item.Owner;

            var of      = owner.GraphicsComponent.Flipped;
            var flipped = false;

            var angle = MathUtils.Mod((of ? -Angle : Angle) + (atBack ? ((InvertBack ? -1 : 1) * (of ? -Math.PI / 4 : Math.PI / 4)) : lastAngle), Math.PI * 2);
            var vf    = angle > Math.PI * 0.5f && angle < Math.PI * 1.5f;

            if (!atBack && !paused && !shadow)
            {
                var to = owner.GetComponent <AimComponent>().Aim;

                /*var dx = Nozzle.X - Origin.X;
                 * var dy = Nozzle.Y - Origin.Y;
                 *
                 * if (vf) {
                 *      dy *= -1;
                 * }
                 *
                 * var a = MathUtils.Angle(dx, dy) + lastAngle - AddedAngle - SwingAngle;
                 * var d = MathUtils.Distance(dx, dy);
                 * to -= MathUtils.CreateVector(a, d);
                 *
                 * owner.GetComponent<AimComponent>().Aim = to;*/
                lastAngle = MathUtils.LerpAngle(lastAngle, owner.AngleTo(to), dt * 24f);
            }

            if (atBack)
            {
                flipped = !flipped;
            }
            else
            {
                angle += (SwingAngle + AddedAngle) * (of ? -1 : 1);
            }

            var pos    = new Vector2(owner.CenterX + (of ? -5 : 5), owner.CenterY + offset + (shadow ? owner.Height : 0));
            var or     = Origin + new Vector2(ox, oy);
            var sc     = new Vector2(flipped ? -sx : sx, (shadow ^ vf) ? -sy : sy);
            var fangle = (float)angle * (shadow ? -1 : 1);

            if (!shadow && !atBack)
            {
                var dx = Nozzle.X - or.X;
                var dy = Nozzle.Y - or.Y;

                if (vf)
                {
                    dy *= -1;
                }

                var a = MathUtils.Angle(dx, dy) + angle;
                var d = MathUtils.Distance(dx, dy);

                var aim = owner.GetComponent <AimComponent>();

                aim.Center = pos + MathUtils.CreateVector(a, d);

                d           = (aim.Aim - pos).Length();
                aim.RealAim = aim.Center + MathUtils.CreateVector(angle - AddedAngle - SwingAngle, d);
            }

            if (Item.Scourged)
            {
                var shader = Shaders.Entity;
                Shaders.Begin(shader);

                shader.Parameters["flash"].SetValue(1f);
                shader.Parameters["flashReplace"].SetValue(1f);
                shader.Parameters["flashColor"].SetValue(ItemGraphicsComponent.ScourgedColor);

                foreach (var d in MathUtils.Directions)
                {
                    Graphics.Render(region, pos + d, fangle, or, sc);
                }

                Shaders.End();
            }

            Graphics.Render(region, pos, fangle, or, sc);
        }