Ejemplo n.º 1
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);
                }
            }
Ejemplo n.º 2
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);
            }
Ejemplo n.º 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);
                }
            }
Ejemplo n.º 4
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));
     }
 }
Ejemplo n.º 5
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);
     }
 }
Ejemplo n.º 6
0
 public static partial void WriteBinaryOpenByDefaultCustom(MutagenWriter writer, IPlacedObjectGetter item)
 {
     if (item.OpenByDefault)
     {
         using (HeaderExport.Subrecord(writer, RecordTypes.ONAM))
         {
         }
     }
 }
Ejemplo n.º 7
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);
     }
 }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
0
 public static partial void WriteBinaryEffectInitialCustom(MutagenWriter writer, IEffectGetter item)
 {
     using (HeaderExport.Subrecord(writer, RecordTypes.EFID))
     {
         RecordTypeBinaryTranslation.Instance.Write(
             writer: writer,
             item: item.Data.MagicEffect);
     }
 }
Ejemplo n.º 10
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);
            }
Ejemplo n.º 11
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);
         }
     }
Ejemplo n.º 12
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);
     }
 }
Ejemplo n.º 13
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));
     }
 }
Ejemplo n.º 14
0
 public static partial void WriteBinaryAnimationsCustom(MutagenWriter writer, IIdleMarkerGetter item)
 {
     if (item.Animations is not {} anims) return;
     using (HeaderExport.Subrecord(writer, RecordTypes.IDLA))
     {
         foreach (var anim in anims)
         {
             FormKeyBinaryTranslation.Instance.Write(writer, anim.FormKey);
         }
     }
 }
Ejemplo n.º 15
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);
     }
 }
Ejemplo n.º 16
0
        public static partial void WriteBinaryPointToPointConnectionsCustom(MutagenWriter writer, IPathGridGetter item)
        {
            if (item.PointToPointConnections is not {
            } ptToPt)
            {
                return;
            }

            using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
            {
                writer.Write((ushort)ptToPt.Count);
            }

            bool anyConnections = false;

            using (HeaderExport.Subrecord(writer, PathGridBinaryCreateTranslation.PGRP))
            {
                foreach (var pt in ptToPt)
                {
                    writer.Write(pt.Point.X);
                    writer.Write(pt.Point.Y);
                    writer.Write(pt.Point.Z);
                    writer.Write((byte)(pt.Connections.Count));
                    writer.Write(pt.Unused);
                    if (pt.Connections.Count > 0)
                    {
                        anyConnections = true;
                    }
                }
            }

            if (item.PGAG is { } pgag)
            {
                using (HeaderExport.Subrecord(writer, RecordTypes.PGAG))
                {
                    writer.Write(pgag);
                }
            }

            if (!anyConnections)
            {
                return;
            }
            using (HeaderExport.Subrecord(writer, PathGridBinaryCreateTranslation.PGRR))
            {
                foreach (var pt in ptToPt)
                {
                    foreach (var conn in pt.Connections)
                    {
                        writer.Write(conn);
                    }
                }
            }
        }
Ejemplo n.º 17
0
            public static partial void WriteBinaryZoomCustom(MutagenWriter writer, ICameraPathGetter item)
            {
                byte e = (byte)item.Zoom;

                if (!item.ZoomMustHaveCameraShots)
                {
                    e += 128;
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.DATA))
                {
                    writer.Write(e);
                }
            }
Ejemplo n.º 18
0
 public static partial void WriteBinaryEffectsCustom(MutagenWriter writer, IPerkGetter item)
 {
     foreach (var effect in item.Effects)
     {
         using (HeaderExport.Subrecord(writer, RecordTypes.PRKE))
         {
             writer.Write((byte)(effect switch
             {
                 PerkQuestEffect quest => Perk.EffectType.Quest,
                 PerkAbilityEffect ab => Perk.EffectType.Ability,
                 APerkEntryPointEffect ep => Perk.EffectType.EntryPoint,
                 _ => throw new NotImplementedException()
             }));
Ejemplo n.º 19
0
 static partial void WriteBinaryDataLogicCustom(MutagenWriter writer, IANavigationMeshGetter item)
 {
     if (!item.Data.TryGet(out var data))
     {
         return;
     }
     using (var header = HeaderExport.Subrecord(
                writer,
                RecordTypes.NVNM,
                overflowRecord: RecordTypes.XXXX))
     {
         data.WriteToBinary(header.PrepWriter);
     }
 }
Ejemplo n.º 20
0
            static partial void WriteBinaryConditionsCustom(MutagenWriter writer, IMusicTrackGetter item)
            {
                var conditions = item.Conditions;

                if (conditions == null)
                {
                    return;
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.CITC))
                {
                    writer.Write(conditions.Count);
                }
                ConditionBinaryWriteTranslation.WriteConditionsList(conditions, writer);
            }
Ejemplo n.º 21
0
            public static partial void WriteBinaryIDParseCustom(MutagenWriter writer, IQuestAliasGetter item)
            {
                RecordType type = item.Type switch
                {
                    QuestAlias.TypeEnum.Reference => RecordTypes.ALST,
                    QuestAlias.TypeEnum.Location => RecordTypes.ALLS,
                    _ => throw new NotImplementedException(),
                };

                using (HeaderExport.Subrecord(writer, type))
                {
                    writer.Write(item.ID);
                }
            }
Ejemplo n.º 22
0
 static void WriteMorph(MutagenWriter writer, MorphEnum e, IMorphGetter?morph)
 {
     if (morph == null)
     {
         return;
     }
     using (HeaderExport.Subrecord(writer, RecordTypes.MPAI))
     {
         writer.Write((int)e);
     }
     using (HeaderExport.Subrecord(writer, AvailableMorphsBinaryCreateTranslation.MPAV))
     {
         writer.Write(morph.Data);
     }
 }
Ejemplo n.º 23
0
            static partial void WriteBinaryCloudTexturesParseCustom(MutagenWriter writer, IWeatherGetter item)
            {
                var cloudTex = item.CloudTextures;

                for (int i = 0; i < cloudTex.Length; i++)
                {
                    if (!cloudTex[i].TryGet(out var tex))
                    {
                        continue;
                    }
                    using (HeaderExport.Subrecord(writer, new RecordType(WeatherBinaryCreateTranslation.TextureIntBase + i)))
                    {
                        writer.Write(tex, StringBinaryType.NullTerminate);
                    }
                }
            }
Ejemplo n.º 24
0
            public static partial void WriteBinaryNextAliasIDCustom(MutagenWriter writer, IQuestGetter item)
            {
                var aliases = item.Aliases;

                using (HeaderExport.Subrecord(writer, RecordTypes.ANAM))
                {
                    if (aliases.Count == 0)
                    {
                        writer.Write(0);
                    }
                    else
                    {
                        writer.Write(aliases.Select(x => x.ID).Max() + 1);
                    }
                }
            }
Ejemplo n.º 25
0
 public static partial void WriteBinaryDataLogicCustom(MutagenWriter writer, IANavigationMeshGetter item)
 {
     if (item.Data is not {
     } data)
     {
         return;
     }
     using (var header = HeaderExport.Subrecord(
                writer,
                RecordTypes.NVNM,
                overflowRecord: RecordTypes.XXXX,
                out var writerToUse))
     {
         data.WriteToBinary(writerToUse);
     }
 }
Ejemplo n.º 26
0
            public static partial void WriteBinaryCloudTexturesParseCustom(MutagenWriter writer, IWeatherGetter item)
            {
                var cloudTex = item.CloudTextures;

                for (int i = 0; i < cloudTex.Length; i++)
                {
                    if (cloudTex[i] is not {
                    } tex)
                    {
                        continue;
                    }
                    using (HeaderExport.Subrecord(writer, new RecordType(WeatherBinaryCreateTranslation.TextureIntBase + i)))
                    {
                        writer.Write(tex, StringBinaryType.NullTerminate, writer.MetaData.Encodings.NonTranslated);
                    }
                }
            }
Ejemplo n.º 27
0
            public static void WriteFaceFxPhonemes(MutagenWriter writer, IFaceFxPhonemesGetter item)
            {
                IPhonemeGetter?[] phonemes = new IPhonemeGetter?[FaceFxPhonemesBinaryCreateTranslation.TargetSize];
                foreach (var target in FaceFxPhonemesBinaryCreateTranslation.Targets)
                {
                    phonemes[(int)target] = item.GetGetter(target);
                }
                if (!phonemes.Any(p => p != null))
                {
                    return;
                }
                var force  = item.ForceNames;
                var hasAll = phonemes.All(p => p != null);

                if (!hasAll || force)
                {
                    for (int i = 0; i < phonemes.Length; i++)
                    {
                        var phoneme = phonemes[i];
                        if (phoneme == null)
                        {
                            continue;
                        }
                        var target = (Target)i;
                        using (HeaderExport.Subrecord(writer, RecordTypes.PHTN))
                        {
                            writer.Write(phoneme.Name, StringBinaryType.NullTerminate);
                        }
                    }
                }
                foreach (var slot in FaceFxPhonemesBinaryCreateTranslation.Slots)
                {
                    using (HeaderExport.Subrecord(writer, RecordTypes.PHWT))
                    {
                        foreach (var target in FaceFxPhonemesBinaryCreateTranslation.Targets)
                        {
                            IPhonemeGetter?phoneme = phonemes[(int)target];
                            if (phoneme == null)
                            {
                                continue;
                            }
                            writer.Write(phoneme.Get(slot));
                        }
                    }
                }
            }
Ejemplo n.º 28
0
            public override ReadOnlyMemorySlice <byte> GetBytes(IMutagenReadStream inputStream)
            {
                var subType = HeaderTranslation.ReadNextSubrecordType(
                    inputStream,
                    out var subLen);

                if (!subType.Equals(_recordType))
                {
                    throw new ArgumentException();
                }
                var           ret    = new byte[subLen + 6];
                MutagenWriter stream = new MutagenWriter(new MemoryStream(ret), inputStream.MetaData.Constants);

                using (HeaderExport.Subrecord(stream, _recordType))
                {
                    inputStream.WriteTo(stream.BaseStream, subLen);
                }
                return(ret);
            }
Ejemplo n.º 29
0
            static partial void WriteBinaryBoundDataCustom(MutagenWriter writer, IPlacedObjectGetter item)
            {
                var lightingTemplate = item.LightingTemplate;
                var imageSpace       = item.ImageSpace;
                var linkedRooms      = item.LinkedRooms;
                var unknown2         = item.Unknown;

                if (lightingTemplate.FormKeyNullable == null &&
                    imageSpace.FormKeyNullable == null &&
                    linkedRooms.Count == 0 &&
                    unknown2 == 0)
                {
                    return;
                }
                using (HeaderExport.Subrecord(writer, RecordTypes.XRMR))
                {
                    writer.Write((byte)item.LinkedRooms.Count);
                    byte flags = 0;
                    if (lightingTemplate.FormKeyNullable != null)
                    {
                        flags = EnumExt.SetFlag(flags, PlacedObjectBinaryCreateTranslation.HasLightingTemplateFlag, true);
                    }
                    if (imageSpace.FormKeyNullable != null)
                    {
                        flags = EnumExt.SetFlag(flags, PlacedObjectBinaryCreateTranslation.HasImageSpaceFlag, true);
                    }
                    writer.Write(flags);
                    writer.Write(unknown2);
                }
                if (lightingTemplate.FormKeyNullable != null)
                {
                    FormKeyBinaryTranslation.Instance.Write(writer, lightingTemplate.FormKeyNullable.Value, RecordTypes.LNAM);
                }
                if (imageSpace.FormKeyNullable != null)
                {
                    FormKeyBinaryTranslation.Instance.Write(writer, imageSpace.FormKeyNullable.Value, RecordTypes.INAM);
                }
                foreach (var room in linkedRooms)
                {
                    FormKeyBinaryTranslation.Instance.Write(writer, room.FormKey, RecordTypes.XLRM);
                }
            }
Ejemplo n.º 30
0
            static partial void WriteBinaryTrapFormCustom(MutagenWriter writer, IAPlacedTrapGetter item)
            {
                using var header = HeaderExport.Subrecord(writer, RecordTypes.NAME);
                switch (item)
                {
                case IPlacedArrowGetter arrow:
                    FormKeyBinaryTranslation.Instance.Write(writer, arrow.Projectile.FormKey);
                    break;

                case IPlacedBeamGetter beam:
                    FormKeyBinaryTranslation.Instance.Write(writer, beam.Projectile.FormKey);
                    break;

                case IPlacedFlameGetter flame:
                    FormKeyBinaryTranslation.Instance.Write(writer, flame.Projectile.FormKey);
                    break;

                case IPlacedConeGetter cone:
                    FormKeyBinaryTranslation.Instance.Write(writer, cone.Projectile.FormKey);
                    break;

                case IPlacedBarrierGetter barrier:
                    FormKeyBinaryTranslation.Instance.Write(writer, barrier.Projectile.FormKey);
                    break;

                case IPlacedTrapGetter trap:
                    FormKeyBinaryTranslation.Instance.Write(writer, trap.Projectile.FormKey);
                    break;

                case IPlacedHazardGetter hazard:
                    FormKeyBinaryTranslation.Instance.Write(writer, hazard.Hazard.FormKey);
                    break;

                case IPlacedMissileGetter missile:
                    FormKeyBinaryTranslation.Instance.Write(writer, missile.Projectile.FormKey);
                    break;

                default:
                    throw new NotImplementedException();
                }
            }