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>(); } }
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); }
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; } }