Ejemplo n.º 1
0
        private static byte[] GetUncompressedPayload(Record record)
        {
            byte[] result             = new byte[GetUncompressedPayloadSize(record)];
            MArrayPosition <byte> pos = new MArrayPosition <byte>(result);

            foreach (var field in record.Fields)
            {
                int    fieldLength       = field.Payload.Length;
                ushort storedFieldLength = unchecked ((ushort)fieldLength);
                if (fieldLength > UInt16.MaxValue)
                {
                    MBitConverter.Set(pos, XXXX);
                    pos += 4;

                    MBitConverter.Set(pos, (ushort)4);
                    pos += 2;

                    MBitConverter.Set(pos, fieldLength);
                    pos += 4;
                    storedFieldLength = 0;
                }

                MBitConverter.Set(pos, field.FieldType);
                pos += 4;

                MBitConverter.Set(pos, storedFieldLength);
                pos += 2;

                MBuffer.BlockCopy(field.Payload, 0, pos, 0, fieldLength);
                pos += fieldLength;
            }

            return(result);
        }
Ejemplo n.º 2
0
        private static (BethesdaRecord record, BethesdaGroup[] subgroups) Write(Record record, ref MArrayPosition <byte> pos)
        {
            var result = default((BethesdaRecord record, BethesdaGroup[] subgroups));

            if (record.IsDummy)
            {
                goto groups;
            }

            result.record = new BethesdaRecord(pos)
            {
                RecordType = record.RecordType,
                DataSize   = unchecked ((uint)(CalculateSize(record, false) - 24)),
                Flags      = record.Flags,
                Id         = record.Id,
                Revision   = record.Revision,
                Version    = record.Version,
                UNKNOWN_22 = record.UNKNOWN_22
            };

            pos += 24;
            byte[] payload = record.Flags.HasFlag(BethesdaRecordFlags.Compressed)
                ? GetCompressedPayload(record)
                : GetUncompressedPayload(record);
            int payloadLength = payload.Length;

            MBuffer.BlockCopy(payload, 0, pos, 0, payloadLength);

            pos += payloadLength;

groups:
            result.subgroups = new BethesdaGroup[record.Subgroups.Count];
            for (int i = 0; i < result.subgroups.Length; i++)
            {
                result.subgroups[i] = Write(record.Subgroups[i], ref pos);
            }

            return(result);
        }