public MapDescriptor Load(IDataManagerArguments arguments) { MapDescriptor map = null; string path = Core.EngineConstants.FILEPATH_MAPS + (arguments as MapDataLoaderArguments)?.Name + EngineConstants.MAP_FILE_EXT; using (var fileStream = new FileStream(path, FileMode.Open)) { using (var bR = new BinaryReader(fileStream)) { // Load the tileset information int tilesetCount = bR.ReadInt32(); for (int i = 0; i < tilesetCount; i++) { // We can throw this information away as it is used only in the editor suite. string tilesetPath = bR.ReadString(); } string name = bR.ReadString(); var dimensions = new Vector(bR.ReadInt32(), bR.ReadInt32()); map = new MapDescriptor(dimensions, name) { Dark = bR.ReadBoolean() }; map.Bounds = new Rect(0, 0, (int)map.Dimensions.X, (int)map.Dimensions.Y); int layerCount = bR.ReadInt32(); for (int i = 0; i < layerCount; i++) { string layerName = bR.ReadString(); int lIndex = bR.ReadInt32(); var layer = new LayerDescriptor(map.Dimensions, layerName, lIndex); for (int x = 0; x < layer.Tiles.GetLength(0); x++) { for (int y = 0; y < layer.Tiles.GetLength(1); y++) { if (bR.ReadBoolean()) { layer.Tiles[x, y] = new TileDescriptor(new Vector(x * EngineConstants.TILE_WIDTH, y * EngineConstants.TILE_HEIGHT)) { Attribute = (TileAttributes)bR.ReadByte() }; int attributeDataLength = bR.ReadInt32(); byte[] attributeData = bR.ReadBytes(attributeDataLength); layer.Tiles[x, y].AttributeData = AttributeData.Deserialize(attributeData); if (bR.ReadBoolean()) { layer.Tiles[x, y].Animated = bR.ReadBoolean(); layer.Tiles[x, y].LightSource = bR.ReadBoolean(); string spriteName = bR.ReadString(); float zIndex = bR.ReadSingle(); // We can throw this away layer.Tiles[x, y].SpriteInfo = new SpriteInfo(spriteName) { Transform = { Position = new Vector(x * EngineConstants.TILE_WIDTH, y * EngineConstants.TILE_HEIGHT), Color = new Color(bR.ReadByte(), bR.ReadByte(), bR.ReadByte(), bR.ReadByte()), Rect = new Rect(bR.ReadInt32(), bR.ReadInt32(), bR.ReadInt32(), bR.ReadInt32()) } }; layer.Tiles[x, y].FrameCount = bR.ReadInt32(); } } } } int mapObjectCount = bR.ReadInt32(); for (int mI = 0; mI < mapObjectCount; mI++) { var mapObject = new MapObjectDescriptor() { Position = new Vector(bR.ReadSingle(), bR.ReadSingle()) }; if (bR.ReadBoolean()) { string texturePath = bR.ReadString(); mapObject.Sprite = new SpriteInfo(texturePath) { Transform = { Rect = new Rect(bR.ReadInt32(), bR.ReadInt32(), bR.ReadInt32(), bR.ReadInt32()) } }; } mapObject.Animated = bR.ReadBoolean(); mapObject.FrameTime = bR.ReadInt32(); string scriptPath = bR.ReadString(); var lightSource = bR.ReadBoolean(); var lightRadius = bR.ReadSingle(); var lightColor = new Color(bR.ReadByte(), bR.ReadByte(), bR.ReadByte(), bR.ReadByte()); if (lightSource) { mapObject.LightInformation = new LightInformation() { Radius = lightRadius, Color = lightColor }; } } map.Layers.Add(layerName, layer); } } } return(map); }