From 5692b95ad2db433658150509cf235fdc4bc589fe Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 2 Jun 2013 17:27:32 +1200 Subject: [PATCH 1/3] Use stream extensions to read binary map data. --- OpenRA.Game/Map.cs | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/OpenRA.Game/Map.cs b/OpenRA.Game/Map.cs index 1bae44f2ba..45a590f93b 100644 --- a/OpenRA.Game/Map.cs +++ b/OpenRA.Game/Map.cs @@ -229,44 +229,27 @@ namespace OpenRA Container.Write(entries); } - static byte ReadByte(Stream s) - { - int ret = s.ReadByte(); - if (ret == -1) - throw new NotImplementedException(); - return (byte)ret; - } - - static ushort ReadWord(Stream s) - { - ushort ret = ReadByte(s); - ret |= (ushort)(ReadByte(s) << 8); - - return ret; - } - public TileReference[,] LoadMapTiles() { var tiles = new TileReference[MapSize.X, MapSize.Y]; using (var dataStream = Container.GetContent("map.bin")) { - if (ReadByte(dataStream) != 1) + if (dataStream.ReadUInt8() != 1) throw new InvalidDataException("Unknown binary map format"); // Load header info - var width = ReadWord(dataStream); - var height = ReadWord(dataStream); + var width = dataStream.ReadUInt16(); + var height = dataStream.ReadUInt16(); if (width != MapSize.X || height != MapSize.Y) throw new InvalidDataException("Invalid tile data"); - // Load tile data for (int i = 0; i < MapSize.X; i++) for (int j = 0; j < MapSize.Y; j++) { - ushort tile = ReadWord(dataStream); - byte index = ReadByte(dataStream); + var tile = dataStream.ReadUInt16(); + var index = dataStream.ReadUInt8(); if (index == byte.MaxValue) index = (byte)(i % 4 + (j % 4) * 4); @@ -282,26 +265,25 @@ namespace OpenRA using (var dataStream = Container.GetContent("map.bin")) { - if (ReadByte(dataStream) != 1) + if (dataStream.ReadUInt8() != 1) throw new InvalidDataException("Unknown binary map format"); // Load header info - var width = ReadWord(dataStream); - var height = ReadWord(dataStream); + var width = dataStream.ReadUInt16(); + var height = dataStream.ReadUInt16(); if (width != MapSize.X || height != MapSize.Y) throw new InvalidDataException("Invalid tile data"); // Skip past tile data - for (var i = 0; i < 3*MapSize.X*MapSize.Y; i++) - ReadByte(dataStream); + dataStream.Seek(3*MapSize.X*MapSize.Y, SeekOrigin.Current); // Load resource data for (var i = 0; i < MapSize.X; i++) for (var j = 0; j < MapSize.Y; j++) { - byte type = ReadByte(dataStream); - byte index = ReadByte(dataStream); + var type = dataStream.ReadUInt8(); + var index = dataStream.ReadUInt8(); resources[i, j] = new TileReference(type, index); } } From 50dff05675a4622c036c4a9d51a94dabd60cd984 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 2 Jun 2013 19:26:55 +1200 Subject: [PATCH 2/3] Return a synthesized tile for missing indices. Fixes #3329. --- OpenRA.FileFormats/Map/TileSet.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenRA.FileFormats/Map/TileSet.cs b/OpenRA.FileFormats/Map/TileSet.cs index 621a47bd26..a59ad79e0f 100644 --- a/OpenRA.FileFormats/Map/TileSet.cs +++ b/OpenRA.FileFormats/Map/TileSet.cs @@ -148,7 +148,11 @@ namespace OpenRA.FileFormats { TileTemplate tile; if (Templates.TryGetValue(r.type, out tile)) - return tile.Data.TileBitmapBytes[r.index]; + { + var data = tile.Data.TileBitmapBytes[r.index]; + if (data != null) + return data; + } byte[] missingTile = new byte[TileSize*TileSize]; for (var i = 0; i < missingTile.Length; i++) From 06d11c4fa9277d2accb2192546bf663858866218 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 2 Jun 2013 19:27:23 +1200 Subject: [PATCH 3/3] Make missing tile transparent to avoid visual glitch with bridge1h in maps. --- OpenRA.FileFormats/Map/TileSet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenRA.FileFormats/Map/TileSet.cs b/OpenRA.FileFormats/Map/TileSet.cs index a59ad79e0f..0cec68450e 100644 --- a/OpenRA.FileFormats/Map/TileSet.cs +++ b/OpenRA.FileFormats/Map/TileSet.cs @@ -156,7 +156,7 @@ namespace OpenRA.FileFormats byte[] missingTile = new byte[TileSize*TileSize]; for (var i = 0; i < missingTile.Length; i++) - missingTile[i] = 0x36; + missingTile[i] = 0x00; return missingTile; }