예제 #1
0
 public static void WriteNullable <T>(
     this PrimitiveBinaryTranslation <T, MutagenFrame, MutagenWriter> transl,
     MutagenWriter writer,
     T?item,
     RecordType header,
     Action <MutagenWriter, T>?write = null)
     where T : struct
 {
     if (!item.HasValue)
     {
         return;
     }
     write ??= transl.Write;
     try
     {
         using (HeaderExport.Header(writer, header, ObjectType.Subrecord))
         {
             write(writer, item.Value);
         }
     }
     catch (Exception ex)
     {
         throw SubrecordException.Factory(ex, header);
     }
 }
예제 #2
0
 public virtual void Write(
     MutagenWriter writer,
     IGlobalGetter item,
     TypedWriteParams?translationParams = null)
 {
     using (HeaderExport.Record(
                writer: writer,
                record: translationParams.ConvertToCustom(RecordTypes.GLOB)))
     {
         try
         {
             OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             writer.MetaData.FormVersion = item.FormVersion;
             WriteRecordTypes(
                 item: item,
                 writer: writer,
                 translationParams: translationParams);
             writer.MetaData.FormVersion = null;
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #3
0
            public static partial void WriteBinaryDisabledCloudLayersCustom(MutagenWriter writer, IWeatherGetter item)
            {
                var          clouds  = item.Clouds;
                Span <bool?> enabled = stackalloc bool?[WeatherBinaryCreateTranslation.NumLayers];
                bool         any     = false;

                for (int i = 0; i < WeatherBinaryCreateTranslation.NumLayers; i++)
                {
                    enabled[i] = clouds[i].Enabled;
                    any       |= enabled[i].HasValue;
                }
                if (!any)
                {
                    return;
                }

                using (HeaderExport.Subrecord(writer, RecordTypes.NAM1))
                {
                    uint raw   = 0;
                    uint index = 1;
                    for (int i = 0; i < WeatherBinaryCreateTranslation.NumLayers; i++)
                    {
                        var enable = enabled[i] ?? true;
                        // Inverse because we're exposing as enabled
                        raw     = EnumExt.SetFlag(raw, index, !enable);
                        index <<= 1;
                    }
                    writer.Write(raw);
                }
            }
 public void Write(
     MutagenWriter writer,
     IActorValueInformationGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.AVIF),
                type: Mutagen.Bethesda.Binary.ObjectType.Record))
     {
         try
         {
             Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #5
0
            public static partial void WriteBinaryCountCustom(MutagenWriter writer, IFootstepSetGetter item)
            {
                var walkForwardFootsteps = item.WalkForwardFootsteps;

                using (HeaderExport.Subrecord(writer, RecordTypes.XCNT))
                {
                    writer.Write(walkForwardFootsteps.Count);
                    writer.Write(item.RunForwardFootsteps.Count);
                    writer.Write(item.WalkForwardAlternateFootsteps.Count);
                    writer.Write(item.RunForwardAlternateFootsteps.Count);
                    writer.Write(item.WalkForwardAlternateFootsteps2.Count);
                }

                void WriteListOfFormKeys(IReadOnlyList <IFormLinkGetter <IFootstepGetter> > formKeys)
                {
                    foreach (var link in formKeys)
                    {
                        FormLinkBinaryTranslation.Instance.Write(writer, link);
                    }
                }

                using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
                {
                    WriteListOfFormKeys(walkForwardFootsteps);
                    WriteListOfFormKeys(item.RunForwardFootsteps);
                    WriteListOfFormKeys(item.WalkForwardAlternateFootsteps);
                    WriteListOfFormKeys(item.RunForwardAlternateFootsteps);
                    WriteListOfFormKeys(item.WalkForwardAlternateFootsteps2);
                }
            }
예제 #6
0
 public void Write(
     MutagenWriter writer,
     IHairGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.HAIR),
                type: Mutagen.Bethesda.Binary.ObjectType.Record))
     {
         try
         {
             Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
         }
         catch (Exception ex)
         {
             throw RecordException.Factory(ex, item.FormKey, item.EditorID);
         }
     }
 }
예제 #7
0
 public void Write(
     MutagenWriter writer,
     ISpellLeveledGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.LVSP),
                type: ObjectType.Record))
     {
         try
         {
             OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             SpellBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #8
0
 public void Write(
     MutagenWriter writer,
     IActorValueInformationGetter item,
     TypedWriteParams?translationParams = null)
 {
     using (HeaderExport.Record(
                writer: writer,
                record: translationParams.ConvertToCustom(RecordTypes.AVIF)))
     {
         try
         {
             Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 translationParams: translationParams);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #9
0
 public static partial void CustomBinaryEndExport(MutagenWriter writer, IDialogTopicGetter obj)
 {
     try
     {
         if (!obj.Items.TryGet(out var items) ||
             items.Count == 0)
         {
             return;
         }
         using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group))
         {
             FormKeyBinaryTranslation.Instance.Write(
                 writer,
                 obj.FormKey);
             writer.Write((int)GroupTypeEnum.TopicChildren);
             writer.Write(obj.Timestamp);
             ListBinaryTranslation <IDialogItemGetter> .Instance.Write(
                 writer : writer,
                 items : items,
                 transl : (MutagenWriter subWriter, IDialogItemGetter subItem) =>
             {
                 subItem.WriteToBinary(subWriter);
             });
         }
     }
     catch (Exception ex)
     {
         throw RecordException.Enrich(ex, obj);
     }
 }
예제 #10
0
            public static partial void CustomBinaryEndExport(MutagenWriter writer, IWorldspaceGetter obj)
            {
                try
                {
                    var topCell  = obj.TopCell;
                    var subCells = obj.SubCells;
                    if (subCells?.Count == 0 &&
                        topCell == null)
                    {
                        return;
                    }
                    using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group))
                    {
                        FormKeyBinaryTranslation.Instance.Write(
                            writer,
                            obj.FormKey);
                        writer.Write((int)GroupTypeEnum.WorldChildren);
                        writer.Write(obj.SubCellsTimestamp);
                        writer.Write(obj.SubCellsUnknown);

                        topCell?.WriteToBinary(writer);
                        ListBinaryTranslation <IWorldspaceBlockGetter> .Instance.Write(
                            writer : writer,
                            items : subCells,
                            transl : (MutagenWriter subWriter, IWorldspaceBlockGetter subItem) =>
                        {
                            subItem.WriteToBinary(subWriter);
                        });
                    }
                }
                catch (Exception ex)
                {
                    throw RecordException.Enrich(ex, obj);
                }
            }
예제 #11
0
            static partial void CustomBinaryEndExport(MutagenWriter writer, IWorldspaceGetter obj)
            {
                var road     = obj.Road;
                var topCell  = obj.TopCell;
                var subCells = obj.SubCells;

                if (subCells?.Count == 0 &&
                    road == null &&
                    topCell == null)
                {
                    return;
                }
                using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group))
                {
                    FormKeyBinaryTranslation.Instance.Write(
                        writer,
                        obj.FormKey);
                    writer.Write((int)GroupTypeEnum.WorldChildren);
                    writer.Write(obj.SubCellsTimestamp);

                    road?.WriteToBinary(writer);
                    topCell?.WriteToBinary(writer);
                    Mutagen.Bethesda.Binary.ListBinaryTranslation <IWorldspaceBlockGetter> .Instance.Write(
                        writer : writer,
                        items : subCells,
                        transl : (MutagenWriter subWriter, IWorldspaceBlockGetter subItem) =>
                    {
                        subItem.WriteToBinary(subWriter);
                    });
                }
            }
예제 #12
0
 public virtual void Write(
     MutagenWriter writer,
     IGlobalGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.GLOB),
                type: Mutagen.Bethesda.Binary.ObjectType.Record))
     {
         try
         {
             OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             writer.MetaData.FormVersion = item.FormVersion;
             WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
             writer.MetaData.FormVersion = null;
         }
         catch (Exception ex)
         {
             throw RecordException.Factory(ex, item.FormKey, item.EditorID);
         }
     }
 }
 public void Write(
     MutagenWriter writer,
     ISpellLeveledGetter item,
     TypedWriteParams?translationParams = null)
 {
     using (HeaderExport.Record(
                writer: writer,
                record: translationParams.ConvertToCustom(RecordTypes.LVSP)))
     {
         try
         {
             OblivionMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             SpellBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 translationParams: translationParams);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #14
0
 public void Write(
     MutagenWriter writer,
     IMaterialSwapGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.MSWP),
                type: ObjectType.Record))
     {
         try
         {
             Fallout4MajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #15
0
 public void Write(
     MutagenWriter writer,
     ILensFlareGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.LENS),
                type: Mutagen.Bethesda.Binary.ObjectType.Record))
     {
         try
         {
             SkyrimMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #16
0
 public void Write(
     MutagenWriter writer,
     ILensFlareGetter item,
     TypedWriteParams?translationParams = null)
 {
     using (HeaderExport.Record(
                writer: writer,
                record: translationParams.ConvertToCustom(RecordTypes.LENS)))
     {
         try
         {
             SkyrimMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 translationParams: translationParams);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #17
0
            public override ReadOnlyMemorySlice <byte> GetBytes(IMutagenReadStream inputStream)
            {
                var           dataList = new List <byte[]>();
                MutagenWriter stream;

                while (!inputStream.Complete)
                {
                    var subType = HeaderTranslation.ReadNextSubrecordType(
                        inputStream,
                        out var subLen);
                    if (!SubTypes.Contains(subType))
                    {
                        inputStream.Position -= 6;
                        break;
                    }
                    var data = new byte[subLen + 6];
                    stream = new MutagenWriter(new MemoryStream(data), inputStream.MetaData.Constants);
                    using (HeaderExport.Subrecord(stream, subType))
                    {
                        inputStream.WriteTo(stream.BaseStream, subLen);
                    }
                    dataList.Add(data);
                }
                byte[] ret = new byte[dataList.Sum((d) => d.Length)];
                stream = new MutagenWriter(new MemoryStream(ret), inputStream.MetaData.Constants);
                foreach (var data in dataList)
                {
                    stream.Write(data);
                }
                return(ret);
            }
예제 #18
0
 public virtual void Write(
     MutagenWriter writer,
     IGameSettingGetter item,
     RecordTypeConverter?recordTypeConverter = null)
 {
     using (HeaderExport.Header(
                writer: writer,
                record: recordTypeConverter.ConvertToCustom(RecordTypes.GMST),
                type: ObjectType.Record))
     {
         try
         {
             SkyrimMajorRecordBinaryWriteTranslation.WriteEmbedded(
                 item: item,
                 writer: writer);
             MajorRecordBinaryWriteTranslation.WriteRecordTypes(
                 item: item,
                 writer: writer,
                 recordTypeConverter: recordTypeConverter);
         }
         catch (Exception ex)
         {
             throw RecordException.Enrich(ex, item);
         }
     }
 }
예제 #19
0
 public static partial void WriteBinaryAnimationCountCustom(MutagenWriter writer, IIdleMarkerGetter item)
 {
     if (item.Animations is not {} anims) return;
     using (HeaderExport.Subrecord(writer, RecordTypes.IDLC))
     {
         writer.Write(checked((byte)anims.Count));
     }
 }
예제 #20
0
        public void ParseRecordLocationsByCount_Alternating_MoreData()
        {
            MemoryTributary data = new MemoryTributary();

            using (MutagenWriter writer = new MutagenWriter(data, GameConstants.Oblivion))
            {
                using (HeaderExport.Subrecord(writer, RecordTypes.EDID))
                {
                    writer.Write(1);
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
                {
                    writer.Write(-1);
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.EDID))
                {
                    writer.Write(2);
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
                {
                    writer.Write(-2);
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.EDID))
                {
                    writer.Write(3);
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
                {
                    writer.Write(-3);
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.MAST))
                {
                    writer.Write(-3);
                }
            }

            data.Position = 0;
            var triggers = new HashSet <RecordType>()
            {
                RecordTypes.EDID,
                RecordTypes.DATA,
            };
            var stream = new OverlayStream(data.ToArray(), new ParsingBundle(GameConstants.Oblivion, masterReferences: null !));
            var pos    = BinaryOverlay.ParseRecordLocationsByCount(
                stream,
                3,
                triggers.ToGetter(),
                GameConstants.Oblivion.SubConstants,
                skipHeader: false);

            Assert.Equal(3, pos.Length);
            Assert.Equal(0, pos[0]);
            Assert.Equal(20, pos[1]);
            Assert.Equal(40, pos[2]);
            Assert.Equal(60, stream.Position);
            Assert.False(stream.Complete);
        }
예제 #21
0
 public static partial void WriteBinaryOpenByDefaultCustom(MutagenWriter writer, IPlacedObjectGetter item)
 {
     if (item.OpenByDefault)
     {
         using (HeaderExport.Subrecord(writer, RecordTypes.ONAM))
         {
         }
     }
 }
예제 #22
0
파일: Effect.cs 프로젝트: erri120/Mutagen
 public static partial void WriteBinaryEffectInitialCustom(MutagenWriter writer, IEffectGetter item)
 {
     using (HeaderExport.Subrecord(writer, RecordTypes.EFID))
     {
         RecordTypeBinaryTranslation.Instance.Write(
             writer: writer,
             item: item.Data.MagicEffect);
     }
 }
예제 #23
0
 static partial void WriteBinaryMinCustom(MutagenWriter writer, IWorldspaceObjectBoundsGetter item)
 {
     using (HeaderExport.Subrecord(writer, RecordTypes.NAM0))
     {
         var min = item.Min;
         writer.Write(min.X * 4096f);
         writer.Write(min.Y * 4096f);
     }
 }
예제 #24
0
 public static partial void WriteBinaryMaxCustom(MutagenWriter writer, IWorldspaceObjectBoundsGetter item)
 {
     using (HeaderExport.Subrecord(writer, RecordTypes.NAM9))
     {
         var max = item.Max;
         writer.Write(max.X * 4096f);
         writer.Write(max.Y * 4096f);
     }
 }
예제 #25
0
            static partial void WriteBinaryConditionsCustom(MutagenWriter writer, IAStoryManagerNodeGetter item)
            {
                var conditions = item.Conditions;

                using (HeaderExport.Subrecord(writer, RecordTypes.CITC))
                {
                    writer.Write(conditions.Count);
                }
                ConditionBinaryWriteTranslation.WriteConditionsList(conditions, writer);
            }
예제 #26
0
 public static partial void WriteBinaryResponseCountCustom(MutagenWriter writer, IDialogTopicGetter item)
 {
     if (!item.Responses.TryGet(out var resp) ||
         resp.Count == 0)
     {
         using (HeaderExport.Subrecord(writer, RecordTypes.TIFC))
         {
             writer.WriteZeros(4);
         }
     }
예제 #27
0
 public static partial void WriteBinaryAliasIndexCustom(MutagenWriter writer, IFindMatchingRefNearAliasGetter item)
 {
     if (!item.AliasIndex.TryGet(out var index))
     {
         return;
     }
     using (HeaderExport.Subrecord(writer, RecordTypes.ALNA))
     {
         writer.Write((int)index);
     }
 }
예제 #28
0
 public void Overflow()
 {
     Assert.Throws <OverflowException>(() =>
     {
         byte[] b         = new byte[ushort.MaxValue + 100];
         byte[] b2        = new byte[ushort.MaxValue + 1];
         using var writer = new MutagenWriter(new MemoryStream(b), GameConstants.Oblivion);
         using var header = HeaderExport.Header(writer, RecordTypes.EDID, ObjectType.Subrecord);
         writer.Write(b2);
     });
 }
예제 #29
0
 static partial void WriteBinaryAnimationCountCustom(MutagenWriter writer, IIdleMarkerGetter item)
 {
     if (!item.Animations.TryGet(out var anims))
     {
         return;
     }
     using (HeaderExport.Subrecord(writer, RecordTypes.IDLC))
     {
         writer.Write(checked ((byte)anims.Count));
     }
 }
예제 #30
0
 static partial void WriteBinaryDataCustom(MutagenWriter writer, IGameSettingBoolGetter item)
 {
     if (!item.Data.TryGet(out var data))
     {
         return;
     }
     using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
     {
         writer.Write(data ? 1 : 0);
     }
 }