NScumm.Scumm.ScummEngine.SaveOrLoadResources C# (CSharp) Метод

SaveOrLoadResources() приватный Метод

private SaveOrLoadResources ( Serializer serializer ) : void
serializer NScumm.Scumm.IO.Serializer
Результат void
        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);
        }
ScummEngine