80 lines
2.3 KiB
C#
80 lines
2.3 KiB
C#
#region Copyright & License Information
|
|
/*
|
|
* Copyright 2007-2010 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 LICENSE.
|
|
*/
|
|
#endregion
|
|
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
namespace OpenRA.FileFormats
|
|
{
|
|
public class Terrain
|
|
{
|
|
public readonly List<byte[]> TileBitmapBytes = new List<byte[]>();
|
|
|
|
public Terrain( Stream stream, int size )
|
|
{
|
|
System.Console.WriteLine("Loading tile with expected size {0}",size);
|
|
// Try loading as a cnc .tem
|
|
BinaryReader reader = new BinaryReader( stream );
|
|
int Width = reader.ReadUInt16();
|
|
int Height = reader.ReadUInt16();
|
|
|
|
System.Console.WriteLine("Actual size {0}x{1}",Width,Height);
|
|
|
|
if( Width != size || Height != size )
|
|
throw new InvalidDataException( "Expected tile of size {0}x{0}, got {1}x{2]".F(size, Width, Height ) );
|
|
|
|
/*NumTiles = */reader.ReadUInt16();
|
|
/*Zero1 = */reader.ReadUInt16();
|
|
/*uint Size = */reader.ReadUInt32();
|
|
uint ImgStart = reader.ReadUInt32();
|
|
/*Zero2 = */reader.ReadUInt32();
|
|
|
|
int IndexEnd, IndexStart;
|
|
if (reader.ReadUInt16() == 65535) // ID1 = FFFFh for cnc
|
|
{
|
|
/*ID2 = */reader.ReadUInt16();
|
|
IndexEnd = reader.ReadInt32();
|
|
IndexStart = reader.ReadInt32();
|
|
}
|
|
else // Load as a ra .tem
|
|
{
|
|
stream.Position = 0;
|
|
reader = new BinaryReader( stream );
|
|
Width = reader.ReadUInt16();
|
|
Height = reader.ReadUInt16();
|
|
|
|
/*NumTiles = */reader.ReadUInt16();
|
|
reader.ReadUInt16();
|
|
/*XDim = */reader.ReadUInt16();
|
|
/*YDim = */reader.ReadUInt16();
|
|
/*uint FileSize = */reader.ReadUInt32();
|
|
ImgStart = reader.ReadUInt32();
|
|
reader.ReadUInt32();
|
|
reader.ReadUInt32();
|
|
IndexEnd = reader.ReadInt32();
|
|
reader.ReadUInt32();
|
|
IndexStart = reader.ReadInt32();
|
|
}
|
|
stream.Position = IndexStart;
|
|
|
|
foreach( byte b in new BinaryReader(stream).ReadBytes(IndexEnd - IndexStart) )
|
|
{
|
|
if (b != 255)
|
|
{
|
|
stream.Position = ImgStart + b * size * size;
|
|
TileBitmapBytes.Add(new BinaryReader(stream).ReadBytes(size * size));
|
|
}
|
|
else
|
|
TileBitmapBytes.Add(null);
|
|
}
|
|
}
|
|
}
|
|
}
|