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