public DreamBlockDebris Init(Vector2 pos, DreamBlockDummy block = null)
        {
            orig_Init(pos, '1');

            Block = block ?? new DreamBlockDummy(this);
            Image image = baseData.Get <Image>("image");

            Remove(image);
            Sprite sprite = new Sprite(GFX.Game, "objects/CommunalHelper/dreamMoveBlock/");
            float  speed  = Calc.Random.NextFloat(0.3f) + 0.1f;

            sprite.AddLoop("active", "debris", speed);
            sprite.AddLoop("disabled", "disabledDebris", speed);
            sprite.CenterOrigin();
            sprite.Color    = image.Color;
            sprite.Rotation = image.Rotation;
            sprite.Scale    = image.Scale;
            sprite.FlipX    = image.FlipX;
            sprite.FlipY    = image.FlipY;

            Add(sprite);
            sprite.Play(Block.PlayerHasDreamDash ? "active" : "disabled", randomizeFrame: true);
            baseData["image"] = this.sprite = sprite;

            if (Calc.Random.Next(4) == 0)
            {
                activePointColor   = Calc.Random.Choose(activeParticleColors);
                disabledPointColor = Color.LightGray * (0.5f + Calc.Random.Choose(0, 1, 1, 2, 2, 2) / 2f * 0.5f);
                pointOffset        = new Vector2(Calc.Random.Next(-2, 2), Calc.Random.Next(-2, 2));
            }

            return(this);
        }
Пример #2
0
        public TemporaryKey(EntityData data, Vector2 offset, EntityID id) : base(data.Position + offset, id, data.NodesOffset(offset))
        {
            this.follower = Get <Follower>();
            // Create sprite
            DynData <Key> dyndata = new DynData <Key>(this);

            sprite = dyndata.Get <Sprite>("sprite");
            Remove(sprite);
            sprite         = new Sprite(GFX.Game, data.Attr("directory", "collectables/FrostHelper/keytemp") + "/");
            sprite.Justify = new Vector2(0.5f, 0.5f);
            sprite.AddLoop("idle", "idle", 0.1f);
            sprite.AddLoop("enter", "enter", 0.1f);
            sprite.Play("idle");
            Add(sprite);
            dyndata.Set("sprite", sprite);
            Follower follower = this.follower;

            follower.OnLoseLeader          = (Action)Delegate.Combine(follower.OnLoseLeader, new Action(Dissolve));
            this.follower.PersistentFollow = false; // was false
            Add(new TransitionListener
            {
                OnOut = delegate(float f)
                {
                    StartedUsing = false;
                    if (!IsUsed)
                    {
                        Dissolve();
                    }
                }
            });
        }
Пример #3
0
 private void SetCrystalHeartSprite(On.Celeste.HeartGem.orig_Awake orig, HeartGem self, Scene scene)
 {
     orig(self, scene);
     if (!self.IsGhost && !self.IsFake)
     {
         var meta = GetModeMetaForAltSide(AreaData.Get((scene as Level).Session.Area));
         if (meta != null)
         {
             var selfdata = new DynData <HeartGem>(self);
             var sprite   = new Sprite(GFX.Game, meta.InWorldHeartIcon);
             sprite.CenterOrigin();
             sprite.AddLoop("idle", "", 0, new int[] { 0 });
             sprite.AddLoop("spin", "", 0.1f, new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 });
             sprite.AddLoop("fastspin", "", 0.1f);
             sprite.CenterOrigin();
             sprite.OnLoop = delegate(string anim) {
                 if (self.Visible && anim == "spin" && (bool)selfdata["autoPulse"])
                 {
                     Audio.Play("event:/game/general/crystalheart_pulse", self.Position);
                     self.ScaleWiggler.Start();
                     (scene as Level).Displacement.AddBurst(self.Position, 0.35f, 8f, 48f, 0.25f);
                 }
             };
             sprite.Play("spin");
             self.ScaleWiggler.RemoveSelf();
             self.ScaleWiggler = Wiggler.Create(0.5f, 4f, delegate(float f) {
                 sprite.Scale = Vector2.One * (1f + f * 0.25f);
             });
             self.Add(self.ScaleWiggler);
             ((Component)selfdata["sprite"]).RemoveSelf();
             selfdata["sprite"] = sprite;
             self.Add(sprite);
         }
     }
 }
Пример #4
0
        private void SetCrystalHeartSprite(On.Celeste.HeartGem.orig_Awake orig, HeartGem self, Scene scene)
        {
            orig(self, scene);
            if (!self.IsFake)
            {
                var data = AreaData.Get((scene as Level).Session.Area);
                var meta = GetModeMetaForAltSide(data);
                if (meta != null)
                {
                    Logger.Log("AltSidesHelper", $"In-world heart customisation: found metadata for \"{data.SID}\".");
                    if (meta.OverrideHeartTextures)
                    {
                        Logger.Log("AltSidesHelper", $"Replacing crystal heart texture for \"{data.SID}\".");
                        var selfdata = new DynData <HeartGem>(self);
                        if (!self.IsGhost)
                        {
                            var sprite = new Sprite(GFX.Game, meta.InWorldHeartIcon);
                            sprite.CenterOrigin();
                            sprite.AddLoop("idle", "", 0, new int[] { 0 });
                            sprite.AddLoop("spin", "", 0.1f, new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 });
                            sprite.AddLoop("fastspin", "", 0.1f);
                            sprite.CenterOrigin();
                            sprite.OnLoop = delegate(string anim) {
                                if (self.Visible && anim == "spin" && (bool)selfdata["autoPulse"])
                                {
                                    Audio.Play("event:/game/general/crystalheart_pulse", self.Position);
                                    self.ScaleWiggler.Start();
                                    (scene as Level).Displacement.AddBurst(self.Position, 0.35f, 8f, 48f, 0.25f);
                                }
                            };
                            sprite.Play("spin");
                            self.ScaleWiggler.RemoveSelf();
                            self.ScaleWiggler = Wiggler.Create(0.5f, 4f, delegate(float f) {
                                sprite.Scale = Vector2.One * (1f + f * 0.25f);
                            });
                            self.Add(self.ScaleWiggler);
                            ((Component)selfdata["sprite"]).RemoveSelf();
                            selfdata["sprite"] = sprite;
                            self.Add(sprite);
                        }

                        var colour = Calc.HexToColor(meta.HeartColour);
                        selfdata["shineParticle"] = new ParticleType(HeartGem.P_BlueShine)
                        {
                            Color = colour
                        };

                        selfdata.Get <VertexLight>("light").RemoveSelf();
                        var newLight = new VertexLight(Color.Lerp(colour, Color.White, 0.5f), 1f, 32, 64);
                        self.Add(newLight);
                        selfdata["light"] = newLight;
                    }
                }
            }
        }
Пример #5
0
        private void CreateSecretSprite()
        {
            string id     = "secret_" + Enum.GetNames(typeof(SpriteStyle))[(int)spriteStyle].ToLower();
            Sprite sprite = new Sprite(GFX.Game, "decals/6-reflection/" + id);

            sprite.AddLoop(id, "", 0.1f);
            sprite.Play(id);
            sprite.CenterOrigin();

            Vector2 offset = Vector2.UnitY * -8;

            if (spriteStyle != SpriteStyle.EyeBat)
            {
                offset = Vector2.UnitY * -16;
            }

            sprite.RenderPosition += offset;

            sprite.Scale.X *= -(int)facing;
            if (spriteStyle == SpriteStyle.Towerfall)
            {
                sprite.Scale.X = -sprite.Scale.X;
            }

            Add(sprite);
        }
Пример #6
0
        public Lamp(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            flag       = data.Attr("flag", "");
            id         = data.ID;
            baseColor  = ColorHelper.GetColor(data.Attr("baseColor", "White"));
            lightColor = ColorHelper.GetColor(data.Attr("lightColor", "White"));

            Add((Component)(startupSprite = new Sprite(GFX.Game, "objects/pandorasBox/lamp/start")));
            startupSprite.AddLoop("start", "", 0.1f);
            startupSprite.JustifyOrigin(0.5f, 0.5f);
            startupSprite.Play("start");
            startupSprite.OnLastFrame = onLastFrame;
            startupSprite.Stop();

            Add((Component)(idleSprite = new Sprite(GFX.Game, "objects/pandorasBox/lamp/idle")));
            idleSprite.AddLoop("idle", "", 0.125f);
            idleSprite.JustifyOrigin(0.5f, 0.5f);
            idleSprite.Play("idle");
            idleSprite.Visible = false;

            Add((Component)(baseSprite = new Sprite(GFX.Game, "objects/pandorasBox/lamp/base")));
            baseSprite.AddLoop("base", "", 0.1f);
            baseSprite.JustifyOrigin(0.5f, 0.5f);
            baseSprite.Play("base");
            baseSprite.SetColor(baseColor);

            inStartupAnimation = false;

            Add((Component)(bloom = new BloomPoint(0.5f, 8f)));
            Add((Component)(light = new VertexLight(lightColor, 1f, 48, 64)));

            bloom.Visible = light.Visible = false;

            Depth = 5;
        }
Пример #7
0
        public Bubbler(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            visible  = data.Bool("visible", false);
            Collider = new Hitbox(14f, 14f, 0f, 0f);
            Collider.CenterOrigin();
            Add(new PlayerCollider(new Action <Player>(OnPlayer), null, null));
            color = ColorHelper.GetColor(data.Attr("color", "White"));

            nodes = data.NodesOffset(offset);

            if (visible)
            {
                Add(sprite = new Sprite(GFX.Game, "objects/FrostHelper/bubble"));
                sprite.AddLoop("idle", "", 0.1f);
                sprite.CenterOrigin();
                sprite.Play("idle", false, false);
                sprite.SetColor(color);
                Add(previewSprite = new Sprite(GFX.Game, "objects/FrostHelper/bubble"));
                previewSprite.AddLoop("idle", "", 0.1f);
                previewSprite.CenterOrigin();
                previewSprite.Play("idle", false, false);
                previewSprite.Position = nodes.Last() - Position;
                previewSprite.SetColor(new Color(color.R, color.G, color.B, 128f) * 0.3f);
            }
        }
        public ReskinnableStarRotateSpinner(EntityData data, Vector2 offset) : base(data, offset)
        {
            string[] particleColorsAsStrings = data.Attr("particleColors", "EA64B7|3EE852,67DFEA|E85351,EA582C|33BDE8").Split(',');
            trailParticles = new ParticleType[particleColorsAsStrings.Length];
            for (int i = 0; i < particleColorsAsStrings.Length; i++)
            {
                string[] colors = particleColorsAsStrings[i].Split('|');
                trailParticles[i] = new ParticleType(StarTrackSpinner.P_Trail[0])
                {
                    Color  = Calc.HexToColor(colors[0]),
                    Color2 = Calc.HexToColor(colors[1])
                };
            }

            colorID = Calc.Random.Next(0, particleColorsAsStrings.Length);

            Add(sprite = new Sprite(GFX.Game, data.Attr("spriteFolder", "danger/MaxHelpingHand/starSpinner") + "/"));
            for (int i = 0; i < particleColorsAsStrings.Length; i++)
            {
                sprite.AddLoop($"idle{i}", $"idle{i}_", 0.08f);
                sprite.Add($"spin{i}", $"spin{i}_", 0.06f, $"idle{(i + 1) % particleColorsAsStrings.Length}");
            }
            sprite.CenterOrigin();
            sprite.Play($"idle{colorID}");

            Depth = -50;
            Add(new MirrorReflection());
        }
        public override void Awake(Scene scene)
        {
            base.Awake(scene);

            // clean up all visuals for the jumpthru
            List <Component> componentsToRemove = new List <Component>();

            foreach (Component component in this)
            {
                if (component is Image)
                {
                    componentsToRemove.Add(component);
                }
            }
            foreach (Component toRemove in componentsToRemove)
            {
                toRemove.RemoveSelf();
            }

            for (int i = 0; i < columns; i++)
            {
                Sprite jumpthruSprite = new Sprite(GFX.Game, "objects/jumpthru/" + animationPath);
                jumpthruSprite.AddLoop("idle", "", animationDelay);
                jumpthruSprite.X = i * 8;
                jumpthruSprite.Play("idle");
                Add(jumpthruSprite);
            }
        }
Пример #10
0
 public KevinRefill(Vector2 position)
     : base(position)
 {
     base.Collider = new Hitbox(16f, 16f, -8f, -8f);
     base.Add(new PlayerCollider(OnPlayer, null, null));
     base.Add(outline = new Image(GFX.Game["objects/refill/outline"]));
     outline.CenterOrigin();
     outline.Visible = false;
     base.Add(sprite = new Sprite(GFX.Game, "objects/refill/idle"));
     sprite.AddLoop("idle", "", 0.1f);
     sprite.Play("idle", false, false);
     sprite.CenterOrigin();
     base.Add(flash = new Sprite(GFX.Game, "objects/refill/flash"));
     flash.Add("flash", "", 0.05f);
     flash.OnFinish = delegate
     {
         flash.Visible = false;
     };
     flash.CenterOrigin();
     base.Add(wiggler = Wiggler.Create(1f, 4f, delegate(float v)
     {
         sprite.Scale = (flash.Scale = Vector2.One * (1f + v * 0.2f));
     }, false, false));
     base.Add(new MirrorReflection());
     base.Add(bloom = new BloomPoint(0.8f, 16f));
     base.Add(light = new VertexLight(Color.White, 1f, 16, 48));
     base.Add(sine  = new SineWave(0.6f));
     sine.Randomize();
     UpdateY();
     base.Depth = -100;
 }
Пример #11
0
        public override void Awake(Scene scene)
        {
            base.Awake(scene);

            if ((ghost && sprite != "ghostberry/seed") || (!ghost && sprite != "strawberry/seed"))
            {
                // the sprite is non-default. replace it.
                Sprite vanillaSprite = selfStrawberrySeed.Get <Sprite>("sprite");

                // build the new sprite.
                MTexture frame0 = GFX.Game["collectables/" + sprite + "00"];
                MTexture frame1 = GFX.Game["collectables/" + sprite + "01"];

                Sprite modSprite = new Sprite(GFX.Game, sprite);
                modSprite.CenterOrigin();
                modSprite.Justify = new Vector2(0.5f, 0.5f);
                modSprite.AddLoop("idle", 0.1f, new MTexture[] {
                    frame0, frame0, frame0, frame0, frame0, frame0, frame0, frame0, frame0, frame0,
                    frame0, frame0, frame0, frame0, frame0, frame0, frame0, frame0, frame0, frame1
                });
                modSprite.AddLoop("noFlash", 0.1f, new MTexture[] { frame0 });

                // copy over the values from the vanilla sprite
                modSprite.Position      = vanillaSprite.Position;
                modSprite.Color         = vanillaSprite.Color;
                modSprite.OnFrameChange = vanillaSprite.OnFrameChange;
                modSprite.Play("idle");
                modSprite.SetAnimationFrame(vanillaSprite.CurrentAnimationFrame);

                // and replace it for good
                Remove(vanillaSprite);
                Add(modSprite);
                selfStrawberrySeed["sprite"] = modSprite;
            }

            if (spawnedAsFollower)
            {
                player.Leader.GainFollower(selfStrawberrySeed.Get <Follower>("follower"));
                canLoseTimerMirror = 0.25f;
                Collidable         = false;
                Depth = -1000000;
                AddTag(Tags.Persistent);
            }

            // get a reference to the sprite. this will be used to "cut out" the lighting renderer.
            spriteObject = selfStrawberrySeed.Get <Sprite>("sprite");
        }
 protected override bool TryCreateCustomSprite(out Sprite sprite)
 {
     sprite = new Sprite(GFX.Game, "objects/CommunalHelper/dreamRefill/idle");
     sprite.AddLoop("idle", "", 0.1f);
     sprite.Play("idle");
     sprite.CenterOrigin();
     return(true);
 }
Пример #13
0
        public RespawningJellyfish(EntityData data, Vector2 offset) : base(data, offset)
        {
            if (P_NotGlow == null)
            {
                // P_NotGlow is a transparent particle.
                P_NotGlow = new ParticleType(P_Glow)
                {
                    Color  = Color.Transparent,
                    Color2 = Color.Transparent
                };
            }

            respawnTime     = data.Float("respawnTime");
            bubble          = data.Bool("bubble");
            initialPosition = Position;
            respawning      = false;

            // get the sprite, and replace it depending on the path in entity properties.
            self   = new DynData <Glider>(this);
            sprite = self.Get <Sprite>("sprite");
            new DynData <Sprite>(sprite)["atlas"] = GFX.Game;
            sprite.Path = data.Attr("spriteDirectory", defaultValue: "objects/MaxHelpingHand/glider") + "/";
            sprite.Stop();
            sprite.ClearAnimations();
            sprite.AddLoop("idle", "idle", 0.1f);
            sprite.AddLoop("held", "held", 0.1f);
            sprite.Add("fall", "fall", 0.06f, "fallLoop");
            sprite.AddLoop("fallLoop", "fallLoop", 0.06f);
            sprite.Add("death", "death", 0.06f);
            sprite.Add("respawn", "respawn", 0.03f, "idle");
            sprite.Play("idle");

            // make the jelly go invisible when the death animation is done.
            sprite.OnFinish += anim => {
                if (anim == "death")
                {
                    Visible = false;
                }
            };

            // listen for transitions: if the jelly is carried to another screen, it should not respawn anymore.
            Add(new TransitionListener()
            {
                OnOutBegin = () => shouldRespawn = false
            });
        }
        public GenericCustomBooster(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            Depth    = -8500;
            Collider = new Circle(10f, 0f, 2f);
            sprite   = new Sprite(GFX.Game, data.Attr("directory", "objects/FrostHelper/blueBooster/"))
            {
                Visible = true
            };
            sprite.CenterOrigin();
            sprite.Justify = new Vector2(0.5f, 0.5f);
            sprite.AddLoop("loop", "booster", 0.1f, 0, 1, 2, 3, 4);
            sprite.AddLoop("inside", "booster", 0.1f, 5, 6, 7, 8);
            sprite.AddLoop("spin", "booster", 0.06f, 18, 19, 20, 21, 22, 23, 24, 25);
            sprite.Add("pop", "booster", 0.08f, 9, 10, 11, 12, 13, 14, 15, 16, 17);
            sprite.Play("loop", false);
            Add(sprite);

            Add(new PlayerCollider(new Action <Player>(OnPlayer), null, null));
            Add(light   = new VertexLight(Color.White, 1f, 16, 32));
            Add(bloom   = new BloomPoint(0.1f, 16f));
            Add(wiggler = Wiggler.Create(0.5f, 4f, delegate(float f)
            {
                sprite.Scale = Vector2.One * (1f + f * 0.25f);
            }, false, false));
            Add(dashRoutine = new Coroutine(false));

            Add(dashListener    = new DashListener());
            dashListener.OnDash = new Action <Vector2>(OnPlayerDashed);

            Add(new MirrorReflection());
            Add(loopingSfx = new SoundSource());

            Red          = data.Bool("red", false);
            particleType = Red ? Booster.P_BurstRed : Booster.P_Burst;

            RespawnTime   = data.Float("respawnTime", 1f);
            BoostTime     = data.Float("boostTime", 0.3f);
            ParticleColor = ColorHelper.GetColor(data.Attr("particleColor", "Yellow"));
            reappearSfx   = data.Attr("reappearSfx", "event:/game/04_cliffside/greenbooster_reappear");
            enterSfx      = data.Attr("enterSfx", "event:/game/04_cliffside/greenbooster_enter");
            boostSfx      = data.Attr("boostSfx", "event:/game/04_cliffside/greenbooster_dash");
            endSfx        = data.Attr("releaseSfx", "event:/game/04_cliffside/greenbooster_end");
        }
        public ReskinnableCrushBlock(EntityData data, Vector2 offset) : base(data, offset)
        {
            DynData <CrushBlock> self = new DynData <CrushBlock>(this);
            bool   giant = self.Get <bool>("giant");
            Sprite face  = self.Get <Sprite>("face");

            // rebuild the face in code with the sprites in our custom directory.
            face.Reset(GFX.Game, spriteDirectory + "/");
            if (giant)
            {
                /*
                 * <Loop id="idle" path="giant_block" frames="0" delay="0.08"/>
                 * <Anim id="hurt"  path="giant_block" frames="8-12" delay="0.08" goto="idle"/>
                 * <Anim id="hit" path="giant_block" frames="0-5" delay="0.08"/>
                 * <Loop id="right" path="giant_block" frames="6,7"  delay="0.08"/>
                 */
                face.AddLoop("idle", "giant_block", 0.08f, 0);
                face.Add("hurt", "giant_block", 0.08f, "idle", 8, 9, 10, 11, 12);
                face.Add("hit", "giant_block", 0.08f, 0, 1, 2, 3, 4, 5);
                face.AddLoop("right", "giant_block", 0.08f, 6, 7);
            }
            else
            {
                /*
                 * <Loop id="idle" path="idle_face" delay="0.08"/>
                 * <Anim id="hurt" path="hurt" frames="3-12" delay="0.08" goto="idle"/>
                 * <Anim id="hit" path="hit" delay="0.08"/>
                 * <Loop id="left" path="hit_left" delay="0.08"/>
                 * <Loop id="right" path="hit_right" delay="0.08"/>
                 * <Loop id="up" path="hit_up" delay="0.08"/>
                 * <Loop id="down" path="hit_down" delay="0.08"/>
                 */

                face.AddLoop("idle", "idle_face", 0.08f);
                face.Add("hurt", "hurt", 0.08f, "idle", 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
                face.Add("hit", "hit", 0.08f);
                face.AddLoop("left", "hit_left", 0.08f);
                face.AddLoop("right", "hit_right", 0.08f);
                face.AddLoop("up", "hit_up", 0.08f);
                face.AddLoop("down", "hit_down", 0.08f);
            }
            face.CenterOrigin();
            face.Play("idle");

            // customize the fill color.
            self["fill"] = Calc.HexToColor(data.Attr("fillColor", "62222b"));

            crushParticleColor = new ParticleType(P_Crushing)
            {
                Color  = Calc.HexToColor(data.Attr("crushParticleColor1", "ff66e2")),
                Color2 = Calc.HexToColor(data.Attr("crushParticleColor2", "68fcff"))
            };
            activateParticleColor = new ParticleType(P_Activate)
            {
                Color  = Calc.HexToColor(data.Attr("activateParticleColor1", "5fcde4")),
                Color2 = Calc.HexToColor(data.Attr("activateParticleColor2", "ffffff"))
            };
        }
Пример #16
0
        public override void Awake(Scene scene)
        {
            if (animationDelay > 0f)
            {
                for (int i = 0; i < columns; i++)
                {
                    Sprite jumpthruSprite = new Sprite(GFX.Game, "objects/jumpthru/" + overrideTexture);
                    jumpthruSprite.AddLoop("idle", "", animationDelay);
                    jumpthruSprite.X       = i * 8;
                    jumpthruSprite.Y       = 8;
                    jumpthruSprite.Scale.Y = -1;
                    jumpthruSprite.Play("idle");
                    Add(jumpthruSprite);
                }
            }
            else
            {
                AreaData areaData = AreaData.Get(scene);
                string   jumpthru = areaData.Jumpthru;
                if (!string.IsNullOrEmpty(overrideTexture) && !overrideTexture.Equals("default"))
                {
                    jumpthru = overrideTexture;
                }

                MTexture mTexture            = GFX.Game["objects/jumpthru/" + jumpthru];
                int      textureWidthInTiles = mTexture.Width / 8;
                for (int i = 0; i < columns; i++)
                {
                    int xTilePosition;
                    int yTilePosition;
                    if (i == 0)
                    {
                        xTilePosition = 0;
                        yTilePosition = ((!CollideCheck <Solid>(Position + new Vector2(-1f, 0f))) ? 1 : 0);
                    }
                    else if (i == columns - 1)
                    {
                        xTilePosition = textureWidthInTiles - 1;
                        yTilePosition = ((!CollideCheck <Solid>(Position + new Vector2(1f, 0f))) ? 1 : 0);
                    }
                    else
                    {
                        xTilePosition = 1 + Calc.Random.Next(textureWidthInTiles - 2);
                        yTilePosition = Calc.Random.Choose(0, 1);
                    }

                    Image image = new Image(mTexture.GetSubtexture(xTilePosition * 8, yTilePosition * 8, 8, 8));
                    image.X       = i * 8;
                    image.Y       = 8;
                    image.Scale.Y = -1;
                    Add(image);
                }
            }
        }
Пример #17
0
        public DeathMark(Vector2 position) : base(position)
        {
            Sprite sprite = new Sprite(GFX.Game, $"objects/speedrun_tool_deathmark/{Id}");

            sprite.AddLoop(Id, "", 1f);
            sprite.Play(Id);
            sprite.CenterOrigin();
            sprite.RenderPosition -= Vector2.UnitY * 8;
            sprite.Color           = Color.White * 0.5f;
            Add(sprite);
            Depth = Depths.FormationSequences;
        }
Пример #18
0
        public LaserWallSensor(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            Add((Component)(sprite = new Sprite(GFX.Game, "objects/pandorasBox/laser/sensor/sensor")));
            sprite.AddLoop("sensor", "", 0.125f);
            sprite.CenterOrigin();
            sprite.Play("sensor");

            flag      = data.Attr("flag", "");
            direction = data.Attr("direction", "Left");

            id = data.ID;

            Collider = new Hitbox(16f, 16f, -8f, -8f);
            base.LaserDetectionCollider = new Hitbox(16f, 16f, -8f, -8f);
        }
Пример #19
0
        public LaserEmitter(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            Add((Component)(startupSprite = new Sprite(GFX.Game, "objects/pandorasBox/laser/emitter/start")));
            startupSprite.AddLoop("start", "", 0.1f);
            startupSprite.JustifyOrigin(0.5f, 1f);
            startupSprite.Play("start");
            startupSprite.OnLastFrame = onLastFrame;
            startupSprite.Stop();

            Add((Component)(idleSprite = new Sprite(GFX.Game, "objects/pandorasBox/laser/emitter/idle")));
            idleSprite.AddLoop("idle", "", 0.125f);
            idleSprite.JustifyOrigin(0.5f, 1f);
            idleSprite.Play("idle");
            idleSprite.Visible = false;

            flag         = data.Attr("flag", "");
            direction    = data.Attr("direction", "");
            beamDuration = data.Int("beamDuration", -1);
            inverted     = Boolean.Parse(data.Attr("inverted", "false"));
            id           = data.ID;
            color        = ColorHelper.GetColor(data.Attr("color", "White"));

            inStartupAnimation = false;

            Collider = new Hitbox(16f, 32f, -8f, -32f);

            Depth = 50;

            Add((Component)(bloom = new BloomPoint(new Vector2(0, -24), 0.3f, 4f)));
            Add((Component)(light = new VertexLight(new Vector2(0, -24), Color.White, 1f, 48, 64)));

            Add(new StaticMover
            {
                SolidChecker    = new Func <Solid, bool>(IsRiding),
                JumpThruChecker = new Func <JumpThru, bool>(IsRiding),
                OnMove          = delegate(Vector2 v)
                {
                    if (laserbeam != null)
                    {
                        laserbeam.Position += v;
                    }
                },
                OnDestroy = delegate()
                {
                    RemoveSelf();
                }
            });
        }
Пример #20
0
        public Lever(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            Add((Component)(sprite = new Sprite(GFX.Game, "objects/pandorasBox/lever/lever")));
            sprite.AddLoop("lever", "", 0.125f);
            sprite.JustifyOrigin(0.5f, 1f);
            sprite.Play("lever");
            sprite.OnLastFrame = onLastFrame;
            sprite.Stop();

            active = data.Bool("active", false);
            flag   = data.Attr("flag", "");
            id     = data.ID;

            Collider = new Hitbox(sprite.Width, sprite.Height, -sprite.Width / 2, -sprite.Height);

            Add(talker     = new TalkComponent(new Rectangle((int)(-sprite.Width / 2 - 2), -4, (int)(sprite.Width + 4), 4), new Vector2(0.0f, -18f), onTalk));
            talker.Enabled = true;
        }
Пример #21
0
        public ResetStateCrystal(EntityData data, Vector2 offset)
            : base(data, offset)
        {
            baseData = new DynData <Refill>(this);

            Remove(baseData.Get <Sprite>("sprite"));
            Sprite sprite = new Sprite(GFX.Game, "objects/CommunalHelper/resetStateCrystal/");

            sprite.AddLoop("idle", "ghostIdle", 0.1f);
            sprite.Play("idle");
            sprite.CenterOrigin();
            sprite.Color = Calc.HexToColor("676767");
            Add(sprite);
            baseData["sprite"] = sprite;
            Remove(Get <PlayerCollider>());

            Add(new PlayerCollider(OnCollide));
        }
Пример #22
0
        public LaserMirror(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            opening = data.Attr("opening", "LeftUp");
            Tuple <int, int> scales = openingScales[opening];
            int scaleX = scales.Item1;
            int scaleY = scales.Item2;

            Add((Component)(sprite = new Sprite(GFX.Game, "objects/pandorasBox/laser/mirror/mirror_static")));
            sprite.AddLoop("mirror_static", "", 0.125f);
            sprite.CenterOrigin();
            sprite.Scale = new Vector2(scaleX, scaleY);

            sprite.Play("mirror_static");

            reflections = new Dictionary <Laserbeam, Laserbeam>();

            Collider = openingBlockingColliders[opening];
            LaserBlockingCollider  = openingBlockingColliders[opening];
            LaserDetectionCollider = new Hitbox(2f, 2f, -1f, -1f);

            Depth = 50;

            Add(new StaticMover
            {
                SolidChecker    = new Func <Solid, bool>(IsRiding),
                JumpThruChecker = new Func <JumpThru, bool>(IsRiding),
                OnMove          = delegate(Vector2 v)
                {
                    foreach (var pair in reflections)
                    {
                        pair.Value.Position += v;
                    }
                },
                OnDestroy = delegate()
                {
                    foreach (var pair in reflections)
                    {
                        pair.Value.RemoveSelf();
                    }
                }
            });

            DetectionDelay = 1;
        }
Пример #23
0
        public LaserNoteblock(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            pitch     = data.Int("pitch", 69);
            direction = data.Attr("direction", "Horizontal");
            sound     = data.Attr("sound", "game_03_deskbell_again");
            volume    = data.Float("volume", 1f);
            atPlayer  = data.Bool("atPlayer", false);

            Add((Component)(sprite = new Sprite(GFX.Game, textureLookup[direction])));
            sprite.AddLoop(loopName[direction], "", 0.125f);
            sprite.CenterOrigin();

            sprite.Play(loopName[direction]);

            Collider = directionBlockingColliders[direction];
            LaserBlockingCollider  = directionBlockingColliders[direction];
            LaserDetectionCollider = new Hitbox(8f, 8f, -4f, -4f);

            Depth = 50;
        }
Пример #24
0
        public AirBubbles(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            oneUse = data.Bool("oneUse");

            Collider = new Hitbox(16f, 16f, -8f, -8f);
            Add(new PlayerCollider(OnPlayer));

            Add(outline = new Image(GFX.Game["objects/pandorasBox/airBubbles/outline"]));
            outline.CenterOrigin();
            outline.Visible = false;

            Add(sprite = new Sprite(GFX.Game, "objects/pandorasBox/airBubbles/idle"));
            sprite.AddLoop("idle", "", 0.1f);
            sprite.Play("idle");
            sprite.CenterOrigin();

            Add(flash = new Sprite(GFX.Game, "objects/pandorasBox/airBubbles/flash"));
            flash.Add("flash", "", 0.05f);
            flash.OnFinish = delegate
            {
                flash.Visible = false;
            };
            flash.CenterOrigin();

            Add(wiggler = Wiggler.Create(1f, 4f, delegate(float v)
            {
                sprite.Scale = (flash.Scale = Vector2.One * (1f + v * 0.2f));
            }));

            Add(new MirrorReflection());

            Add(bloom = new BloomPoint(0.8f, 16f));
            Add(light = new VertexLight(Color.White, 1f, 16, 48));

            Add(sine = new SineWave(0.6f, 0f));
            sine.Randomize();

            UpdateY();

            base.Depth = -100;
        }
Пример #25
0
        public ColorfulRefill(Vector2 position, bool twoDashes, bool oneUse, RefillColor color) : base(position,
                                                                                                       twoDashes, oneUse)
        {
            this.color = color;
            var str = "objects/DJMapHelper/";

            switch (color)
            {
            case RefillColor.Red:
                str += "redRefill/";
                break;

            case RefillColor.Blue:
                str += "blueRefill/";
                break;

            case RefillColor.Black:
                str += "blackRefill/";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(color), color, null);
            }

            Sprite sprite = new Sprite(GFX.Game, str + "idle");

            sprite.AddLoop("idle", "", 0.1f);
            sprite.Play("idle");
            sprite.CenterOrigin();
            Sprite flash = new Sprite(GFX.Game, str + "flash");

            flash.Add(nameof(flash), "", 0.05f);
            flash.OnFinish = anim => flash.Visible = false;
            flash.CenterOrigin();
            SpriteFieldInfo?.SetValue(this, sprite);
            FlashFieldInfo?.SetValue(this, flash);
            Remove(Get <Sprite>());
            Remove(Get <Sprite>());
            Add(sprite);
            Add(flash);
        }
Пример #26
0
        public override void Added(Scene scene)
        {
            base.Added(scene);

            Level level = (Level)scene;

            level.Add(text = new CustomMemorialText(this, level.Session.Dreaming, textText, textSpacing));

            if (level.Session.Dreaming)
            {
                Add(dreamyText = new Sprite(GFX.Game, "scenery/memorial/floatytext"));
                dreamyText.AddLoop("dreamy", "", 0.1f);
                dreamyText.Play("dreamy", false, false);
                dreamyText.Position = new Vector2(-dreamyText.Width / 2f, -33f);
            }

            if (level.Session.Area.ID == 1 && level.Session.Area.Mode == AreaMode.Normal)
            {
                Audio.SetMusicParam("end", 1f);
            }
        }
Пример #27
0
        public PandorasBox(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            Add(talker     = new TalkComponent(new Rectangle(-8, -8, 16, 16), new Vector2(0.0f, -24f), onTalk));
            talker.Enabled = true;
            canTalk        = true;

            Add((Component)(boxOpen = new Sprite(GFX.Game, "objects/pandorasBox/pandorasBox/box_open")));
            boxOpen.AddLoop("box_open", "", 0.25f);
            boxOpen.JustifyOrigin(0.5f, 1f);
            boxOpen.Visible = false;
            boxOpen.Stop();

            Add((Component)(boxIdle = new Sprite(GFX.Game, "objects/pandorasBox/pandorasBox/box_idle")));
            boxIdle.AddLoop("box_idle", "", 0.1f);
            boxIdle.Play("box_idle");
            boxIdle.JustifyOrigin(0.5f, 1f);

            completeChapter = Boolean.Parse(data.Attr("completeChapter", "false"));
            dialogId        = data.Attr("dialog", "");

            Depth = 5;
        }
Пример #28
0
        public PowerRefill(Vector2 position, bool oneUse)
            : base(position)
        {
            base.Collider = new Hitbox(16f, 16f, -8f, -8f);
            Add(new BatteryCollider(OnBattery));
            this.oneUse = oneUse;
            string str;

            str         = "batteries/power_refill/";
            p_shatter   = P_Shatter;
            p_regen     = P_Regen;
            p_glow      = P_Glow;
            Add(outline = new Image(GFX.Game[str + "outline"]));
            outline.CenterOrigin();
            outline.Visible = false;
            Add(sprite      = new Sprite(GFX.Game, str + "idle"));
            sprite.AddLoop("idle", "", 0.1f);
            sprite.Play("idle");
            sprite.CenterOrigin();
            Add(flash = new Sprite(GFX.Game, str + "flash"));
            flash.Add("flash", "", 0.05f);
            flash.OnFinish = delegate
            {
                flash.Visible = false;
            };
            flash.CenterOrigin();
            Add(wiggler = Wiggler.Create(1f, 4f, delegate(float v)
            {
                sprite.Scale = (flash.Scale = Vector2.One * (1f + v * 0.2f));
            }));
            Add(new MirrorReflection());
            Add(bloom = new BloomPoint(0.8f, 16f));
            Add(light = new VertexLight(Color.White, 1f, 16, 48));
            Add(sine  = new SineWave(0.6f, 0f));
            sine.Randomize();
            UpdateY();
            base.Depth = -100;
        }
Пример #29
0
        public Gate(EntityData data, Vector2 offset) : base(data.Position + offset, 8f, 48f, true)
        {
            inverted      = Boolean.Parse(data.Attr("inverted", "false"));
            textureFolder = data.Attr("texture", "objects/pandorasBox/gate/");
            flag          = data.Attr("flag", "");
            id            = data.ID;

            lockState = false;

            Add((Component)(sprite = new Sprite(GFX.Game, textureFolder + "gate")));
            sprite.AddLoop("gate", "", 0.06f);
            sprite.Play("gate");
            sprite.OnLastFrame = onLastFrame;
            sprite.Rate        = 0;

            sprite.X = -base.Collider.Width / 2f;

            Add(shaker = new Shaker(on: false));

            Depth = -9000;

            drawingHeight = sprite.Height;
        }
        public ReskinnableSwapBlock(EntityData data, Vector2 offset) : base(data, offset)
        {
            DynData <SwapBlock> self = new DynData <SwapBlock>(this);

            // replace the sprites for the middle of the blocks.
            Sprite middleGreen = self.Get <Sprite>("middleGreen");

            middleGreen.Reset(GFX.Game, spriteDirectory + "/");
            middleGreen.AddLoop("idle", "midBlock", 0.08f);
            middleGreen.Play("idle");

            Sprite middleRed = self.Get <Sprite>("middleRed");

            middleRed.Reset(GFX.Game, spriteDirectory + "/");
            middleRed.AddLoop("idle", "midBlockRed", 0.08f);
            middleRed.Play("idle");

            customParticleColor = new ParticleType(P_Move)
            {
                Color  = Calc.HexToColor(data.Attr("particleColor1", "fbf236")),
                Color2 = Calc.HexToColor(data.Attr("particleColor2", "6abe30"))
            };
        }