From 32d9e8a09dce498ac5a476dac9edf9fe11befb79 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 23 Jul 2026 16:45:12 -0400 Subject: [PATCH] Add dir RomVault header extension field --- SabreTools.Data.Models/Logiqx/RomVault.cs | 5 +++++ SabreTools.Data.Models/Metadata/Header.cs | 8 ++++++++ .../DatFileTests.FromMetadata.cs | 2 ++ .../DatFileTests.ToMetadata.cs | 1 + SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs | 2 ++ SabreTools.Metadata.DatFiles/DatHeader.cs | 6 ++++++ SabreTools.Metadata.Filter.Test/FilterObjectTests.cs | 2 ++ SabreTools.Metadata.Filter/Constants.cs | 2 ++ SabreTools.Metadata.Filter/FilterObject.cs | 4 ++++ SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs | 2 ++ .../Logiqx.Deserializer.cs | 2 ++ SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs | 9 +++++++++ SabreTools.Serialization.Readers.Test/LogiqxTests.cs | 2 ++ SabreTools.Serialization.Readers/Logiqx.cs | 1 + SabreTools.Serialization.Writers/Logiqx.cs | 1 + 15 files changed, 49 insertions(+) diff --git a/SabreTools.Data.Models/Logiqx/RomVault.cs b/SabreTools.Data.Models/Logiqx/RomVault.cs index 3bccee00..eaed2193 100644 --- a/SabreTools.Data.Models/Logiqx/RomVault.cs +++ b/SabreTools.Data.Models/Logiqx/RomVault.cs @@ -21,5 +21,10 @@ namespace SabreTools.Data.Models.Logiqx /// (zip|unzip) "zip" [XmlAttribute("forcepacking")] public PackingFlag ForcePacking { get; set; } + + /// (noautodir|nogame) + /// TODO: Turn this into an enum like the other flags + [XmlAttribute("dir")] + public string? Dir { get; set; } } } diff --git a/SabreTools.Data.Models/Metadata/Header.cs b/SabreTools.Data.Models/Metadata/Header.cs index e81449a5..a0fa40cb 100644 --- a/SabreTools.Data.Models/Metadata/Header.cs +++ b/SabreTools.Data.Models/Metadata/Header.cs @@ -33,6 +33,8 @@ namespace SabreTools.Data.Models.Metadata public string? Description { get; set; } + public string? DirHandling { get; set; } + public string? Email { get; set; } public string? EmulatorVersion { get; set; } @@ -137,6 +139,7 @@ namespace SabreTools.Data.Models.Metadata obj.DatVersion = DatVersion; obj.Debug = Debug; obj.Description = Description; + obj.DirHandling = DirHandling; obj.Email = Email; obj.EmulatorVersion = EmulatorVersion; obj.FileName = FileName; @@ -227,6 +230,11 @@ namespace SabreTools.Data.Models.Metadata else if (Description is not null && !Description.Equals(other.Description, StringComparison.OrdinalIgnoreCase)) return false; + if ((DirHandling is null) ^ (other.DirHandling is null)) + return false; + else if (DirHandling is not null && !DirHandling.Equals(other.DirHandling, StringComparison.OrdinalIgnoreCase)) + return false; + if ((Email is null) ^ (other.Email is null)) return false; else if (Email is not null && !Email.Equals(other.Email, StringComparison.OrdinalIgnoreCase)) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index dab4a214..7e804bec 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -212,6 +212,7 @@ namespace SabreTools.Metadata.DatFiles.Test DatVersion = "datversion", Debug = true, Description = "description", + DirHandling = "noautodir", Email = "email", EmulatorVersion = "emulatorversion", FileName = "filename", @@ -1006,6 +1007,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("datversion", datHeader.DatVersion); Assert.True(datHeader.Debug); Assert.Equal("description", datHeader.Description); + Assert.Equal("noautodir", datHeader.DirHandling); Assert.Equal("email", datHeader.Email); Assert.Equal("emulatorversion", datHeader.EmulatorVersion); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, datHeader.ForceMerging); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 06bad6ae..3a06bfa0 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -344,6 +344,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("datversion", header.DatVersion); Assert.True(header.Debug); Assert.Equal("description", header.Description); + Assert.Equal("noautodir", header.DirHandling); Assert.Equal("email", header.Email); Assert.Equal("emulatorversion", header.EmulatorVersion); Assert.Equal("filename", header.FileName); diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs index 33e7fbbc..1e4460af 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs @@ -104,6 +104,8 @@ namespace SabreTools.Metadata.DatFiles Header.Debug = header.Debug; if (Header.Description is null) Header.Description = header.Description; + if (Header.DirHandling is null) + Header.DirHandling = header.DirHandling; if (Header.Email is null) Header.Email = header.Email; if (Header.EmulatorVersion is null) diff --git a/SabreTools.Metadata.DatFiles/DatHeader.cs b/SabreTools.Metadata.DatFiles/DatHeader.cs index 3365e02d..370b8ea5 100644 --- a/SabreTools.Metadata.DatFiles/DatHeader.cs +++ b/SabreTools.Metadata.DatFiles/DatHeader.cs @@ -84,6 +84,12 @@ namespace SabreTools.Metadata.DatFiles set => _internal.Description = value; } + public string? DirHandling + { + get => _internal.DirHandling; + set => _internal.DirHandling = value; + } + public string? Email { get => _internal.Email; diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs index 40c2b8ce..77232eed 100644 --- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs +++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs @@ -1103,6 +1103,7 @@ namespace SabreTools.Metadata.Filter.Test [InlineData("header.datversion", "datversion")] [InlineData("header.debug", "yes")] [InlineData("header.description", "description")] + [InlineData("header.dir", "noautodir")] [InlineData("header.email", "email")] [InlineData("header.emulatorversion", "emulatorversion")] [InlineData("header.filename", "filename")] @@ -1151,6 +1152,7 @@ namespace SabreTools.Metadata.Filter.Test DatVersion = "datversion", Debug = true, Description = "description", + DirHandling = "noautodir", Email = "email", EmulatorVersion = "emulatorversion", FileName = "filename", diff --git a/SabreTools.Metadata.Filter/Constants.cs b/SabreTools.Metadata.Filter/Constants.cs index db1e0dac..2fa86141 100644 --- a/SabreTools.Metadata.Filter/Constants.cs +++ b/SabreTools.Metadata.Filter/Constants.cs @@ -309,6 +309,8 @@ namespace SabreTools.Metadata.Filter "datversion", "debug", "description", + "dir", + "dirhandling", "email", "emulatorversion", "filename", diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 3a7ec777..9af59792 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -1280,6 +1280,10 @@ namespace SabreTools.Metadata.Filter case "description": checkValue = obj.Description; return true; + case "dir": + case "dirhandling": + checkValue = obj.DirHandling; + return true; case "email": checkValue = obj.Email; return true; diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs index 4ef1b633..b1cfa22b 100644 --- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs @@ -79,6 +79,7 @@ namespace SabreTools.Serialization.CrossModel.Test ForceMerging = Data.Models.Metadata.MergingFlag.Merged, ForceNodump = Data.Models.Metadata.NodumpFlag.Required, ForcePacking = Data.Models.Metadata.PackingFlag.Zip, + Dir = "noautodir", }; var clrmamepro = new Data.Models.Logiqx.ClrMamePro @@ -332,6 +333,7 @@ namespace SabreTools.Serialization.CrossModel.Test Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, rv.ForceMerging); Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, rv.ForceNodump); Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, rv.ForcePacking); + Assert.Equal("noautodir", rv.Dir); } /// diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index 971d1b79..abb2f448 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -71,6 +71,8 @@ namespace SabreTools.Serialization.CrossModel header.RomVault.ForceNodump = item.ForceNodump; if (item.ForcePacking is not Data.Models.Metadata.PackingFlag.None) header.RomVault.ForcePacking = item.ForcePacking; + if (item.DirHandling is not null) + header.RomVault.Dir = item.DirHandling; header.ClrMamePro = new Data.Models.Logiqx.ClrMamePro(); if (item.HeaderSkipper is not null) diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 47109752..637e9170 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -69,6 +69,15 @@ namespace SabreTools.Serialization.CrossModel Subset = item.Subset, }; + if (item.RomVault is not null) + { + header.HeaderSkipper = item.RomVault.Header; + header.ForceMerging = item.RomVault.ForceMerging; + header.ForceNodump = item.RomVault.ForceNodump; + header.ForcePacking = item.RomVault.ForcePacking; + header.DirHandling = item.RomVault.Dir; + } + if (item.ClrMamePro is not null) { header.HeaderSkipper = item.ClrMamePro.Header; diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs index 801902b8..b2796051 100644 --- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs @@ -144,6 +144,7 @@ namespace SabreTools.Serialization.Readers.Test ForceMerging = Data.Models.Metadata.MergingFlag.Merged, ForceNodump = Data.Models.Metadata.NodumpFlag.Required, ForcePacking = Data.Models.Metadata.PackingFlag.Zip, + Dir = "noautodir", }; var clrmamepro = new Data.Models.Logiqx.ClrMamePro @@ -385,6 +386,7 @@ namespace SabreTools.Serialization.Readers.Test Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, rv.ForceMerging); Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, rv.ForceNodump); Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, rv.ForcePacking); + Assert.Equal("noautodir", rv.Dir); } /// diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs index 90cef509..c8ae19ed 100644 --- a/SabreTools.Serialization.Readers/Logiqx.cs +++ b/SabreTools.Serialization.Readers/Logiqx.cs @@ -341,6 +341,7 @@ namespace SabreTools.Serialization.Readers obj.ForceMerging = reader.GetAttribute("forcemerging").AsMergingFlag(); obj.ForceNodump = reader.GetAttribute("forcenodump").AsNodumpFlag(); obj.ForcePacking = reader.GetAttribute("forcepacking").AsPackingFlag(); + obj.Dir = reader.GetAttribute("dir"); return obj; } diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs index 05960e04..f1f4ebe7 100644 --- a/SabreTools.Serialization.Writers/Logiqx.cs +++ b/SabreTools.Serialization.Writers/Logiqx.cs @@ -212,6 +212,7 @@ namespace SabreTools.Serialization.Writers writer.WriteOptionalAttributeString("forcenodump", obj.ForceNodump.AsStringValue()); if (obj.ForcePacking != Data.Models.Metadata.PackingFlag.None) writer.WriteOptionalAttributeString("forcepacking", obj.ForcePacking.AsStringValue()); + writer.WriteOptionalAttributeString("dir", obj.Dir); writer.WriteEndElement(); }