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