private void ReadTiles()
{
var mapSection = GetSection("IsoMapPack5");
byte[] lzoData = Convert.FromBase64String(mapSection.ConcatenatedValues());
int cells = (FullSize.Width * 2 - 1) * FullSize.Height;
int lzoPackSize = cells * 11 + 4; // last 4 bytes contains a lzo pack header saying no more data is left
var isoMapPack = new byte[lzoPackSize];
uint totalDecompressSize = Format5.DecodeInto(lzoData, isoMapPack);
var mf = new MemoryFile(isoMapPack);
int numtiles = 0;
for (int i = 0; i < cells; i++) {
ushort rx = mf.ReadUInt16();
ushort ry = mf.ReadUInt16();
short tilenum = mf.ReadInt16();
short zero1 = mf.ReadInt16();
byte subtile = mf.ReadByte();
byte z = mf.ReadByte();
byte zero2 = mf.ReadByte();
int dx = rx - ry + FullSize.Width - 1;
int dy = rx + ry - FullSize.Width - 1;
numtiles++;
if (dx >= 0 && dx < 2 * Tiles.Width &&
dy >= 0 && dy < 2 * Tiles.Height) {
var tile = new IsoTile((ushort)dx, (ushort)dy, rx, ry, z, tilenum, subtile);
Tiles[(ushort)dx, (ushort)dy / 2] = tile;
}
}
// fix missing tiles
// import tiles
for (ushort y = 0; y < FullSize.Height; y++) {
for (ushort x = 0; x <= FullSize.Width * 2 - 2; x++) {
var isoTile = Tiles[x, y];
if (isoTile == null) {
// fix null tiles to blank
ushort dx = (ushort)(x);
ushort dy = (ushort)(y * 2 + x % 2);
ushort rx = (ushort)((dx + dy) / 2 + 1);
ushort ry = (ushort)(dy - rx + FullSize.Width + 1);
Tiles[x, y] = new IsoTile(dx, dy, rx, ry, 0, 0, 0);
}
}
}
Logger.Debug("Read {0} tiles", numtiles);
}