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); } } }
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); } } }
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); }