Esempio n. 1
0
            public override void Update(float dt)
            {
                base.Update(dt);

                if (Self.Target != null)
                {
                    Self.GraphicsComponent.Flipped = Self.Target.CenterX < Self.CenterX;
                }

                if (!tweened && T >= delay - 0.4f)
                {
                    tweened = true;
                    Self.GetComponent <MobAnimationComponent>().Animate();
                }

                if (T >= delay && Self.CanSeeTarget())
                {
                    var p = new ProjectilePattern(KeepShapePattern.Make(Rnd.Chance() ? -4 : 4))
                    {
                        Position = Self.Center
                    };

                    Self.Area.Add(p);
                    var sa    = Rnd.AnglePI();
                    var count = 5;

                    for (var i = 0; i < count; i++)
                    {
                        var i1 = i;

                        Timer.Add(() => {
                            var a  = (float)Math.PI * i1 / (count * 0.5f) + sa;
                            var pr = Projectile.Make(Self, "small");

                            pr.CanBeReflected = false;
                            pr.Color          = Self.color;
                            pr.AddLight(32, Self.color);

                            pr.CanBeReflected      = false;
                            pr.BodyComponent.Angle = a;

                            pr.Center = Self.Center + MathUtils.CreateVector(a, 12);

                            p.Add(pr);
                            Self.GetComponent <AudioEmitterComponent>().EmitRandomized("mob_fire");

                            if (i1 == count - 1)
                            {
                                p.Launch(Self.Target == null ? Rnd.AnglePI() : Self.AngleTo(Self.Target), 80);
                            }
                        }, i * 0.1f);
                    }

                    Become <TeleportState>();
                }
            }
Esempio n. 2
0
            public override void Update(float dt)
            {
                base.Update(dt);

                if (Self.target.Done || Self.target.HasComponent <OwnerComponent>())
                {
                    Self.target = null;
                    Self.Become <IdleState>();
                    return;
                }

                var dx = Self.DxTo(Self.target);
                var dy = Self.DyTo(Self.target);
                var d  = MathUtils.Distance(dx, dy);

                var b = Self.GetComponent <SensorBodyComponent>().Body;
                var s = 360 * dt / d;

                b.LinearVelocity += new Vector2(dx * s, dy * s);
            }
Esempio n. 3
0
        public override void Update(float dt)
        {
            if (Delay > 0)
            {
                Delay -= dt;
                return;
            }

            T += dt;

            if (T > 0.3f)
            {
                if (Run.Level != null && Run.Level.Biome is CaveBiome)
                {
                    R = Math.Max(0, R - dt * 3 * Mod);
                    G = Math.Max(0, G - dt * 0.3f * Mod);
                    B = Math.Max(0, B - dt * Mod);
                }
                else
                {
                    R = Math.Max(0, R - dt * 0.3f * Mod);
                    G = Math.Max(0, G - dt * Mod);
                    B = Math.Max(0, B - dt * 3 * Mod);
                }
            }

            if (Growing)
            {
                Scale += dt;

                if (Scale >= ScaleTar)
                {
                    Scale   = ScaleTar;
                    Growing = false;
                }
            }
            else
            {
                Scale -= dt * (Target.HasValue ? 0.33f : 0.5f);

                if (Scale <= 0)
                {
                    Done = true;
                    return;
                }
            }

            Vy += dt * Mod * 20;

            if (Target.HasValue)
            {
                var t = Target.Value;

                var dx = t.X - Position.X - Offset.X;
                var dy = t.Y - Position.Y - Offset.Y;
                var d  = MathUtils.Distance(Vx, Vy) + dt * 30;

                var angle = Math.Atan2(dy, dx);
                var va    = Math.Atan2(-Vy, -Vx);

                va = MathUtils.LerpAngle(va, angle, dt * 4);

                Vx = (float)-Math.Cos(va) * d;
                Vy = (float)-Math.Sin(va) * d;
            }

            Offset.X -= Vx * dt;
            Offset.Y -= Vy * dt;

            if (Owner != null)
            {
                X = Owner.CenterX;
                Y = Owner.Bottom;

                if (Owner.TryGetComponent <ZComponent>(out var z))
                {
                    Y -= z.Z;
                }
            }

            if (Hurts)
            {
                GetComponent <CircleBodyComponent>().Position = Position + Offset;
            }
        }