コード例 #1
0
ファイル: LevelHandler.cs プロジェクト: razluta/jazz2
        private void LoadLevel(string level, string episode)
        {
            string levelPath = PathOp.Combine(DualityApp.DataDirectory, "Episodes", episode, level);

            using (Stream s = FileOp.Open(PathOp.Combine(levelPath, ".res"), FileAccessMode.Read)) {
                // ToDo: Cache parser, move JSON parsing to ContentResolver
                JsonParser      json   = new JsonParser();
                LevelConfigJson config = json.Parse <LevelConfigJson>(s);

                if (config.Version.LayerFormat > LayerFormatVersion || config.Version.EventSet > EventSetVersion)
                {
                    throw new NotSupportedException("Version not supported");
                }

                Console.WriteLine("Loading level \"" + config.Description.Name + "\"...");

                root.Title     = BitmapFont.StripFormatting(config.Description.Name);
                root.Immersive = false;

                defaultNextLevel    = config.Description.NextLevel;
                defaultSecretLevel  = config.Description.SecretLevel;
                ambientLightDefault = config.Description.DefaultLight;
                ambientLightCurrent = ambientLightTarget = ambientLightDefault * 0.01f;

                if (config.Description.DefaultDarkness != null && config.Description.DefaultDarkness.Count >= 4)
                {
                    darknessColor = new Vector4(config.Description.DefaultDarkness[0] / 255f, config.Description.DefaultDarkness[1] / 255f, config.Description.DefaultDarkness[2] / 255f, config.Description.DefaultDarkness[3] / 255f);
                }
                else
                {
                    darknessColor = new Vector4(0, 0, 0, 1);
                }

                // Palette
                {
                    ColorRgba[] tileMapPalette;

                    string levelPalette = PathOp.Combine(levelPath, ".palette");
                    if (FileOp.Exists(levelPalette))
                    {
                        tileMapPalette = TileSet.LoadPalette(levelPalette);
                    }
                    else
                    {
                        string tilesetPath = PathOp.Combine(DualityApp.DataDirectory, "Tilesets", config.Description.DefaultTileset);
                        tileMapPalette = TileSet.LoadPalette(PathOp.Combine(tilesetPath, ".palette"));
                    }

                    ContentResolver.Current.ApplyBasePalette(tileMapPalette);
                }

                // Tileset
                tileMap = new TileMap(this, config.Description.DefaultTileset, (config.Description.Flags & LevelFlags.HasPit) != 0);

                // Additional tilesets
                if (config.Tilesets != null)
                {
                    for (int i = 0; i < config.Tilesets.Count; i++)
                    {
                        LevelConfigJson.TilesetSection part = config.Tilesets[i];
                        tileMap.ReadTilesetPart(part.Name, part.Offset, part.Count);
                    }
                }

                // Read all layers
                config.Layers.Add("Sprite", new LevelConfigJson.LayerSection {
                    XSpeed = 1,
                    YSpeed = 1
                });

                foreach (var layer in config.Layers.OrderBy(layer => layer.Value.Depth))
                {
                    LayerType type;
                    if (layer.Key == "Sprite")
                    {
                        type = LayerType.Sprite;
                    }
                    else if (layer.Key == "Sky")
                    {
                        type = LayerType.Sky;

                        if (layer.Value.BackgroundStyle != 0 /*Plain*/ && layer.Value.BackgroundColor != null && layer.Value.BackgroundColor.Count >= 3)
                        {
                            camera.GetComponent <Camera>().ClearColor = new ColorRgba((byte)layer.Value.BackgroundColor[0], (byte)layer.Value.BackgroundColor[1], (byte)layer.Value.BackgroundColor[2]);
                        }
                    }
                    else
                    {
                        type = LayerType.Other;
                    }

                    tileMap.ReadLayerConfiguration(type, levelPath, layer.Key, layer.Value);
                }

                // Read animated tiles
                string animTilesPath = PathOp.Combine(levelPath, "Animated.tiles");
                if (FileOp.Exists(animTilesPath))
                {
                    tileMap.ReadAnimatedTiles(animTilesPath);
                }

                CameraController controller = camera.GetComponent <CameraController>();
                controller.ViewRect = new Rect(tileMap.Size * tileMap.Tileset.TileSize);

                // Read events
                eventMap = new EventMap(this, tileMap.Size);

                string eventsPath = PathOp.Combine(levelPath, "Events.layer");
                if (FileOp.Exists(animTilesPath))
                {
                    eventMap.ReadEvents(eventsPath, config.Version.LayerFormat, difficulty);
                }

                levelTexts = config.TextEvents ?? new Dictionary <int, string>();

                GameObject tilemapHandler = new GameObject("TilemapHandler");
                tilemapHandler.Parent = rootObject;
                tilemapHandler.AddComponent(tileMap);

                // Load default music
                musicPath = PathOp.Combine(DualityApp.DataDirectory, "Music", config.Description.DefaultMusic);
                music     = DualityApp.Sound.PlaySound(new OpenMptStream(musicPath));
                music.BeginFadeIn(0.5f);

                if (config.Description.DefaultWeather != WeatherType.None)
                {
                    ApplyWeather(
                        config.Description.DefaultWeather,
                        config.Description.DefaultWeatherIntensity,
                        config.Description.DefaultWeatherOutdoors);
                }
            }
        }
コード例 #2
0
ファイル: LevelHandler.cs プロジェクト: TheWlr9/jazz2
        private void LoadLevel(string level, string episode)
        {
            string      levelPath    = PathOp.Combine(DualityApp.DataDirectory, "Episodes", episode, level + ".level");
            IFileSystem levelPackage = new CompressedContent(levelPath);

            // ToDo: Cache parser, move JSON parsing to ContentResolver
            JsonParser      jsonParser = new JsonParser();
            LevelConfigJson json;

            using (Stream s = levelPackage.OpenFile(".res", FileAccessMode.Read)) {
                json = jsonParser.Parse <LevelConfigJson>(s);
            }

            if (json.Version.LayerFormat > LayerFormatVersion || json.Version.EventSet > EventSetVersion)
            {
                throw new NotSupportedException("Level version not supported");
            }

            App.Log("Loading level \"" + json.Description.Name + "\"...");

            root.Title     = BitmapFont.StripFormatting(json.Description.Name);
            root.Immersive = false;

            defaultNextLevel    = json.Description.NextLevel;
            defaultSecretLevel  = json.Description.SecretLevel;
            ambientLightDefault = json.Description.DefaultLight;
            ambientLightCurrent = ambientLightTarget = ambientLightDefault * 0.01f;

            if (json.Description.DefaultDarkness != null && json.Description.DefaultDarkness.Count >= 4)
            {
                darknessColor = new Vector4(json.Description.DefaultDarkness[0] / 255f, json.Description.DefaultDarkness[1] / 255f, json.Description.DefaultDarkness[2] / 255f, json.Description.DefaultDarkness[3] / 255f);
            }
            else
            {
                darknessColor = new Vector4(0, 0, 0, 1);
            }

            // Palette
            ColorRgba[] tileMapPalette;
            if (levelPackage.FileExists("Main.palette"))
            {
                using (Stream s = levelPackage.OpenFile("Main.palette", FileAccessMode.Read)) {
                    tileMapPalette = TileSet.LoadPalette(s);
                }
            }
            else
            {
                tileMapPalette = null;
            }

            // Tileset
            tileMap = new TileMap(this, json.Description.DefaultTileset, tileMapPalette, (json.Description.Flags & LevelFlags.HasPit) != 0);

            // Additional tilesets
            if (json.Tilesets != null)
            {
                for (int i = 0; i < json.Tilesets.Count; i++)
                {
                    LevelConfigJson.TilesetSection part = json.Tilesets[i];
                    tileMap.ReadTilesetPart(part.Name, part.Offset, part.Count);
                }
            }

            // Read all layers
            json.Layers.Add("Sprite", new LevelConfigJson.LayerSection {
                XSpeed = 1,
                YSpeed = 1
            });

            foreach (var layer in json.Layers.OrderBy(layer => layer.Value.Depth))
            {
                LayerType type;
                if (layer.Key == "Sprite")
                {
                    type = LayerType.Sprite;
                }
                else if (layer.Key == "Sky")
                {
                    type = LayerType.Sky;

                    //if (layer.Value.BackgroundStyle != 0 /*Plain*/ && layer.Value.BackgroundColor != null && layer.Value.BackgroundColor.Count >= 3) {
                    //    camera.GetComponent<Camera>().ClearColor = new ColorRgba((byte)layer.Value.BackgroundColor[0], (byte)layer.Value.BackgroundColor[1], (byte)layer.Value.BackgroundColor[2]);
                    //}
                }
                else
                {
                    type = LayerType.Other;
                }

                using (Stream s = levelPackage.OpenFile(layer.Key + ".layer", FileAccessMode.Read)) {
                    tileMap.ReadLayerConfiguration(type, s, layer.Value);
                }
            }

            // Read animated tiles
            if (levelPackage.FileExists("Animated.tiles"))
            {
                using (Stream s = levelPackage.OpenFile("Animated.tiles", FileAccessMode.Read)) {
                    tileMap.ReadAnimatedTiles(s);
                }
            }

            levelBounds = new Rect(tileMap.Size * tileMap.Tileset.TileSize);

            // Read events
            eventMap = new EventMap(this, tileMap.Size);

            if (levelPackage.FileExists("Events.layer"))
            {
                using (Stream s2 = levelPackage.OpenFile("Events.layer", FileAccessMode.Read)) {
                    eventMap.ReadEvents(s2, json.Version.LayerFormat, difficulty);
                }
            }

            GameObject tilemapHandler = new GameObject();

            tilemapHandler.Parent = rootObject;
            tilemapHandler.AddComponent(tileMap);

            // Load default music
            musicPath = PathOp.Combine(DualityApp.DataDirectory, "Music", json.Description.DefaultMusic);
            music     = new OpenMptStream(musicPath, true);
            music.BeginFadeIn(0.5f);
            DualityApp.Sound.PlaySound(music);

            // Apply weather
            if (json.Description.DefaultWeather != WeatherType.None)
            {
                ApplyWeather(
                    json.Description.DefaultWeather,
                    json.Description.DefaultWeatherIntensity,
                    json.Description.DefaultWeatherOutdoors);
            }

            // Load level text events
            levelTexts = json.TextEvents ?? new List <string>();

            if (FileOp.Exists(levelPath + "." + i18n.Language))
            {
                try {
                    using (Stream s = FileOp.Open(levelPath + "." + i18n.Language, FileAccessMode.Read)) {
                        json = jsonParser.Parse <LevelConfigJson>(s);
                        if (json.TextEvents != null)
                        {
                            for (int i = 0; i < json.TextEvents.Count && i < levelTexts.Count; i++)
                            {
                                if (json.TextEvents[i] != null)
                                {
                                    levelTexts[i] = json.TextEvents[i];
                                }
                            }
                        }
                    }
                } catch (Exception ex) {
                    App.Log("Cannot load i18n for this level: " + ex);
                }
            }
        }
コード例 #3
0
        private void LoadLevel(string level, string episode)
        {
            string      levelPath    = PathOp.Combine(DualityApp.DataDirectory, "Episodes", episode, level + ".level");
            IFileSystem levelPackage = new CompressedContent(levelPath);

            LevelConfigJson json;

            using (Stream s = levelPackage.OpenFile(".res", FileAccessMode.Read)) {
                json = ContentResolver.Current.Json.Parse <LevelConfigJson>(s);
            }

            if (json.Version.LayerFormat > LayerFormatVersion || json.Version.EventSet > EventSetVersion)
            {
                throw new NotSupportedException("Level version not supported");
            }

            Log.Write(LogType.Info, "Loading level \"" + json.Description.Name + "\"...");

            levelFriendlyName = json.Description.Name;

            //defaultNextLevel = json.Description.NextLevel;
            //defaultSecretLevel = json.Description.SecretLevel;

            // Palette
            ColorRgba[] tileMapPalette;
            if (levelPackage.FileExists("Main.palette"))
            {
                using (Stream s = levelPackage.OpenFile("Main.palette", FileAccessMode.Read)) {
                    tileMapPalette = TileSet.LoadPalette(s);
                }
            }
            else
            {
                tileMapPalette = null;
            }

            // Tileset
            tileMap = new TileMap(this, json.Description.DefaultTileset, tileMapPalette, (json.Description.Flags & LevelFlags.HasPit) != 0);

            // Additional tilesets
            if (json.Tilesets != null)
            {
                for (int i = 0; i < json.Tilesets.Count; i++)
                {
                    LevelConfigJson.TilesetSection part = json.Tilesets[i];
                    tileMap.ReadTilesetPart(part.Name, part.Offset, part.Count);
                }
            }

            // Read all layers
            json.Layers.Add("Sprite", new LevelConfigJson.LayerSection {
                XSpeed = 1,
                YSpeed = 1
            });

            foreach (var layer in json.Layers.OrderBy(layer => layer.Value.Depth))
            {
                LayerType type;
                if (layer.Key == "Sprite")
                {
                    type = LayerType.Sprite;
                }
                else if (layer.Key == "Sky")
                {
                    type = LayerType.Sky;

                    //if (layer.Value.BackgroundStyle != 0 /*Plain*/ && layer.Value.BackgroundColor != null && layer.Value.BackgroundColor.Count >= 3) {
                    //    camera.GetComponent<Camera>().ClearColor = new ColorRgba((byte)layer.Value.BackgroundColor[0], (byte)layer.Value.BackgroundColor[1], (byte)layer.Value.BackgroundColor[2]);
                    //}
                }
                else
                {
                    type = LayerType.Other;
                }

                using (Stream s = levelPackage.OpenFile(layer.Key + ".layer", FileAccessMode.Read)) {
                    tileMap.ReadLayerConfiguration(type, s, layer.Value);
                }
            }

            // Read animated tiles
            if (levelPackage.FileExists("Animated.tiles"))
            {
                using (Stream s = levelPackage.OpenFile("Animated.tiles", FileAccessMode.Read)) {
                    tileMap.ReadAnimatedTiles(s);
                }
            }

            levelBounds = new Rect(tileMap.Size * tileMap.Tileset.TileSize);

            // Read events
            eventMap = new EventMap(this, tileMap.Size);

            if (levelPackage.FileExists("Events.layer"))
            {
                using (Stream s2 = levelPackage.OpenFile("Events.layer", FileAccessMode.Read)) {
                    eventMap.ReadEvents(s2, json.Version.LayerFormat, difficulty);
                }
            }

            GameObject tilemapHandler = new GameObject();

            tilemapHandler.Parent = rootObject;
            tilemapHandler.AddComponent(tileMap);

            // Apply weather
            if (json.Description.DefaultWeather != WeatherType.None)
            {
                ApplyWeather(
                    json.Description.DefaultWeather,
                    json.Description.DefaultWeatherIntensity,
                    json.Description.DefaultWeatherOutdoors);
            }

            // Load level text events
            levelTexts = json.TextEvents ?? new List <string>();

            /*if (FileOp.Exists(levelPath + "." + i18n.Language)) {
             *  try {
             *      using (Stream s = FileOp.Open(levelPath + "." + i18n.Language, FileAccessMode.Read)) {
             *          json = ContentResolver.Current.Json.Parse<LevelConfigJson>(s);
             *          if (json.TextEvents != null) {
             *              for (int i = 0; i < json.TextEvents.Count && i < levelTexts.Count; i++) {
             *                  if (json.TextEvents[i] != null) {
             *                      levelTexts[i] = json.TextEvents[i];
             *                  }
             *              }
             *          }
             *      }
             *  } catch (Exception ex) {
             *      Log.Write(LogType.Warning, "Cannot load i18n for this level: " + ex);
             *  }
             * }*/

            eventMap.ActivateEvents(int.MinValue, int.MinValue, int.MaxValue, int.MaxValue, false);
        }