Exemplo n.º 1
0
        public static void Talk(Entity obj)
        {
            tempData.Add("UpArrow", "true");
            GameMethods.ShowMessages(new List <MessageBox>()
            {
                new MessageBox("Ziggy", "I can't believe you figured it out!", obj.Position + new Vector2(0, -84)),
                new MessageBox("Ziggy", ".|.|. Well done!", obj.Position + new Vector2(0, -84))
            }, true, () =>
            {
                GameGlobal.PlayerController.MovementEnabled = false;
                Entity temp = Entity.Find("EarthRock");

                CameraController.Instance.Shake(3);
                Global.AudioController.Play("SFX/EarthRockRumble");

                StaticCoroutines.CoroutineHelper.RunOverX(3, 64, t => {
                    temp.Position += new Vector2(0, 1f);
                }, () => {
                    obj.Destroy();
                    GameData.Set("EarthRock/First", "2");
                    temp.Destroy();
                    GameGlobal.PlayerController.MovementEnabled = true;
                });
            }
                                     );
        }
Exemplo n.º 2
0
        public static void First(Entity obj)
        {
            if (GameData.Get("EarthRock/First") != null)
            {
                obj.Destroy();
                return;
            }

            GameData.Set("EarthRock/First", "1");
            GameMethods.ShowMessages(new List <MessageBox>()
            {
                new MessageBox("", "!", obj.Position + new Vector2(0, -64)),
                new MessageBox("Ziggy", "Hi.|.|.", obj.Position + new Vector2(0, -64)),
                new MessageBox("Ziggy", "I didn't think you'd survived.|.|.\nYou fell into that tree almost 3 days ago...", obj.Position + new Vector2(0, -64)),
                new MessageBox("Ziggy", "I'm not sure what this means but I feel implelled\nto tell you that if you want to interact with\nsomething you can press UP!", obj.Position + new Vector2(0, -64)),
                new MessageBox("Ziggy", "Why don't you try it on me!", obj.Position + new Vector2(16, -32))
            }, true, () =>
            {
                // Input icons
                if (GameData.Get("Tips/UpToInteract") == null)
                {
                    GameData.Set("Tips/UpToInteract", "1");
                    Texture2D texture2D = GameMethods.GetInputIcon(InputManager.Input.Up, Global.InputManager.CurrentInputType);
                    GameMethods.DisplayInputIcon(texture2D, new Vector2(119 * 16 + 8, 57 * 16 + 2), () => { return(false); });
                    GameMethods.DisplayInputIcon(texture2D, Entity.Find("EarthRock").Position + new Vector2(-8, 32 + 2), () => { return(tempData.ContainsKey("UpArrow")); });
                }
            }
                                     );
        }
Exemplo n.º 3
0
        public static void ID_first(Entity obj)
        {
            if (GameData.Get("NPCChest/" + obj.Data["id"] + "/" + "script") == null)
            {
                Global.AudioController.Play("SFX/OpenChest");
                obj.GetComponent <Sprite>().RunAnimation("Opening", false);
                GameData.Set("NPCChest/" + obj.Data["id"] + "/" + "open", "true");

                GameGlobal.PlayerController.MovementMode = PlayerController.MovementModes.None;

                StaticCoroutines.CoroutineHelper.WaitRun(1, () => {
                    GameMethods.ShowMessages(new List <MessageBox>()
                    {
                        new MessageBox(null, "There's nothing inside.|.|.", new Vector2(obj.Position.X, obj.Position.Y - 30))
                    }, null, () => {
                        StaticCoroutines.CoroutineHelper.WaitRun(2, () => {
                            GameMethods.ShowMessages(new List <MessageBox>()
                            {
                                new MessageBox("Majestic Chest", "Hi!|| Did you want something?", new Vector2(obj.Position.X, obj.Position.Y - 30)),
                                new MessageBox("Pause", "|.|.|.| I wasn't expecting that.", new Vector2(GameGlobal.Player.Position.X, GameGlobal.Player.Position.Y - 20))
                            }, null, () => {
                                StaticCoroutines.CoroutineHelper.WaitRun(1, () => {
                                    GameGlobal.PlayerController.MovementMode = PlayerController.MovementModes.Normal;
                                    GameData.Set("NPCChest/" + obj.Data["id"] + "/" + "open", "false");
                                    GameData.Set("NPCChest/" + obj.Data["id"] + "/" + "script", "2");
                                    obj.GetComponent <Sprite>().RunAnimation("Closing", false);
                                    Global.AudioController.Play("SFX/OpenChest");
                                });
                            });
                        });
                    });
                });
            }
            else if (GameData.Get("NPCChest/" + obj.Data["id"] + "/" + "script") == "2")
            {
                GameMethods.ShowMessages(new List <MessageBox>()
                {
                    new MessageBox(null, ".|.|. nothing.", new Vector2(obj.Position.X, obj.Position.Y - 30))
                }, true, () =>
                {
                });
            }
        }
Exemplo n.º 4
0
 public static void End(Entity obj)
 {
     GameMethods.ShowMessages(new List <MessageBox>()
     {
         new MessageBox("", "Oh, this is as far as you go...|", obj.Position + new Vector2(0, -32)),
         new MessageBox("", "An adventure awaits you on the\nother side of this cave!|", obj.Position + new Vector2(0, -32))
     }, true, () =>
     {
         GameGlobal.Player.GetComponent <PlayerController>().MovementEnabled = false;
         StaticCoroutines.CoroutineHelper.RunUntil(() => { return(Global.AudioController.MasterVolume <= 0); }, () => {
             Global.AudioController.MasterVolume -= 0.15f * Global.DeltaTime;
         }, () => {
             MonoXEngineGame.Instance.Exit();
         });
         GameGlobal.Fader.Data["Time"] = "4";
         GameGlobal.Fader.RunFunction("FadeOut", entity => {
             entity.RunFunction("SetDefault");
         });
     }
                              );
 }
Exemplo n.º 5
0
        public void Save(Vector2 pos)
        {
            Saving = true;
            GameGlobal.PlayerController.MovementEnabled = false;

            if (GameData.Get("SavePoint/First") == null)
            {
                GameData.Set("SavePoint/First", "1");

                GameMethods.ShowMessages(new List <MessageBox> {
                    new MessageBox("", "Something is written here.|.|.", pos),
                    new MessageBox("It say's", "'If you touch this grave stone your entire life up to\nthis point will be recorded.\n\nThe Holy Gravestone'|", pos),
                    new MessageBox("Holy Gravestone", "Why don't they just call it a save point?", pos)
                }, null, () => {
                    Save(pos);
                });
            }
            else
            {
                MessageBox messageBox = new MessageBox(null, "Would you like to save?", pos);
                messageBox.Build(null, () => {
                    GameMethods.ShowOptionSelector(pos + new Vector2(-16, 16), new List <Option>()
                    {
                        new Option("yes", "Yes", new Vector2(0, 0)),
                        new Option("no", "No", new Vector2(0, 16))
                    }, option => {
                        if (option == "yes")
                        {
                            Global.AudioController.Play("SFX/Save");
                            GameData.Save();
                        }

                        messageBox.Destroy();
                        GameGlobal.PlayerController.MovementEnabled = true;
                        Saving = false;
                    });
                });
            }
        }
Exemplo n.º 6
0
        public void MysticCave()
        {
            // Input icons
            Entity pushableBox = Global.Entities.Find(p => p.Name == "MovableObject");

            StaticCoroutines.CoroutineHelper.RunWhen(() => { return(GameGlobal.Player.Position.GetDistance(pushableBox.Position) < Global.Resolution.X / 2); }, () => {
                if (GameData.Get("Tips/Action2ToPush") == null)
                {
                    // Action 2
                    Texture2D texture2D = GameMethods.GetInputIcon(InputManager.Input.Action2, Global.InputManager.CurrentInputType);
                    GameMethods.DisplayInputIcon(texture2D, pushableBox.Position + new Vector2(0, -18), () => { return(GameGlobal.PlayerController.Pushing != 0); }, () => {
                        GameData.Set("Tips/Action2ToPush", "1");
                    });

                    // Right
                    texture2D = GameMethods.GetInputIcon(InputManager.Input.Right, Global.InputManager.CurrentInputType);
                    GameMethods.DisplayInputIcon(texture2D, pushableBox.Position + new Vector2(-18, 0), () => { return(GameGlobal.PlayerController.Pushing != 0); });

                    // Left
                    texture2D = GameMethods.GetInputIcon(InputManager.Input.Left, Global.InputManager.CurrentInputType);
                    GameMethods.DisplayInputIcon(texture2D, pushableBox.Position + new Vector2(18, 0), () => { return(GameGlobal.PlayerController.Pushing != 0); });
                }
            });
        }
Exemplo n.º 7
0
        public void TheTree()
        {
            SoundEffectInstance forestAmbienceSFX = Global.AudioController.Play("SFX/Forest_Ambience");

            forestAmbienceSFX.Volume = 0.3f;
            CoroutineHelper.Always(() => {
                if (forestAmbienceSFX.State == SoundState.Stopped)
                {
                    forestAmbienceSFX        = Global.AudioController.Play("SFX/Forest_Ambience");
                    forestAmbienceSFX.Volume = 0.3f;
                }
            });

            Global.SceneManager.CurrentScene.OnExit += () => {
                Global.AudioController.Stop("SFX/Forest_Ambience");
            };


            if (GameData.Get("Levels/TheTree/Intro") == "True")
            {
                // Music
                Global.AudioController.PlayMusic("Overworld Happy");
                return;
            }

            MyGame.Scenes.Level.CameraController.Offset = new Vector2(16, 0);

            // Initial fade
            GameGlobal.Fader.RunFunction("BlackOut");
            GameGlobal.Fader.RunFunction("Cancel");
            GameGlobal.Fader.Data["Time"] = "5";
            CoroutineHelper.WaitRun(2, () => {
                GameGlobal.Fader.RunFunction("Resume");
                GameGlobal.Fader.RunFunction("FadeIn");
            });

            GameGlobal.PlayerController.MovementEnabled = false;
            GameGlobal.PlayerController.Kinetic         = true;
            GameGlobal.PlayerGraphic.Visible            = false;
            GameGlobal.PlayerController.MovementMode    = PlayerController.MovementModes.None;

            // Camera pan down
            Entity camePos = new Entity(e => { e.Position = GameGlobal.Player.Position + new Vector2(0, -800); });

            CameraController.Instance.Easing  = 0.03f;
            CameraController.Instance.MaxStep = 1f;
            CameraController.Instance.Target  = camePos;
            CameraController.Instance.SnapOnce();

            // Seagulls
            CoroutineHelper.WaitRun(11, () => {
                CoroutineHelper.WaitRun(1, () => {
                    Global.AudioController.Play("SFX/BushRustle");
                });
                new Entity(entity => {
                    entity.LayerName    = "Main";
                    entity.SortingLayer = 8;
                    entity.AddComponent(new Sprite()
                    {
                        Texture2D = Global.Content.Load <Texture2D>("Entities/Seagull")
                    }).Run <Sprite>(s => {
                        s.AddAnimation(new Animation("Default", 0.1f, new Point(16, 16), new Point(0, 0), new Point(1, 0), new Point(2, 0), new Point(3, 0), new Point(3, 0), new Point(3, 0)));
                        s.RunAnimation("Default");
                    });

                    entity.Position = GameGlobal.Player.Position + new Vector2(0, -100);
                    entity.Scale    = new Vector2(2.1f, 2.1f);

                    CoroutineHelper.RunUntil(() => { return(entity.Position.Y < -500); }, () => {
                        entity.Position += new Vector2(0.3f, -0.2f * entity.Scale.Y);
                        entity.Scale    += new Vector2(-0.003f, -0.003f);
                        if (entity.Scale.X < 0.5f)
                        {
                            entity.Scale = new Vector2(0.5f, 0.5f);
                        }
                    });
                });
                new Entity(entity => {
                    entity.LayerName    = "Main";
                    entity.SortingLayer = 8;
                    entity.AddComponent(new Sprite()
                    {
                        Texture2D = Global.Content.Load <Texture2D>("Entities/Seagull")
                    }).Run <Sprite>(s => {
                        s.AddAnimation(new Animation("Default", 0.1f, new Point(16, 16), new Point(0, 0), new Point(1, 0), new Point(2, 0), new Point(3, 0), new Point(3, 0), new Point(3, 0)));
                        s.RunAnimation("Default");
                    });

                    entity.Position = GameGlobal.Player.Position + new Vector2(-40, -100);
                    entity.Scale    = new Vector2(2, 2);

                    CoroutineHelper.RunUntil(() => { return(entity.Position.Y < -500); }, () => {
                        entity.Position += new Vector2(0.3f, -0.2f * entity.Scale.Y);
                        entity.Scale    += new Vector2(-0.003f, -0.003f);
                        if (entity.Scale.X < 0.5f)
                        {
                            entity.Scale = new Vector2(0.5f, 0.5f);
                        }
                    });
                });
            });

            CoroutineHelper.WaitRun(7, () => {
                camePos.Position = GameGlobal.Player.Position + new Vector2(0, -40);

                CoroutineHelper.WaitRun(12, () => {
                    GameGlobal.Player.Position = camePos.Position + new Vector2(0, -20);
                    GameGlobal.PlayerGraphic.RunAnimation("Jump");

                    GameMethods.ShowMessages(new List <MessageBox>()
                    {
                        new MessageBox("Pause", ".|.|.|| !", camePos.Position),
                        new MessageBox("Pause", "Huh|.|.|.||| I don't remember\nsleeping there!?", camePos.Position)
                    }, null, () => {
                        CoroutineHelper.WaitRun(3, () => {
                            GameGlobal.PlayerGraphic.Visible = true;

                            MessageBox WoahMSG = new MessageBox("Pause", "Woah!", camePos.Position, MessageBox.Type.ManualDestroy);
                            WoahMSG.Build();

                            float temp = GameGlobal.Player.Position.Y;
                            CoroutineHelper.RunFor(0.7f, p => {
                                if (GameGlobal.Player.Position.Y < camePos.Position.Y + 45)
                                {
                                    GameGlobal.Player.Position.Y += 1f * (p * 4.15f);
                                }

                                if (GameGlobal.Player.Position.Y > WoahMSG.Position.Y + 32)
                                {
                                    WoahMSG.Position = GameGlobal.Player.Position + new Vector2(-WoahMSG.Container.Size.X / 2, -32);
                                }
                            }, () => {
                                GameGlobal.Player.Position.Y = camePos.Position.Y + 45;
                                GameGlobal.PlayerGraphic.RunAnimation("Lay");
                                Global.AudioController.Play("SFX/Thump");
                                WoahMSG.Destroy();

                                GameMethods.SmokePuffs(8, GameGlobal.PlayerGraphicEntity.Position, new Point(8, 8));

                                CameraController.Instance.Shake(0.7f);

                                CoroutineHelper.WaitRun(2, () => {
                                    // Music
                                    Global.AudioController.PlayMusic("Overworld Happy", 1);

                                    GameMethods.ShowMessages(new List <MessageBox>()
                                    {
                                        new MessageBox("Pause", "OUCH!", GameGlobal.Player.Position + new Vector2(0, -32)),
                                    }, null, () => {
                                        GameGlobal.PlayerController.MovementEnabled = true;
                                        GameGlobal.PlayerController.MovementMode    = PlayerController.MovementModes.Normal;
                                        GameGlobal.PlayerController.Kinetic         = false;
                                        CameraController.Instance.Easing            = 0.1f;
                                        CameraController.Instance.MaxStep           = 1000;
                                        CameraController.Instance.Target            = GameGlobal.Player;
                                        camePos.Destroy();

                                        GameGlobal.PlayerGraphic.RunAnimation("Stand");
                                        GameGlobal.PlayerController.Direction  = 1;
                                        GameGlobal.PlayerController.IsGrounded = true;

                                        GameData.Set("Levels/TheTree/Intro", "True");

                                        GameGlobal.Fader.RunFunction("SetDefault");
                                    });
                                });
                            });
                        });
                    });
                });
            });
        }
Exemplo n.º 8
0
        public void Build(Action action = null, Action finishedWriting = null)
        {
            FinishedWriting = finishedWriting;

            if (Speaker != null && Speaker != "")
            {
                PassedText = Speaker + "\n" + PassedText;
            }


            // Build and position text
            TextObject = new Entity(entity => {
                entity.LayerName    = DefaultLayerName;
                entity.SortingLayer = DefaultSortingLayer + 1;
                entity.Position     = PassedPosition;

                entity.AddComponent(new Text()).Run <Text>(component => {
                    component.String = PassedText.Replace("|", "");
                    TextString       = component;

                    // Final positioning
                    entity.Position = entity.BoundingBox.Location.ToVector2();
                });
            });

            // Build container based on text
            Container = new Entity(entity => {
                entity.LayerName    = DefaultLayerName;
                entity.SortingLayer = DefaultSortingLayer;
                entity.Origin       = Vector2.Zero;
                entity.Position     = new Vector2(TextObject.Position.X - Padding.X, (TextObject.Position.Y - Padding.Y) + 1);
                entity.AddComponent(new Drawable()
                {
                    Texture2D = GameMethods.RoundedRect(Global.Content.Load <Texture2D>("Defaults/9Patch_8"),
                                                        new Point(TextObject.BoundingBox.Width + (Padding.X * 2) + ((ThisType == Type.PressToProgress) ? 8 : 0), TextObject.BoundingBox.Height + Padding.Y * 2))
                });
            });

            // Build arrow flasher
            if (ThisType == Type.PressToProgress)
            {
                ArrowFlash = new Entity(entity => {
                    entity.LayerName    = DefaultLayerName;
                    entity.SortingLayer = DefaultSortingLayer + 1;
                    entity.Position     = new Vector2(TextObject.Position.X + TextObject.BoundingBox.Width + 6, TextObject.BoundingBox.Bottom + 2);
                    entity.AddComponent(new Sprite()
                    {
                        Texture2D = Global.Content.Load <Texture2D>("Defaults/ArrowFlash")
                    }).Run <Sprite>(sprite => {
                        sprite.AddAnimation(new Animation("Flashing", 0.5f, new Point(8, 8), new Point(0, 0), new Point(1, 0)));
                        sprite.RunAnimation("Flashing");
                        sprite.Visible = false;
                    });
                });
            }

            if (Speaker != null && Speaker != "")
            {
                TextString.String = Speaker + "\n";
                TestString        = Speaker + "\n";
            }
            else
            {
                TextString.String = "";
                TestString        = "";
            }

            ProgressText(action);
        }
Exemplo n.º 9
0
        public void Build(Vector2 position, List <Option> optionList, Action <string> action = null, bool closeAfter = true, string texture9Patch = "Defaults/9Patch_8")
        {
            Selecting      = true;
            CloseAfter     = closeAfter;
            CurrentOptions = optionList;

            Selector = new Entity(entity => {
                entity.LayerName    = DefaultLayerName;
                entity.SortingLayer = DefaultSortingLayer + 1;
                entity.AddComponent(new Sprite()
                {
                    Texture2D = Global.Content.Load <Texture2D>("Defaults/OptionSelector")
                });
            });

            Container = new Entity(entity => {
                entity.Position     = position;
                entity.LayerName    = DefaultLayerName;
                entity.SortingLayer = DefaultSortingLayer;
                entity.Origin       = Vector2.Zero;

                float w = 0, h = 0;

                foreach (var option in optionList)
                {
                    float optionBoundsX = option.Position.X + option.Size.X;
                    if (optionBoundsX > w)
                    {
                        w = optionBoundsX;
                    }

                    float optionBoundsY = option.Position.Y + option.Size.Y;
                    if (optionBoundsY > h)
                    {
                        h = optionBoundsY;
                    }

                    option.Position = (entity.Position + option.Position + (Padding.ToVector2() / 2) + new Vector2(SelectorSize.X, 0));
                }

                if (texture9Patch != null)
                {
                    entity.AddComponent(new Drawable()
                    {
                        Texture2D = GameMethods.RoundedRect(Global.Content.Load <Texture2D>(texture9Patch),
                                                            new Point((int)w + (int)(Padding.X * 1.5f) + (int)SelectorSize.X, (int)h + Padding.Y))
                    });
                }

                SelectedOption = optionList.First <Option>();

                StaticCoroutines.CoroutineHelper.RunUntil(() => { return(!Selecting); }, () => {
                    if (Global.InputManager.Pressed(InputManager.Input.Up))
                    {
                        FindOption(optionList, "Up");
                    }
                    else if (Global.InputManager.Pressed(InputManager.Input.Down))
                    {
                        FindOption(optionList, "Down");
                    }
                    else if (Global.InputManager.Pressed(InputManager.Input.Left))
                    {
                        FindOption(optionList, "Left");
                    }
                    else if (Global.InputManager.Pressed(InputManager.Input.Right))
                    {
                        FindOption(optionList, "Right");
                    }
                    else if (Global.InputManager.Pressed(InputManager.Input.Action1))
                    {
                        Finished(optionList, action);
                    }
                });
            });
        }
Exemplo n.º 10
0
        public void Interpret(EntityInfo entityInfo)
        {
            if (entityInfo.Name == "StartPosition" && GameData.Get("Player/Position") == null)
            {
                GameGlobal.Player.Position = new Vector2(entityInfo.Position.X * 16, entityInfo.Position.Y * 16);
            }
            else if (entityInfo.Name == "Switch")
            {
                new Entity(entity => {
                    entity.AddComponent(new Switch(entityInfo));
                });
            }
            else if (entityInfo.Name == "MovableObject")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);
                new Entity(entity => {
                    entity.LayerName    = "Main";
                    entity.SortingLayer = GameGlobal.PlayerGraphicEntity.SortingLayer - 1;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Sprite()).Run <Sprite>(sprite => {
                        sprite.LoadTexture("Graphics/WoodenBox");
                    });
                    entity.AddComponent(new MoveableObject());
                    if (data.GetString("id") != null)
                    {
                        entity.Data.Add("PO_ID", data.GetString("id"));
                        string poidposstr = GameData.Get("PO_ID:" + entity.Data["PO_ID"] + "/Position");
                        if (poidposstr != null)
                        {
                            string[] poidpos = poidposstr.Split(',');
                            entity.Position  = new Vector2((float)Convert.ToDouble(poidpos[0]), (int)Convert.ToDouble(poidpos[1]));
                        }
                    }
                });
            }
            else if (entityInfo.Name == "MovablePlatform")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);
                new Entity(entity => {
                    entity.LayerName    = "Main";
                    entity.SortingLayer = 10;
                    entity.Position     = entityInfo.Position * 16;
                    entity.AddComponent(new Sprite()).Run <Sprite>(sprite => {
                        sprite.BuildRectangle(new Point(32, 16), Color.White);
                    });

                    entity.AddComponent(new MovablePlatform(entity.Position)).Run <MovablePlatform>(mp => {
                        mp.Speed     = (data.HasKey("speed")) ? data.GetFloat("speed") : 1;
                        mp.XDistance = (data.HasKey("xdistance")) ? data.GetFloat("xdistance") : 0;
                        mp.YDistance = (data.HasKey("ydistance")) ? data.GetFloat("ydistance") : 0;
                    });
                });
            }
            else if (entityInfo.Name == "LightSource")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                // Pre set light sources
                if (data.HasKey("type"))
                {
                    if (data.GetString("type") == "OrangeTorch")
                    {
                        Level.RenderBlender.DrawableTextures.Add(new RenderBlender.DrawableTexture("alphamask2")
                        {
                            Position = (entityInfo.Position * 16),
                            Blend    = RenderBlender.Subtract,
                            Update   = item => { item.Scale = 1.6f; }
                        });
                        Level.RenderBlender.DrawableTextures.Add(new RenderBlender.DrawableTexture("alphamask2")
                        {
                            Position = (entityInfo.Position * 16),
                            Color    = Color.Orange * 0.1f,
                            Update   = item => { item.Scale = 0.6f + 0.04f * (float)Math.Sin(GameGlobal.TimeLoop * 50); }
                        });
                    }
                    else if (data.GetString("type") == "BlueMushroom")
                    {
                        Level.RenderBlender.DrawableTextures.Add(new RenderBlender.DrawableTexture("alphamask2")
                        {
                            Position = (entityInfo.Position * 16),
                            Blend    = RenderBlender.Subtract,
                            Color    = Color.White * 0.8f,
                            Update   = item => { item.Scale = 1.3f; }
                        });
                        Level.RenderBlender.DrawableTextures.Add(new RenderBlender.DrawableTexture("alphamask")
                        {
                            Position = (entityInfo.Position * 16),
                            Color    = Color.DeepSkyBlue * 0.2f,
                            Update   = item => { item.Scale = 0.6f + 0.03f * (float)Math.Sin(GameGlobal.TimeLoop * 3); }
                        });
                    }
                }
                // Custom light sources
                else
                {
                    Level.RenderBlender.DrawableTextures.Add(new RenderBlender.DrawableTexture(data.GetString("texture") != "" ? data.GetString("texture"): "White")
                    {
                        Position = (entityInfo.Position * 16) + data.GetPointArr("offset")[0].ToVector2(),
                        Blend    = (data.GetString("blendstate") == "Subtract") ? RenderBlender.Subtract : RenderBlender.Lighting,
                        Color    = GameMethods.GetProperty <Color>(data.GetString("color")),
                        Scale    = data.GetFloat("scale"),
                        Layer    = data.GetInt("layer")
                    });
                }
            }
            else if (entityInfo.Name == "Lighting")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                Level.RenderBlender.ClearColor = Color.Black * data.GetFloat("darkness");
            }
            else if (entityInfo.Name == "SavePoint")
            {
                new SavePoint(entityInfo);
            }
            else if (entityInfo.Name == "Enemy")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                Type type = Type.GetType("MyGame.Enemies." + data.GetString("type"));
                Activator.CreateInstance(type, new object[] { entityInfo });
            }
            else if (entityInfo.Name == "Audio2D")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                Vector2 position  = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                float   distance  = ((data.HasKey("distance")) ? data.GetFloat("distance") : 5) * 16;
                float   minvolume = ((data.HasKey("minvolume")) ? data.GetFloat("minvolume") : 0);
                float   maxvolume = ((data.HasKey("maxvolume")) ? data.GetFloat("maxvolume") : 1);

                SoundEffectInstance sfi = Global.AudioController.Play("SFX/" + data.GetString("file"));
                sfi.Volume = 0;
                CoroutineHelper.Always(() => {
                    if (Global.RunWhenEventLoops("ReplaySFX_" + data.GetString("file"), sfi == null || sfi.State != SoundState.Playing))
                    {
                        sfi = Global.AudioController.Play("SFX/" + data.GetString("file"));
                    }

                    float difference = GameGlobal.Player.Position.GetDistance(position);
                    float percent    = (((difference - distance) * 100) / ((maxvolume) - distance)).Between(minvolume, maxvolume);
                    sfi.Volume       = (percent / 100);
                });

                Global.SceneManager.CurrentScene.OnExit += () => {
                    Global.AudioController.Stop("SFX/" + data.GetString("file"));
                };
            }
            else if (entityInfo.Name == "InteractScript")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.Name      = "InteractScript";
                    entity.LayerName = "Main";

                    entity.Data.Add("Script", data.GetString("script"));

                    entity.SortingLayer = GameGlobal.Player.SortingLayer;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), Color.Blue);
                        d.Visible = false;
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });

                    if (data.HasKey("autoscript"))
                    {
                        CoroutineHelper.WaitRun(0.1f, () => {
                            string[] script = data.GetString("autoscript").Split('.');
                            Type type       = Type.GetType("MyGame." + script[0]);
                            MethodInfo mi   = type.GetMethod(script[1], BindingFlags.Static | BindingFlags.Public);
                            mi.Invoke(null, new object[] { entity });
                        });
                    }
                });
            }
            else if (entityInfo.Name == "TouchScript")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.Name      = "TouchScript";
                    entity.LayerName = "Main";

                    entity.Data.Add("Script", data.GetString("script"));

                    entity.SortingLayer = GameGlobal.Player.SortingLayer;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), Color.Blue);
                        d.Visible = false;
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
            else if (entityInfo.Name == "Ambience")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                SoundEffectInstance sfi = Global.AudioController.Play("SFX/" + data.GetString("file"));
                sfi.Volume = (data.HasKey("volume")) ? data.GetFloat("volume") : 1;
                CoroutineHelper.Always(() => {
                    if (sfi.State == SoundState.Stopped)
                    {
                        sfi        = Global.AudioController.Play("SFX/" + data.GetString("file"));
                        sfi.Volume = (data.HasKey("volume")) ? data.GetFloat("volume") : 1;
                    }
                });

                Global.SceneManager.CurrentScene.OnExit += () => {
                    Global.AudioController.Stop("SFX/" + data.GetString("file"));
                };
            }
            else if (entityInfo.Name == "Music")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                float fadeTo = (data.HasKey("fadeTo")) ? data.GetFloat("fadeTo") : 1;

                if (Global.AudioController.CurrentMusicFile == null || Global.AudioController.CurrentMusicFile == "")
                {
                    Global.AudioController.PlayMusic(data.GetString("file"));
                    Global.AudioController.CurrentMusicVolume = fadeTo;
                }
                else
                {
                    Global.AudioController.PlayMusic(data.GetString("file"), fadeTo);
                }
            }
            else if (entityInfo.Name == "NPCChest")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                NPCChest.Create(entityInfo, data);
            }
            else if (entityInfo.Name == "Chest")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.Name         = "Chest";
                    entity.LayerName    = "Main";
                    entity.SortingLayer = GameGlobal.Player.SortingLayer - 1;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Sprite()).Run <Sprite>(d => {
                        d.LoadTexture("Entities/Chest_" + data.GetString("type"));
                        d.AddAnimation(new Animation("Closed", 0, new Point(32, 32), new Point(0, 0)));
                        d.AddAnimation(new Animation("Opening", 0.1f, new Point(32, 32), new Point(1, 0), new Point(2, 0), new Point(3, 0), new Point(4, 0)));
                        d.RunAnimation("Closed");
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
            else if (entityInfo.Name == "NPC")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.Name         = "NPC";
                    entity.LayerName    = "Main";
                    entity.SortingLayer = GameGlobal.Player.SortingLayer;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.Origin       = Vector2.Zero;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), Color.CornflowerBlue);
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
            else if (entityInfo.Name == "Water")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.Name         = "Water";
                    entity.LayerName    = "Main";
                    entity.SortingLayer = 4;
                    entity.Opacity      = 1f;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        Color waterColor = (data.HasKey("color")) ? GameMethods.GetProperty <Color>(data.GetString("color")) * 0.2f : new Color(0, 0, 0, 0.2f);
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), waterColor);

                        /* Animate water */
                        int offset     = 0;
                        Color[] colors = new Color[6];
                        for (int i = 0; i < colors.Length; i++)
                        {
                            colors[i] = (i % 6 >= 3) ? Color.AliceBlue * 0.3f : Color.DarkSlateBlue * 0.1f;
                        }
                        colors[3] = Color.AliceBlue * 0.5f;

                        int offsetPrev = 0;
                        CoroutineHelper.Always(() => {
                            offset = 6 + (int)(Math.Sin(Global.GameTime.TotalGameTime.TotalMilliseconds / 500) * 3);

                            if (offset != offsetPrev)
                            {
                                offsetPrev = offset;
                                d.Texture2D.ManipulateColorsRect1D(new Rectangle(0, 0, d.Texture2D.Width, 2), colors1D => {
                                    int width = d.Texture2D.Width;
                                    for (int x = 0; x < width; x++)
                                    {
                                        colors1D[0 * width + x] = colors[(x + offset).Wrap(0, colors.Length - 1)];
                                        colors1D[1 * width + x] = colors[(2 - x + offset / 2).Wrap(0, colors.Length - 1)] * 0.5f;
                                    }

                                    return(colors1D);
                                });
                            }
                        });
                        /* /Animate water */
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
            else if (entityInfo.Name == "Background")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.LayerName = "Background";
                    entity.Position  = new Vector2(0, 0);

                    if (data.HasKey("sortinglayer"))
                    {
                        entity.SortingLayer = data.GetInt("sortinglayer");
                    }

                    if (data.HasKey("opacity"))
                    {
                        entity.Opacity = data.GetFloat("opacity");
                    }

                    float[] coefficient = data.GetFloatArr("coefficient");
                    float[] offset      = data.GetFloatArr("offset");

                    entity.AddComponent(new CameraOffsetTexture()
                    {
                        Texture2D = Global.Content.Load <Texture2D>("Backgrounds/" + data.GetString("image")), Coefficient = new Vector2(coefficient[0], coefficient[1]), Offset = new Vector2(offset[0], offset[1])
                    });

                    if (data.HasKey("animate"))
                    {
                        entity.GetComponent <CameraOffsetTexture>().Animate      = true;
                        entity.GetComponent <CameraOffsetTexture>().AnimStepTime = data.GetFloat("animate");
                        entity.GetComponent <CameraOffsetTexture>().Size         = data.GetPointArr("crop")[0];
                    }
                });
            }
            else if (entityInfo.Name == "Foreground")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.LayerName    = "Foreground";
                    entity.Position     = Vector2.Zero;
                    entity.SortingLayer = 8;
                    float[] coefficient = data.GetFloatArr("coefficient");
                    float[] offset      = data.GetFloatArr("offset");

                    entity.AddComponent(new CameraOffsetTexture()
                    {
                        Texture2D = Global.Content.Load <Texture2D>("Foregrounds/" + data.GetString("image")), Coefficient = new Vector2(coefficient[0], coefficient[1]), Offset = new Vector2(offset[0], offset[1])
                    });

                    if (data.HasKey("animate"))
                    {
                        entity.GetComponent <CameraOffsetTexture>().Animate      = true;
                        entity.GetComponent <CameraOffsetTexture>().AnimStepTime = data.GetFloat("animate");
                        entity.GetComponent <CameraOffsetTexture>().Size         = data.GetPointArr("crop")[0];
                    }
                });
            }
            else if (entityInfo.Name == "AutoDoor")
            {
                new Entity(entity => {
                    entity.Name      = "AutoDoor";
                    entity.LayerName = "Main";

                    ZInterpreter data = new ZInterpreter(entityInfo.Data);
                    entity.Data.Add("Level", data.GetString("level"));
                    entity.Data.Add("Position", data.GetString("position"));

                    entity.SortingLayer = GameGlobal.Player.SortingLayer + 5;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), Color.Blue);
                        d.Visible = false;
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
            else if (entityInfo.Name == "Door")
            {
                new Entity(entity => {
                    entity.Name      = "Door";
                    entity.LayerName = "Main";

                    ZInterpreter data = new ZInterpreter(entityInfo.Data);
                    entity.Data.Add("Level", data.GetString("level"));
                    entity.Data.Add("Position", data.GetString("position"));

                    entity.SortingLayer = GameGlobal.Player.SortingLayer;
                    entity.Position     = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), Color.Blue);
                        d.Visible = false;
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
            else if (entityInfo.Name == "Graphic")
            {
                ZInterpreter data = new ZInterpreter(entityInfo.Data);

                new Entity(entity => {
                    entity.Name         = "Graphic";
                    entity.LayerName    = "Main";
                    entity.SortingLayer = (data.HasKey("sortinglayer")) ? data.GetInt("sortinglayer") : 2;

                    entity.Position = (entityInfo.Position * 16);

                    if (data.HasKey("origin"))
                    {
                        var origin    = data.GetFloatArr("origin");
                        entity.Origin = new Vector2(origin[0], origin[1]);
                        if (entity.Origin.X == 1)
                        {
                            entity.Position.X += (16 * entity.Origin.X);
                        }
                        if (entity.Origin.Y == 1)
                        {
                            entity.Position.Y += (16 * entity.Origin.Y);
                        }
                    }

                    if (data.HasKey("collider"))
                    {
                        entity.AddComponent(new Collider());

                        if (data.GetString("collider").ToLower() == "pixel")
                        {
                            entity.GetComponent <Collider>().ColliderType = Collider.ColliderTypes.Pixel;
                        }
                        else if (data.GetString("collider").ToLower() == "box")
                        {
                            if (data.HasKey("boxrect"))
                            {
                                int[] boxrect = data.GetIntArr("boxrect");
                                entity.GetComponent <Collider>().ColliderType = Collider.ColliderTypes.Box;
                                entity.GetComponent <Collider>().Offset       = new Offset(boxrect[0], boxrect[1], boxrect[2], boxrect[3]);
                            }
                        }
                    }

                    if (data.HasKey("offset"))
                    {
                        var offset       = data.GetFloatArr("offset");
                        entity.Position += new Vector2(offset[0], offset[1]);
                    }

                    if (data.HasKey("id"))
                    {
                        entity.ID = data.GetString("id");
                    }

                    entity.AddComponent(new Sprite()).Run <Sprite>(d => {
                        d.LoadTexture("Graphics/" + data.GetString("image"));
                    });
                });
            }
            else if (entityInfo.Name == "Animation")
            {
                new Entity(entity => {
                    entity.Name         = "Animation";
                    entity.LayerName    = "Main";
                    entity.Origin       = Vector2.Zero;
                    entity.SortingLayer = 2;

                    ZInterpreter data = new ZInterpreter(entityInfo.Data);
                    entity.Opacity    = (data.HasKey("opacity")) ? data.GetFloat("opacity") : 1;

                    entity.AddComponent(new Sprite()).Run <Sprite>(d => {
                        d.LoadTexture("Graphics/" + data.GetString("image"));
                        d.AddAnimation(new Animation("Default", data.GetFloat("delay"), data.GetPointArr("size")[0], data.GetPointArr("frames")));
                        d.RunAnimation("Default");
                        entity.Position = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    });
                });
            }
            else if (entityInfo.Name == "CameraLock")
            {
                new Entity(entity => {
                    entity.Name      = "CameraLock";
                    entity.LayerName = "Main";
                    entity.Data.Add("Type", entityInfo.Data);
                    entity.SortingLayer = GameGlobal.Player.SortingLayer;
                    entity.Opacity      = 0;
                    entity.AddComponent(new Drawable()).Run <Drawable>(d => {
                        d.BuildRectangle(new Point(entityInfo.Size.X * 16, entityInfo.Size.Y * 16), Color.Red);
                        entity.Position = (entityInfo.Position * 16) + (entityInfo.Size.ToVector2() / 2) * 16;
                    });

                    entity.AddComponent(new Collider()).Run <Collider>(c => { c.TriggerType = Collider.TriggerTypes.NonSolid; c.ColliderType = Collider.ColliderTypes.Box; });
                });
            }
        }
Exemplo n.º 11
0
        public SavePoint(EntityInfo entityInfo)
        {
            Entity = new Entity(entity => {
                entity.Name      = "SavePoint";
                entity.Position  = entityInfo.Position * 16;
                entity.LayerName = "Main";

                //entity.SortingLayer = GameGlobal.PlayerGraphicEntity.SortingLayer-1;
                entity.Origin = Vector2.Zero;
                entity.AddComponent(new Sprite()).Run <Sprite>(sprite => {
                    sprite.LoadTexture("Entities/SavePoint");
                });

                entity.AddComponent(new Collider()).Run <Collider>(collider => { Collider = collider; Collider.TriggerType = Collider.TriggerTypes.NonSolid; });

                StaticCoroutines.CoroutineHelper.Always(() => {
                    Collider.CheckOffset(new Offset());
                });
            });

            /*
             * Entity.CollidingWithTrigger = obj => {
             *  if (Saving)
             *      return;
             *
             *  if (obj.Name == "Player" && Global.InputManager.Pressed(InputManager.Input.Up))
             *      Save(Entity.Position + new Vector2(0, -32));
             * };
             */

            Level.RenderBlender.DrawableTextures.AddRange(new List <DrawableTexture>()
            {
                new RenderBlender.DrawableTexture("alphamask2")
                {
                    Blend    = RenderBlender.Subtract,
                    Position = Entity.Position + new Vector2(8),
                    Color    = Color.White,
                    Update   = item => { item.Scale = 2f + 0.06f * (float)Math.Sin(GameGlobal.TimeLoop * 2); }
                }
            });

            Level.RenderBlender.DrawableTextures.AddRange(new List <DrawableTexture>()
            {
                new RenderBlender.DrawableTexture("alphamask")
                {
                    Position = Entity.Position + new Vector2(8),
                    Color    = Color.DeepSkyBlue * 0.3f,
                    Update   = item => { item.Scale = 1.2f + 0.2f * (float)Math.Sin(GameGlobal.TimeLoop * 2); }
                }
            });

            // Circle bits
            Vector2 origin = (entityInfo.Position * 16) + new Vector2(8);

            for (int I = 0; I < 7; I++)
            {
                float rand = GameMethods.Random(1, 2);
                if (rand >= 1.5f)
                {
                    rand = -rand;
                }
                Level.RenderBlender.DrawableTextures.Add(new RenderBlender.DrawableTexture("alphamask2")
                {
                    Color  = Color.AliceBlue * 0.6f,
                    Update = item => {
                        item.Scale      = 0.02f * rand + 0.02f * (float)Math.Sin(GameGlobal.TimeLoop * rand);
                        item.Position.X = origin.X + (float)Math.Cos(MathHelper.WrapAngle(GameGlobal.TimeLoop * 0.4f * rand)) * 12 * rand;
                        item.Position.Y = origin.Y + (float)Math.Sin(GameGlobal.TimeLoop * 0.7f * rand) * 12 * rand;
                    }
                });
            }
        }