From 717de3608ceda5dd50f839feea54fd6f2fe0cccd Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 22 Jun 2026 16:35:03 -0400 Subject: [PATCH] Add Logiqx serial and version machine fields --- SabreTools.Data.Models/Logiqx/GameBase.cs | 6 ++++++ SabreTools.Data.Models/Metadata/Machine.cs | 16 ++++++++++++++++ .../DatFileTests.FromMetadata.cs | 2 ++ .../DatFileTests.ToMetadata.cs | 2 ++ SabreTools.Metadata.DatItems/Machine.cs | 12 ++++++++++++ .../FilterObjectTests.cs | 2 ++ SabreTools.Metadata.Filter/FilterObject.cs | 6 ++++++ .../LogiqxTests.cs | 4 ++++ .../Logiqx.Deserializer.cs | 2 ++ .../Logiqx.Serializer.cs | 2 ++ .../LogiqxTests.cs | 4 ++++ SabreTools.Serialization.Readers/Logiqx.cs | 12 ++++++++++++ SabreTools.Serialization.Writers/Logiqx.cs | 2 ++ 13 files changed, 72 insertions(+) diff --git a/SabreTools.Data.Models/Logiqx/GameBase.cs b/SabreTools.Data.Models/Logiqx/GameBase.cs index 49fb6d26..2e97a215 100644 --- a/SabreTools.Data.Models/Logiqx/GameBase.cs +++ b/SabreTools.Data.Models/Logiqx/GameBase.cs @@ -71,6 +71,12 @@ namespace SabreTools.Data.Models.Logiqx [XmlElement("publisher")] public string? Publisher { get; set; } + [XmlElement("serial")] + public string? Serial { get; set; } + + [XmlElement("version")] + public string? Version { get; set; } + /// No-Intro extension includes more than 1 instance [XmlElement("category")] public string[]? Category { get; set; } diff --git a/SabreTools.Data.Models/Metadata/Machine.cs b/SabreTools.Data.Models/Metadata/Machine.cs index 7ca9bde4..046242c0 100644 --- a/SabreTools.Data.Models/Metadata/Machine.cs +++ b/SabreTools.Data.Models/Metadata/Machine.cs @@ -157,6 +157,8 @@ namespace SabreTools.Data.Models.Metadata public string? Score { get; set; } + public string? Serial { get; set; } + public SharedFeat[]? SharedFeat { get; set; } public Slot[]? Slot { get; set; } @@ -186,6 +188,8 @@ namespace SabreTools.Data.Models.Metadata public string? Url { get; set; } + public string? Version { get; set; } + public Video[]? Video { get; set; } public string? Year { get; set; } @@ -293,6 +297,7 @@ namespace SabreTools.Data.Models.Metadata obj.SampleOf = SampleOf; obj.SaveType = SaveType; obj.Score = Score; + obj.Serial = Serial; if (SharedFeat is not null) obj.SharedFeat = Array.ConvertAll(SharedFeat, i => (SharedFeat)i.Clone()); if (Slot is not null) @@ -311,6 +316,7 @@ namespace SabreTools.Data.Models.Metadata obj.Tags = Tags; obj.TitleID = TitleID; obj.Url = Url; + obj.Version = Version; if (Video is not null) obj.Video = Array.ConvertAll(Video, i => (Video)i.Clone()); obj.Year = Year; @@ -558,6 +564,11 @@ namespace SabreTools.Data.Models.Metadata else if (Score is not null && !Score.Equals(other.Score, StringComparison.OrdinalIgnoreCase)) return false; + if ((Serial is null) ^ (other.Serial is null)) + return false; + else if (Serial is not null && !Serial.Equals(other.Serial, 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)) @@ -606,6 +617,11 @@ namespace SabreTools.Data.Models.Metadata else if (Url is not null && !Url.Equals(other.Url, StringComparison.OrdinalIgnoreCase)) return false; + if ((Version is null) ^ (other.Version is null)) + return false; + else if (Version is not null && !Version.Equals(other.Version, StringComparison.OrdinalIgnoreCase)) + return false; + if ((Year is null) ^ (other.Year is null)) return false; else if (Year is not null && !Year.Equals(other.Year, StringComparison.OrdinalIgnoreCase)) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index f120f2b4..c31826e7 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -326,6 +326,7 @@ namespace SabreTools.Metadata.DatFiles.Test SampleOf = "sampleof", SaveType = "savetype", Score = "score", + Serial = "serial", SharedFeat = [CreateMetadataSharedFeat()], Slot = [CreateMetadataSlot()], SoftwareList = [CreateMetadataSoftwareList()], @@ -340,6 +341,7 @@ namespace SabreTools.Metadata.DatFiles.Test Tags = "tags", TitleID = "titleid", Url = "url", + Version = "version", Video = [CreateMetadataVideo()], Year = "year", }; diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index c5efd5ff..6e9385af 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -435,6 +435,7 @@ 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("source", machine.Source); Assert.Equal("sourcefile", machine.SourceFile); Assert.Equal("sourcerom", machine.SourceRom); @@ -444,6 +445,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("system", machine.System); Assert.Equal("tags", machine.Tags); Assert.Equal("titleid", machine.TitleID); + Assert.Equal("version", machine.Version); Assert.Equal("year", machine.Year); Data.Models.Metadata.Adjuster[]? adjusters = machine.Adjuster; diff --git a/SabreTools.Metadata.DatItems/Machine.cs b/SabreTools.Metadata.DatItems/Machine.cs index ba2b77cb..194eb993 100644 --- a/SabreTools.Metadata.DatItems/Machine.cs +++ b/SabreTools.Metadata.DatItems/Machine.cs @@ -314,6 +314,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Score = value; } + public string? Serial + { + get => _internal.Serial; + set => _internal.Serial = value; + } + public string? Source { get => _internal.Source; @@ -374,6 +380,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Url = value; } + public string? Version + { + get => _internal.Version; + set => _internal.Version = value; + } + public string? Year { get => _internal.Year; diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs index 280d26d9..20b07857 100644 --- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs +++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs @@ -1359,6 +1359,7 @@ namespace SabreTools.Metadata.Filter.Test SampleOf = "sampleof", SaveType = "savetype", Score = "score", + Serial = "serial", Source = "source", SourceFile = "sourcefile", SourceRom = "sourcerom", @@ -1369,6 +1370,7 @@ namespace SabreTools.Metadata.Filter.Test Tags = "tags", TitleID = "titleid", Url = "url", + Version = "version", Year = "year", }; diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index a62106f4..a06d2688 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -1600,6 +1600,9 @@ namespace SabreTools.Metadata.Filter case "score": checkValue = obj.Score; return true; + case "serial": + checkValue = obj.Serial; + return true; case "source": checkValue = obj.Source; return true; @@ -1630,6 +1633,9 @@ namespace SabreTools.Metadata.Filter case "url": checkValue = obj.Url; return true; + case "version": + checkValue = obj.Version; + return true; case "year": checkValue = obj.Year; return true; diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs index 47c246ea..1418e8b8 100644 --- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs @@ -257,6 +257,8 @@ namespace SabreTools.Serialization.CrossModel.Test gameBase.Year = "year"; gameBase.Manufacturer = "manufacturer"; gameBase.Publisher = "publisher"; + gameBase.Serial = "serial"; + gameBase.Version = "version"; gameBase.Category = ["category"]; gameBase.Trurip = trurip; gameBase.Release = [release]; @@ -387,6 +389,8 @@ namespace SabreTools.Serialization.CrossModel.Test Assert.Equal("year", gb.Year); Assert.Equal("manufacturer", gb.Manufacturer); Assert.Equal("publisher", gb.Publisher); + Assert.Equal("serial", gb.Serial); + Assert.Equal("version", gb.Version); Assert.NotNull(gb.Category); string category = Assert.Single(gb.Category); diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index 823efbb8..bbc3d7a0 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -135,6 +135,8 @@ namespace SabreTools.Serialization.CrossModel gameBase.Year = item.Year; gameBase.Manufacturer = item.Manufacturer; gameBase.Publisher = item.Publisher; + gameBase.Serial = item.Serial; + gameBase.Version = item.Version; gameBase.Category = item.Category; if (item.TitleID is not null diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 918902bf..669aab66 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -144,6 +144,8 @@ namespace SabreTools.Serialization.CrossModel Name = machineName, Players = item.Trurip?.Players, Publisher = item.Publisher ?? item.Trurip?.Publisher, + Serial = item.Serial, + Version = item.Version, Ratings = item.Trurip?.Ratings, RebuildTo = item.RebuildTo, RelatedTo = item.Trurip?.RelatedTo, diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs index 5772b757..d26b439f 100644 --- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs @@ -322,6 +322,8 @@ namespace SabreTools.Serialization.Readers.Test gameBase.Year = "year"; gameBase.Manufacturer = "manufacturer"; gameBase.Publisher = "publisher"; + gameBase.Serial = "serial"; + gameBase.Version = "version"; gameBase.Category = ["category"]; gameBase.Trurip = trurip; gameBase.Release = [release]; @@ -437,6 +439,8 @@ namespace SabreTools.Serialization.Readers.Test Assert.Equal("year", gb.Year); Assert.Equal("manufacturer", gb.Manufacturer); Assert.Equal("publisher", gb.Publisher); + Assert.Equal("serial", gb.Serial); + Assert.Equal("version", gb.Version); Assert.NotNull(gb.Category); string category = Assert.Single(gb.Category); diff --git a/SabreTools.Serialization.Readers/Logiqx.cs b/SabreTools.Serialization.Readers/Logiqx.cs index 7424d872..8c50d42e 100644 --- a/SabreTools.Serialization.Readers/Logiqx.cs +++ b/SabreTools.Serialization.Readers/Logiqx.cs @@ -587,6 +587,18 @@ namespace SabreTools.Serialization.Readers obj.Publisher = reader.ReadElementContentAsString(); break; + case "serial": + if (obj.Serial is not null && Debug) + Console.WriteLine($"'{reader.Name}' element already found, overwriting"); + + obj.Serial = reader.ReadElementContentAsString(); + break; + case "version": + if (obj.Version is not null && Debug) + Console.WriteLine($"'{reader.Name}' element already found, overwriting"); + + obj.Version = reader.ReadElementContentAsString(); + break; case "category": var category = reader.ReadElementContentAsString(); if (category is not null) diff --git a/SabreTools.Serialization.Writers/Logiqx.cs b/SabreTools.Serialization.Writers/Logiqx.cs index 9ce88276..db0dfdf1 100644 --- a/SabreTools.Serialization.Writers/Logiqx.cs +++ b/SabreTools.Serialization.Writers/Logiqx.cs @@ -373,6 +373,8 @@ namespace SabreTools.Serialization.Writers writer.WriteOptionalElementString("year", obj.Year); writer.WriteOptionalElementString("manufacturer", obj.Manufacturer); writer.WriteOptionalElementString("publisher", obj.Publisher); + writer.WriteOptionalElementString("serial", obj.Serial); + writer.WriteOptionalElementString("version", obj.Version); if (obj.Category is not null && obj.Category.Length > 0) {