diff --git a/SabreTools.DatFiles/Formats/Listrom.Reader.cs b/SabreTools.DatFiles/Formats/Listrom.Reader.cs index 3258a491..8b22c050 100644 --- a/SabreTools.DatFiles/Formats/Listrom.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listrom.Reader.cs @@ -72,7 +72,7 @@ namespace SabreTools.DatFiles.Formats { machine = new Machine(); machine.SetFieldValue(Models.Metadata.Machine.NameKey, set.Device); - machine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, true); + machine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, (true as bool?).FromYesNo()); } else if (!string.IsNullOrEmpty(set.Driver)) { diff --git a/SabreTools.DatFiles/Formats/Listrom.Writer.cs b/SabreTools.DatFiles/Formats/Listrom.Writer.cs index ca92c38f..34e82479 100644 --- a/SabreTools.DatFiles/Formats/Listrom.Writer.cs +++ b/SabreTools.DatFiles/Formats/Listrom.Writer.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq; using SabreTools.Core; -using SabreTools.Core.Tools; using SabreTools.DatItems; using SabreTools.DatItems.Formats; @@ -62,7 +60,9 @@ namespace SabreTools.DatFiles.Formats { logger.User($"Writing to '{outfile}'..."); - var metadataFile = CreateMetadataFile(ignoreblanks); + // Serialize the input file + var metadata = ConvertMetadata(ignoreblanks); + var metadataFile = new Serialization.CrossModel.Listrom().Deserialize(metadata); if (!(new Serialization.Files.Listrom().Serialize(metadataFile, outfile))) { logger.Warning($"File '{outfile}' could not be written! See the log for more details."); @@ -78,170 +78,5 @@ namespace SabreTools.DatFiles.Formats logger.User($"'{outfile}' written!{Environment.NewLine}"); return true; } - - #region Converters - - /// - /// Create a MetadataFile from the current internal information - /// - /// True if blank roms should be skipped on output, false otherwise - private Models.Listrom.MetadataFile CreateMetadataFile(bool ignoreblanks) - { - var metadataFile = new Models.Listrom.MetadataFile - { - Set = CreateSets(ignoreblanks) - }; - return metadataFile; - } - - /// - /// Create an array of Set from the current internal information - /// - /// True if blank roms should be skipped on output, false otherwise - private Models.Listrom.Set[]? CreateSets(bool ignoreblanks) - { - // If we don't have items, we can't do anything - if (this.Items == null || !this.Items.Any()) - return null; - - // Create lists to hold the data - var sets = new List(); - var rows = new List(); - - // Loop through the sorted items and create games for them - foreach (string key in Items.SortedKeys) - { - var items = Items.FilteredItems(key); - if (items == null || !items.Any()) - continue; - - var set = new Models.Listrom.Set - { - Driver = items[0]!.GetFieldValue(DatItem.MachineKey)!.GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey) == true - ? items[0]!.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) - : null, - Device = items[0]!.GetFieldValue(DatItem.MachineKey)!.GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey) == true - ? items[0]!.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) - : null, - }; - - // Loop through and convert the items to respective lists - for (int index = 0; index < items.Count; index++) - { - // Get the item - var item = items[index]; - - // Check for a "null" item - item = ProcessNullifiedItem(item); - - // Skip if we're ignoring the item - if (ShouldIgnore(item, ignoreblanks)) - continue; - - switch (item) - { - case Disk disk: - var diskRow = CreateRow(disk); - if (diskRow != null) - rows.Add(diskRow); - break; - case Rom rom: - var romRow = CreateRow(rom); - if (romRow != null) - rows.Add(romRow); - break; - } - } - - set.Row = [.. rows]; - sets.Add(set); - rows.Clear(); - } - - return [.. sets]; - } - - /// - /// Create a Row from the current Disk DatItem - /// - private static Models.Listrom.Row? CreateRow(Disk disk) - { - if (disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue() == ItemStatus.Nodump) - { - return new Models.Listrom.Row - { - Name = disk.GetName(), - NoGoodDumpKnown = true, - }; - } - else if (disk.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue() == ItemStatus.BadDump) - { - var row = new Models.Listrom.Row - { - Name = disk.GetName(), - Bad = true, - }; - - if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))) - row.MD5 = disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key); - else - row.SHA1 = disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key); - - return row; - } - else - { - var row = new Models.Listrom.Row - { - Name = disk.GetName(), - }; - - if (!string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key))) - row.MD5 = disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key); - else - row.SHA1 = disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key); - - return row; - } - } - - /// - /// Create a Row from the current Rom DatItem - /// - private static Models.Listrom.Row? CreateRow(Rom rom) - { - if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue() == ItemStatus.Nodump) - { - return new Models.Listrom.Row - { - Name = rom.GetName(), - Size = rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString(), - NoGoodDumpKnown = true, - }; - } - else if (rom.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue() == ItemStatus.BadDump) - { - return new Models.Listrom.Row - { - Name = rom.GetName(), - Size = rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString(), - Bad = true, - CRC = rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey), - SHA1 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), - }; - } - else - { - return new Models.Listrom.Row - { - Name = rom.GetName(), - Size = rom.GetInt64FieldValue(Models.Metadata.Rom.SizeKey).ToString(), - CRC = rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey), - SHA1 = rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), - }; - } - } - - #endregion } }