From d08427f1ba4b664716112cc4ebfb8600c8a9ce02 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 4 Apr 2026 15:17:58 -0400 Subject: [PATCH] Trurip finally gets integrated, more at 11 --- .../MetadataExtensions.cs | 10 ++ SabreTools.Data.Models/Metadata/Machine.cs | 38 ++++- .../DatFileTests.FromMetadata.cs | 65 +++----- .../DatFileTests.ToMetadata.cs | 54 ++----- .../DatFile.ToMetadata.cs | 32 ---- SabreTools.Metadata.DatItems/Machine.cs | 66 +++++++- SabreTools.Metadata.DatItems/Trurip.cs | 146 ------------------ SabreTools.Metadata.Filter/FilterObject.cs | 30 ++++ .../DictionaryBaseExtensions.cs | 20 +++ .../Logiqx.Deserializer.cs | 115 ++++++++------ .../Logiqx.Serializer.cs | 42 +++-- 11 files changed, 279 insertions(+), 339 deletions(-) delete mode 100644 SabreTools.Metadata.DatItems/Trurip.cs diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index a509a6e9..c94edef1 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -159,15 +159,19 @@ namespace SabreTools.Data.Extensions cloneMachine.Company = selfMachine.Company; cloneMachine.Control = selfMachine.Control; cloneMachine.Country = selfMachine.Country; + cloneMachine.CRC = selfMachine.CRC; cloneMachine.Description = selfMachine.Description; + cloneMachine.Developer = selfMachine.Developer; cloneMachine.DirName = selfMachine.DirName; cloneMachine.DisplayCount = selfMachine.DisplayCount; cloneMachine.DisplayType = selfMachine.DisplayType; cloneMachine.DuplicateID = selfMachine.DuplicateID; cloneMachine.Emulator = selfMachine.Emulator; + cloneMachine.Enabled = selfMachine.Enabled; cloneMachine.Extra = selfMachine.Extra; cloneMachine.Favorite = selfMachine.Favorite; cloneMachine.GenMSXID = selfMachine.GenMSXID; + cloneMachine.Genre = selfMachine.Genre; cloneMachine.Hash = selfMachine.Hash; cloneMachine.History = selfMachine.History; cloneMachine.Id = selfMachine.Id; @@ -186,19 +190,25 @@ namespace SabreTools.Data.Extensions cloneMachine.PlayedTime = selfMachine.PlayedTime; cloneMachine.Players = selfMachine.Players; cloneMachine.Publisher = selfMachine.Publisher; + cloneMachine.Ratings = selfMachine.Ratings; cloneMachine.RebuildTo = selfMachine.RebuildTo; + cloneMachine.RelatedTo = selfMachine.RelatedTo; cloneMachine.ReleaseNumber = selfMachine.ReleaseNumber; cloneMachine.RomOf = selfMachine.RomOf; cloneMachine.Rotation = selfMachine.Rotation; cloneMachine.Runnable = selfMachine.Runnable; cloneMachine.SampleOf = selfMachine.SampleOf; cloneMachine.SaveType = selfMachine.SaveType; + cloneMachine.Score = selfMachine.Score; + cloneMachine.Source = selfMachine.Source; cloneMachine.SourceFile = selfMachine.SourceFile; cloneMachine.SourceRom = selfMachine.SourceRom; cloneMachine.Status = selfMachine.Status; + cloneMachine.Subgenre = selfMachine.Subgenre; cloneMachine.Supported = selfMachine.Supported; cloneMachine.System = selfMachine.System; cloneMachine.Tags = selfMachine.Tags; + cloneMachine.TitleID = selfMachine.TitleID; cloneMachine.Url = selfMachine.Url; cloneMachine.Year = selfMachine.Year; } diff --git a/SabreTools.Data.Models/Metadata/Machine.cs b/SabreTools.Data.Models/Metadata/Machine.cs index 9fe850f1..1fddb4bd 100644 --- a/SabreTools.Data.Models/Metadata/Machine.cs +++ b/SabreTools.Data.Models/Metadata/Machine.cs @@ -1,4 +1,3 @@ - namespace SabreTools.Data.Models.Metadata { /// @@ -167,6 +166,38 @@ namespace SabreTools.Data.Models.Metadata #endregion + #region From Trurip + + // public string? CloneOf { get; set; } + + public string? CRC { get; set; } + + public string? Developer { get; set; } + + public string? Enabled { get; set; } + + public string? Genre { get; set; } + + // public string? Players { get; set; } + + // public string? Publisher { get; set; } + + public string? Ratings { get; set; } + + public string? RelatedTo { get; set; } + + public string? Score { get; set; } + + public string? Source { get; set; } + + public string? Subgenre { get; set; } + + public string? TitleID { get; set; } + + // public string? Year { get; set; } + + #endregion + #region Keys /// string, string[] @@ -175,11 +206,6 @@ namespace SabreTools.Data.Models.Metadata /// string, string[] public const string CommentKey = "comment"; - /// TODO: This needs an internal model OR mapping to fields - /// Trurip - [NoFilter] - public const string TruripKey = "trurip"; - #endregion } } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index 689bab84..a8d6e6fa 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -263,8 +263,10 @@ namespace SabreTools.Metadata.DatFiles.Test Company = "company", Configuration = [CreateMetadataConfiguration()], Control = "control", + CRC = "crc", Country = "country", Description = "description", + Developer = "developer", Device = [CreateMetadataDevice()], DeviceRef = [CreateMetadataDeviceRef()], DipSwitch = [CreateMetadataDipSwitch()], @@ -277,10 +279,12 @@ namespace SabreTools.Metadata.DatFiles.Test Dump = [CreateMetadataDump()], DuplicateID = "duplicateid", Emulator = "emulator", + Enabled = "enabled", Extra = "extra", Favorite = "favorite", Feature = [CreateMetadataFeature()], GenMSXID = "genmsxid", + Genre = "genre", History = "history", Id = "id", Im1CRC = HashType.CRC32.ZeroString, @@ -304,7 +308,9 @@ namespace SabreTools.Metadata.DatFiles.Test Port = [CreateMetadataPort()], Publisher = "publisher", RamOption = [CreateMetadataRamOption()], + Ratings = "ratings", RebuildTo = "rebuildto", + RelatedTo = "relatedto", Release = [CreateMetadataRelease()], ReleaseNumber = "releasenumber", Rom = [CreateMetadataRom()], @@ -314,17 +320,20 @@ namespace SabreTools.Metadata.DatFiles.Test Sample = [CreateMetadataSample()], SampleOf = "sampleof", SaveType = "savetype", + Score = "score", SharedFeat = [CreateMetadataSharedFeat()], Slot = [CreateMetadataSlot()], SoftwareList = [CreateMetadataSoftwareList()], Sound = CreateMetadataSound(), + Source = "source", SourceFile = "sourcefile", SourceRom = "sourcerom", Status = "status", + Subgenre = "subgenre", Supported = Data.Models.Metadata.Supported.Yes, System = "system", Tags = "tags", - [Data.Models.Metadata.Machine.TruripKey] = CreateMetadataTrurip(), + TitleID = "titleid", Video = [CreateMetadataVideo()], Year = "year", }; @@ -977,27 +986,6 @@ namespace SabreTools.Metadata.DatFiles.Test }; } - private static Data.Models.Logiqx.Trurip CreateMetadataTrurip() - { - return new Data.Models.Logiqx.Trurip - { - TitleID = "titleid", - Publisher = "publisher", - Developer = "developer", - Year = "year", - Genre = "genre", - Subgenre = "subgenre", - Ratings = "ratings", - Score = "score", - Players = "players", - Enabled = "enabled", - CRC = "yes", - Source = "source", - CloneOf = "cloneof", - RelatedTo = "relatedto", - }; - } - private static Data.Models.Metadata.Video CreateMetadataVideo() { return new Data.Models.Metadata.Video @@ -1076,15 +1064,19 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("company", machine.Company); Assert.Equal("control", machine.Control); Assert.Equal("country", machine.Country); + Assert.Equal("crc", machine.CRC); Assert.Equal("description", machine.Description); + Assert.Equal("developer", machine.Developer); Assert.Equal("dirname", machine.DirName); Assert.Equal("displaycount", machine.DisplayCount); Assert.Equal("displaytype", machine.DisplayType); Assert.Equal("duplicateid", machine.DuplicateID); Assert.Equal("emulator", machine.Emulator); + Assert.Equal("enabled", machine.Enabled); Assert.Equal("extra", machine.Extra); Assert.Equal("favorite", machine.Favorite); Assert.Equal("genmsxid", machine.GenMSXID); + Assert.Equal("genre", machine.Genre); Assert.Equal("history", machine.History); Assert.Equal("id", machine.Id); Assert.Equal(HashType.CRC32.ZeroString, machine.Im1CRC); @@ -1102,23 +1094,26 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("playedtime", machine.PlayedTime); Assert.Equal("players", machine.Players); Assert.Equal("publisher", machine.Publisher); + Assert.Equal("ratings", machine.Ratings); Assert.Equal("rebuildto", machine.RebuildTo); + Assert.Equal("relatedto", machine.RelatedTo); Assert.Equal("releasenumber", machine.ReleaseNumber); Assert.Equal("romof", machine.RomOf); Assert.Equal("rotation", machine.Rotation); Assert.Equal(Data.Models.Metadata.Runnable.Yes, machine.Runnable); Assert.Equal("sampleof", machine.SampleOf); Assert.Equal("savetype", machine.SaveType); + Assert.Equal("score", machine.Score); + Assert.Equal("source", machine.Source); Assert.Equal("sourcefile", machine.SourceFile); Assert.Equal("sourcerom", machine.SourceRom); Assert.Equal("status", machine.Status); + Assert.Equal("subgenre", machine.Subgenre); Assert.Equal(Data.Models.Metadata.Supported.Yes, machine.Supported); Assert.Equal("system", machine.System); Assert.Equal("tags", machine.Tags); + Assert.Equal("titleid", machine.TitleID); Assert.Equal("year", machine.Year); - - DatItems.Trurip? trurip = machine.Read(Data.Models.Metadata.Machine.TruripKey); - ValidateTrurip(trurip); } #pragma warning restore IDE0051 @@ -1653,26 +1648,6 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal(12345, sound.Channels); } - // TODO: Figure out why so many fields are omitted - private static void ValidateTrurip(DatItems.Trurip? trurip) - { - Assert.NotNull(trurip); - Assert.Equal("titleid", trurip.TitleID); - //Assert.Equal("publisher", trurip.Publisher); // Omitted from conversion - Assert.Equal("developer", trurip.Developer); - // Assert.Equal("year", trurip.Year); // Omitted from conversion - Assert.Equal("genre", trurip.Genre); - Assert.Equal("subgenre", trurip.Subgenre); - Assert.Equal("ratings", trurip.Ratings); - Assert.Equal("score", trurip.Score); - // Assert.Equal("players", trurip.Players); // Omitted from conversion - Assert.Equal("enabled", trurip.Enabled); - Assert.True(trurip.Crc); - // Assert.Equal("source", trurip.Source); // Omitted from conversion - // Assert.Equal("cloneof", trurip.CloneOf); // Omitted from conversion - Assert.Equal("relatedto", trurip.RelatedTo); - } - private static void ValidateVideo(Display? display) { Assert.NotNull(display); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index ee6c4ce5..c7fc5e49 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -110,7 +110,6 @@ namespace SabreTools.Metadata.DatFiles.Test private static Machine CreateMachine() { Machine item = new Machine(CreateMetadataMachine()); - item.Write(Data.Models.Metadata.Machine.TruripKey, CreateTrurip()); return item; } @@ -338,27 +337,6 @@ namespace SabreTools.Metadata.DatFiles.Test return item; } - private static Trurip CreateTrurip() - { - return new Trurip - { - TitleID = "titleid", - // Publisher = "publisher", - Developer = "developer", - // Year = "year", - Genre = "genre", - Subgenre = "subgenre", - Ratings = "ratings", - Score = "score", - // Players = "players", - Enabled = "enabled", - Crc = true, - // Source = "source", - // CloneOf = "cloneof", - RelatedTo = "relatedto", - }; - } - private static Display CreateVideo(Machine machine) { Display item = new Display(CreateMetadataVideo()); @@ -430,15 +408,19 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("company", machine.Company); Assert.Equal("control", machine.Control); Assert.Equal("country", machine.Country); + Assert.Equal("crc", machine.CRC); Assert.Equal("description", machine.Description); + Assert.Equal("developer", machine.Developer); Assert.Equal("dirname", machine.DirName); Assert.Equal("displaycount", machine.DisplayCount); Assert.Equal("displaytype", machine.DisplayType); Assert.Equal("duplicateid", machine.DuplicateID); Assert.Equal("emulator", machine.Emulator); + Assert.Equal("enabled", machine.Enabled); Assert.Equal("extra", machine.Extra); Assert.Equal("favorite", machine.Favorite); Assert.Equal("genmsxid", machine.GenMSXID); + Assert.Equal("genre", machine.Genre); Assert.Equal("history", machine.History); Assert.Equal("id", machine.Id); Assert.Equal(HashType.CRC32.ZeroString, machine.Im1CRC); @@ -456,19 +438,25 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("playedtime", machine.PlayedTime); Assert.Equal("players", machine.Players); Assert.Equal("publisher", machine.Publisher); + Assert.Equal("ratings", machine.Ratings); Assert.Equal("rebuildto", machine.RebuildTo); + Assert.Equal("relatedto", machine.RelatedTo); Assert.Equal("releasenumber", machine.ReleaseNumber); Assert.Equal("romof", machine.RomOf); Assert.Equal("rotation", machine.Rotation); Assert.Equal(Data.Models.Metadata.Runnable.Yes, machine.Runnable); Assert.Equal("sampleof", machine.SampleOf); Assert.Equal("savetype", machine.SaveType); + Assert.Equal("score", machine.Score); + Assert.Equal("source", machine.Source); Assert.Equal("sourcefile", machine.SourceFile); Assert.Equal("sourcerom", machine.SourceRom); Assert.Equal("status", machine.Status); + Assert.Equal("subgenre", machine.Subgenre); Assert.Equal(Data.Models.Metadata.Supported.Yes, machine.Supported); Assert.Equal("system", machine.System); Assert.Equal("tags", machine.Tags); + Assert.Equal("titleid", machine.TitleID); Assert.Equal("year", machine.Year); Data.Models.Metadata.Adjuster[]? adjusters = machine.Adjuster; @@ -604,9 +592,6 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(sound); ValidateMetadataSound(sound); - Data.Models.Logiqx.Trurip? trurip = machine.Read(Data.Models.Metadata.Machine.TruripKey); - ValidateMetadataTrurip(trurip); - Data.Models.Metadata.Video[]? videos = machine.Video; Assert.NotNull(videos); Data.Models.Metadata.Video video = Assert.Single(videos); @@ -1223,25 +1208,6 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.Equal("tool", sourceDetails.Tool); } - private static void ValidateMetadataTrurip(Data.Models.Logiqx.Trurip? trurip) - { - Assert.NotNull(trurip); - Assert.Equal("titleid", trurip.TitleID); - Assert.Equal("publisher", trurip.Publisher); - Assert.Equal("developer", trurip.Developer); - Assert.Equal("year", trurip.Year); - Assert.Equal("genre", trurip.Genre); - Assert.Equal("subgenre", trurip.Subgenre); - Assert.Equal("ratings", trurip.Ratings); - Assert.Equal("score", trurip.Score); - Assert.Equal("players", trurip.Players); - Assert.Equal(expected: "enabled", trurip.Enabled); - Assert.Equal("yes", trurip.CRC); - Assert.Equal("sourcefile", trurip.Source); - Assert.Equal("cloneof", trurip.CloneOf); - Assert.Equal("relatedto", trurip.RelatedTo); - } - private static void ValidateMetadataVideo(Data.Models.Metadata.Video? video) { Assert.NotNull(video); diff --git a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs index ee24369a..601bab62 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs @@ -77,22 +77,6 @@ namespace SabreTools.Metadata.DatFiles // Create a machine to hold everything var machine = items[0].Machine!.GetInternalClone(); - // Handle Trurip object, if it exists - if (machine.ContainsKey(Data.Models.Metadata.Machine.TruripKey)) - { - var trurip = machine.Read(Data.Models.Metadata.Machine.TruripKey); - if (trurip is not null) - { - var truripItem = trurip.ConvertToLogiqx(); - truripItem.Publisher = machine.Publisher; - truripItem.Year = machine.Year; - truripItem.Players = machine.Players; - truripItem.Source = machine.SourceFile; - truripItem.CloneOf = machine.CloneOf; - machine[Data.Models.Metadata.Machine.TruripKey] = truripItem; - } - } - // Create mapping dictionaries for the Parts, DataAreas, and DiskAreas associated with this machine Dictionary partMappings = []; Dictionary dataAreaMappings = []; @@ -472,22 +456,6 @@ namespace SabreTools.Metadata.DatFiles // Create a machine to hold everything var machine = GetMachineForItemDB(items.First().Key).Value!.GetInternalClone(); - // Handle Trurip object, if it exists - if (machine.ContainsKey(Data.Models.Metadata.Machine.TruripKey)) - { - var trurip = machine.Read(Data.Models.Metadata.Machine.TruripKey); - if (trurip is not null) - { - var truripItem = trurip.ConvertToLogiqx(); - truripItem.Publisher = machine.Publisher; - truripItem.Year = machine.Year; - truripItem.Players = machine.Players; - truripItem.Source = machine.SourceFile; - truripItem.CloneOf = machine.CloneOf; - machine[Data.Models.Metadata.Machine.TruripKey] = truripItem; - } - } - // Create mapping dictionaries for the Parts, DataAreas, and DiskAreas associated with this machine Dictionary partMappings = []; Dictionary dataAreaMappings = []; diff --git a/SabreTools.Metadata.DatItems/Machine.cs b/SabreTools.Metadata.DatItems/Machine.cs index 5cfc6008..8d27e8c5 100644 --- a/SabreTools.Metadata.DatItems/Machine.cs +++ b/SabreTools.Metadata.DatItems/Machine.cs @@ -51,6 +51,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Control = value; } + public string? CRC + { + get => _internal.CRC; + set => _internal.CRC = value; + } + public string? Country { get => _internal.Country; @@ -63,6 +69,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Description = value; } + public string? Developer + { + get => _internal.Developer; + set => _internal.Developer = value; + } + public string? DirName { get => _internal.DirName; @@ -93,6 +105,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Emulator = value; } + public string? Enabled + { + get => _internal.Enabled; + set => _internal.Enabled = value; + } + public string? Extra { get => _internal.Extra; @@ -111,6 +129,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.GenMSXID = value; } + public string? Genre + { + get => _internal.Genre; + set => _internal.Genre = value; + } + public string? Hash { get => _internal.Hash; @@ -219,12 +243,24 @@ namespace SabreTools.Metadata.DatItems set => _internal.Publisher = value; } + public string? Ratings + { + get => _internal.Ratings; + set => _internal.Ratings = value; + } + public string? RebuildTo { get => _internal.RebuildTo; set => _internal.RebuildTo = value; } + public string? RelatedTo + { + get => _internal.RelatedTo; + set => _internal.RelatedTo = value; + } + public string? ReleaseNumber { get => _internal.ReleaseNumber; @@ -261,6 +297,18 @@ namespace SabreTools.Metadata.DatItems set => _internal.SaveType = value; } + public string? Score + { + get => _internal.Score; + set => _internal.Score = value; + } + + public string? Source + { + get => _internal.Source; + set => _internal.Source = value; + } + public string? SourceFile { get => _internal.SourceFile; @@ -279,6 +327,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Status = value; } + public string? Subgenre + { + get => _internal.Subgenre; + set => _internal.Subgenre = value; + } + public Data.Models.Metadata.Supported? Supported { get => _internal.Supported; @@ -297,6 +351,12 @@ namespace SabreTools.Metadata.DatItems set => _internal.Tags = value; } + public string? TitleID + { + get => _internal.TitleID; + set => _internal.TitleID = value; + } + public string? Url { get => _internal.Url; @@ -321,7 +381,6 @@ namespace SabreTools.Metadata.DatItems public Machine(Data.Models.Metadata.Machine machine) { _internal = machine.DeepClone() as Data.Models.Metadata.Machine ?? []; - Remove(Data.Models.Metadata.Machine.TruripKey); // Process flag values if (Im1CRC is not null) @@ -329,11 +388,6 @@ namespace SabreTools.Metadata.DatItems if (Im2CRC is not null) Im2CRC = TextHelper.NormalizeCRC32(Im2CRC); - - // Handle Trurip object, if it exists - var truripItem = machine.Read(Data.Models.Metadata.Machine.TruripKey); - if (truripItem is not null) - Write(Data.Models.Metadata.Machine.TruripKey, new Trurip(truripItem)); } #endregion diff --git a/SabreTools.Metadata.DatItems/Trurip.cs b/SabreTools.Metadata.DatItems/Trurip.cs deleted file mode 100644 index 0541824c..00000000 --- a/SabreTools.Metadata.DatItems/Trurip.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.Xml.Serialization; -using Newtonsoft.Json; -using SabreTools.Data.Extensions; - -namespace SabreTools.Metadata.DatItems -{ - /// - /// Represents TruRip/EmuArc-specific values on a machine - /// - [JsonObject("trurip"), XmlRoot("trurip")] - public sealed class Trurip : ICloneable - { - #region Fields - - /// - /// Title ID - /// - [JsonProperty("titleid", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("titleid")] - public string? TitleID { get; set; } = null; - - /// - /// Machine developer - /// - [JsonProperty("developer", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("developer")] - public string? Developer { get; set; } = null; - - /// - /// Game genre - /// - [JsonProperty("genre", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("genre")] - public string? Genre { get; set; } = null; - - /// - /// Game subgenre - /// - [JsonProperty("subgenre", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("subgenre")] - public string? Subgenre { get; set; } = null; - - /// - /// Game ratings - /// - [JsonProperty("ratings", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("ratings")] - public string? Ratings { get; set; } = null; - - /// - /// Game score - /// - [JsonProperty("score", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("score")] - public string? Score { get; set; } = null; - - /// - /// Is the machine enabled - /// - [JsonProperty("enabled", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("enabled")] - public string? Enabled { get; set; } = null; // bool? - - /// - /// Does the game have a CRC check - /// - [JsonProperty("hascrc", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("hascrc")] - public bool? Crc { get; set; } = null; - - [JsonIgnore] - public bool CrcSpecified { get { return Crc is not null; } } - - /// - /// Machine relations - /// - [JsonProperty("relatedto", DefaultValueHandling = DefaultValueHandling.Ignore)] - [XmlElement("relatedto")] - public string? RelatedTo { get; set; } = null; - - #endregion - - #region Constructors - - public Trurip() { } - - public Trurip(Data.Models.Logiqx.Trurip trurip) - { - TitleID = trurip.TitleID; - Developer = trurip.Developer; - Genre = trurip.Genre; - Subgenre = trurip.Subgenre; - Ratings = trurip.Ratings; - Score = trurip.Score; - Enabled = trurip.Enabled; - Crc = trurip.CRC.AsYesNo(); - RelatedTo = trurip.RelatedTo; - } - - #endregion - - #region Cloning methods - - /// - /// Create a clone of the current object - /// - /// New object with the same values as the current one - public object Clone() - { - return new Trurip() - { - TitleID = this.TitleID, - Developer = this.Developer, - Genre = this.Genre, - Subgenre = this.Subgenre, - Ratings = this.Ratings, - Score = this.Score, - Enabled = this.Enabled, - Crc = this.Crc, - RelatedTo = this.RelatedTo, - }; - } - - /// - /// Convert to the internal Logiqx model - /// - public Data.Models.Logiqx.Trurip ConvertToLogiqx() - { - return new Data.Models.Logiqx.Trurip() - { - TitleID = this.TitleID, - Developer = this.Developer, - Genre = this.Genre, - Subgenre = this.Subgenre, - Ratings = this.Ratings, - Score = this.Score, - Enabled = this.Enabled, - CRC = this.Crc.FromYesNo(), - RelatedTo = this.RelatedTo, - }; - } - - #endregion - } -} diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 45426cad..349344aa 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -919,12 +919,18 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "control": checkValue = item.Control; return true; + case Machine item when fieldName == "crc": + checkValue = item.CRC; + return true; case Machine item when fieldName == "country": checkValue = item.Country; return true; case Machine item when fieldName == "description": checkValue = item.Description; return true; + case Machine item when fieldName == "developer": + checkValue = item.Developer; + return true; case Machine item when fieldName == "dirname": checkValue = item.DirName; return true; @@ -940,6 +946,9 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "emulator": checkValue = item.Emulator; return true; + case Machine item when fieldName == "enabled": + checkValue = item.Enabled; + return true; case Machine item when fieldName == "extra": checkValue = item.Extra; return true; @@ -949,6 +958,9 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "genmsxid": checkValue = item.GenMSXID; return true; + case Machine item when fieldName == "genre": + checkValue = item.Genre; + return true; case Machine item when fieldName == "hash": checkValue = item.Hash; return true; @@ -1003,9 +1015,15 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "publisher": checkValue = item.Publisher; return true; + case Machine item when fieldName == "ratings": + checkValue = item.Ratings; + return true; case Machine item when fieldName == "rebuildto": checkValue = item.RebuildTo; return true; + case Machine item when fieldName == "relatedto": + checkValue = item.RelatedTo; + return true; case Machine item when fieldName == "releasenumber": checkValue = item.ReleaseNumber; return true; @@ -1024,6 +1042,12 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "savetype": checkValue = item.SaveType; return true; + case Machine item when fieldName == "score": + checkValue = item.Score; + return true; + case Machine item when fieldName == "source": + checkValue = item.Source; + return true; case Machine item when fieldName == "sourcefile": checkValue = item.SourceFile; return true; @@ -1033,6 +1057,9 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "status": checkValue = item.Status; return true; + case Machine item when fieldName == "subgenre": + checkValue = item.Subgenre; + return true; case Machine item when fieldName == "supported": checkValue = item.Supported?.AsStringValue(); return true; @@ -1042,6 +1069,9 @@ namespace SabreTools.Metadata.Filter case Machine item when fieldName == "tags": checkValue = item.Tags; return true; + case Machine item when fieldName == "titleid": + checkValue = item.TitleID; + return true; case Machine item when fieldName == "url": checkValue = item.Url; return true; diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index bc5ba954..caf91860 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -254,10 +254,14 @@ namespace SabreTools.Metadata return false; if (selfMachine.Control != otherMachine.Control) return false; + if (selfMachine.CRC != otherMachine.CRC) + return false; if (selfMachine.Country != otherMachine.Country) return false; if (selfMachine.Description != otherMachine.Description) return false; + if (selfMachine.Developer != otherMachine.Developer) + return false; if (selfMachine.DirName != otherMachine.DirName) return false; if (selfMachine.DisplayCount != otherMachine.DisplayCount) @@ -268,12 +272,16 @@ namespace SabreTools.Metadata return false; if (selfMachine.Emulator != otherMachine.Emulator) return false; + if (selfMachine.Enabled != otherMachine.Enabled) + return false; if (selfMachine.Extra != otherMachine.Extra) return false; if (selfMachine.Favorite != otherMachine.Favorite) return false; if (selfMachine.GenMSXID != otherMachine.GenMSXID) return false; + if (selfMachine.Genre != otherMachine.Genre) + return false; if (selfMachine.Hash != otherMachine.Hash) return false; if (selfMachine.History != otherMachine.History) @@ -308,8 +316,12 @@ namespace SabreTools.Metadata return false; if (selfMachine.Publisher != otherMachine.Publisher) return false; + if (selfMachine.Ratings != otherMachine.Ratings) + return false; if (selfMachine.RebuildTo != otherMachine.RebuildTo) return false; + if (selfMachine.RelatedTo != otherMachine.RelatedTo) + return false; if (selfMachine.ReleaseNumber != otherMachine.ReleaseNumber) return false; if (selfMachine.RomOf != otherMachine.RomOf) @@ -322,18 +334,26 @@ namespace SabreTools.Metadata return false; if (selfMachine.SaveType != otherMachine.SaveType) return false; + if (selfMachine.Score != otherMachine.Score) + return false; + if (selfMachine.Source != otherMachine.Source) + return false; if (selfMachine.SourceFile != otherMachine.SourceFile) return false; if (selfMachine.SourceRom != otherMachine.SourceRom) return false; if (selfMachine.Status != otherMachine.Status) return false; + if (selfMachine.Subgenre != otherMachine.Subgenre) + return false; if (selfMachine.Supported != otherMachine.Supported) return false; if (selfMachine.System != otherMachine.System) return false; if (selfMachine.Tags != otherMachine.Tags) return false; + if (selfMachine.TitleID != otherMachine.TitleID) + return false; if (selfMachine.Url != otherMachine.Url) return false; if (selfMachine.Year != otherMachine.Year) diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index 7d474dfe..aeea4996 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -57,57 +57,46 @@ namespace SabreTools.Serialization.CrossModel }; string? headerVal = item.ReadString(Data.Models.Metadata.Header.HeaderKey); - Data.Models.Metadata.MergingFlag forceMerging = item.ForceMerging; - Data.Models.Metadata.NodumpFlag forceNodump = item.ForceNodump; - Data.Models.Metadata.PackingFlag forcePacking = item.ForcePacking; if (headerVal is not null - || forceMerging is not Data.Models.Metadata.MergingFlag.None - || forceNodump is not Data.Models.Metadata.NodumpFlag.None - || forcePacking is not Data.Models.Metadata.PackingFlag.None) + || item.ForceMerging is not Data.Models.Metadata.MergingFlag.None + || item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None + || item.ForcePacking is not Data.Models.Metadata.PackingFlag.None) { header.ClrMamePro = new Data.Models.Logiqx.ClrMamePro(); if (headerVal is not null) header.ClrMamePro.Header = headerVal; - if (forceMerging is not Data.Models.Metadata.MergingFlag.None) - header.ClrMamePro.ForceMerging = forceMerging; - if (forceNodump is not Data.Models.Metadata.NodumpFlag.None) - header.ClrMamePro.ForceNodump = forceNodump; - if (forcePacking is not Data.Models.Metadata.PackingFlag.None) - header.ClrMamePro.ForcePacking = forcePacking; + if (item.ForceMerging is not Data.Models.Metadata.MergingFlag.None) + header.ClrMamePro.ForceMerging = item.ForceMerging; + if (item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None) + header.ClrMamePro.ForceNodump = item.ForceNodump; + if (item.ForcePacking is not Data.Models.Metadata.PackingFlag.None) + header.ClrMamePro.ForcePacking = item.ForcePacking; } - string? plugin = item.Plugin; - Data.Models.Metadata.MergingFlag romMode = item.RomMode; - Data.Models.Metadata.MergingFlag biosMode = item.BiosMode; - Data.Models.Metadata.MergingFlag sampleMode = item.SampleMode; - bool? lockRomMode = item.LockRomMode; - bool? lockBiosMode = item.LockBiosMode; - bool? lockSampleMode = item.LockSampleMode; - - if (plugin is not null - || romMode is not Data.Models.Metadata.MergingFlag.None - || biosMode is not Data.Models.Metadata.MergingFlag.None - || sampleMode is not Data.Models.Metadata.MergingFlag.None - || lockRomMode is not null - || lockBiosMode is not null - || lockSampleMode is not null) + if (item.Plugin is not null + || item.RomMode is not Data.Models.Metadata.MergingFlag.None + || item.BiosMode is not Data.Models.Metadata.MergingFlag.None + || item.SampleMode is not Data.Models.Metadata.MergingFlag.None + || item.LockRomMode is not null + || item.LockBiosMode is not null + || item.LockSampleMode is not null) { header.RomCenter = new Data.Models.Logiqx.RomCenter(); - if (plugin is not null) - header.RomCenter.Plugin = plugin; - if (romMode is not Data.Models.Metadata.MergingFlag.None) - header.RomCenter.RomMode = romMode; - if (biosMode is not Data.Models.Metadata.MergingFlag.None) - header.RomCenter.BiosMode = biosMode; - if (sampleMode is not Data.Models.Metadata.MergingFlag.None) - header.RomCenter.SampleMode = sampleMode; - if (lockRomMode is not null) - header.RomCenter.LockRomMode = lockRomMode; - if (lockBiosMode is not null) - header.RomCenter.LockBiosMode = lockBiosMode; - if (lockSampleMode is not null) - header.RomCenter.LockSampleMode = lockSampleMode; + if (item.Plugin is not null) + header.RomCenter.Plugin = item.Plugin; + if (item.RomMode is not Data.Models.Metadata.MergingFlag.None) + header.RomCenter.RomMode = item.RomMode; + if (item.BiosMode is not Data.Models.Metadata.MergingFlag.None) + header.RomCenter.BiosMode = item.BiosMode; + if (item.SampleMode is not Data.Models.Metadata.MergingFlag.None) + header.RomCenter.SampleMode = item.SampleMode; + if (item.LockRomMode is not null) + header.RomCenter.LockRomMode = item.LockRomMode; + if (item.LockBiosMode is not null) + header.RomCenter.LockBiosMode = item.LockBiosMode; + if (item.LockSampleMode is not null) + header.RomCenter.LockSampleMode = item.LockSampleMode; } return header; @@ -140,9 +129,47 @@ namespace SabreTools.Serialization.CrossModel gameBase.Publisher = item.Publisher; gameBase.Category = item.ReadStringArray(Data.Models.Metadata.Machine.CategoryKey); - var trurip = item.Read(Data.Models.Metadata.Machine.TruripKey); - if (trurip is not null) - gameBase.Trurip = trurip; + if (item.TitleID is not null + || item.Developer is not null + || item.Genre is not null + || item.Subgenre is not null + || item.Ratings is not null + || item.Score is not null + || item.Enabled is not null + || item.CRC is not null + || item.Source is not null + || item.RelatedTo is not null) + { + gameBase.Trurip = new Trurip(); + if (item.TitleID is not null) + gameBase.Trurip.TitleID = item.TitleID; + if (item.Publisher is not null) + gameBase.Trurip.Publisher = item.Publisher; + if (item.Developer is not null) + gameBase.Trurip.Developer = item.Developer; + if (item.Year is not null) + gameBase.Trurip.Year = item.Year; + if (item.Genre is not null) + gameBase.Trurip.Genre = item.Genre; + if (item.Subgenre is not null) + gameBase.Trurip.Subgenre = item.Subgenre; + if (item.Ratings is not null) + gameBase.Trurip.Ratings = item.Ratings; + if (item.Score is not null) + gameBase.Trurip.Score = item.Score; + if (item.Players is not null) + gameBase.Trurip.Players = item.Players; + if (item.Enabled is not null) + gameBase.Trurip.Enabled = item.Enabled; + if (item.CRC is not null) + gameBase.Trurip.CRC = item.CRC; + if (item.Source is not null) + gameBase.Trurip.Source = item.Source; + if (item.CloneOf is not null) + gameBase.Trurip.CloneOf = item.CloneOf; + if (item.RelatedTo is not null) + gameBase.Trurip.RelatedTo = item.RelatedTo; + } var releases = item.Release; if (releases is not null && releases.Length > 0) diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 12af46bd..45e4f08d 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -126,26 +126,36 @@ namespace SabreTools.Serialization.CrossModel var machine = new Data.Models.Metadata.Machine { - Name = machineName, - SourceFile = item.SourceFile, + Board = item.Board, + [Data.Models.Metadata.Machine.CategoryKey] = item.Category, + CloneOf = item.CloneOf ?? item.Trurip?.CloneOf, + CloneOfId = item.CloneOfId, + [Data.Models.Metadata.Machine.CommentKey] = item.Comment, + CRC = item.Trurip?.CRC, + Description = item.Description, + Developer = item.Trurip?.Developer, + Enabled = item.Trurip?.Enabled, + Genre = item.Trurip?.Genre, + Id = item.Id, IsBios = item.IsBios, IsDevice = item.IsDevice, IsMechanical = item.IsMechanical, - CloneOf = item.CloneOf, - RomOf = item.RomOf, - SampleOf = item.SampleOf, - Board = item.Board, - RebuildTo = item.RebuildTo, - Id = item.Id, - CloneOfId = item.CloneOfId, - Runnable = item.Runnable, - [Data.Models.Metadata.Machine.CommentKey] = item.Comment, - Description = item.Description, - Year = item.Year, Manufacturer = item.Manufacturer, - Publisher = item.Publisher, - [Data.Models.Metadata.Machine.CategoryKey] = item.Category, - [Data.Models.Metadata.Machine.TruripKey] = item.Trurip, + Name = machineName, + Players = item.Trurip?.Players, + Publisher = item.Publisher ?? item.Trurip?.Publisher, + Ratings = item.Trurip?.Ratings, + RebuildTo = item.RebuildTo, + RelatedTo = item.Trurip?.RelatedTo, + RomOf = item.RomOf, + Runnable = item.Runnable, + SampleOf = item.SampleOf, + Score = item.Trurip?.Score, + Source = item.Trurip?.Source, + SourceFile = item.SourceFile, + Subgenre = item.Trurip?.Subgenre, + TitleID = item.Trurip?.TitleID, + Year = item.Year ?? item.Trurip?.Year, }; if (item.Release is not null && item.Release.Length > 0)