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); }
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); }