Пример #1
0
            public static partial ParseResult FillBinaryEffectInitialCustom(MutagenFrame frame, IEffect item, PreviousParse lastParsed)
            {
                var subMeta = frame.ReadSubrecord();

                if (subMeta.ContentLength != Mutagen.Bethesda.Plugins.Internals.Constants.HeaderLength)
                {
                    throw new ArgumentException($"Magic effect name must be length 4.  Was: {subMeta.ContentLength}");
                }
                var magicEffName = frame.ReadMemory(4);

                if (!frame.Reader.TryGetSubrecord(RecordTypes.EFIT, out var efitMeta))
                {
                    throw new ArgumentException("Expected EFIT header.");
                }
                if (efitMeta.ContentLength < Mutagen.Bethesda.Plugins.Internals.Constants.HeaderLength)
                {
                    throw new ArgumentException($"Magic effect ref length was less than 4.  Was: {efitMeta.ContentLength}");
                }
                var magicEffName2 = frame.GetMemory(amount: Mutagen.Bethesda.Plugins.Internals.Constants.HeaderLength, offset: efitMeta.HeaderLength);

                if (!magicEffName.Span.SequenceEqual(magicEffName2.Span))
                {
                    throw new ArgumentException($"Magic effect names did not match. {BinaryStringUtility.ToZString(magicEffName, frame.MetaData.Encodings.NonTranslated)} != {BinaryStringUtility.ToZString(magicEffName2, frame.MetaData.Encodings.NonTranslated)}");
                }

                return(lastParsed.ParsedIndex);
            }
Пример #2
0
            public static partial void FillBinaryEffectInitialCustom(MutagenFrame frame, IEffect item)
            {
                var subMeta = frame.ReadSubrecord();

                if (subMeta.ContentLength != Plugins.Internals.Constants.HeaderLength)
                {
                    throw new ArgumentException($"Magic effect name must be length 4.  Was: {subMeta.ContentLength}");
                }
                var magicEffName = frame.ReadMemory(4);

                if (!frame.Reader.TryGetSubrecord(RecordTypes.EFIT, out var efitMeta))
                {
                    throw new ArgumentException("Expected EFIT header.");
                }
                if (efitMeta.ContentLength < Plugins.Internals.Constants.HeaderLength)
                {
                    throw new ArgumentException($"Magic effect ref length was less than 4.  Was: {efitMeta.ContentLength}");
                }
                var magicEffName2 = frame.GetMemory(amount: Plugins.Internals.Constants.HeaderLength, offset: efitMeta.HeaderLength);

                if (!magicEffName.Span.SequenceEqual(magicEffName2.Span))
                {
                    throw new ArgumentException($"Magic effect names did not match. {BinaryStringUtility.ToZString(magicEffName)} != {BinaryStringUtility.ToZString(magicEffName2)}");
                }
            }
Пример #3
0
 public static void FillBinaryCloudXSpeeds(MutagenFrame frame, CloudLayer[] clouds)
 {
     frame.ReadSubrecord();
     for (int i = 0; i < NumLayers; i++)
     {
         clouds[i].XSpeed = ConvertToSpeed(frame.ReadUInt8());
     }
 }
Пример #4
0
            static partial void FillBinaryMinCustom(MutagenFrame frame, IWorldspaceObjectBounds item)
            {
                var subHeader = frame.ReadSubrecord();

                if (subHeader.ContentLength != 8)
                {
                    throw new ArgumentException("Unexpected length");
                }
                item.Min = new P2Float(
                    frame.ReadFloat() / 4096f,
                    frame.ReadFloat() / 4096f);
            }
Пример #5
0
        public static partial void FillBinaryPointsCustom(MutagenFrame frame, IRoadInternal item)
        {
            if (!frame.Reader.TryReadSubrecord(PGRP, out var subMeta))
            {
                return;
            }
            var pointBytes = frame.Reader.ReadSpan(subMeta.ContentLength);

            subMeta = frame.ReadSubrecord();
            switch (subMeta.RecordType.TypeInt)
            {
            case 0x52524750:     // "PGRR":
                var         connBytes  = frame.Reader.ReadSpan(subMeta.ContentLength);
                var         connFloats = connBytes.AsFloatSpan();
                int         numPts     = pointBytes.Length / POINT_LEN;
                RoadPoint[] points     = new RoadPoint[numPts];
                for (int i = 0; i < numPts; i++)
                {
                    var pt = ReadPathGridPoint(pointBytes, out var numConn);
                    pointBytes = pointBytes.Slice(16);
                    P3Float[] conns = new P3Float[numConn];
                    for (int j = 0; j < numConn; j++)
                    {
                        conns[j] = new P3Float(
                            x: connFloats[0],
                            y: connFloats[1],
                            z: connFloats[2]);
                        connFloats = connFloats.Slice(3);
                    }
                    pt.Connections.AddRange(conns);
                    points[i] = pt;
                }
                item.Points = points.ToExtendedList();
                if (connFloats.Length > 0)
                {
                    throw new ArgumentException("Connection reader did not complete as expected.");
                }
                break;

            default:
                frame.Reader.Position -= subMeta.HeaderLength;
                item.Points            = new ExtendedList <RoadPoint>();
                while (pointBytes.Length > 0)
                {
                    item.Points.Add(
                        ReadPathGridPoint(pointBytes, out var numConn));
                    pointBytes = pointBytes.Slice(16);
                }
                break;
            }
        }
Пример #6
0
 public static void FillBinaryCloudAlphas(MutagenFrame frame, CloudLayer[] clouds)
 {
     frame.ReadSubrecord();
     for (int i = 0; i < NumLayers; i++)
     {
         clouds[i].Alphas = new WeatherAlpha()
         {
             Sunrise = frame.ReadFloat(),
             Day     = frame.ReadFloat(),
             Sunset  = frame.ReadFloat(),
             Night   = frame.ReadFloat(),
         };
     }
 }
Пример #7
0
            static partial void FillBinaryIDParseCustom(MutagenFrame frame, IQuestAlias item)
            {
                var subMeta = frame.ReadSubrecord();

                item.Type = subMeta.RecordTypeInt switch
                {
                    // ALST
                    0x54534C41 => QuestAlias.TypeEnum.Reference,
                    // ALLS
                    0x534C4C41 => QuestAlias.TypeEnum.Location,
                    _ => throw new NotImplementedException(),
                };
                item.ID = frame.ReadUInt32();
            }
Пример #8
0
            public static BodyTemplate Parse(MutagenFrame frame)
            {
                var subFrame = frame.ReadSubrecord();
                var version  = frame.MetaData.FormVersion !.Value;

                switch (subFrame.RecordTypeInt)
                {
                case RecordTypeInts.BODT:
                    return(ParseBodt(version, frame, subFrame));

                case RecordTypeInts.BOD2:
                    return(ParseBod2(version, frame, subFrame));

                default:
                    throw new ArgumentException();
                }
            }
Пример #9
0
            public static void FillBinaryCloudColors(MutagenFrame frame, CloudLayer[] clouds)
            {
                var rec = frame.ReadSubrecord();

                frame = frame.SpawnWithLength(rec.ContentLength);
                for (int i = 0; i < NumLayers; i++)
                {
                    if (frame.Complete)
                    {
                        return;
                    }
                    clouds[i].Colors = new WeatherColor()
                    {
                        Sunrise = frame.ReadColor(ColorBinaryType.Alpha),
                        Day     = frame.ReadColor(ColorBinaryType.Alpha),
                        Sunset  = frame.ReadColor(ColorBinaryType.Alpha),
                        Night   = frame.ReadColor(ColorBinaryType.Alpha),
                    };
                }
            }
Пример #10
0
            public static WeatherAmbientColorSet GetBinaryDirectionalAmbientLightingColors(MutagenFrame frame)
            {
                AmbientColors Parse()
                {
                    var subMeta = frame.ReadSubrecord();

                    if (subMeta.RecordType != RecordTypes.DALC)
                    {
                        throw new ArgumentException();
                    }
                    return(AmbientColors.CreateFromBinary(frame.SpawnWithLength(subMeta.ContentLength, checkFraming: false)));
                }

                return(new WeatherAmbientColorSet()
                {
                    Sunrise = Parse(),
                    Day = Parse(),
                    Sunset = Parse(),
                    Night = Parse(),
                });
            }
Пример #11
0
        public ExtendedList <T> Parse(
            MutagenFrame reader,
            RecordType triggeringRecord,
            BinarySubParseDelegate <IBinaryReadStream, T> transl)
        {
            var ret = new ExtendedList <T>();

            while (!reader.Complete && !reader.Reader.Complete)
            {
                if (!HeaderTranslation.TryGetRecordType(reader.Reader, triggeringRecord))
                {
                    break;
                }
                var          startingPos = reader.Position;
                MutagenFrame subFrame;
                if (!IsLoqui)
                {
                    var subHeader = reader.ReadSubrecord();
                    subFrame = reader.ReadAndReframe(subHeader.ContentLength);
                }
                else
                {
                    subFrame = reader;
                }
                if (transl(subFrame, out var subItem))
                {
                    ret.Add(subItem);
                }

                if (reader.Position == startingPos)
                {
                    reader.Position += reader.MetaData.Constants.SubConstants.HeaderLength;
                    throw new ArgumentException($"Parsed item on the list consumed no data: {subItem}");
                }
            }
            return(ret);
        }