Beispiel #1
0
        private void LoadFile(string path, List <string> pathArgs = null)
        {
            var projectReader = new ProjectXmlReader();

            project = projectReader.Load(path);

            BasePath = project.BaseDir;

            PixelsDown   = project.ScreenHeight;
            PixelsAcross = project.ScreenWidth;

            if (ScreenSizeChanged != null)
            {
                ScreenSizeChangedEventArgs args = new ScreenSizeChangedEventArgs(PixelsAcross, PixelsDown);
                ScreenSizeChanged(this, args);
            }

            if (project.MusicNSF != null)
            {
                Engine.Instance.SoundSystem.LoadMusicNSF(project.MusicNSF.Absolute);
            }
            if (project.EffectsNSF != null)
            {
                Engine.Instance.SoundSystem.LoadSfxNSF(project.EffectsNSF.Absolute);
            }

            foreach (var stageInfo in project.Stages)
            {
                stageFactory.Load(stageInfo);
            }

            foreach (var includePath in project.Includes)
            {
                string includefile = includePath.Absolute;
                IncludeXmlFile(includefile);
            }

            Engine.Instance.SoundSystem.LoadEffectsFromInfo(project.Sounds);
            Scene.LoadScenes(project.Scenes);
            Menu.LoadMenus(project.Menus);
            FontSystem.Load(project.Fonts);
            PaletteSystem.LoadPalettes(project.Palettes);

            currentPath = path;

            if (pathArgs != null && pathArgs.Any())
            {
                ProcessCommandLineArgs(pathArgs);
            }
            else if (project.StartHandler != null)
            {
                _stateMachine.ProcessHandler(project.StartHandler);
            }
            else
            {
                throw new GameRunException("The game file loaded correctly, but it failed to specify a starting point!");
            }

            Player = new Player();
        }
            public void ChangePalette(int index)
            {
                var paletteName = _sprites.Values.First().PaletteName;
                var palette     = PaletteSystem.Get(paletteName);

                if (palette != null)
                {
                    palette.CurrentIndex = index;
                }
            }
        public static Effect ParseEffect(XElement node)
        {
            Effect action = entity => { };

            foreach (XElement prop in node.Elements())
            {
                switch (prop.Name.LocalName)
                {
                case "Name":
                    string spritename = prop.Value;

                    action += entity =>
                    {
                        SpriteComponent spritecomp = entity.GetComponent <SpriteComponent>();
                        spritecomp.ChangeSprite(spritename);
                    };
                    break;

                case "Playing":
                    bool play = prop.GetValue <bool>();
                    action += entity =>
                    {
                        SpriteComponent spritecomp = entity.GetComponent <SpriteComponent>();
                        spritecomp.Playing = play;
                    };
                    break;

                case "Visible":
                    bool vis = prop.GetValue <bool>();
                    action += entity =>
                    {
                        SpriteComponent spritecomp = entity.GetComponent <SpriteComponent>();
                        spritecomp.Visible = vis;
                    };
                    break;

                case "Palette":
                    string pal   = prop.RequireAttribute("name").Value;
                    int    index = prop.GetAttribute <int>("index");
                    action += entity =>
                    {
                        var palette = PaletteSystem.Get(pal);
                        if (palette != null)
                        {
                            palette.CurrentIndex = index;
                        }
                    };
                    break;
                }
            }
            return(action);
        }
Beispiel #4
0
 public void Unload()
 {
     Engine.Instance.Stop();
     _stateMachine.StopAllHandlers();
     _entitySource.Unload();
     Engine.Instance.UnloadAudio();
     FontSystem.Unload();
     HealthMeter.Unload();
     Scene.Unload();
     Menu.Unload();
     PaletteSystem.Unload();
     EffectParser.Unload();
     CurrentGame = null;
 }
Beispiel #5
0
        public static Effect LoadEffectAction(XElement node)
        {
            Effect effect = e => { };

            switch (node.Name.LocalName)
            {
            case "Call":
                effect = GetLateBoundEffect(node.Value);
                break;

            case "Spawn":
                effect = LoadSpawnEffect(node);
                break;

            case "Remove":
                effect = entity => { entity.Remove(); };
                break;

            case "Die":
                effect = entity => { entity.Die(); };
                break;

            case "AddInventory":
                string itemName = node.RequireAttribute("item").Value;
                int    quantity = node.TryAttribute <int>("quantity", 1);

                effect = entity =>
                {
                    Game.CurrentGame.Player.CollectItem(itemName, quantity);
                };
                break;

            case "RemoveInventory":
                string itemNameUse = node.RequireAttribute("item").Value;
                int    quantityUse = node.TryAttribute <int>("quantity", 1);

                effect = entity =>
                {
                    Game.CurrentGame.Player.UseItem(itemNameUse, quantityUse);
                };
                break;

            case "UnlockWeapon":
                string weaponName = node.RequireAttribute("name").Value;

                effect = entity =>
                {
                    Game.CurrentGame.Player.UnlockWeapon(weaponName);
                };
                break;

            case "DefeatBoss":
                string name = node.RequireAttribute("name").Value;

                effect = entity =>
                {
                    Game.CurrentGame.Player.DefeatBoss(name);
                };
                break;

            case "Lives":
                int add = int.Parse(node.RequireAttribute("add").Value);
                effect = entity =>
                {
                    Game.CurrentGame.Player.Lives += add;
                };
                break;

            case "GravityFlip":
                bool flip = node.GetValue <bool>();
                effect = entity => { entity.Container.IsGravityFlipped = flip; };
                break;

            case "Func":
                effect = entity => { };
                string[] statements = node.Value.Split(';');
                foreach (string st in statements.Where(st => !string.IsNullOrEmpty(st.Trim())))
                {
                    LambdaExpression lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(
                        new[] { posParam, moveParam, sprParam, inputParam, collParam, ladderParam, timerParam, healthParam, stateParam, weaponParam, playerParam },
                        typeof(SplitEffect),
                        null,
                        st,
                        dirDict);
                    effect += CloseEffect((SplitEffect)lambda.Compile());
                }
                break;

            case "Trigger":
                string conditionString;
                if (node.Attribute("condition") != null)
                {
                    conditionString = node.RequireAttribute("condition").Value;
                }
                else
                {
                    conditionString = node.Element("Condition").Value;
                }

                Condition condition     = ParseCondition(conditionString);
                Effect    triggerEffect = LoadTriggerEffect(node.Element("Effect"));
                effect += (e) =>
                {
                    if (condition(e))
                    {
                        triggerEffect(e);
                    }
                };
                break;

            case "Pause":
                effect = entity => { entity.Paused = true; };
                break;

            case "Unpause":
                effect = entity => { entity.Paused = false; };
                break;

            case "Next":
                var transfer = GameXmlReader.LoadHandlerTransfer(node);
                effect = e => { Game.CurrentGame.ProcessHandler(transfer); };
                break;

            case "Palette":
                var paletteName  = node.RequireAttribute("name").Value;
                var paletteIndex = node.GetAttribute <int>("index");
                effect = e =>
                {
                    var palette = PaletteSystem.Get(paletteName);
                    if (palette != null)
                    {
                        palette.CurrentIndex = paletteIndex;
                    }
                };
                break;

            case "Delay":
                var delayFrames = node.GetAttribute <int>("frames");
                var delayEffect = LoadEffect(node);
                effect = e =>
                {
                    Engine.Instance.DelayedCall(() => delayEffect(e), null, delayFrames);
                };
                break;

            case "SetVar":
                var varname = node.RequireAttribute("name").Value;
                var value   = node.RequireAttribute("value").Value;
                effect = e =>
                {
                    Game.CurrentGame.Player.SetVar(varname, value);
                };
                break;

            default:
                effect = GameEntity.ParseComponentEffect(node);
                break;
            }
            return(effect);
        }