Ejemplo n.º 1
0
            public static BodyTemplate Parse(MutagenFrame frame)
            {
                var subFrame = frame.GetSubrecordFrame();
                var version  = frame.MetaData.FormVersion !.Value;

                switch (subFrame.RecordTypeInt)
                {
                case RecordTypeInts.BODT:
                    if (version >= 44)
                    {
                        throw new ArgumentException("BODT type not expected on versions >= 44");
                    }
                    return(BodyTemplate.CreateFromBinary(frame));

                case RecordTypeInts.BOD2:
                    if (version < 43)
                    {
                        throw new ArgumentException("BOD2 type not expected on versions < 43");
                    }
                    if (version >= 44)
                    {
                        return(BodyTemplate.CreateFromBinary(frame));
                    }
                    frame.MetaData.FormVersion = 44;
                    var template = BodyTemplate.CreateFromBinary(frame);
                    template.ActsLike44        = true;
                    frame.MetaData.FormVersion = 43;
                    return(template);

                default:
                    throw new ArgumentException();
                }
            }
Ejemplo n.º 2
0
        static void ParseRegionData(MutagenFrame frame, IRegionInternal item)
        {
            var rdatFrame = frame.GetSubrecordFrame();

            RegionData.RegionDataType dataType = (RegionData.RegionDataType)BinaryPrimitives.ReadUInt32LittleEndian(rdatFrame.Content);
            var subMeta = frame.GetSubrecord(offset: rdatFrame.TotalLength);
            int len     = rdatFrame.TotalLength;

            if (IsExpected(dataType, subMeta.RecordType))
            {
                len += subMeta.TotalLength;
            }
            switch (dataType)
            {
            case RegionData.RegionDataType.Object:
                item.Objects = RegionObjects.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false));
                break;

            case RegionData.RegionDataType.Map:
                item.MapName = RegionMap.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false));
                break;

            case RegionData.RegionDataType.Grass:
                item.Grasses = RegionGrasses.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false));
                break;

            case RegionData.RegionDataType.Sound:
                if (frame.Reader.TryGetSubrecord(out var nextRec, offset: len) &&
                    (nextRec.RecordType.Equals(RDSD) || nextRec.RecordType.Equals(RDMD)))
                {
                    len += nextRec.TotalLength;
                }
                item.Sounds = RegionSounds.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false));
                break;

            case RegionData.RegionDataType.Weather:
                item.Weather = RegionWeather.CreateFromBinary(frame.SpawnWithLength(len, checkFraming: false));
                break;

            case RegionData.RegionDataType.Icon:
                frame.Position += frame.MetaData.Constants.SubConstants.HeaderLength + rdatFrame.TotalLength;
                len             = len - frame.MetaData.Constants.SubConstants.HeaderLength - rdatFrame.TotalLength;
                if (StringBinaryTranslation.Instance.Parse(
                        frame.SpawnWithLength(len, checkFraming: false),
                        out var iconVal))
                {
                    item.Icon = iconVal;
                }
                else
                {
                    item.Icon = null;
                }
                break;

            default:
                throw new NotImplementedException();
            }
        }
Ejemplo n.º 3
0
            public static partial void FillBinaryAnimationsCustom(MutagenFrame frame, IPackageIdles item)
            {
                byte?count = null;

                for (int i = 0; i < 3; i++)
                {
                    var subRecord = frame.GetSubrecordFrame();
                    if (subRecord.RecordType == RecordTypes.IDLC)
                    {
                        // Counter start
                        if (subRecord.Content.Length != 1)
                        {
                            throw new ArgumentException("Unexpected counter length");
                        }
                        count           = subRecord.Content[0];
                        frame.Position += subRecord.TotalLength;
                    }
                    else if (subRecord.RecordType == RecordTypes.IDLA)
                    {
                        if (count == null)
                        {
                            item.Animations.SetTo(
                                ListBinaryTranslation <IFormLinkGetter <IdleAnimation> > .Instance.Parse(
                                    reader: frame,
                                    triggeringRecord: RecordTypes.IDLA,
                                    transl: FormLinkBinaryTranslation.Instance.Parse));
                        }
                        else
                        {
                            item.Animations.SetTo(
                                ListBinaryTranslation <IFormLinkGetter <IdleAnimation> > .Instance.Parse(
                                    reader: frame,
                                    amount: count.Value,
                                    triggeringRecord: RecordTypes.IDLA,
                                    transl: FormLinkBinaryTranslation.Instance.Parse));
                        }
                    }
                    else if (subRecord.RecordType == RecordTypes.IDLT)
                    {
                        item.TimerSetting = subRecord.Content.Float();
                        frame.Position   += subRecord.TotalLength;
                    }
                    else
                    {
                        break;
                    }
                }
                if (count.HasValue && count.Value != item.Animations.Count)
                {
                    throw new ArgumentException("Idle animation counts did not match.");
                }
            }