diff --git a/Blarg.GameFramework/Blarg.GameFramework.csproj b/Blarg.GameFramework/Blarg.GameFramework.csproj index 6ebc3d8..d833910 100644 --- a/Blarg.GameFramework/Blarg.GameFramework.csproj +++ b/Blarg.GameFramework/Blarg.GameFramework.csproj @@ -220,7 +220,7 @@ - + diff --git a/Blarg.GameFramework/TileMap/Json/TileMapLoader.cs b/Blarg.GameFramework/TileMap/Json/TileMapSerializer.cs similarity index 53% rename from Blarg.GameFramework/TileMap/Json/TileMapLoader.cs rename to Blarg.GameFramework/TileMap/Json/TileMapSerializer.cs index 9e11a2e..466933c 100644 --- a/Blarg.GameFramework/TileMap/Json/TileMapLoader.cs +++ b/Blarg.GameFramework/TileMap/Json/TileMapSerializer.cs @@ -1,22 +1,26 @@ using System; -using Blarg.GameFramework.TileMap.Meshes; -using Blarg.GameFramework.TileMap; using System.IO; using Newtonsoft.Json; +using Blarg.GameFramework.IO; +using Blarg.GameFramework.TileMap; using Blarg.GameFramework.TileMap.Lighting; +using Blarg.GameFramework.TileMap.Meshes; +using System.Collections.Generic; namespace Blarg.GameFramework.TileMap.Json { - public static class TileMapLoader + public static class TileMapSerializer { public static TileMap Load(string file, TileMeshCollection tileMeshes) { - var stream = Framework.FileSystem.Open(file); - string path = null; - if (file.Contains("/")) - path = file.Substring(0, file.LastIndexOf('/') + 1); + using (var stream = Framework.FileSystem.Open(file)) + { + string path = null; + if (file.Contains("/")) + path = file.Substring(0, file.LastIndexOf('/') + 1); - return Load(stream, tileMeshes, path); + return Load(stream, tileMeshes, path); + } } public static TileMap Load(Stream file, TileMeshCollection tileMeshes, string path = null) @@ -68,6 +72,55 @@ namespace Blarg.GameFramework.TileMap.Json return tileMap; } + + public static void Save(TileMap tileMap, string file) + { + using (var stream = Framework.FileSystem.Open(file, FileOpenMode.Create)) + { + Save(tileMap, stream); + } + } + + public static void Save(TileMap tileMap, Stream file) + { + if (tileMap == null) + throw new ArgumentNullException("tileMap"); + if (file == null) + throw new ArgumentNullException("file"); + + var map = new JsonTileMap(); + map.ChunkWidth = tileMap.ChunkWidth; + map.ChunkHeight = tileMap.ChunkHeight; + map.ChunkDepth = tileMap.ChunkDepth; + map.WidthInChunks = tileMap.WidthInChunks; + map.HeightInChunks = tileMap.HeightInChunks; + map.DepthInChunks = tileMap.DepthInChunks; + + // TODO: figure out real lighting mode from the types of vertex generator / lighter objects set + map.LightingMode = null; + + // each serialized chunk will be the same size in bytes (same number of tiles in each) + int chunkSizeInBytes = tileMap.Chunks[0].Data.Length * TileDataSerializer.TILE_SIZE_BYTES; + + map.Chunks = new List(tileMap.Chunks.Length); + for (int i = 0; i < tileMap.Chunks.Length; ++i) + { + var chunk = tileMap.Chunks[i]; + + var buffer = new MemoryStream(chunkSizeInBytes); + using (var byteWriter = new BinaryWriter(buffer)) + { + TileDataSerializer.Serialize(chunk, byteWriter); + } + + map.Chunks.Add(Convert.ToBase64String(buffer.ToArray())); + } + + using (var writer = new StreamWriter(file)) + { + writer.Write(JsonConvert.SerializeObject(map, Formatting.Indented)); + } + } } } diff --git a/Blarg.GameFramework/TileMap/TileDataSerializer.cs b/Blarg.GameFramework/TileMap/TileDataSerializer.cs index 1c9216d..12953d0 100644 --- a/Blarg.GameFramework/TileMap/TileDataSerializer.cs +++ b/Blarg.GameFramework/TileMap/TileDataSerializer.cs @@ -5,6 +5,8 @@ namespace Blarg.GameFramework.TileMap { public static class TileDataSerializer { + public const int TILE_SIZE_BYTES = 17; // because sizeof() only works with value types + public static void Serialize(TileRawDataContainer src, BinaryWriter writer) { var tiles = src.Data;