public override Room ReadRoom(long offset)
{
_reader.BaseStream.Seek(offset, SeekOrigin.Begin);
var size = _reader.ReadUInt16();
var tmp = _reader.ReadBytes(2);
var header = ReadRMHD();
var room = new Room { Header = header, Size = size };
// 6
var img = new ImageData1();
room.Image = img;
img.Colors = _reader.ReadBytes(4);
var charmapOffset = _reader.ReadUInt16();
var picMapOffset = _reader.ReadUInt16();
var colorMapOffset = _reader.ReadUInt16();
var maskMapOffset = _reader.ReadUInt16();
var maskOffset = _reader.ReadUInt16();
// 20
var numObjects = _reader.ReadByte();
// 21
var boxesOffset = _reader.ReadByte();
// 22
var numSounds = _reader.ReadByte();
// 23
var numScripts = _reader.ReadByte();
// 24
var exitScriptOffset = _reader.ReadUInt16();
// 26
var entryScriptOffset = _reader.ReadUInt16();
var exitScriptLength = entryScriptOffset - entryScriptOffset;
var entryScriptLength = size - entryScriptOffset;
// 28
var objImgOffsets = _reader.ReadUInt16s(numObjects);
var objScriptOffsets = _reader.ReadUInt16s(numObjects);
// load sounds
var soundIds = _reader.ReadBytes(numSounds);
// load scripts
var scriptIds = _reader.ReadBytes(numScripts);
var width = header.Width / 8;
var height = header.Height / 8;
DecodeV1Gfx(offset + charmapOffset, img.CharMap, 2048);
DecodeV1Gfx(offset + picMapOffset, img.PicMap, width * height);
DecodeV1Gfx(offset + colorMapOffset, img.ColorMap, width * height);
DecodeV1Gfx(offset + maskMapOffset, img.MaskMap, width * height);
// Read the mask data. The 16bit length value seems to always be 8 too big.
// See bug #1837375 for details on this.
_reader.BaseStream.Seek(offset + maskOffset, SeekOrigin.Begin);
DecodeV1Gfx(offset + maskOffset + 2, img.MaskChar, _reader.ReadUInt16() - 8);
// read exit script
if (exitScriptOffset > 0)
{
room.ExitScript.Data = ReadBytes(offset + exitScriptOffset, exitScriptLength);
}
else
{
room.ExitScript.Data = new byte[0];
}
// read entry script
if (entryScriptOffset > 0)
{
room.EntryScript.Data = ReadBytes(offset + entryScriptOffset, entryScriptLength);
}
else
{
room.EntryScript.Data = new byte[0];
}
// read boxes
ReadBoxes(offset + boxesOffset, room);
// read objects
if (numObjects > 0)
{
var firstOffset = objScriptOffsets.Min();
for (var i = 0; i < numObjects; i++)
{
var objOffset = objScriptOffsets[i];
var obj = ReadObject(offset + objOffset);
room.Objects.Add(obj);
}
for (var i = 0; i < numObjects; i++)
{
var objImgOffset = objImgOffsets[i];
if (firstOffset != objImgOffset)
{
img = new ImageData1();
var obj = room.Objects[i];
DecodeV1Gfx(offset + objImgOffset, img.ObjectMap, (obj.Width / 8) * (obj.Height / 8) * 3);
obj.Images.Add(img);
}
}
}
return room;
}