diff --git a/OpenRA.FileFormats/Graphics/SpriteSource.cs b/OpenRA.FileFormats/Graphics/SpriteSource.cs index 426273c0ac..a3edbec43f 100644 --- a/OpenRA.FileFormats/Graphics/SpriteSource.cs +++ b/OpenRA.FileFormats/Graphics/SpriteSource.cs @@ -179,6 +179,10 @@ namespace OpenRA.FileFormats return new ShpTSReader(s); case SpriteType.R8: return new R8Reader(s); + case SpriteType.TmpRA: + return new TmpRAReader(s); + case SpriteType.TmpTD: + return new TmpTDReader(s); case SpriteType.Unknown: default: throw new InvalidDataException(filename + " is not a valid sprite file"); diff --git a/OpenRA.FileFormats/Graphics/TileSetRenderer.cs b/OpenRA.FileFormats/Graphics/TileSetRenderer.cs index e33462afd1..abb93b1cca 100644 --- a/OpenRA.FileFormats/Graphics/TileSetRenderer.cs +++ b/OpenRA.FileFormats/Graphics/TileSetRenderer.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; +using System.IO; using System.Linq; namespace OpenRA.FileFormats @@ -33,7 +34,22 @@ namespace OpenRA.FileFormats } using (var s = FileSystem.OpenWithExts(filename, exts)) - return new Terrain(s).TileBitmapBytes; + { + var type = SpriteSource.DetectSpriteType(s); + ISpriteSource source; + switch (type) + { + case SpriteType.TmpTD: + source = new TmpTDReader(s); + break; + case SpriteType.TmpRA: + source = new TmpRAReader(s); + break; + default: + throw new InvalidDataException(filename + " is not a valid terrain tile"); + } + return source.Frames.Select(f => f.Data).ToList(); + } } public TileSetRenderer(TileSet tileset, Size tileSize) diff --git a/OpenRA.FileFormats/Graphics/TmpRAReader.cs b/OpenRA.FileFormats/Graphics/TmpRAReader.cs new file mode 100644 index 0000000000..c126554e6b --- /dev/null +++ b/OpenRA.FileFormats/Graphics/TmpRAReader.cs @@ -0,0 +1,49 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; + +namespace OpenRA.FileFormats +{ + public class TmpRAReader : ISpriteSource + { + readonly List tiles = new List(); + public IEnumerable Frames { get { return tiles.Cast(); } } + + public TmpRAReader(Stream s) + { + var width = s.ReadUInt16(); + var height = s.ReadUInt16(); + var size = new Size(width, height); + + s.Position += 12; + var imgStart = s.ReadUInt32(); + s.Position += 8; + var indexEnd = s.ReadInt32(); + s.Position += 4; + var indexStart = s.ReadInt32(); + + s.Position = indexStart; + foreach (byte b in s.ReadBytes(indexEnd - indexStart)) + { + if (b != 255) + { + s.Position = imgStart + b * width * height; + tiles.Add(new TmpTile(s.ReadBytes(width * height), size)); + } + else + tiles.Add(new TmpTile(null, size)); + } + } + } +} diff --git a/OpenRA.FileFormats/Graphics/TmpTDReader.cs b/OpenRA.FileFormats/Graphics/TmpTDReader.cs new file mode 100644 index 0000000000..04f6e9faf8 --- /dev/null +++ b/OpenRA.FileFormats/Graphics/TmpTDReader.cs @@ -0,0 +1,67 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.IO; + +namespace OpenRA.FileFormats +{ + public class TmpTile : ISpriteFrame + { + public Size Size { get; private set; } + public Size FrameSize { get; private set; } + public float2 Offset { get { return float2.Zero; } } + public byte[] Data { get; set; } + + public TmpTile(byte[] data, Size size) + { + FrameSize = size; + Data = data; + + if (data == null) + Data = new byte[0]; + else + Size = size; + } + } + + public class TmpTDReader : ISpriteSource + { + readonly List tiles = new List(); + public IEnumerable Frames { get { return tiles.Cast(); } } + + public TmpTDReader(Stream s) + { + var width = s.ReadUInt16(); + var height = s.ReadUInt16(); + var size = new Size(width, height); + + s.Position += 8; + var imgStart = s.ReadUInt32(); + s.Position += 8; + var indexEnd = s.ReadInt32(); + var indexStart = s.ReadInt32(); + + s.Position = indexStart; + foreach (byte b in s.ReadBytes(indexEnd - indexStart)) + { + if (b != 255) + { + s.Position = imgStart + b * width * height; + tiles.Add(new TmpTile(s.ReadBytes(width * height), size)); + } + else + tiles.Add(new TmpTile(null, size)); + } + } + } +} diff --git a/OpenRA.FileFormats/Map/Terrain.cs b/OpenRA.FileFormats/Map/Terrain.cs deleted file mode 100644 index 92fbacb2df..0000000000 --- a/OpenRA.FileFormats/Map/Terrain.cs +++ /dev/null @@ -1,77 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System.Collections.Generic; -using System.IO; - -namespace OpenRA.FileFormats -{ - public class Terrain - { - public readonly List TileBitmapBytes = new List(); - public readonly int Width; - public readonly int Height; - - public Terrain(Stream s) - { - // Try loading as a cnc .tem - Width = s.ReadUInt16(); - Height = s.ReadUInt16(); - - /*NumTiles = */s.ReadUInt16(); - /*Zero1 = */s.ReadUInt16(); - /*uint Size = */s.ReadUInt32(); - var imgStart = s.ReadUInt32(); - /*Zero2 = */s.ReadUInt32(); - - int indexEnd, indexStart; - - // ID1 = FFFFh for cnc - if (s.ReadUInt16() == 65535) - { - /*ID2 = */s.ReadUInt16(); - indexEnd = s.ReadInt32(); - indexStart = s.ReadInt32(); - } - else - { - // Load as a ra .tem - s.Position = 0; - Width = s.ReadUInt16(); - Height = s.ReadUInt16(); - - /*NumTiles = */s.ReadUInt16(); - s.ReadUInt16(); - /*XDim = */s.ReadUInt16(); - /*YDim = */s.ReadUInt16(); - /*uint FileSize = */s.ReadUInt32(); - imgStart = s.ReadUInt32(); - s.ReadUInt32(); - s.ReadUInt32(); - indexEnd = s.ReadInt32(); - s.ReadUInt32(); - indexStart = s.ReadInt32(); - } - - s.Position = indexStart; - - foreach (byte b in s.ReadBytes(indexEnd - indexStart)) - { - if (b != 255) - { - s.Position = imgStart + b * Width * Height; - TileBitmapBytes.Add(s.ReadBytes(Width * Height)); - } - else - TileBitmapBytes.Add(null); - } - } - } -} diff --git a/OpenRA.FileFormats/OpenRA.FileFormats.csproj b/OpenRA.FileFormats/OpenRA.FileFormats.csproj index 4f675cf4fd..938ad857b8 100644 --- a/OpenRA.FileFormats/OpenRA.FileFormats.csproj +++ b/OpenRA.FileFormats/OpenRA.FileFormats.csproj @@ -101,7 +101,6 @@ - @@ -153,6 +152,8 @@ + + diff --git a/OpenRA.Game/Graphics/Theater.cs b/OpenRA.Game/Graphics/Theater.cs index b0e29c7a50..078e4c1883 100644 --- a/OpenRA.Game/Graphics/Theater.cs +++ b/OpenRA.Game/Graphics/Theater.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.IO; using System.Linq; using OpenRA.FileFormats; @@ -38,10 +39,21 @@ namespace OpenRA.Graphics using (var s = FileSystem.OpenWithExts(filename, exts)) { - var t = new Terrain(s); - return t.TileBitmapBytes - .Select(b => b != null ? sheetBuilder.Add(b, new Size(t.Width, t.Height)) : null) - .ToArray(); + var type = SpriteSource.DetectSpriteType(s); + ISpriteSource source; + switch (type) + { + case SpriteType.TmpTD: + source = new TmpTDReader(s); + break; + case SpriteType.TmpRA: + source = new TmpRAReader(s); + break; + default: + throw new InvalidDataException(filename + " is not a valid terrain tile"); + } + + return source.Frames.Select(f => sheetBuilder.Add(f)).ToArray(); } } @@ -70,11 +82,13 @@ namespace OpenRA.Graphics public Sprite TileSprite(TileReference r) { Sprite[] template; - if (templates.TryGetValue(r.Type, out template)) - if (template.Length > r.Index && template[r.Index] != null) - return template[r.Index]; + if (!templates.TryGetValue(r.Type, out template)) + return missingTile; - return missingTile; + if (r.Index >= template.Length) + return missingTile; + + return template[r.Index]; } public Sheet Sheet { get { return sheetBuilder.Current; } }