From bcc0a5bd1e691fd8c060367a9e212f23a8de72eb Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 23 Jul 2026 17:03:14 -0400 Subject: [PATCH] Add set type RomVault game extension field --- SabreTools.Data.Models/Logiqx/GameBase.cs | 5 +++++ SabreTools.Data.Models/Metadata/Machine.cs | 9 +++++++++ .../DatFileTests.FromMetadata.cs | 3 +++ .../DatFileTests.ToMetadata.cs | 1 + SabreTools.Metadata.DatItems/Machine.cs | 6 ++++++ SabreTools.Metadata.Filter.Test/FilterObjectTests.cs | 3 +++ SabreTools.Metadata.Filter/Constants.cs | 2 ++ SabreTools.Metadata.Filter/FilterObject.cs | 3 +++ SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs | 2 ++ .../Logiqx.Deserializer.cs | 1 + SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs | 1 + SabreTools.Serialization.Readers.Test/LogiqxTests.cs | 2 ++ SabreTools.Serialization.Readers/Logiqx.cs | 1 + SabreTools.Serialization.Writers/Logiqx.cs | 1 + 14 files changed, 40 insertions(+) diff --git a/SabreTools.Data.Models/Logiqx/GameBase.cs b/SabreTools.Data.Models/Logiqx/GameBase.cs index 2e97a215..89f27584 100644 --- a/SabreTools.Data.Models/Logiqx/GameBase.cs +++ b/SabreTools.Data.Models/Logiqx/GameBase.cs @@ -55,6 +55,11 @@ namespace SabreTools.Data.Models.Logiqx [XmlAttribute("runnable")] public Runnable? Runnable { get; set; } + /// (dir|zip|7z), RomVault extension + /// TODO: Turn this into an enum like the other flags + [XmlAttribute("type")] + public string? SetType { get; set; } + [XmlElement("comment")] public string[]? Comment { get; set; } diff --git a/SabreTools.Data.Models/Metadata/Machine.cs b/SabreTools.Data.Models/Metadata/Machine.cs index 046242c0..d2422b0a 100644 --- a/SabreTools.Data.Models/Metadata/Machine.cs +++ b/SabreTools.Data.Models/Metadata/Machine.cs @@ -159,6 +159,9 @@ namespace SabreTools.Data.Models.Metadata public string? Serial { get; set; } + /// (dir|zip|7z), RomVault extension + public string? SetType { get; set; } + public SharedFeat[]? SharedFeat { get; set; } public Slot[]? Slot { get; set; } @@ -298,6 +301,7 @@ namespace SabreTools.Data.Models.Metadata obj.SaveType = SaveType; obj.Score = Score; obj.Serial = Serial; + obj.SetType = SetType; if (SharedFeat is not null) obj.SharedFeat = Array.ConvertAll(SharedFeat, i => (SharedFeat)i.Clone()); if (Slot is not null) @@ -569,6 +573,11 @@ namespace SabreTools.Data.Models.Metadata else if (Serial is not null && !Serial.Equals(other.Serial, StringComparison.OrdinalIgnoreCase)) return false; + if ((SetType is null) ^ (other.SetType is null)) + return false; + else if (SetType is not null && !SetType.Equals(other.SetType, StringComparison.OrdinalIgnoreCase)) + return false; + if ((Source is null) ^ (other.Source is null)) return false; else if (Source is not null && !Source.Equals(other.Source, StringComparison.OrdinalIgnoreCase)) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 7e804bec..f31ab053 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -329,6 +329,7 @@ namespace SabreTools.Metadata.DatFiles.Test SaveType = "savetype", Score = "score", Serial = "serial", + SetType = "dir", SharedFeat = [CreateMetadataSharedFeat()], Slot = [CreateMetadataSlot()], SoftwareList = [CreateMetadataSoftwareList()], @@ -1095,6 +1096,8 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("sampleof", machine.SampleOf); Assert.Equal("savetype", machine.SaveType); Assert.Equal("score", machine.Score); + Assert.Equal("serial", machine.Serial); + Assert.Equal("dir", machine.SetType); Assert.Equal("source", machine.Source); Assert.Equal("sourcefile", machine.SourceFile); Assert.Equal("sourcerom", machine.SourceRom); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 3a06bfa0..8a99997e 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -438,6 +438,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("savetype", machine.SaveType); Assert.Equal("score", machine.Score); Assert.Equal("serial", machine.Serial); + Assert.Equal("dir", machine.SetType); Assert.Equal("source", machine.Source); Assert.Equal("sourcefile", machine.SourceFile); Assert.Equal("sourcerom", machine.SourceRom); diff --git a/SabreTools.Metadata.DatItems/Machine.cs b/SabreTools.Metadata.DatItems/Machine.cs index 194eb993..921fad18 100644 --- a/SabreTools.Metadata.DatItems/Machine.cs +++ b/SabreTools.Metadata.DatItems/Machine.cs @@ -320,6 +320,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Serial = value; } + public string? SetType + { + get => _internal.SetType; + set => _internal.SetType = value; + } + public string? Source { get => _internal.Source; diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs index 77232eed..f98b108d 100644 --- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs +++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs @@ -1294,6 +1294,8 @@ namespace SabreTools.Metadata.Filter.Test [InlineData("machine.sampleof", "sampleof")] [InlineData("machine.savetype", "savetype")] [InlineData("machine.score", "score")] + [InlineData("machine.serial", "serial")] + [InlineData("machine.settype", "dir")] [InlineData("machine.source", "source")] [InlineData("machine.sourcefile", "sourcefile")] [InlineData("machine.sourcerom", "sourcerom")] @@ -1364,6 +1366,7 @@ namespace SabreTools.Metadata.Filter.Test SaveType = "savetype", Score = "score", Serial = "serial", + SetType = "dir", Source = "source", SourceFile = "sourcefile", SourceRom = "sourcerom", diff --git a/SabreTools.Metadata.Filter/Constants.cs b/SabreTools.Metadata.Filter/Constants.cs index 2fa86141..7a864d15 100644 --- a/SabreTools.Metadata.Filter/Constants.cs +++ b/SabreTools.Metadata.Filter/Constants.cs @@ -424,6 +424,8 @@ namespace SabreTools.Metadata.Filter "sampleof", "savetype", "score", + "serial", + "settype", "source", "sourcefile", "sourcerom", diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 9af59792..5571030f 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -1610,6 +1610,9 @@ namespace SabreTools.Metadata.Filter case "serial": checkValue = obj.Serial; return true; + case "settype": + checkValue = obj.SetType; + return true; case "source": checkValue = obj.Source; return true; diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs index b1cfa22b..059b7113 100644 --- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs @@ -255,6 +255,7 @@ namespace SabreTools.Serialization.CrossModel.Test gameBase.Id = "id"; gameBase.CloneOfId = "cloneofid"; gameBase.Runnable = Data.Models.Metadata.Runnable.Yes; + gameBase.SetType = "dir"; gameBase.Comment = ["comment"]; gameBase.Description = "description"; gameBase.Year = "year"; @@ -385,6 +386,7 @@ namespace SabreTools.Serialization.CrossModel.Test Assert.Equal("id", gb.Id); Assert.Equal("cloneofid", gb.CloneOfId); Assert.Equal(Data.Models.Metadata.Runnable.Yes, gb.Runnable); + Assert.Equal("dir", gb.SetType); Assert.NotNull(gb.Comment); string comment = Assert.Single(gb.Comment); diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index abb2f448..4fbe43c6 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -133,6 +133,7 @@ namespace SabreTools.Serialization.CrossModel gameBase.Id = item.Id; gameBase.CloneOfId = item.CloneOfId; gameBase.Runnable = item.Runnable; + gameBase.SetType = item.SetType; gameBase.Comment = item.Comment; gameBase.Description = item.Description; gameBase.Year = item.Year; diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 637e9170..1dfe7cf9 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -163,6 +163,7 @@ namespace SabreTools.Serialization.CrossModel Runnable = item.Runnable, SampleOf = item.SampleOf, Score = item.Trurip?.Score, + SetType = item.SetType, Source = item.Trurip?.Source, SourceFile = item.SourceFile, Subgenre = item.Trurip?.Subgenre, diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs index b2796051..d023fdb9 100644 --- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs @@ -320,6 +320,7 @@ namespace SabreTools.Serialization.Readers.Test gameBase.Id = "id"; gameBase.CloneOfId = "cloneofid"; gameBase.Runnable = Data.Models.Metadata.Runnable.Yes; + gameBase.SetType = "dir"; gameBase.Comment = ["comment"]; gameBase.Description = "description"; gameBase.Year = "year"; @@ -435,6 +436,7 @@ namespace SabreTools.Serialization.Readers.Test Assert.Equal("id", gb.Id); Assert.Equal("cloneofid", gb.CloneOfId); Assert.Equal(Data.Models.Metadata.Runnable.Yes, gb.Runnable); + Assert.Equal("dir", gb.SetType); Assert.NotNull(gb.Comment); string comment = Assert.Single(gb.Comment); diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs index c8ae19ed..3aee7b82 100644 --- a/SabreTools.Serialization.Readers/Logiqx.cs +++ b/SabreTools.Serialization.Readers/Logiqx.cs @@ -524,6 +524,7 @@ namespace SabreTools.Serialization.Readers obj.Id = reader.GetAttribute("id"); obj.CloneOfId = reader.GetAttribute("cloneofid"); obj.Runnable = reader.GetAttribute("runnable").AsRunnable(); + obj.SetType = reader.GetAttribute("type"); // Handle empty elements if (reader.IsEmptyElement) diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs index f1f4ebe7..2cdca17d 100644 --- a/SabreTools.Serialization.Writers/Logiqx.cs +++ b/SabreTools.Serialization.Writers/Logiqx.cs @@ -362,6 +362,7 @@ namespace SabreTools.Serialization.Writers writer.WriteOptionalAttributeString("id", obj.Id); writer.WriteOptionalAttributeString("cloneofid", obj.CloneOfId); writer.WriteOptionalAttributeString("runnable", obj.Runnable?.AsStringValue()); + writer.WriteOptionalAttributeString("type", obj.SetType); if (obj.Comment is not null && obj.Comment.Length > 0) {