Пример #1
0
        public override void Added(Scene scene)
        {
            base.Added(scene);

            IsGhost = AltSidesHelperModule.AltSidesSaveData.UnlockedAltSideIDs.Contains(altSideToUnlock);
            string path = IsGhost ? "ghost" : "idle";

            sprite = new Sprite(GFX.Game, spritePath);
            sprite.Add("idle", path, 0.07f, "pulse", new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
            sprite.Add("spin", path, 0.07f, "spin", new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 });
            sprite.Add("pulse", path, 0.04f, "idle", new int[] { 13, 14, 15, 16, 17, 18 });
            sprite.CenterOrigin();
            Add(sprite);

            sprite.Play("idle");
            Add(scaleWiggler = Wiggler.Create(0.25f, 4f, delegate(float f) {
                sprite.Scale = Vector2.One * (1f + f * 0.25f);
            }));
            Add(bloom      = new BloomPoint(0.25f, 16f));
            Add(light      = new VertexLight(Color.White, 0.4f, 32, 64));
            Add(hover      = new SineWave(0.5f, 0f));
            hover.OnUpdate = delegate(float f) {
                Sprite      obj         = sprite;
                VertexLight vertexLight = light;
                float       num2        = bloom.Y = f * 2f;
                float       num5        = obj.Y = (vertexLight.Y = num2);
            };
            if (IsGhost)
            {
                sprite.Color = Color.White * 0.8f;
            }
        }
Пример #2
0
        public BoomBox(Vector2 position, string activationId, float initialDelay, bool startActive) : base(position, 24, 24, false)
        {
            Add(Activator          = new FactoryActivator());
            Activator.StartOn      = startActive;
            Activator.ActivationId = activationId == string.Empty ? null : activationId;
            Activator.OnStartOn    = OnStartOn;
            Activator.OnStartOff   = OnStartOff;
            Activator.OnTurnOn     = OnTurnOn;
            Activator.OnTurnOff    = OnTurnOff;

            Add(new SteamCollider(OnSteamWall));

            _initialDelay = initialDelay;

            Add(_sprite = new Sprite(GFX.Game, "objects/FactoryHelper/boomBox/"));
            _sprite.Add("idle", "idle", 0.2f, "idle");
            _sprite.Add("activating", "activating", 0.2f, "activating");
            _sprite.Add("active", "active", 0.15f, "active");
            _sprite.Add("angry", "angry", 0.05f, "angry");
            _sprite.Add("resetting", "resetting", 0.15f, "active");

            Add(_boomSprite = new Sprite(GFX.Game, "objects/FactoryHelper/boomBox/"));
            _boomSprite.Add("boom", "boom", 0.04f);
            _boomSprite.Color   = Color.White * 0.5f;
            _boomSprite.Visible = false;
            _boomSprite.CenterOrigin();
            _boomSprite.Position = new Vector2(Width / 2, Height / 2);

            _boomCollider = new BoomCollider(position + new Vector2(Width / 2, Height / 2));
            Add(_sfx      = new SoundSource());
            _sfx.Position = new Vector2(Width / 2, Height / 2);
            Add(new LightOcclude(0.2f));
        }
        public NoDashRefillSpring(EntityData data, Vector2 offset)
            : base(data.Position + offset, GetOrientationFromName(data.Name), data.Bool("playerCanUse", true))
        {
            DynData <Spring> selfSpring = new DynData <Spring>(this);

            // remove the vanilla player collider. this is the one thing we want to mod here.
            foreach (Component component in this)
            {
                if (component.GetType() == typeof(PlayerCollider))
                {
                    Remove(component);
                    break;
                }
            }

            // replace it with our own collider.
            if (data.Bool("playerCanUse", true))
            {
                Add(new PlayerCollider(OnCollide));
            }

            // replace the vanilla sprite with our custom one.
            Sprite sprite = selfSpring.Get <Sprite>("sprite");

            sprite.Reset(GFX.Game, "objects/SpringCollab2020/noDashRefillSpring/");
            sprite.Add("idle", "", 0f, default(int));
            sprite.Add("bounce", "", 0.07f, "idle", 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5);
            sprite.Add("disabled", "white", 0.07f);
            sprite.Play("idle");
            sprite.Origin.X = sprite.Width / 2f;
            sprite.Origin.Y = sprite.Height;
        }
        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"))
            };
        }
Пример #5
0
        public static void Attach(Main main, Entity entity, UIRenderer ui, Property <float> health, Property <float> rotation, Property <bool> noteActive, Property <bool> phoneActive)
        {
            Sprite damageOverlay = new Sprite();

            damageOverlay.Image.Value       = "Images\\damage";
            damageOverlay.AnchorPoint.Value = new Vector2(0.5f);
            ui.Root.Children.Add(damageOverlay);

            // Center the damage overlay and scale it to fit the screen
            damageOverlay.Add(new Binding <Vector2, Point>(damageOverlay.Position, x => new Vector2(x.X * 0.5f, x.Y * 0.5f), main.ScreenSize));
            damageOverlay.Add(new Binding <Vector2>(damageOverlay.Scale, () => new Vector2(main.ScreenSize.Value.X / damageOverlay.Size.Value.X, main.ScreenSize.Value.Y / damageOverlay.Size.Value.Y), main.ScreenSize, damageOverlay.Size));
            damageOverlay.Add(new Binding <float, float>(damageOverlay.Opacity, x => 1.0f - x, health));

#if VR
            if (main.VR)
            {
                VirtualReticle reticleController = entity.GetOrCreate <VirtualReticle>();
                reticleController.Add(new Binding <float>(reticleController.Rotation, rotation));

                ModelNonPostProcessed reticle = entity.Create <ModelNonPostProcessed>();
                reticle.Filename.Value       = "Models\\plane";
                reticle.EffectFile.Value     = "Effects\\VirtualUI";
                reticle.DiffuseTexture.Value = "Images\\reticle";
                reticle.Add(new Binding <Matrix>(reticle.Transform, reticleController.Transform));
                reticle.Add(new Binding <bool>(reticle.Enabled, () => !main.Paused && !phoneActive && !noteActive, main.Paused, phoneActive, noteActive));
            }
            else
#endif
            {
                Sprite reticle = new Sprite();
                reticle.Image.Value       = "Images\\reticle";
                reticle.AnchorPoint.Value = new Vector2(0.5f);
                reticle.Opacity.Value     = 0.5f;
                ui.Root.Children.Add(reticle);

                reticle.Add(new Binding <bool>(reticle.Visible, main.Settings.EnableReticle));

                // Center the reticle
                reticle.Add(new Binding <Vector2, Point>(reticle.Position, x => new Vector2(x.X * 0.5f, x.Y * 0.5f), main.ScreenSize));
            }

            UIComponent targets = new UIComponent();
            ui.Root.Children.Add(targets);

            TargetUI targetUi = entity.GetOrCreate <TargetUI>();
            targetUi.Add(new ListBinding <UIComponent>(targetUi.Sprites, targets.Children));

            targets.Add(new ListBinding <UIComponent, Transform>(targets.Children, TargetFactory.Positions, delegate(Transform target)
            {
                Sprite sprite            = new Sprite();
                sprite.Image.Value       = "Images\\target";
                sprite.AnchorPoint.Value = new Vector2(0.5f, 0.5f);
                sprite.UserData.Value    = target;
                sprite.Add(new Binding <bool>(sprite.Visible, target.Enabled));
                return(sprite);
            }));
        }
        public static Entity Load(Level level, LevelData levelData, Vector2 offset, EntityData entityData)
        {
            string flag = entityData.Attr("flag");

            if (level.Session.GetFlag(flag) || level.Session.GetFlag(flag + "_switch" + entityData.ID))
            {
                // moving touch switches can't be persistent, but we can very much spawn a flag touch switch instead!
                Vector2[] nodes        = entityData.Nodes;
                Vector2   origPosition = entityData.Position;
                entityData.Position = nodes[nodes.Length - 1];
                FlagTouchSwitch flagTouchSwitch = new FlagTouchSwitch(entityData, offset);
                entityData.Position = origPosition;
                return(flagTouchSwitch);
            }
            else
            {
                // build the moving touch switch
                TouchSwitch movingTouchSwitch = (TouchSwitch)Activator.CreateInstance(movingTouchSwitchType,
                                                                                      new object[] { entityData.NodesOffset(offset), entityData, offset });

                // save its attributes as DynData
                DynData <TouchSwitch> switchData = new DynData <TouchSwitch>(movingTouchSwitch);
                switchData["flag"]        = entityData.Attr("flag");
                switchData["id"]          = entityData.ID;
                switchData["persistent"]  = entityData.Bool("persistent", false);
                switchData["movingColor"] = Calc.HexToColor(entityData.Attr("movingColor", "FF8080"));

                // these attributes actually exist in TouchSwitch and as such, they work!
                switchData["inactiveColor"]   = Calc.HexToColor(entityData.Attr("inactiveColor", "5FCDE4"));
                switchData["activeColor"]     = Calc.HexToColor(entityData.Attr("activeColor", "FFFFFF"));
                switchData["finishColor"]     = Calc.HexToColor(entityData.Attr("finishColor", "F141DF"));
                switchData["P_RecoloredFire"] = new ParticleType(TouchSwitch.P_Fire)
                {
                    Color = switchData.Get <Color>("finishColor")
                };

                // set up the icon
                string iconAttribute = entityData.Attr("icon", "vanilla");
                Sprite icon          = new Sprite(GFX.Game, iconAttribute == "vanilla" ? "objects/touchswitch/icon" : $"objects/MaxHelpingHand/flagTouchSwitch/{iconAttribute}/icon");
                icon.Add("idle", "", 0f, default(int));
                icon.Add("spin", "", 0.1f, new Chooser <string>("spin", 1f), 0, 1, 2, 3, 4, 5);
                icon.Play("spin");
                icon.Color = switchData.Get <Color>("inactiveColor");
                icon.CenterOrigin();
                movingTouchSwitch.Remove(movingTouchSwitch.Get <Sprite>());
                movingTouchSwitch.Add(icon);
                movingTouchSwitchIcon.SetValue(movingTouchSwitch, icon);
                switchData["icon"] = icon;

                // collect the list of flag touch switches in the room as soon as the entity is awake, like regular flag touch switches.
                movingTouchSwitch.Add(new TouchSwitchListAttacher(entityData.Attr("flag")));

                return(movingTouchSwitch);
            }
        }
        public MultiplayerControlSwitch(Vector2 position)
            : base(position)
        {
            base.Depth             = 2000;
            base.Add(ControlSwitch = new ControlSwitch(false, 0));

            base.Add(new PlayerCollider(OnPlayer, null, new Hitbox(30f, 30f, -15f, -15f)));
            base.Add(icon);
            base.Add(bloom = new BloomPoint(0f, 16f));
            bloom.Alpha    = 0f;
            icon.Add("idle", "", 0f, default(int));
            icon.Add("spin", "", 0.1f, new Chooser <string>("spin", 1f), 0, 1, 2, 3, 4, 5);
            icon.Play("spin", false, false);
            icon.Color = inactiveColor;
            icon.CenterOrigin();
            base.Collider = new Hitbox(16f, 16f, -8f, -8f);
            base.Add(new TheoCrystalCollider(OnTheoCrystal, new Hitbox(20f, 20f, -10f, -10f)));
            base.Add(new SeekerCollider(OnSeeker, new Hitbox(24f, 24f, -12f, -12f)));

            ControlSwitch.OnActivate = delegate
            {
                wiggler.Start();
                for (int i = 0; i < 32; i++)
                {
                    float num = Calc.Random.NextFloat(6.28318548f);
                    //level.Particles.Emit(P_FireWhite, base.Position + Calc.AngleToVector(num, 6f), num);
                }
                icon.Rate = 4f;
            };

            ControlSwitch.OnDeactivate = delegate
            {
                wiggler.StopAndClear();
                icon.Rate = 0.1f;
                icon.Play("spin", false, false);
            };

            ControlSwitch.OnFinish = delegate
            {
                ease = 0f;
            };
            ControlSwitch.OnStartFinished = delegate
            {
                icon.Rate = 0.1f;
                icon.Play("spin", false, false);
                ease = 1f;
            };

            base.Add(wiggler = Wiggler.Create(0.5f, 4f, delegate(float v)
            {
                pulse = Vector2.One * (1f + v * 0.25f);
            }, false, false));
            base.Add(new VertexLight(Color.White, 0.8f, 16, 32));
            base.Add(touchSfx = new SoundSource());
        }
 public BadelineChaserBlock(EntityData data, Vector2 offset) : base(data.Position + offset, data.Width, data.Height, false)
 {
     Reversed = data.Bool("reversed", false);
     Collider = new Hitbox(data.Width, data.Height);
     Emblem   = new Sprite(GFX.Game, "objects/FrostHelper/badelineChaserBlock/emblem");
     Emblem.Add("solid", !Reversed ? "solidreverse" : "solid");
     Emblem.Add("pressed", !Reversed ? "pressedreverse" : "pressed");
     Emblem.CenterOrigin();
     Emblem.Play(Reversed ? "pressed" : "solid");
     AllowStaticMovers = true;
 }
Пример #9
0
        public FlagTouchSwitch(EntityData data, Vector2 offset)
            : base(data.Position + offset)
        {
            Depth = 2000;

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

            inactiveColor = Calc.HexToColor(data.Attr("inactiveColor", "5FCDE4"));
            activeColor   = Calc.HexToColor(data.Attr("activeColor", "FFFFFF"));
            finishColor   = Calc.HexToColor(data.Attr("finishColor", "F141DF"));

            hitSound = data.Attr("hitSound", "event:/game/general/touchswitch_any");
            completeSoundFromSwitch = data.Attr("completeSoundFromSwitch", "event:/game/general/touchswitch_last_cutoff");
            completeSoundFromScene  = data.Attr("completeSoundFromScene", "event:/game/general/touchswitch_last_oneshot");

            inverted     = data.Bool("inverted", false);
            allowDisable = data.Bool("allowDisable", false);

            smoke = data.Bool("smoke", true);

            P_RecoloredFire = new ParticleType(TouchSwitch.P_Fire)
            {
                Color = finishColor
            };

            // set up collision
            Collider = new Hitbox(16f, 16f, -8f, -8f);
            Add(new PlayerCollider(onPlayer, null, new Hitbox(30f, 30f, -15f, -15f)));
            Add(new HoldableCollider(onHoldable, new Hitbox(20f, 20f, -10f, -10f)));
            Add(new SeekerCollider(onSeeker, new Hitbox(24f, 24f, -12f, -12f)));

            // set up the icon
            string iconAttribute = data.Attr("icon", "vanilla");

            icon = new Sprite(GFX.Game, iconAttribute == "vanilla" ? "objects/touchswitch/icon" : $"objects/MaxHelpingHand/flagTouchSwitch/{iconAttribute}/icon");
            Add(icon);
            icon.Add("idle", "", 0f, default(int));
            icon.Add("spin", "", 0.1f, new Chooser <string>("spin", 1f), 0, 1, 2, 3, 4, 5);
            icon.Play("spin");
            icon.Color = inactiveColor;
            icon.CenterOrigin();

            Add(bloom   = new BloomPoint(0f, 16f));
            bloom.Alpha = 0f;

            Add(wiggler = Wiggler.Create(0.5f, 4f, v => {
                pulse = Vector2.One * (1f + v * 0.25f);
            }));

            Add(new VertexLight(Color.White, 0.8f, 16, 32));
            Add(touchSfx = new SoundSource());
        }
Пример #10
0
        public DashFuseBox(EntityData data, Vector2 offset) : base(data.Position + offset, 4f, 16f, false)
        {
            string[] activationIds = data.Attr("activationIds", "").Split(',');

            _startCutscene = data.Bool("startCutscene", false);
            _persistent    = data.Bool("persistent", false);
            _id            = new EntityID(data.Level.Name, data.ID);
            _direction     = Direction.Right;
            Enum.TryParse(data.Attr("direction", "Right"), out _direction);

            Depth           = -20;
            Add(_mainSprite = new Sprite(GFX.Game, "objects/FactoryHelper/dashFuseBox/"));
            _mainSprite.Add("idle", "idle", 0.1f, "idleBackwards");
            _mainSprite.Add("chaos", "chaos", 0.08f, "chaos");
            _mainSprite.Add("idleBackwards", "idle", 0.1f, "idle", 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
            _mainSprite.Play("idle", false, false);

            _door = new Entity(Position)
            {
                Depth = 8490
            };
            _door.Add(_doorSprite = new Sprite(GFX.Game, "objects/FactoryHelper/dashFuseBox/"));
            _doorSprite.Add("busted", "busted", 0.05f);
            _doorSprite.Play("busted", false, false);
            _doorSprite.Active  = false;
            _doorSprite.Visible = false;


            if (_direction == Direction.Left)
            {
                _mainSprite.Scale *= new Vector2(-1f, 1f);
                //_mainSprite.Position.X += 4;
                _doorSprite.Scale      *= new Vector2(-1f, 1f);
                _doorSprite.Position.X += 4;

                Collider.Position.X -= 4;
                _pressDirection      = Vector2.UnitX;
                _sparks.Direction    = (float)Math.PI;
            }
            else
            {
                _pressDirection = -Vector2.UnitX;
            }

            foreach (string activationId in activationIds)
            {
                if (activationId != "")
                {
                    _activationIds.Add(activationId);
                }
            }
            OnDashCollide = OnDashed;
        }
Пример #11
0
        public TimedSwitchGate(Vector2 position, float width, float height, Vector2 node, bool persistent, string spriteName)
            : base(position, width, height, false)
        {
            this.node       = node;
            this.ogTarget   = node;
            this.ogPosition = position;
            this.persistent = persistent;
            base.Add(icon   = new Sprite(GFX.Game, "objects/switchgate/icon"));
            icon.Add("spin", "", 0.1f, "spin");
            icon.Play("spin", false, false);
            icon.Rate     = 0f;
            icon.Color    = inactiveColor;
            icon.Position = (iconOffset = new Vector2(width / 2f, height / 2f));
            icon.CenterOrigin();
            base.Add(wiggler = Wiggler.Create(0.5f, 4f, delegate(float f)
            {
                icon.Scale = Vector2.One * (1f + f);
            }, false, false));
            MTexture mTexture = GFX.Game["objects/switchgate/" + spriteName];

            nineSlice = new MTexture[3, 3];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    MTexture[,] array = nineSlice;
                    int      num        = i;
                    int      num2       = j;
                    MTexture subtexture = mTexture.GetSubtexture(new Rectangle(i * 8, j * 8, 8, 8));
                    array[num, num2] = subtexture;
                }
            }
            base.Add(openSfx = new SoundSource());
            base.Add(new LightOcclude(0.5f));
        }
Пример #12
0
        public DashSpring(Vector2 position, Orientations orientation, bool playerCanUse)
            : base(position, orientation, playerCanUse)
        {
            // Only one other player collider is added so it can easily be removed
            Remove(Get <PlayerCollider>());
            Add(new PlayerCollider(OnCollide));
            Sprite sprite = (Sprite)spriteInfo.GetValue(this);

            sprite.Reset(GFX.Game, "objects/SpringCollab2020/dashSpring/");
            sprite.Add("idle", "", 0f, default(int));
            sprite.Add("bounce", "", 0.07f, "idle", 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5);
            sprite.Add("disabled", "white", 0.07f);
            sprite.Play("idle");
            sprite.Origin.X = sprite.Width / 2f;
            sprite.Origin.Y = sprite.Height;
        }
Пример #13
0
        public CustomPickup(Vector2 position, Vector2 targetPosition, int playerIndex) : base(position, targetPosition, playerIndex)
        {
            this.playerIndex = playerIndex;
            Tag(GameTags.LightSource);
            images = new Sprite <int> [3];
            for (int i = 0; i < images.Length; i++)
            {
                Sprite <int> image;
                image    = new Sprite <int>(TFGame.Atlas["pickups/bomb"], 12, 12, 0);
                image.X += 14;
                image.X -= 14 * i;
                image.CenterOrigin();
                image.Add(0, 0.05f, new int[]
                {
                    0,
                    0,
                    2,
                    1,
                    1,
                    2
                });

                image.Play(0, false);
                Add(image);
                images[i] = image;
            }
        }
Пример #14
0
        public void AddingUVCalculatorResultsThrowsException()
        {
            var sprite = new Sprite("DeltaEngineLogoAlpha", Rectangle.One);

            Assert.Throws <Sprite.RenderingDataComponentAddingIsNotSupported>(
                () => sprite.Add(new RenderingData()));
        }
Пример #15
0
        public void RenderSpriteWithRedOutline()
        {
            var sprite = new Sprite(logoMaterial, Rectangle.HalfCentered);

            sprite.Add(new OutlineColor(Color.Red));
            sprite.OnDraw <DrawPolygon2DOutlines>();
        }
Пример #16
0
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            _moonSprite = new Sprite(Utilities.FromFile <Texture2D>(@"Data\Example1\moon.png", GraphicsDevice))
            {
                Position = new Vector2(150.0f, 0.0f),
                Scale    = new Vector2(1.25f),
                Name     = "Moon"
            };

            _earthSprite = new Sprite(Utilities.FromFile <Texture2D>(@"Data\Example1\exoplanet.png", GraphicsDevice))
            {
                Position = new Vector2(400.0f, 0.0f),
                Scale    = new Vector2(0.5f),
                Name     = "Earth"
            };
            _earthSprite.Add(_moonSprite);

            _sunSprite = new Sprite(Utilities.FromFile <Texture2D>(@"Data\Example1\sun.png", GraphicsDevice))
            {
                Name = "Sun",
            };
            _sunSprite.Add(_earthSprite);

            _scene.AddNode(_sunSprite);

            _camera.Position  = new Vector2(800, 0);
            _camera.Focus     = _sunSprite;
            _camera.MoveSpeed = 0.5f;

            (SubSystem.Instance.Services.GetInstance <IRenderSystem>() as SceneGraphRenderSystem).CurrentScene = _scene;
        }
Пример #17
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;
 }
        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());
        }
Пример #19
0
 public virtual void UpdateSpriteState()
 {
     foreach (var buff in _buffs)
     {
         if (buff is Burning)
         {
             Sprite.Add(CharSprite.State.Burning);
         }
         else if (buff is Levitation)
         {
             Sprite.Add(CharSprite.State.Levitating);
         }
         else if (buff is Invisibility)
         {
             Sprite.Add(CharSprite.State.Invisible);
         }
         else if (buff is Paralysis)
         {
             Sprite.Add(CharSprite.State.Paralysed);
         }
         else if (buff is Frost)
         {
             Sprite.Add(CharSprite.State.Frozen);
         }
         else if (buff is Light)
         {
             Sprite.Add(CharSprite.State.Illuminated);
         }
     }
 }
        public RustyLamp(Vector2 position, Vector2 offset, string activationId, float initialDelay, string strobePattern, bool startActive) : base()
        {
            Depth    = 8500;
            Position = position + offset;

            Collider = new Hitbox(12, 12, 2, 2);

            Add(Activator          = new FactoryActivator());
            Activator.ActivationId = activationId == string.Empty ? null : activationId;
            Activator.StartOn      = startActive;
            Activator.OnTurnOff    = OnTurnOff;
            Activator.OnTurnOn     = OnTurnOn;
            Activator.OnStartOff   = OnStartOff;
            Activator.OnStartOn    = OnStartOn;

            Add(_steamCollider = new SteamCollider(OnSteamWall));

            _initialDelay = initialDelay;
            Add(_sprite   = new Sprite(GFX.Game, "objects/FactoryHelper/rustyLamp/rustyLamp"));
            _sprite.Add("frames", "");
            _sprite.Play("frames");
            _sprite.Active = false;

            _strobePatternString = strobePattern;

            Add(_light      = new VertexLight(Color, 0f, 128, 128));
            Add(_bloom      = new BloomPoint(0.0f, 16f));
            _light.Position = new Vector2(8, 8);
            _bloom.Position = new Vector2(8, 8);
        }
Пример #21
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
            });
        }
Пример #22
0
 public void AddComponent()
 {
     logo.Add(new Name("name"));
     AdvanceTimeAndUpdateEntities();
     if (GetTextBox("Name") != null)
     {
         Assert.AreEqual("name", GetTextBox("Name").Text);
     }
 }
        public TrollZipper(Vector2 position, int width, int height, Vector2 target, Themes theme, int trollOffset, bool trollFixed, bool switchTroll, bool flipDirection)
            : base(position, width, height, safe: false)
        {
            this.flipDirection = flipDirection;
            this.switchTroll   = switchTroll;
            this.trollFixed    = trollFixed;
            this.trollOffset   = trollOffset;
            Depth            = -9999;
            start            = Position;
            this.target      = target;
            maxForwardSpeed  = 360f / Vector2.Distance(start, target);
            maxBackwardSpeed = maxForwardSpeed * 0.4f;
            Direction.X      = Math.Sign(target.X - start.X);
            Direction.Y      = Math.Sign(target.Y - start.Y);
            this.theme       = theme;
            string path;
            string id;
            string key;

            if (theme == Themes.Moon)
            {
                path            = "objects/zipmover/moon/light";
                id              = "objects/zipmover/moon/block";
                key             = "objects/zipmover/moon/innercog";
                drawBlackBorder = false;
            }
            else
            {
                path            = "objects/zipmover/light";
                id              = "objects/zipmover/block";
                key             = "objects/zipmover/innercog";
                drawBlackBorder = true;
            }
            innerCogs       = GFX.Game.GetAtlasSubtextures(key);
            Add(streetlight = new Sprite(GFX.Game, path));
            streetlight.Add("frames", "", 1f);
            streetlight.Play("frames");
            streetlight.Active = false;
            streetlight.SetAnimationFrame(1);
            streetlight.Position = new Vector2(Width / 2f - streetlight.Width / 2f, 0f);
            Add(bloom            = new BloomPoint(1f, 6f));
            bloom.Position       = new Vector2(Width / 2f, 4f);
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    edges[i, j] = GFX.Game[id].GetSubtexture(i * 8, j * 8, 8, 8);
                }
            }
            SurfaceSoundIndex = 7;
            sfx.Position      = new Vector2(Width, Height) / 2f;
            Add(sfx);
            Add(new LightOcclude());
        }
Пример #24
0
		public void CreateTrigger()
		{
			var trigger = new Sprite(material, new Rectangle(Vector2D.Zero, (Size)Vector2D.One))
			{
				Color = Color.Red
			};
			trigger.Add(new TimeTrigger.Data(Color.Red, Color.Gray, 1));
			trigger.Start<CollisionTrigger>().Add(new CollisionTrigger.Data(Color.White, Color.Red));
			Assert.AreEqual(Vector2D.Zero, trigger.Get<Rectangle>().TopLeft);
			Assert.AreEqual(Vector2D.One, trigger.Get<Rectangle>().BottomRight);
		}
Пример #25
0
        public void CreateTrigger()
        {
            var trigger = new Sprite(material, new Rectangle(Vector2D.Zero, (Size)Vector2D.One))
            {
                Color = Color.Red
            };

            trigger.Add(new TimeTrigger.Data(Color.Red, Color.Gray, 1));
            trigger.Start <CollisionTrigger>().Add(new CollisionTrigger.Data(Color.White, Color.Red));
            Assert.AreEqual(Vector2D.Zero, trigger.Get <Rectangle>().TopLeft);
            Assert.AreEqual(Vector2D.One, trigger.Get <Rectangle>().BottomRight);
        }
Пример #26
0
        public BadelineChaserBlockActivator(EntityData data, Vector2 offset) : base(data.Position + offset, data.Width, data.Height, false)
        {
            Solid      = data.Bool("solid", true);
            Collider   = new Hitbox(data.Width, data.Height);
            Collidable = Solid;

            Emblem = new Sprite(GFX.Game, "objects/FrostHelper/badelineChaserBlock/emblem");
            Emblem.Add("loop", "field");
            //Emblem.Add("pressed", Reversed ? "pressedreverse" : "pressed");
            Emblem.CenterOrigin();
            Emblem.Play("loop");
            Depth = 8990;
        }
Пример #27
0
		public void RenderSlowlyFallingLogo()
		{
			var sprite = new Sprite(new Material(ShaderFlags.Position2DTextured, "DeltaEngineLogo"),
				screenCenter);
			sprite.Add(new SimplePhysics.Data
			{
				Velocity = new Vector2D(0.0f, -0.3f),
				RotationSpeed = 100.0f,
				Gravity = new Vector2D(0.0f, 0.1f),
			});
			sprite.Color = Color.Red;
			sprite.Start<SimplePhysics.Move>();
		}
Пример #28
0
        public void RenderSlowlyFallingLogo()
        {
            var sprite = new Sprite(new Material(ShaderFlags.Position2DTextured, "DeltaEngineLogo"),
                                    screenCenter);

            sprite.Add(new SimplePhysics.Data
            {
                Velocity      = new Vector2D(0.0f, -0.3f),
                RotationSpeed = 100.0f,
                Gravity       = new Vector2D(0.0f, 0.1f),
            });
            sprite.Color = Color.Red;
            sprite.Start <SimplePhysics.Move>();
        }
Пример #29
0
		private static Sprite CreateFallingSpriteWhichExpires()
		{
			var sprite = new Sprite(new Material(ShaderFlags.Position2DTextured, "DeltaEngineLogo"),
				Rectangle.One);
			sprite.Add(new SimplePhysics.Data
			{
				Velocity = Vector2D.Half,
				Gravity = new Vector2D(1.0f, 2.0f),
				Duration = 1.0f
			});
			sprite.Start<SimplePhysics.Move>();
			sprite.Color = Color.Red;
			return sprite;
		}
Пример #30
0
        public SteamPoof(Vector2 position, float fade) : base(position)
        {
            Depth = -100001;
            string type = Calc.Random.Chance(0.1f) ? "b" : "a";

            Add(_sprite = new Sprite(GFX.Game, "danger/FactoryHelper/steamWall/"));
            _sprite.Add("poof", "poof_" + type, 0.07f);
            _sprite.Play("poof");
            float scale = Calc.Random.NextFloat(0.4f) + 0.4f;

            _sprite.Scale    = new Vector2(scale, scale);
            _sprite.Rotation = Calc.Random.NextAngle();
            _sprite.Color    = Color.Lerp(new Color(0.9f, 0.9f, 0.9f) * 0.8f, new Color(0.7f, 0.7f, 0.7f) * 0.5f, Calc.Random.NextFloat()) * fade;
            _sprite.CenterOrigin();
        }
Пример #31
0
        private static Sprite CreateFallingSpriteWhichExpires()
        {
            var sprite = new Sprite(new Material(ShaderFlags.Position2DTextured, "DeltaEngineLogo"),
                                    Rectangle.One);

            sprite.Add(new SimplePhysics.Data
            {
                Velocity = Vector2D.Half,
                Gravity  = new Vector2D(1.0f, 2.0f),
                Duration = 1.0f
            });
            sprite.Start <SimplePhysics.Move>();
            sprite.Color = Color.Red;
            return(sprite);
        }
 public override void OnBegin(Level level)
 {
     payphone = Scene.Tracker.GetEntity <Payphone>();
     Add(new Coroutine(Cutscene(level)));
     Add(ringtone = new SoundSource());
     Add(phoneSfx = new SoundSource());
     Add(sprite   = new Sprite(GFX.Game, "cutscenes/payphone/phone"));
     sprite.Add("putdown", "", 0.08f, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
     sprite.Justify = new Vector2(0.5f, 1f);
     sprite.Visible = false;
     if (endLevel)
     {
         level.RegisterAreaComplete();
     }
 }
        public DreamSwitchGate(EntityData data, Vector2 offset)
            : base(data, offset)
        {
            permanent = data.Bool("permanent");
            node      = data.Nodes[0] + offset;

            isFlagSwitchGate = data.Bool("isFlagSwitchGate");

            ID   = data.ID;
            Flag = data.Attr("flag");

            inactiveColor = Calc.HexToColor(data.Attr("inactiveColor", "5FCDE4"));
            activeColor   = Calc.HexToColor(data.Attr("activeColor", "FFFFFF"));
            finishColor   = Calc.HexToColor(data.Attr("finishColor", "F141DF"));

            shakeTime = data.Float("shakeTime", 0.5f);
            moveTime  = data.Float("moveTime", 1.8f);
            moveEased = data.Bool("moveEased", true);

            moveSound     = data.Attr("moveSound", SFX.game_gen_touchswitch_gate_open);
            finishedSound = data.Attr("finishedSound", SFX.game_gen_touchswitch_gate_finish);

            allowReturn = data.Bool("allowReturn");

            P_RecoloredFire = new ParticleType(TouchSwitch.P_Fire)
            {
                Color = finishColor
            };
            P_RecoloredFireBack = new ParticleType(TouchSwitch.P_Fire)
            {
                Color = inactiveColor
            };

            string iconAttribute = data.Attr("icon", "vanilla");

            icon = new Sprite(GFX.Game, iconAttribute == "vanilla" ? "objects/switchgate/icon" : $"objects/MaxHelpingHand/flagSwitchGate/{iconAttribute}/icon");
            icon.Add("spin", "", 0.1f, "spin");
            icon.Play("spin");
            icon.Rate  = 0f;
            icon.Color = inactiveColor;
            icon.CenterOrigin();
            iconOffset  = new Vector2(Width, Height) / 2f;
            Add(wiggler = Wiggler.Create(0.5f, 4f, scale => {
                icon.Scale = Vector2.One * (1f + scale);
            }));

            Add(openSfx = new SoundSource());
        }
Пример #34
0
        public Sprite<string> GetSpriteString(string id)
        {
            XmlElement xml = sprites[id];

            Sprite<string> sprite = new Sprite<string>(atlas[xml.ChildText("Texture")], xml.ChildInt("FrameWidth"), xml.ChildInt("FrameHeight"));
            sprite.Origin = new Vector2(xml.ChildFloat("OriginX", 0), xml.ChildFloat("OriginY", 0));
            sprite.Position = new Vector2(xml.ChildFloat("X", 0), xml.ChildFloat("Y", 0));
            sprite.Color = xml.ChildHexColor("Color", Color.White);

            XmlElement anims = xml["Animations"];
            if (anims != null)
                foreach (XmlElement anim in anims.GetElementsByTagName("Anim"))
                    sprite.Add(anim.Attr("id"), anim.AttrFloat("delay", 0), anim.AttrBool("loop", true), Calc.ReadCSV(anim.Attr("frames")));

            return sprite;
        }
Пример #35
0
		public void KillSpriteAfterTimeout()
		{
			var enemyMovingOutOfScreen =
				new Sprite(new Material(ShaderFlags.Position2DTextured, "DeltaEngineLogo"),
					new Rectangle(Vector2D.Half, new Size(0.1f)));
			var data = new SimplePhysics.Data { Velocity = new Vector2D(0.5f, 0), Duration = 1 };
			enemyMovingOutOfScreen.Add(data);
			enemyMovingOutOfScreen.Start<SimplePhysics.Move>();
			enemyMovingOutOfScreen.Start<SimplePhysics.KillAfterDurationReached>();
			if (IsMockResolver)
				AdvanceTimeAndUpdateEntities(1.1f);
		}
Пример #36
0
		public void RenderSpriteWithRedOutline()
		{
			var sprite = new Sprite(logoMaterial, Rectangle.HalfCentered);
			sprite.Add(new OutlineColor(Color.Red));
			sprite.OnDraw<DrawPolygon2DOutlines>();
		}
Пример #37
0
		} //ncrunch: no coverage end

		private static void AddFallingBrick(Entity2D brick, Material material)
		{
			var fallingBrick = new Sprite(material, brick.DrawArea)
			{
				Color = brick.Color,
				RenderLayer = (int)BlocksRenderLayer.FallingBrick,
			};
			var random = Randomizer.Current;
			var data = new SimplePhysics.Data
			{
				Velocity = new Vector2D(random.Get(-0.5f, 0.5f), random.Get(-1.0f, 0.0f)),
				RotationSpeed = random.Get(-360, 360),
				Duration = 5.0f,
				Gravity = new Vector2D(0.0f, 2.0f)
			};
			fallingBrick.Add(data);
			fallingBrick.Start<SimplePhysics.Move>();
		}
Пример #38
0
		public void AddingUVCalculatorResultsThrowsException()
		{
			var sprite = new Sprite("DeltaEngineLogoAlpha", Rectangle.One);
			Assert.Throws<Sprite.RenderingDataComponentAddingIsNotSupported>(
				() => sprite.Add(new RenderingData()));
		}