void SaveOrLoadResources(Serializer serializer)
{
var entry = LoadAndSaveEntry.Create(
reader =>
{
ResType type;
ushort idx;
while ((type = (ResType)reader.ReadUInt16()) != (ResType)0xFFFF)
{
while ((idx = reader.ReadUInt16()) != 0xFFFF)
{
LoadResource(reader, type, idx);
}
}
},
writer =>
{
// inventory
writer.WriteUInt16((ushort)ResType.Inventory);
for (int i = 0; i < _invData.Length; i++)
{
var data = _invData[i];
if (data == null)
break;
// write index
writer.WriteUInt16(i);
var verbTableLength = Game.Version == 8 ? 8 * data.ScriptOffsets.Count + 4 : 3 * data.ScriptOffsets.Count + 1;
var nameOffset = 18 + 1 + verbTableLength;
// write size
writer.WriteInt32(nameOffset + data.Name.Length + 1 + data.Script.Data.Length);
// write image offset
writer.WriteBytes(new byte[18], 18);
// write name offset
writer.WriteByte(nameOffset);
// write verb table
if (Game.Version == 8)
{
foreach (var scriptOffset in data.ScriptOffsets)
{
writer.WriteInt32(scriptOffset.Key);
writer.WriteInt32(scriptOffset.Value);
}
// write end of table
writer.WriteUInt32(0);
}
else
{
foreach (var scriptOffset in data.ScriptOffsets)
{
writer.WriteByte(scriptOffset.Key);
writer.WriteUInt16(scriptOffset.Value);
}
// write end of table
writer.WriteByte(0);
}
var name = EncodeName(data.Name);
// write name
for (int c = 0; c < name.Length; c++)
{
writer.WriteByte(name[c]);
}
writer.WriteByte(0);
// write script
writer.Write(data.Script.Data);
// write index
writer.WriteUInt16(_inventory[i]);
}
writer.WriteUInt16(0xFFFF);
// actors name
writer.WriteUInt16((ushort)ResType.ActorName);
for (int i = 0; i < Actors.Length; i++)
{
var actor = Actors[i];
if (actor.Name != null)
{
// write index
writer.WriteUInt16(i);
// write name
writer.WriteInt32(actor.Name.Length);
writer.WriteBytes(actor.Name, actor.Name.Length);
}
}
writer.WriteUInt16(0xFFFF);
// objects name
writer.WriteUInt16((ushort)ResType.ObjectName);
var objs = _invData.Where(obj => obj != null && obj.Number != 0).ToArray();
for (var i = 0; i < objs.Length; i++)
{
var obj = objs[i];
var name = GetObjectOrActorName(obj.Number);
if (name.Length > 0)
{
// write index
writer.WriteUInt16(i);
// write name
writer.WriteInt32(name.Length);
writer.WriteBytes(name, name.Length);
// writer obj number
writer.WriteUInt16(obj.Number);
}
}
writer.WriteUInt16(0xFFFF);
// matrix
writer.WriteUInt16((ushort)ResType.Matrix);
// write BoxMatrix
writer.WriteUInt16(1);
writer.WriteInt32(_boxMatrix.Count);
writer.WriteBytes(_boxMatrix.ToArray(), _boxMatrix.Count);
// write boxes
writer.WriteUInt16(2);
writer.WriteInt32((Game.Version == 8 ? 21 : 20) * _boxes.Length + 1);
writer.WriteByte(_boxes.Length);
for (int i = 0; i < _boxes.Length; i++)
{
Box box = _boxes[i];
writer.WriteInt16(box.Ulx);
writer.WriteInt16(box.Uly);
writer.WriteInt16(box.Urx);
writer.WriteInt16(box.Ury);
writer.WriteInt16(box.Lrx);
writer.WriteInt16(box.Lry);
writer.WriteInt16(box.Llx);
writer.WriteInt16(box.Lly);
writer.WriteByte(box.Mask);
writer.WriteByte((byte)box.Flags);
writer.WriteUInt16(box.Scale);
if (Game.Version == 8)
{
writer.WriteByte(box.ScaleSlot);
}
}
writer.WriteUInt16(0xFFFF);
// verbs
writer.WriteUInt16((ushort)ResType.Verb);
for (int i = 0; i < Verbs.Length; i++)
{
var verb = Verbs[i];
if (verb.Text != null)
{
// write index
writer.WriteUInt16(i);
// write text
writer.WriteInt32(verb.Text.Length);
writer.WriteBytes(verb.Text, verb.Text.Length);
}
}
writer.WriteUInt16(0xFFFF);
// verb images
writer.WriteUInt16((ushort)ResType.VerbImage);
for (int i = 0; i < Verbs.Length; i++)
{
var verb = Verbs[i];
if (verb.ImageData != null)
{
// write index
writer.WriteUInt16(i);
// write size
writer.WriteInt32(4 + verb.ImageData.Data.Length);
// wrie width and height
writer.WriteUInt16(verb.ImageWidth);
writer.WriteUInt16(verb.ImageHeight);
// write
writer.WriteBytes(verb.ImageData.Data, verb.ImageData.Data.Length);
}
}
writer.WriteUInt16(0xFFFF);
// strings
writer.WriteUInt16((ushort)ResType.String);
for (int i = 0; i < _strings.Length; i++)
{
var str = _strings[i];
if (str != null)
{
// write index
writer.WriteUInt16(i);
// write text
writer.WriteInt32(str.Length);
writer.WriteBytes(str, str.Length);
}
}
writer.WriteUInt16(0xFFFF);
// write end of resources
writer.WriteUInt16(0xFFFF);
});
entry.Execute(serializer);
}