public static partial void WriteBinaryEndCustom(MutagenWriter writer, IQuestAliasGetter item) { using (HeaderExport.Subrecord(writer, RecordTypes.ALED)) { } }
private static void AlignWorldChildren( IMutagenReadStream reader, MutagenWriter writer) { reader.WriteTo(writer.BaseStream, 4); ReadOnlyMemorySlice <byte>? roadStorage = null; ReadOnlyMemorySlice <byte>? cellStorage = null; List <ReadOnlyMemorySlice <byte> > grupBytes = new List <ReadOnlyMemorySlice <byte> >(); for (int i = 0; i < 3; i++) { RecordType type = HeaderTranslation.GetNextRecordType(reader); switch (type.Type) { case "ROAD": roadStorage = reader.ReadMemory(checked ((int)reader.GetMajorRecord().TotalLength)); break; case "CELL": if (cellStorage != null) { throw new ArgumentException(); } var cellMajorMeta = reader.GetMajorRecord(); var startPos = reader.Position; reader.Position += cellMajorMeta.HeaderLength; long cellGroupLen = 0; if (reader.TryGetGroup(out var cellSubGroupMeta) && cellSubGroupMeta.GroupType == writer.MetaData.Constants.GroupConstants.Cell.TopGroupType) { cellGroupLen = cellSubGroupMeta.TotalLength; } reader.Position = startPos; cellStorage = reader.ReadMemory(checked ((int)(cellMajorMeta.TotalLength + cellGroupLen))); break; case "GRUP": if (roadStorage != null && cellStorage != null) { i = 3; // end loop continue; } grupBytes.Add(reader.ReadMemory(checked ((int)reader.GetGroup().TotalLength))); break; case "WRLD": i = 3; // end loop continue; default: throw new NotImplementedException(); } } if (roadStorage != null) { writer.Write(roadStorage.Value); } if (cellStorage != null) { writer.Write(cellStorage.Value); } foreach (var item in grupBytes) { writer.Write(item); } }
public static partial void WriteBinaryStopTimeCustom(MutagenWriter writer, ISoundDataExtendedInternalGetter item) { ByteBinaryTranslation <MutagenFrame, MutagenWriter> .Instance.Write( writer, (byte)Math.Round(item.StopTime / 1440f * 256f)); }
static partial void WriteBinaryFlagsCustom(MutagenWriter writer, IWeaponDataGetter item) { writer.Write((ushort)item.Flags); }
private static void AlignGroupsByRules( MutagenBinaryReadStream inputStream, MutagenWriter writer, AlignmentRules alignmentRules, RecordLocator.FileLocations fileLocs) { while (!inputStream.Complete) { // Import until next listed major record long noRecordLength; if (fileLocs.GrupLocations.TryGetInDirection( inputStream.Position, higher: true, result: out var nextRec)) { noRecordLength = nextRec.Value - inputStream.Position; } else { noRecordLength = inputStream.Remaining; } inputStream.WriteTo(writer.BaseStream, (int)noRecordLength); // If complete overall, return if (inputStream.Complete) { break; } var groupMeta = inputStream.GetGroup(); if (!groupMeta.IsGroup) { throw new ArgumentException(); } writer.Write(inputStream.ReadSpan(groupMeta.HeaderLength)); if (!alignmentRules.GroupAlignment.TryGetValue(groupMeta.GroupType, out var groupRules)) { continue; } var storage = new Dictionary <RecordType, List <ReadOnlyMemorySlice <byte> > >(); var rest = new List <ReadOnlyMemorySlice <byte> >(); using (var frame = MutagenFrame.ByLength(inputStream, groupMeta.ContentLength)) { while (!frame.Complete) { var majorMeta = inputStream.GetMajorRecord(); var bytes = inputStream.ReadMemory(checked ((int)majorMeta.TotalLength)); var type = majorMeta.RecordType; if (groupRules.Contains(type)) { storage.GetOrAdd(type).Add(bytes); } else { rest.Add(bytes); } } } foreach (var rule in groupRules) { if (storage.TryGetValue(rule, out var storageBytes)) { foreach (var item in storageBytes) { writer.Write(item); } } } foreach (var item in rest) { writer.Write(item); } } }
static partial void WriteBinaryUnusedConditionsLogicCustom(MutagenWriter writer, IQuestGetter item) { using (HeaderExport.Subrecord(writer, RecordTypes.NEXT)) { } ConditionBinaryWriteTranslation.WriteConditionsList(item.UnusedConditions, writer); }
public static partial void WriteBinaryPatrolScriptMarkerCustom(MutagenWriter writer, IPatrolGetter item) { using (HeaderExport.Subrecord(writer, RecordTypes.XPPA)) { } }
public static partial void WriteBinaryTimerSettingCustom(MutagenWriter writer, IPackageIdlesGetter item) { }
static partial void WriteBinaryNavmeshGridCustom(MutagenWriter writer, IANavigationMeshDataGetter item) { writer.Write(item.NavmeshGrid); }
public static partial void WriteBinaryPropertyCustom(MutagenWriter writer, IQuestFragmentAliasGetter item) { AVirtualMachineAdapterBinaryWriteTranslation.WriteObject(writer, item.Property, item.ObjectFormat); }
public static partial void WriteBinaryCustomLogicCustom(MutagenWriter writer, IADamageTypeGetter item) { }
public static partial void WriteBinaryScriptsCustom(MutagenWriter writer, IQuestFragmentAliasGetter item) { AVirtualMachineAdapterBinaryWriteTranslation.WriteScripts(writer, item.ObjectFormat, item.Scripts); }
public static partial void WriteBinaryFragmentsCustom(MutagenWriter writer, IQuestAdapterGetter item) { }
public static partial void WriteBinaryFileNameCustom(MutagenWriter writer, IQuestAdapterGetter item) { }
public static partial void WriteBinaryScriptsCustom(MutagenWriter writer, IAVirtualMachineAdapterGetter item) { WriteScripts(writer, item.ObjectFormat, item.Scripts); }
public static void Align( ModPath inputPath, FilePath outputPath, GameRelease release, AlignmentRules alignmentRules, TempFolder?temp = null) { var interest = new RecordInterest(alignmentRules.Alignments.Keys) { EmptyMeansInterested = false }; var constants = GameConstants.Get(release); var parsingBundle = new ParsingBundle(constants, MasterReferenceReader.FromPath(inputPath, release)); var fileLocs = RecordLocator.GetFileLocations(inputPath.Path, release, interest); temp ??= TempFolder.Factory(); using (temp) { var alignedMajorRecordsFile = Path.Combine(temp.Dir.Path, "alignedRules"); using (var inputStream = new MutagenBinaryReadStream(inputPath.Path, parsingBundle)) { using var writer = new MutagenWriter(new FileStream(alignedMajorRecordsFile, FileMode.Create), release); AlignMajorRecordsByRules(inputStream, writer, alignmentRules, fileLocs); } var alignedGroupsFile = Path.Combine(temp.Dir.Path, "alignedGroups"); using (var inputStream = new MutagenBinaryReadStream(alignedMajorRecordsFile, parsingBundle)) { using var writer = new MutagenWriter(new FileStream(alignedGroupsFile, FileMode.Create), release); AlignGroupsByRules(inputStream, writer, alignmentRules, fileLocs); } fileLocs = RecordLocator.GetFileLocations(alignedGroupsFile, release, interest); var alignedCellsFile = Path.Combine(temp.Dir.Path, "alignedCells"); using (var mutaReader = new BinaryReadStream(alignedGroupsFile)) { using var writer = new MutagenWriter(alignedCellsFile, release); foreach (var grup in fileLocs.GrupLocations) { if (grup <= mutaReader.Position) { continue; } var noRecordLength = grup - mutaReader.Position; mutaReader.WriteTo(writer.BaseStream, (int)noRecordLength); // If complete overall, return if (mutaReader.Complete) { break; } mutaReader.WriteTo(writer.BaseStream, 12); var grupType = mutaReader.ReadUInt32(); writer.Write((int)grupType); if (grupType == constants.GroupConstants.Cell.TopGroupType) { AlignCellChildren(mutaReader, writer); } } mutaReader.WriteTo(writer.BaseStream, checked ((int)mutaReader.Remaining)); } fileLocs = RecordLocator.GetFileLocations(alignedCellsFile, release, interest); using (var mutaReader = new MutagenBinaryReadStream(alignedCellsFile, parsingBundle)) { using var writer = new MutagenWriter(outputPath.Path, GameConstants.Get(release)); foreach (var grup in fileLocs.GrupLocations) { if (grup <= mutaReader.Position) { continue; } var noRecordLength = grup - mutaReader.Position; mutaReader.WriteTo(writer.BaseStream, (int)noRecordLength); // If complete overall, return if (mutaReader.Complete) { break; } mutaReader.WriteTo(writer.BaseStream, 12); var grupType = mutaReader.ReadUInt32(); writer.Write((int)grupType); if (grupType == constants.GroupConstants.World.TopGroupType) { AlignWorldChildren(mutaReader, writer); } } mutaReader.WriteTo(writer.BaseStream, checked ((int)mutaReader.Remaining)); } } }
static partial void WriteBinaryDialogConditionsCustom(MutagenWriter writer, IQuestGetter item) { ConditionBinaryWriteTranslation.WriteConditionsList(item.DialogConditions, writer); }
public static void Align( ModPath inputPath, FilePath outputPath, GameRelease gameMode, AlignmentRules alignmentRules, TempFolder temp) { var interest = new Mutagen.Bethesda.RecordInterest(alignmentRules.Alignments.Keys) { EmptyMeansInterested = false }; // Always interested in parent record types interest.InterestingTypes.Add("CELL"); interest.InterestingTypes.Add("WRLD"); var fileLocs = RecordLocator.GetFileLocations(inputPath, gameMode, interest); if (gameMode == GameRelease.Oblivion) { var alignedMajorRecordsFile = new ModPath(inputPath.ModKey, Path.Combine(temp.Dir.Path, "alignedRules")); using (var inputStream = new MutagenBinaryReadStream(inputPath, gameMode)) { using var writer = new MutagenWriter(new FileStream(alignedMajorRecordsFile, FileMode.Create), gameMode); AlignMajorRecordsByRules(inputStream, writer, alignmentRules, fileLocs); } var alignedGroupsFile = new ModPath(inputPath.ModKey, Path.Combine(temp.Dir.Path, "alignedGroups")); using (var inputStream = new MutagenBinaryReadStream(alignedMajorRecordsFile, gameMode)) { using var writer = new MutagenWriter(new FileStream(alignedGroupsFile, FileMode.Create), gameMode); AlignGroupsByRules(inputStream, writer, alignmentRules, fileLocs); } fileLocs = RecordLocator.GetFileLocations(alignedGroupsFile, gameMode, interest); var alignedCellsFile = new ModPath(inputPath.ModKey, Path.Combine(temp.Dir.Path, "alignedCells")); using (var mutaReader = new BinaryReadStream(alignedGroupsFile)) { using var writer = new MutagenWriter(alignedCellsFile, gameMode); foreach (var grup in fileLocs.GrupLocations) { if (grup <= mutaReader.Position) { continue; } var noRecordLength = grup - mutaReader.Position; mutaReader.WriteTo(writer.BaseStream, (int)noRecordLength); // If complete overall, return if (mutaReader.Complete) { break; } mutaReader.WriteTo(writer.BaseStream, 12); var grupType = mutaReader.ReadInt32(); writer.Write(grupType); if (writer.MetaData.Constants.GroupConstants.Cell.TopGroupType == grupType) { AlignCellChildren(mutaReader, writer); } } mutaReader.WriteTo(writer.BaseStream, checked ((int)mutaReader.Remaining)); } fileLocs = RecordLocator.GetFileLocations(alignedCellsFile, gameMode, interest); using (var mutaReader = new MutagenBinaryReadStream(alignedCellsFile, gameMode)) { using var writer = new MutagenWriter(outputPath.Path, gameMode); foreach (var grup in fileLocs.GrupLocations) { if (grup <= mutaReader.Position) { continue; } var noRecordLength = grup - mutaReader.Position; mutaReader.WriteTo(writer.BaseStream, (int)noRecordLength); // If complete overall, return if (mutaReader.Complete) { break; } mutaReader.WriteTo(writer.BaseStream, 12); var grupType = mutaReader.ReadInt32(); writer.Write(grupType); if (writer.MetaData.Constants.GroupConstants.World.TopGroupType == grupType) { AlignWorldChildren(mutaReader, writer); } } mutaReader.WriteTo(writer.BaseStream, checked ((int)mutaReader.Remaining)); } } else { var alignedMajorRecordsFile = new ModPath(inputPath.ModKey, Path.Combine(temp.Dir.Path, "alignedRules")); using (var inputStream = new MutagenBinaryReadStream(inputPath, gameMode)) { using var writer = new MutagenWriter(alignedMajorRecordsFile, gameMode); AlignMajorRecordsByRules(inputStream, writer, alignmentRules, fileLocs); } var alignedGroupsFile = Path.Combine(temp.Dir.Path, "alignedGroups"); using (var inputStream = new MutagenBinaryReadStream(alignedMajorRecordsFile, gameMode)) { using var writer = new MutagenWriter(new FileStream(outputPath.Path, FileMode.Create), gameMode); AlignGroupsByRules(inputStream, writer, alignmentRules, fileLocs); } } }
static partial void WriteBinaryConditionsCustom(MutagenWriter writer, ISceneGetter item) { ConditionBinaryWriteTranslation.WriteConditionsList(item.Conditions, writer); }
private static void AlignMajorRecordsByRules( IMutagenReadStream inputStream, MutagenWriter writer, AlignmentRules alignmentRules, RecordLocator.FileLocations fileLocs) { while (!inputStream.Complete) { // Import until next listed major record long noRecordLength; if (fileLocs.ListedRecords.TryGetInDirection( inputStream.Position, higher: true, result: out var nextRec)) { var recordLocation = fileLocs.ListedRecords.Keys[nextRec.Key]; noRecordLength = recordLocation - inputStream.Position; } else { noRecordLength = inputStream.Remaining; } inputStream.WriteTo(writer.BaseStream, (int)noRecordLength); // If complete overall, return if (inputStream.Complete) { break; } var recType = HeaderTranslation.ReadNextRecordType( inputStream, out var len); if (!alignmentRules.StopMarkers.TryGetValue(recType, out var stopMarkers)) { stopMarkers = null; } writer.Write(recType.TypeInt); writer.Write(len); if (!alignmentRules.Alignments.TryGetValue(recType, out var alignments)) { inputStream.WriteTo(writer.BaseStream, inputStream.MetaData.Constants.MajorConstants.LengthAfterLength + len); continue; } inputStream.WriteTo(writer.BaseStream, inputStream.MetaData.Constants.MajorConstants.LengthAfterLength); var writerEndPos = writer.Position + len; var endPos = inputStream.Position + len; var dataDict = new Dictionary <RecordType, ReadOnlyMemorySlice <byte> >(); ReadOnlyMemorySlice <byte>?rest = null; while (inputStream.Position < endPos) { var subType = HeaderTranslation.GetNextSubrecordType( inputStream, out var _); if (stopMarkers?.Contains(subType) ?? false) { rest = inputStream.ReadMemory((int)(endPos - inputStream.Position), readSafe: true); break; } if (!alignments.TryGetValue(subType, out var rule)) { throw new ArgumentException($"Encountered an unknown record: {subType}"); } dataDict.Add(subType, rule.GetBytes(inputStream)); } foreach (var alignment in alignmentRules.Alignments[recType]) { if (dataDict.TryGetValue( alignment.Key, out var data)) { writer.Write(data); dataDict.Remove(alignment.Key); } } if (dataDict.Count > 0) { throw new ArgumentException($"Encountered an unknown record: {dataDict.First().Key}"); } if (rest != null) { writer.Write(rest.Value); } if (writer.Position != writerEndPos) { throw new ArgumentException("Record alignment changed length"); } } }
public static partial void WriteBinaryTopicsCustom(MutagenWriter writer, IPatrolGetter item) { ATopicReferenceBinaryWriteTranslation.Write(writer, item.Topics); }
static partial void CustomBinaryEndExport(MutagenWriter writer, ICellGetter obj) { var pathGrid = obj.PathGrid; var landscape = obj.Landscape; if ((obj.Persistent?.Count ?? 0) == 0 && (obj.Temporary?.Count ?? 0) == 0 && (obj.VisibleWhenDistant?.Count ?? 0) == 0 && pathGrid == null && landscape == null) { return; } using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.CellChildren); writer.Write(obj.Timestamp); if (obj.Persistent?.Count > 0) { using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.CellPersistentChildren); writer.Write(obj.PersistentTimestamp); Mutagen.Bethesda.Binary.ListBinaryTranslation <IPlacedGetter> .Instance.Write( writer : writer, items : obj.Persistent, transl : (r, item) => { item.WriteToBinary(r); }); } } if (obj.Temporary?.Count > 0 || pathGrid != null || landscape != null) { using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.CellTemporaryChildren); writer.Write(obj.TemporaryTimestamp); landscape?.WriteToBinary(writer); pathGrid?.WriteToBinary(writer); if (obj.Temporary != null) { Mutagen.Bethesda.Binary.ListBinaryTranslation <IPlacedGetter> .Instance.Write( writer : writer, items : obj.Temporary, transl : (r, item) => { item.WriteToBinary(r); }); } } } if (obj.VisibleWhenDistant?.Count > 0) { using (HeaderExport.Header(writer, RecordTypes.GRUP, ObjectType.Group)) { FormKeyBinaryTranslation.Instance.Write( writer, obj.FormKey); writer.Write((int)GroupTypeEnum.CellVisibleDistantChildren); writer.Write(obj.VisibleWhenDistantTimestamp); Mutagen.Bethesda.Binary.ListBinaryTranslation <IPlacedGetter> .Instance.Write( writer : writer, items : obj.VisibleWhenDistant, transl : (r, item) => { item.WriteToBinary(r); }); } } } }