Пример #1
0
            static partial void CustomBinaryEndImport(MutagenFrame frame, IDialogTopicInternal obj)
            {
                if (frame.Reader.Complete)
                {
                    return;
                }
                GroupHeader groupMeta = frame.GetGroup();

                if (!groupMeta.IsGroup)
                {
                    return;
                }
                if (groupMeta.GroupType == (int)GroupTypeEnum.TopicChildren)
                {
                    obj.Timestamp = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.LastModifiedSpan);
                    if (FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeSpan)) != obj.FormKey)
                    {
                        throw new ArgumentException("Dialog children group did not match the FormID of the parent.");
                    }
                }
                else
                {
                    return;
                }
                frame.Reader.Position += groupMeta.HeaderLength;
                obj.Items.SetTo(Mutagen.Bethesda.Binary.ListBinaryTranslation <DialogItem> .Instance.Parse(
                                    frame: frame.SpawnWithLength(groupMeta.ContentLength),
                                    transl: (MutagenFrame r, RecordType header, out DialogItem listItem) =>
                {
                    return(LoquiBinaryTranslation <DialogItem> .Instance.Parse(
                               frame: r,
                               item: out listItem));
                }));
            }
Пример #2
0
        public static M ModParse <M, G>(
            M record,
            MutagenFrame frame,
            G importMask,
            RecordTypeConverter?recordTypeConverter,
            RecordStructFill <M> fillStructs,
            ModRecordTypeFill <M, G> fillTyped)
        {
            var modHeader = frame.Reader.GetMod();

            fillTyped(
                record: record,
                frame: frame,
                importMask: importMask,
                nextRecordType: modHeader.RecordType,
                contentLength: checked ((int)modHeader.ContentLength),
                recordTypeConverter: recordTypeConverter);
            while (!frame.Complete)
            {
                var groupHeader = frame.GetGroup();
                if (!groupHeader.IsGroup)
                {
                    throw new ArgumentException("Did not see GRUP header as expected.");
                }
                var len      = checked ((int)groupHeader.ContentLength);
                var finalPos = frame.Position + groupHeader.TotalLength;
                if (len == 0)
                {
                    frame.Position = finalPos;
                    continue;
                }
                var parsed = fillTyped(
                    record: record,
                    frame: frame,
                    importMask: importMask,
                    nextRecordType: groupHeader.ContainedRecordType,
                    contentLength: len,
                    recordTypeConverter: recordTypeConverter);
                if (parsed.Failed)
                {
                    break;
                }
                if (frame.Position < finalPos)
                {
                    frame.Position = finalPos;
                }
            }
            frame.SetToFinalPosition();
            return(record);
        }
Пример #3
0
        public static G GroupParse <G>(
            G record,
            MutagenFrame frame,
            RecordTypeConverter?recordTypeConverter,
            RecordStructFill <G> fillStructs,
            RecordTypeFill <G> fillTyped)
        {
            var groupMeta = frame.GetGroup();

            if (!groupMeta.IsGroup)
            {
                throw new ArgumentException($"Expected GRUP header was not read in: {frame.Position}");
            }
            frame.Position += groupMeta.TypeAndLengthLength;
            frame           = frame.ReadAndReframe(checked ((int)(groupMeta.TotalLength - groupMeta.TypeAndLengthLength)));

            fillStructs?.Invoke(
                record: record,
                frame: frame);
            while (!frame.Complete)
            {
                var nextRecordType = HeaderTranslation.GetNextSubrecordType(
                    reader: frame.Reader,
                    contentLength: out var contentLength);
                var finalPos = frame.Position + contentLength;
                var parsed   = fillTyped(
                    record: record,
                    frame: frame,
                    nextRecordType: nextRecordType,
                    contentLength: contentLength,
                    recordTypeConverter: recordTypeConverter);
                if (parsed.Failed)
                {
                    break;
                }
                if (frame.Position < finalPos)
                {
                    frame.Position = finalPos;
                }
            }
            frame.SetToFinalPosition();
            return(record);
        }
Пример #4
0
            private static void CustomBinaryEnd(MutagenFrame frame, ICellInternal obj)
            {
                if (frame.Reader.Complete)
                {
                    return;
                }
                if (!frame.TryGetGroup(out var groupMeta))
                {
                    return;
                }
                var formKey = FormKey.Factory(frame.MetaData.MasterReferences !, BinaryPrimitives.ReadUInt32LittleEndian(groupMeta.ContainedRecordTypeData));

                if (groupMeta.GroupType == (int)GroupTypeEnum.CellChildren)
                {
                    obj.Timestamp   = BinaryPrimitives.ReadInt32LittleEndian(groupMeta.LastModifiedData);
                    frame.Position += groupMeta.HeaderLength;
                    if (formKey != obj.FormKey)
                    {
                        throw new ArgumentException("Cell children group did not match the FormID of the parent cell.");
                    }
                }
                else
                {
                    return;
                }
                var subFrame = frame.SpawnWithLength(groupMeta.ContentLength);

                while (!subFrame.Complete)
                {
                    var persistGroupMeta = frame.GetGroup();
                    if (!persistGroupMeta.IsGroup)
                    {
                        throw new ArgumentException();
                    }
                    GroupTypeEnum type      = (GroupTypeEnum)persistGroupMeta.GroupType;
                    var           itemFrame = frame.SpawnWithLength(persistGroupMeta.TotalLength);
                    switch (type)
                    {
                    case GroupTypeEnum.CellPersistentChildren:
                        ParseTypical(
                            frame: itemFrame,
                            obj: obj,
                            coll: obj.Persistent,
                            persistentParse: true);
                        break;

                    case GroupTypeEnum.CellTemporaryChildren:
                        ParseTemporary(
                            itemFrame,
                            obj);
                        break;

                    case GroupTypeEnum.CellVisibleDistantChildren:
                        ParseTypical(
                            frame: itemFrame,
                            obj: obj,
                            coll: obj.VisibleWhenDistant,
                            persistentParse: false);
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }
            }