public override void Init() { base.Init(); Self.counter++; if (Self.counter > 2) { Self.counter = 0; for (var i = 0; i < 10; i++) { Timer.Add(() => { var projectile = Projectile.Make(Self, "small", Rnd.AnglePI(), Rnd.Float(1, 9)); projectile.Color = ProjectileColor.Green; projectile.Center = Self.Center; projectile.Spectral = true; projectile.BreaksFromWalls = false; projectile.Depth = Layers.Wall + 1; projectile.Controller += SlowdownProjectileController.Make(Rnd.Float(1f, 2f)); projectile.AddLight(32f, Projectile.GreenLight); }, i * 0.1f); } } }
public override bool HandleEvent(Event e) { if (e is ProjectileCreatedEvent pce) { pce.Projectile.Controller += SlowdownProjectileController.Make(amount, time); } return(base.HandleEvent(e)); }
public override void Update(float dt) { base.Update(dt); var body = Self.GetComponent <RectBodyComponent>(); if ((Self.CenterX - x) * sign >= -16) { body.Velocity -= body.Velocity * (dt * 2); delay -= dt; if (delay <= 0) { Become <IdleState>(); } return; } if (!Self.InFirstPhase) { lastBullet -= dt; if (lastBullet <= 0) { lastBullet = 0.2f; var a = (sign < 0 ? Math.PI : 0) + Rnd.Float(-1f, 1f); var p = Projectile.Make(Self, "circle", a, Rnd.Float(3f, 10f), scale: Rnd.Float(0.6f, 2f)); p.Color = ProjectileColor.Orange; p.BounceLeft = 5; p.Controller += SlowdownProjectileController.Make(0.25f); p.AddLight(64f, ProjectileColor.Orange); Self.GetComponent <AudioEmitterComponent>().EmitRandomized("mob_bee_shot"); } } Self.X += sign * dt * 360; body.Velocity += new Vector2(sign * dt * 3600, 0); }
public override void Init() { base.Init(); Self.GetComponent <AudioEmitterComponent>().Emit("mob_hive_breaking"); Self.tree = null; var y = Self.Y; var c = Self.GetComponent <MobAnimationComponent>(); Tween.To(0, c.ShadowOffset, x => c.ShadowOffset = x, 0.4f, Ease.QuadIn); Tween.To(y + ZHeight, y, x => Self.Y = x, 0.4f, Ease.QuadIn).OnEnd = () => { Audio.PlaySfx("mob_hive_release"); Self.AnimateDeath(null); Self.GetComponent <AudioEmitterComponent>().StopAll(); var am = 16; for (var i = 0; i < am; i++) { var a = Math.PI * 2 * (((float)i) / am) + Rnd.Float(-1f, 1f); var p = Projectile.Make(Self, "circle", a, Rnd.Float(3f, 10f), scale: Rnd.Float(0.4f, 1f)); p.Color = ProjectileColor.Orange; p.BounceLeft = 5; p.Controller += SlowdownProjectileController.Make(0.25f, 0.5f, 1f); } for (var i = 0; i < Rnd.Int(4, 10); i++) { var bee = GenerateBee(); Self.Area.Add(bee); bee.Center = Self.Center; } }; }
static ProjectileRegistry() { Add("skull", skull => { skull.NearDeath += p => { var c = new AudioEmitterComponent { DestroySounds = false }; p.AddComponent(c); c.Emit("mob_oldking_explode"); }; skull.OnDeath += (p, e, t) => { for (var i = 0; i < 8; i++) { var bullet = Projectile.Make(p.Owner, "small", ((float)i) / 4 * (float)Math.PI, (i % 2 == 0 ? 2 : 1) * 4 + 3); bullet.CanBeReflected = false; bullet.Center = p.Center; } }; skull.Controller += TargetProjectileController.Make(null, 0.5f); skull.Range = 5f; skull.IndicateDeath = true; skull.CanBeReflected = false; skull.GetComponent <ProjectileGraphicsComponent>().IgnoreRotation = true; }); Add("disk", p => { CollisionFilterComponent.Add(p, (entity, with) => with is Mob || with is HalfProjectileLevel ? CollisionResult.Disable : CollisionResult.Default); p.BounceLeft += 10; p.CanHitOwner = true; p.GetComponent <CircleBodyComponent>().Body.AngularVelocity = 10f; }); Add("what", p => { p.Controller += WhatController.Make(); p.GetComponent <CircleBodyComponent>().Body.AngularVelocity = 10f; }); Add("soap", p => { p.Controller += SlowdownProjectileController.Make(2); }); Add("grenade", p => { CollisionFilterComponent.Add(p, (entity, with) => { if (with is Mob) { p.BounceLeft = 0; return(CollisionResult.Enable); } return(CollisionResult.Default); }); p.Controller += SlowdownProjectileController.Make(1); p.BreaksFromWalls = false; p.OnDeath += (pr, e, t) => { ExplosionMaker.Make(pr, 16, damage: 8); }; p.Controller += (pr, dt) => { if (pr.T >= 3f) { pr.Break(); } }; }); Add("missile", p => { CollisionFilterComponent.Add(p, (entity, with) => { if (with is Mob) { p.BounceLeft = 0; return(CollisionResult.Enable); } if (with is Prop) { return(CollisionResult.Disable); } return(CollisionResult.Default); }); p.Controller += TargetProjectileController.Make(null, 0.5f); p.Controller += SmokeProjectileController.Make(); p.OnDeath += (pr, e, t) => { ExplosionMaker.Make(pr, 32); }; }); Add("shotgun", p => { p.Controller += SlowdownProjectileController.Make(1); p.BounceLeft += 1; }); Add("follower", p => { CollisionFilterComponent.Add(p, (entity, with) => { if (with is Mob) { p.BounceLeft = 0; return(CollisionResult.Enable); } if (with is Prop) { return(CollisionResult.Disable); } return(CollisionResult.Default); }); p.Controller += TargetProjectileController.MakeCursor(); p.Controller += SmokeProjectileController.Make(); p.OnDeath += (pr, e, t) => { ExplosionMaker.Make(pr, 32); }; }); Add("flak", p => { CollisionFilterComponent.Add(p, (entity, with) => { if (with is Mob) { p.BounceLeft = 0; return(CollisionResult.Enable); } return(CollisionResult.Default); }); p.Controller += SlowdownProjectileController.Make(0.5f); p.OnDeath += (pr, e, t) => { for (var i = 0; i < 8; i++) { var pr2 = Projectile.Make(pr.Owner, "shot", (float)i / 8 * (float)Math.PI * 2, 8, true, 0, null, 0.8f); pr2.Center = pr.Center; pr2.Controller += SlowdownProjectileController.Make(1); } }; p.Controller += (pr, dt) => { if (pr.T >= 1f) { pr.Break(); } }; }); Add("crash", p => { p.Controller += HsvProjectileController.Make(); p.OnDeath += (pr, ee, t) => { if (pr.T < 0.1f) { return; } for (var i = 0; i < 8; i++) { var p2 = Projectile.Make(pr.Owner, "square", (float)i / 8 * (float)Math.PI * 2, 8, true, 0, null, 0.8f); p2.Center = pr.Center; p2.Controller += HsvProjectileController.Make(1, pr.T); p2.OnDeath += (pr2, eee, t2) => { if (pr2.T < 0.1f) { return; } for (var j = 0; j < 8; j++) { var p3 = Projectile.Make(pr.Owner, "square", (float)j / 8 * (float)Math.PI * 2, 12, true, 0, null, 0.6f); p3.Center = pr2.Center; p3.Controller += HsvProjectileController.Make(1, p2.T); p3.OnDeath += (pr4, eeee, t4) => { if (pr4.T < 0.1f) { return; } for (var k = 0; k < 8; k++) { var p5 = Projectile.Make(pr.Owner, "square", (float)k / 8 * (float)Math.PI * 2, 24, true, 0, null, 0.3f); p5.Center = pr4.Center; p5.Controller += HsvProjectileController.Make(1, pr4.T); } }; } }; } }; }); Add("duck", p => { CollisionFilterComponent.Add(p, (entity, with) => with is Mob || with is Prop ? CollisionResult.Disable : CollisionResult.Default); }); Add("portal", p => { p.Center = p.Owner.GetComponent <CursorComponent>().Cursor.GamePosition; p.GetAnyComponent <BodyComponent>().Velocity *= -1; }); Add("axe", p => { CollisionFilterComponent.Add(p, (entity, with) => ((with is Creature && with != p.Owner) || ((Projectile)entity).BounceLeft == 0) ? CollisionResult.Disable : CollisionResult.Default); var ts = Timer.Add(() => { p.Item.Renderer.Hidden = false; foreach (var u in p.Item.Uses) { if (u is SimpleShootUse ss) { ss.ProjectileDied = true; break; } } }, 3f); p.Range = 5; p.PreventSpectralBreak = true; p.OnCollision = (projectile, e) => { if (Run.Level.Biome is IceBiome && e is ProjectileLevelBody lvl) { if (lvl.Break(projectile.CenterX, projectile.CenterY)) { AudioEmitterComponent.Dummy(projectile.Area, projectile.Center).EmitRandomizedPrefixed("level_snow_break", 3); } } if (projectile.BounceLeft == 0) { if (e == projectile.Owner) { projectile.Item.Renderer.Hidden = false; projectile.Break(); foreach (var u in projectile.Item.Uses) { if (u is SimpleShootUse ss) { ss.ProjectileDied = true; break; } } } else if (!(e is Mob)) { return(true); } } else if (projectile.BreaksFrom(e, null)) { if (e is Painting || e is BreakableProp || e is ExplodingBarrel || e.HasComponent <HealthComponent>()) { projectile.BounceLeft++; } else { var b = projectile.GetComponent <RectBodyComponent>().Body; b.LinearVelocity *= -1; projectile.BounceLeft = 0; projectile.EntitiesHurt.Clear(); projectile.Controller += ReturnProjectileController.Make(projectile.Owner); var pi = projectile.OnDeath; projectile.OnDeath = (pr, ee, t) => { pr.Item.Renderer.Hidden = false; foreach (var u in pr.Item.Uses) { if (u is SimpleShootUse ss) { ss.ProjectileDied = true; break; } } ts.Cancel(); pr.Owner.GetComponent <AudioEmitterComponent>().EmitRandomized("item_axe_catch"); }; pi?.Invoke(projectile, e, false); return(true); } } return(false); }; p.BounceLeft = 1; p.DieOffscreen = false; p.Rotates = true; p.Item.Renderer.Hidden = true; });
public override void Update(float dt) { base.Update(dt); if (T >= 1f) { T = 0; count++; var a = Self.AngleTo(Self.Target) + Rnd.Float(-0.1f, 0.1f) + (count == 1 ? 0 : Math.PI); var projectile = Projectile.Make(Self, "square", a, 15f); Self.Animate(); projectile.Color = ProjectileColor.Red; projectile.AddLight(32f, projectile.Color); projectile.Center += MathUtils.CreateVector(a, 8); projectile.CanBeBroken = false; projectile.CanBeReflected = false; var tt = 0f; projectile.Controller += (p, dtt) => { tt += dtt; if (tt >= 0.3f) { tt = 0; var s = projectile.BodyComponent.Velocity.Length(); if (s < 3f) { return; } var z = Projectile.Make(Self, "small", a - Math.PI + Rnd.Float(-0.1f, 0.1f), s, scale: Rnd.Float(0.8f, 1.2f)); z.Center = projectile.Center; } }; projectile.Controller += SlowdownProjectileController.Make(); projectile.Range = 5f; projectile.IndicateDeath = true; projectile.OnDeath += (p, e, t) => { for (var i = 0; i < SmallCount; i++) { var an = (float)(((float)i) / SmallCount * Math.PI * 2); var pp = new ProjectilePattern(CircleProjectilePattern.Make(4.5f, 10 * (i % 2 == 0 ? 1 : -1))) { Position = p.Center }; for (var j = 0; j < 4; j++) { var b = Projectile.Make(Self, "small"); pp.Add(b); b.Color = ProjectileColor.Red; b.AddLight(32f, b.Color); b.CanBeReflected = false; } pp.Launch(an, 40); Self.Area.Add(pp); } for (var i = 0; i < InnerCount; i++) { var b = Projectile.Make(Self, "snowflake", Rnd.AnglePI(), Rnd.Float(10, 40), true, 1, null, Rnd.Float(0.5f, 1f)); b.Color = ProjectileColor.Cyan; b.Center = p.Center; b.CanBeReflected = false; b.Controller += SlowdownProjectileController.Make(Rnd.Float(0.5f, 4f)); } }; if (count == 2) { Become <IdleState>(); } } }