Пример #1
0
            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);
                    }
                }
            }
Пример #2
0
        public override bool HandleEvent(Event e)
        {
            if (e is ProjectileCreatedEvent pce)
            {
                pce.Projectile.Controller += SlowdownProjectileController.Make(amount, time);
            }

            return(base.HandleEvent(e));
        }
Пример #3
0
            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);
            }
Пример #4
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;
                    }
                };
            }
Пример #5
0
        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;
            });
Пример #6
0
            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>();
                    }
                }
            }