Exemplo n.º 1
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);
        }