예제 #1
0
        /// <summary>
        /// Создает новый экземпляр LevelData
        /// </summary>
        /// <param name="jsonData">Данные уровня в формате JSON</param>
        public LevelData(string jsonData) : this()
        {
            RawLevelData rawLevelData = null;

            try
            {
                rawLevelData = JsonConvert.DeserializeObject <RawLevelData>(jsonData);
            }
            catch (JsonException) { return; }

            try
            {
                Width  = rawLevelData.size.width;
                Height = rawLevelData.size.height;

                SpawnPosition = new Point(rawLevelData.spawnInfo.position.x, rawLevelData.spawnInfo.position.y);
                SpawnBig      = (rawLevelData.spawnInfo.type == "big");

                Blocks = new ObservableCollection <Block>(ConstructBlockList(rawLevelData.blocks));
                if (rawLevelData.areas != null)
                {
                    Areas = new ObservableCollection <Area>(rawLevelData.areas.Select(
                                                                rawArea => Area.FromRaw(rawArea)));
                }
                if (rawLevelData.listeners != null)
                {
                    Listeners = new ObservableCollection <Listener>(rawLevelData.listeners.Select(
                                                                        rawListener => Listener.FromRaw(rawListener)));
                }
                if (rawLevelData.entities != null)
                {
                    Entities = new ObservableCollection <Entity>(rawLevelData.entities.Select(
                                                                     rawEntity => Entity.FromRaw(rawEntity)));
                }
            }
            catch (NullReferenceException) { return; }

            // На случай, если какой-то 3.14дор вздумает редактировать уровень руками, без этого шикарного редактора,
            // и выставит ширину, не соответствующую массиву блоков.
            // Или если Энтони набухается и проебет несколько блоков при конвертации.
            if (Blocks.Count == Width * Height)
            {
                Ready = true;
            }
        }
예제 #2
0
        public string Serialize()
        {
            var rawLevelData = new RawLevelData();

            rawLevelData.size = new RawLevelData.Size
            {
                width  = Width,
                height = Height
            };

            rawLevelData.spawnInfo = new RawLevelData.RawSpawnInfo
            {
                position = new RawLevelData.Coords {
                    x = SpawnPosition.X, y = SpawnPosition.Y
                },
                type = SpawnBig ? "big" : "small"
            };

            rawLevelData.areas     = Areas.Select(area => Area.ToRaw(area)).ToList();
            rawLevelData.listeners = Listeners.Select(listener => Listener.ToRaw(listener)).ToList();
            rawLevelData.entities  = Entities.Select(entity => Entity.ToRaw(entity)).ToList();
            rawLevelData.blocks    = new List <IList <int> >();

            for (int i = 0; i < Height; i++)
            {
                var blockList = new List <int>();
                for (int j = 0; j < Width; j++)
                {
                    blockList.Add(Blocks[i * Width + j].BlockId);
                }
                rawLevelData.blocks.Add(blockList);
            }

            return(JsonConvert.SerializeObject(rawLevelData, Formatting.None, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            }));
        }