diff --git a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs index 1ed0e8c0..0ece0d7e 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs @@ -273,7 +273,7 @@ namespace SabreTools.DatFiles.Formats ConvertDeviceRefs(game.DeviceRef, machine, filename, indexId, statsOnly, ref containsItems); ConvertSamples(game.Sample, machine, filename, indexId, statsOnly, ref containsItems); ConvertArchives(game.Archive, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDrivers(game.Driver, machine, filename, indexId, statsOnly, ref containsItems); + ConvertDriver(game.Driver, machine, filename, indexId, statsOnly, ref containsItems); ConvertSoftwareLists(game.SoftwareList, machine, filename, indexId, statsOnly, ref containsItems); // If we had no items, create a Blank placeholder @@ -599,42 +599,39 @@ namespace SabreTools.DatFiles.Formats /// /// Convert Driver information /// - /// Array of deserialized models to convert + /// Deserialized model to convert /// Prefilled machine to use /// Name of the file to be parsed /// Index ID for the DAT /// True to only add item statistics while parsing, false otherwise /// True if there were any items in the array, false otherwise - private void ConvertDrivers(Models.Logiqx.Driver[]? drivers, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) + private void ConvertDriver(Models.Logiqx.Driver? driver, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) { - // If the drivers array is missing, we can't do anything - if (drivers == null || !drivers.Any()) + // If the driver is missing, we can't do anything + if (driver == null) return; containsItems = true; - foreach (var driver in drivers) + var item = new Driver { - var item = new Driver + Status = driver.Status?.AsSupportStatus() ?? SupportStatus.NULL, + Emulation = driver.Emulation?.AsSupportStatus() ?? SupportStatus.NULL, + Cocktail = driver.Cocktail?.AsSupportStatus() ?? SupportStatus.NULL, + SaveState = driver.SaveState?.AsSupported() ?? Supported.NULL, + RequiresArtwork = driver.RequiresArtwork?.AsYesNo(), + Unofficial = driver.Unofficial?.AsYesNo(), + NoSoundHardware = driver.NoSoundHardware?.AsYesNo(), + Incomplete = driver.Incomplete?.AsYesNo(), + + Source = new Source { - Status = driver.Status?.AsSupportStatus() ?? SupportStatus.NULL, - Emulation = driver.Emulation?.AsSupportStatus() ?? SupportStatus.NULL, - Cocktail = driver.Cocktail?.AsSupportStatus() ?? SupportStatus.NULL, - SaveState = driver.SaveState?.AsSupported() ?? Supported.NULL, - RequiresArtwork = driver.RequiresArtwork?.AsYesNo(), - Unofficial = driver.Unofficial?.AsYesNo(), - NoSoundHardware = driver.NoSoundHardware?.AsYesNo(), - Incomplete = driver.Incomplete?.AsYesNo(), + Index = indexId, + Name = filename, + }, + }; - Source = new Source - { - Index = indexId, - Name = filename, - }, - }; - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } + item.CopyMachineInformation(machine); + ParseAddHelper(item, statsOnly); } /// diff --git a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs index ce38f774..b541bc15 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs @@ -314,7 +314,6 @@ namespace SabreTools.DatFiles.Formats var samples = new List(); var archives = new List(); var devicerefs = new List(); - var drivers = new List(); var softwarelists = new List(); // Loop through and convert the items to respective lists @@ -357,7 +356,7 @@ namespace SabreTools.DatFiles.Formats devicerefs.Add(CreateDeviceRef(deviceref)); break; case Driver driver: - drivers.Add(CreateDriver(driver)); + game.Driver = CreateDriver(driver); break; case DatItems.Formats.SoftwareList softwarelist: softwarelists.Add(CreateSoftwareList(softwarelist)); @@ -374,7 +373,6 @@ namespace SabreTools.DatFiles.Formats game.Sample = samples.ToArray(); game.Archive = archives.ToArray(); game.DeviceRef = devicerefs.ToArray(); - game.Driver = drivers.ToArray(); game.SoftwareList = softwarelists.ToArray(); // Add the game to the list diff --git a/SabreTools.Models/ClrMamePro/GameBase.cs b/SabreTools.Models/ClrMamePro/GameBase.cs index c39198e1..1efbd9fb 100644 --- a/SabreTools.Models/ClrMamePro/GameBase.cs +++ b/SabreTools.Models/ClrMamePro/GameBase.cs @@ -60,7 +60,7 @@ namespace SabreTools.Models.ClrMamePro public Chip[]? Chip { get; set; } /// video, Appears after Chip - public Video? Video { get; set; } + public Video[]? Video { get; set; } /// sound, Appears after Video public Sound? Sound { get; set; } diff --git a/SabreTools.Models/Internal/Machine.cs b/SabreTools.Models/Internal/Machine.cs index 61d0a0cc..95dd5d0b 100644 --- a/SabreTools.Models/Internal/Machine.cs +++ b/SabreTools.Models/Internal/Machine.cs @@ -61,6 +61,9 @@ namespace SabreTools.Models.Internal /// DipSwitch[] public const string DipSwitchKey = "dipswitch"; + /// string + public const string DirNameKey = "dirName"; + /// Disk[] public const string DiskKey = "disk"; @@ -73,7 +76,7 @@ namespace SabreTools.Models.Internal /// string public const string DisplayTypeKey = "displaytype"; - /// Driver, Driver[] + /// Driver public const string DriverKey = "driver"; /// Dump[] @@ -230,7 +233,7 @@ namespace SabreTools.Models.Internal /// Trurip public const string TruripKey = "trurip"; - /// Video, Video[] + /// Video[] public const string VideoKey = "video"; /// string diff --git a/SabreTools.Models/Logiqx/GameBase.cs b/SabreTools.Models/Logiqx/GameBase.cs index b6ce477e..b3ae4980 100644 --- a/SabreTools.Models/Logiqx/GameBase.cs +++ b/SabreTools.Models/Logiqx/GameBase.cs @@ -102,10 +102,9 @@ namespace SabreTools.Models.Logiqx [XmlElement("archive")] public Archive[]? Archive { get; set; } - /// TODO: Validate multiple can exist /// MAME extension [XmlElement("driver")] - public Driver[]? Driver { get; set; } + public Driver? Driver { get; set; } /// MAME extension [XmlElement("softwarelist")] diff --git a/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs b/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs index 3a518f93..7c8e83e2 100644 --- a/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs +++ b/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using SabreTools.Models.ArchiveDotOrg; @@ -22,7 +23,12 @@ namespace SabreTools.Serialization var machines = item.Read(Models.Internal.MetadataFile.MachineKey); if (machines != null && machines.Any()) - files.File = machines.SelectMany(ConvertFromInternalModel).ToArray(); + { + files.File = machines + .Where(m => m != null) + .SelectMany(ConvertFromInternalModel) + .ToArray(); + } return files; } @@ -30,23 +36,22 @@ namespace SabreTools.Serialization /// /// Convert from to an array of /// - private static File[]? ConvertFromInternalModel(Models.Internal.Machine? item) + private static File[] ConvertFromInternalModel(Models.Internal.Machine item) { - if (item == null) - return null; - var roms = item.Read(Models.Internal.Machine.RomKey); - return roms?.Select(ConvertFromInternalModel)?.ToArray(); + if (roms == null) + return Array.Empty(); + + return roms + .Where(r => r != null) + .Select(ConvertFromInternalModel).ToArray(); } /// /// Convert from to /// - private static File? ConvertFromInternalModel(Models.Internal.Rom? item) + private static File ConvertFromInternalModel(Models.Internal.Rom item) { - if (item == null) - return null; - var file = new File { Name = item.ReadString(Models.Internal.Rom.NameKey), diff --git a/SabreTools.Serialization/ArchiveDotOrg.Serializer.cs b/SabreTools.Serialization/ArchiveDotOrg.Serializer.cs index 161e5c35..8b1df2c0 100644 --- a/SabreTools.Serialization/ArchiveDotOrg.Serializer.cs +++ b/SabreTools.Serialization/ArchiveDotOrg.Serializer.cs @@ -13,15 +13,23 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Models.Internal.MetadataFile ConvertToInternalModel(Files item) + public static Models.Internal.MetadataFile? ConvertToInternalModel(Files? item) { + if (item == null) + return null; + var metadataFile = new Models.Internal.MetadataFile { [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), }; if (item?.File != null && item.File.Any()) - metadataFile[Models.Internal.MetadataFile.MachineKey] = item.File.Select(ConvertMachineToInternalModel).ToArray(); + { + metadataFile[Models.Internal.MetadataFile.MachineKey] = item.File + .Where(f => f != null) + .Select(ConvertMachineToInternalModel) + .ToArray(); + } return metadataFile; } diff --git a/SabreTools.Serialization/AttractMode.Deserializer.cs b/SabreTools.Serialization/AttractMode.Deserializer.cs index 2deff0b3..ff314467 100644 --- a/SabreTools.Serialization/AttractMode.Deserializer.cs +++ b/SabreTools.Serialization/AttractMode.Deserializer.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -136,19 +137,21 @@ namespace SabreTools.Serialization var machines = item.Read(Models.Internal.MetadataFile.MachineKey); if (machines != null && machines.Any()) - metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); - + { + metadataFile.Row = machines + .Where(m => m != null) + .SelectMany(ConvertMachineFromInternalModel) + .ToArray(); + } + return metadataFile; } /// /// Convert from to /// - private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static MetadataFile ConvertHeaderFromInternalModel(Models.Internal.Header item) { - if (item == null) - return null; - var metadataFile = new MetadataFile { Header = item.ReadStringArray(Models.Internal.Header.HeaderKey), @@ -159,55 +162,46 @@ namespace SabreTools.Serialization /// /// Convert from to an array of /// - private static Row?[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Row[] ConvertMachineFromInternalModel(Models.Internal.Machine item) { - if (item == null) - return null; - var roms = item.Read(Models.Internal.Machine.RomKey); - return roms?.Select(rom => - { - if (rom == null) - return null; + if (roms == null || !roms.Any()) + return Array.Empty(); - var rowItem = ConvertFromInternalModel(rom); - - rowItem.Name = item.ReadString(Models.Internal.Machine.NameKey); - rowItem.Emulator = item.ReadString(Models.Internal.Machine.EmulatorKey); - rowItem.CloneOf = item.ReadString(Models.Internal.Machine.CloneOfKey); - rowItem.Year = item.ReadString(Models.Internal.Machine.YearKey); - rowItem.Manufacturer = item.ReadString(Models.Internal.Machine.ManufacturerKey); - rowItem.Category = item.ReadString(Models.Internal.Machine.CategoryKey); - rowItem.Players = item.ReadString(Models.Internal.Machine.PlayersKey); - rowItem.Rotation = item.ReadString(Models.Internal.Machine.RotationKey); - rowItem.Control = item.ReadString(Models.Internal.Machine.ControlKey); - rowItem.Status = item.ReadString(Models.Internal.Machine.StatusKey); - rowItem.DisplayCount = item.ReadString(Models.Internal.Machine.DisplayCountKey); - rowItem.DisplayType = item.ReadString(Models.Internal.Machine.DisplayTypeKey); - rowItem.Extra = item.ReadString(Models.Internal.Machine.ExtraKey); - rowItem.Buttons = item.ReadString(Models.Internal.Machine.ButtonsKey); - rowItem.Favorite = item.ReadString(Models.Internal.Machine.FavoriteKey); - rowItem.Tags = item.ReadString(Models.Internal.Machine.TagsKey); - rowItem.PlayedCount = item.ReadString(Models.Internal.Machine.PlayedCountKey); - rowItem.PlayedTime = item.ReadString(Models.Internal.Machine.PlayedTimeKey); - - return rowItem; - })?.ToArray(); + return roms + .Where(r => r != null) + .Select(rom => ConvertFromInternalModel(rom, item)) + .ToArray(); } /// /// Convert from to /// - private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) + private static Row ConvertFromInternalModel(Models.Internal.Rom item, Models.Internal.Machine parent) { - if (item == null) - return null; - var row = new Row { + Name = parent.ReadString(Models.Internal.Machine.NameKey), Title = item.ReadString(Models.Internal.Rom.NameKey), + Emulator = parent.ReadString(Models.Internal.Machine.EmulatorKey), + CloneOf = parent.ReadString(Models.Internal.Machine.CloneOfKey), + Year = parent.ReadString(Models.Internal.Machine.YearKey), + Manufacturer = parent.ReadString(Models.Internal.Machine.ManufacturerKey), + Category = parent.ReadString(Models.Internal.Machine.CategoryKey), + Players = parent.ReadString(Models.Internal.Machine.PlayersKey), + Rotation = parent.ReadString(Models.Internal.Machine.RotationKey), + Control = parent.ReadString(Models.Internal.Machine.ControlKey), + Status = parent.ReadString(Models.Internal.Machine.StatusKey), + DisplayCount = parent.ReadString(Models.Internal.Machine.DisplayCountKey), + DisplayType = parent.ReadString(Models.Internal.Machine.DisplayTypeKey), AltRomname = item.ReadString(Models.Internal.Rom.AltRomnameKey), AltTitle = item.ReadString(Models.Internal.Rom.AltTitleKey), + Extra = parent.ReadString(Models.Internal.Machine.ExtraKey), + Buttons = parent.ReadString(Models.Internal.Machine.ButtonsKey), + Favorite = parent.ReadString(Models.Internal.Machine.FavoriteKey), + Tags = parent.ReadString(Models.Internal.Machine.TagsKey), + PlayedCount = parent.ReadString(Models.Internal.Machine.PlayedCountKey), + PlayedTime = parent.ReadString(Models.Internal.Machine.PlayedTimeKey), FileIsAvailable = item.ReadString(Models.Internal.Rom.FileIsAvailableKey), }; return row; diff --git a/SabreTools.Serialization/AttractMode.Serializer.cs b/SabreTools.Serialization/AttractMode.Serializer.cs index 34cea23e..f4282a0e 100644 --- a/SabreTools.Serialization/AttractMode.Serializer.cs +++ b/SabreTools.Serialization/AttractMode.Serializer.cs @@ -105,15 +105,23 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Models.Internal.MetadataFile ConvertToInternalModel(MetadataFile item) + public static Models.Internal.MetadataFile? ConvertToInternalModel(MetadataFile? item) { + if (item == null) + return null; + var metadataFile = new Models.Internal.MetadataFile { [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), }; if (item?.Row != null && item.Row.Any()) - metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row.Select(ConvertMachineToInternalModel).ToArray(); + { + metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Row + .Where(r => r != null) + .Select(ConvertMachineToInternalModel) + .ToArray(); + } return metadataFile; } diff --git a/SabreTools.Serialization/ClrMamePro.Deserializer.cs b/SabreTools.Serialization/ClrMamePro.Deserializer.cs index b05bd905..01bcb9a5 100644 --- a/SabreTools.Serialization/ClrMamePro.Deserializer.cs +++ b/SabreTools.Serialization/ClrMamePro.Deserializer.cs @@ -53,6 +53,7 @@ namespace SabreTools.Serialization var samples = new List(); var archives = new List(); var chips = new List(); + var videos = new List