diff --git a/SabreTools.DatFiles/DatFile.MetadataConverter.cs b/SabreTools.DatFiles/DatFile.MetadataConverter.cs index 237ceaf1..196d3832 100644 --- a/SabreTools.DatFiles/DatFile.MetadataConverter.cs +++ b/SabreTools.DatFiles/DatFile.MetadataConverter.cs @@ -259,8 +259,10 @@ namespace SabreTools.DatFiles Header.SetFieldValue(Models.Metadata.Header.LockRomModeKey, header.GetFieldValue(Models.Metadata.Header.LockRomModeKey)); if (Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey) == null) Header.SetFieldValue(Models.Metadata.Header.LockSampleModeKey, header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey)); + if (Header.GetFieldValue(Models.Metadata.Header.MameConfigKey) == null) + Header.SetFieldValue(Models.Metadata.Header.MameConfigKey, header.GetFieldValue(Models.Metadata.Header.NameKey)); if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) - Header.SetFieldValue(Models.Metadata.Header.NameKey, header.GetFieldValue(Models.Metadata.Header.NameKey)); + Header.SetFieldValue(Models.Metadata.Header.NameKey, header.GetFieldValue(Models.Metadata.Header.MameConfigKey)); if (Header.GetFieldValue(Models.Metadata.Header.PluginKey) == null) Header.SetFieldValue(Models.Metadata.Header.PluginKey, header.GetFieldValue(Models.Metadata.Header.PluginKey)); if (Header.GetFieldValue(Models.Metadata.Header.RefNameKey) == null) @@ -446,6 +448,11 @@ namespace SabreTools.DatFiles var items = ReadItemArray(item, Models.Metadata.Machine.SharedFeatKey); ProcessItems(items, machine, filename, indexId, statsOnly); } + if (item.ContainsKey(Models.Metadata.Machine.SlotKey)) + { + var items = ReadItemArray(item, Models.Metadata.Machine.SlotKey); + ProcessItems(items, machine, filename, indexId, statsOnly); + } if (item.ContainsKey(Models.Metadata.Machine.SoftwareListKey)) { var items = ReadItemArray(item, Models.Metadata.Machine.SoftwareListKey); @@ -487,6 +494,15 @@ namespace SabreTools.DatFiles var datItem = new DatItems.Formats.Adjuster(item); datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); + + // Handle subitems + var condition = item.Read(Models.Metadata.Adjuster.ConditionKey); + if (condition != null) + { + var subItem = new DatItems.Formats.Condition(condition); + datItem.SetFieldValue(Models.Metadata.Adjuster.ConditionKey, subItem); + } + ParseAddHelper(datItem, statsOnly); } } @@ -583,6 +599,49 @@ namespace SabreTools.DatFiles var datItem = new DatItems.Formats.Configuration(item); datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); + + // Handle subitems + var condition = item.Read(Models.Metadata.Configuration.ConditionKey); + if (condition != null) + { + var subItem = new DatItems.Formats.Condition(condition); + datItem.SetFieldValue(Models.Metadata.Configuration.ConditionKey, subItem); + } + + var confLocations = ReadItemArray(item, Models.Metadata.Configuration.ConfLocationKey); + if (confLocations != null) + { + var subLocations = new List(); + foreach (var location in confLocations) + { + var subItem = new DatItems.Formats.ConfLocation(location); + subLocations.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.Configuration.ConfLocationKey, [.. subLocations]); + } + + var confSettings = ReadItemArray(item, Models.Metadata.Configuration.ConfSettingKey); + if (confSettings != null) + { + var subValues = new List(); + foreach (var setting in confSettings) + { + var subItem = new DatItems.Formats.ConfSetting(setting); + + var subCondition = item.Read(Models.Metadata.ConfSetting.ConditionKey); + if (subCondition != null) + { + var subSubItem = new DatItems.Formats.Condition(subCondition); + subItem.SetFieldValue(Models.Metadata.ConfSetting.ConditionKey, subSubItem); + } + + subValues.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.Configuration.ConfSettingKey, [.. subValues]); + } + ParseAddHelper(datItem, statsOnly); } } @@ -633,6 +692,28 @@ namespace SabreTools.DatFiles var datItem = new DatItems.Formats.Device(item); datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); + + // Handle subitems + var instance = item.Read(Models.Metadata.Device.InstanceKey); + if (instance != null) + { + var subItem = new DatItems.Formats.Instance(instance); + datItem.SetFieldValue(Models.Metadata.Device.InstanceKey, subItem); + } + + var extensions = ReadItemArray(item, Models.Metadata.Device.ExtensionKey); + if (extensions != null) + { + var subExtensions = new List(); + foreach (var extension in extensions) + { + var subItem = new DatItems.Formats.Extension(extension); + subExtensions.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.Device.ExtensionKey, [.. subExtensions]); + } + ParseAddHelper(datItem, statsOnly); } } @@ -705,6 +786,49 @@ namespace SabreTools.DatFiles var datItem = new DatItems.Formats.DipSwitch(item); datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); + + // Handle subitems + var condition = item.Read(Models.Metadata.DipSwitch.ConditionKey); + if (condition != null) + { + var subItem = new DatItems.Formats.Condition(condition); + datItem.SetFieldValue(Models.Metadata.DipSwitch.ConditionKey, subItem); + } + + var dipLocations = ReadItemArray(item, Models.Metadata.DipSwitch.DipLocationKey); + if (dipLocations != null) + { + var subLocations = new List(); + foreach (var location in dipLocations) + { + var subItem = new DatItems.Formats.DipLocation(location); + subLocations.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.DipSwitch.DipLocationKey, [.. subLocations]); + } + + var dipValues = ReadItemArray(item, Models.Metadata.DipSwitch.DipValueKey); + if (dipValues != null) + { + var subValues = new List(); + foreach (var value in dipValues) + { + var subItem = new DatItems.Formats.DipValue(value); + + var subCondition = item.Read(Models.Metadata.DipValue.ConditionKey); + if (subCondition != null) + { + var subSubItem = new DatItems.Formats.Condition(subCondition); + subItem.SetFieldValue(Models.Metadata.DipValue.ConditionKey, subSubItem); + } + + subValues.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.DipSwitch.DipValueKey, [.. subValues]); + } + ParseAddHelper(datItem, statsOnly); } } @@ -966,6 +1090,21 @@ namespace SabreTools.DatFiles var datItem = new DatItems.Formats.Input(item); datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); + + // Handle subitems + var controls = ReadItemArray(item, Models.Metadata.Input.ControlKey); + if (controls != null) + { + var subControls = new List(); + foreach (var control in controls) + { + var subItem = new DatItems.Formats.Control(control); + subControls.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.Input.ControlKey, [.. subControls]); + } + ParseAddHelper(datItem, statsOnly); } } @@ -1042,6 +1181,21 @@ namespace SabreTools.DatFiles var datItem = new DatItems.Formats.Port(item); datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); datItem.CopyMachineInformation(machine); + + // Handle subitems + var analogs = ReadItemArray(item, Models.Metadata.Port.AnalogKey); + if (analogs != null) + { + var subAnalogs = new List(); + foreach (var analog in analogs) + { + var subItem = new DatItems.Formats.Analog(analog); + subAnalogs.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.Port.AnalogKey, [.. subAnalogs]); + } + ParseAddHelper(datItem, statsOnly); } } @@ -1166,6 +1320,45 @@ namespace SabreTools.DatFiles } } + /// + /// Convert Slot information + /// + /// Array of internal items to convert + /// Machine to use with the converted items + /// Name of the file to be parsed + /// Index ID for the DAT + /// True to only add item statistics while parsing, false otherwise + private void ProcessItems(Models.Metadata.Slot[]? items, DatItems.Machine machine, string filename, int indexId, bool statsOnly) + { + // If the array is null or empty, return without processing + if (items == null || items.Length == 0) + return; + + // Loop through the items and add + foreach (var item in items) + { + var datItem = new DatItems.Formats.Slot(item); + datItem.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); + datItem.CopyMachineInformation(machine); + + // Handle subitems + var slotOptions = ReadItemArray(item, Models.Metadata.Slot.SlotOptionKey); + if (slotOptions != null) + { + var subOptions = new List(); + foreach (var slotOption in slotOptions) + { + var subItem = new DatItems.Formats.SlotOption(slotOption); + subOptions.Add(subItem); + } + + datItem.SetFieldValue(Models.Metadata.Slot.SlotOptionKey, [.. subOptions]); + } + + ParseAddHelper(datItem, statsOnly); + } + } + /// /// Convert SoftwareList information /// diff --git a/SabreTools.DatFiles/Formats/Listrom.Reader.cs b/SabreTools.DatFiles/Formats/Listrom.Reader.cs index 0595f6f6..3f782fa7 100644 --- a/SabreTools.DatFiles/Formats/Listrom.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listrom.Reader.cs @@ -152,7 +152,7 @@ namespace SabreTools.DatFiles.Formats { var disk = new Disk(); disk.SetName(row.Name); - disk.SetFieldValue(Models.Metadata.Disk.StatusKey, value: ItemStatus.BadDump); + disk.SetFieldValue(Models.Metadata.Disk.StatusKey, ItemStatus.BadDump); disk.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); if (!string.IsNullOrEmpty(row.MD5)) diff --git a/SabreTools.DatFiles/Formats/Listxml.Reader.cs b/SabreTools.DatFiles/Formats/Listxml.Reader.cs index 0a3f7d3c..ec76b3ce 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Reader.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Reader.cs @@ -1,10 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using SabreTools.Core; -using SabreTools.Core.Tools; -using SabreTools.DatItems; -using SabreTools.DatItems.Formats; namespace SabreTools.DatFiles.Formats { @@ -21,12 +15,10 @@ namespace SabreTools.DatFiles.Formats // Deserialize the input file // TODO: Support M1 DATs again var mame = new Serialization.Files.Listxml().Deserialize(filename); + var metadata = new Serialization.CrossModel.Listxml().Serialize(mame); - // Convert the header to the internal format - ConvertHeader(mame, keep); - - // Convert the game data to the internal format - ConvertGames(mame?.Game, filename, indexId, statsOnly); + // Convert to the internal format + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { @@ -34,920 +26,5 @@ namespace SabreTools.DatFiles.Formats logger.Error(ex, message); } } - - #region Converters - - /// - /// Convert header information - /// - /// Deserialized model to convert - /// True if full pathnames are to be kept, false otherwise (default) - private void ConvertHeader(Models.Listxml.Mame? mame, bool keep) - { - // If the mame is missing, we can't do anything - if (mame == null) - return; - - if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) - Header.SetFieldValue(Models.Metadata.Header.NameKey, mame.Build); - if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) - Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, mame.Build); - if (Header.GetFieldValue(Models.Metadata.Header.BuildKey) == null) - Header.SetFieldValue(Models.Metadata.Header.BuildKey, mame.Build); - if (Header.GetFieldValue(Models.Metadata.Header.DebugKey) == null) - Header.SetFieldValue (Models.Metadata.Header.DebugKey, mame.Debug.AsYesNo()); - if (Header.GetFieldValue(Models.Metadata.Header.MameConfigKey) == null) - Header.SetFieldValue(Models.Metadata.Header.MameConfigKey, mame.MameConfig); - - // Handle implied SuperDAT - if (Header.GetFieldValue(Models.Metadata.Header.NameKey)?.Contains(" - SuperDAT") == true && keep) - { - if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) - Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); - } - } - - /// - /// Convert games information - /// - /// Array of deserialized models to convert - /// Name of the file to be parsed - /// Index ID for the DAT - /// True to only add item statistics while parsing, false otherwise - private void ConvertGames(Models.Listxml.GameBase[]? games, string filename, int indexId, bool statsOnly) - { - // If the game array is missing, we can't do anything - if (games == null || !games.Any()) - return; - - // Loop through the games and add - foreach (var game in games) - { - ConvertGame(game, filename, indexId, statsOnly); - } - } - - /// - /// Convert game information - /// - /// Deserialized model to convert - /// Name of the file to be parsed - /// Index ID for the DAT - /// True to only add item statistics while parsing, false otherwise - private void ConvertGame(Models.Listxml.GameBase game, string filename, int indexId, bool statsOnly) - { - // If the game is missing, we can't do anything - if (game == null) - return; - - // Create the machine for copying information - var machine = new Machine(); - machine.SetFieldValue(Models.Metadata.Machine.CloneOfKey, game.CloneOf); - machine.SetFieldValue(Models.Metadata.Machine.DescriptionKey, game.Description); - machine.SetFieldValue(Models.Metadata.Machine.HistoryKey, game.History); - machine.SetFieldValue(Models.Metadata.Machine.IsBiosKey, game.IsBios.AsYesNo()); - machine.SetFieldValue(Models.Metadata.Machine.IsDeviceKey, game.IsDevice.AsYesNo()); - machine.SetFieldValue(Models.Metadata.Machine.IsMechanicalKey, game.IsMechanical.AsYesNo()); - machine.SetFieldValue(Models.Metadata.Machine.ManufacturerKey, game.Manufacturer); - machine.SetFieldValue(Models.Metadata.Machine.NameKey, game.Name); - machine.SetFieldValue(Models.Metadata.Machine.RunnableKey, game.Runnable.AsEnumValue()); - machine.SetFieldValue(Models.Metadata.Machine.RomOfKey, game.RomOf); - machine.SetFieldValue(Models.Metadata.Machine.SampleOfKey, game.SampleOf); - machine.SetFieldValue(Models.Metadata.Machine.SourceFileKey, game.SourceFile); - machine.SetFieldValue(Models.Metadata.Machine.YearKey, game.Year); - - // Check if there are any items - bool containsItems = false; - - // Loop through each type of item - ConvertBiosSets(game.BiosSet, machine, filename, indexId, statsOnly, ref containsItems); - ConvertRoms(game.Rom, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDisks(game.Disk, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDeviceRefs(game.DeviceRef, machine, filename, indexId, statsOnly, ref containsItems); - ConvertSamples(game.Sample, machine, filename, indexId, statsOnly, ref containsItems); - ConvertChips(game.Chip, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDisplays(game.Display, machine, filename, indexId, statsOnly, ref containsItems); - ConvertVideos(game.Video, machine, filename, indexId, statsOnly, ref containsItems); - ConvertSound(game.Sound, machine, filename, indexId, statsOnly, ref containsItems); - ConvertInput(game.Input, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDipSwitches(game.DipSwitch, machine, filename, indexId, statsOnly, ref containsItems); - ConvertConfigurations(game.Configuration, machine, filename, indexId, statsOnly, ref containsItems); - ConvertPorts(game.Port, machine, filename, indexId, statsOnly, ref containsItems); - ConvertAdjusters(game.Adjuster, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDriver(game.Driver, machine, filename, indexId, statsOnly, ref containsItems); - ConvertFeatures(game.Feature, machine, filename, indexId, statsOnly, ref containsItems); - ConvertDevices(game.Device, machine, filename, indexId, statsOnly, ref containsItems); - ConvertSlots(game.Slot, machine, filename, indexId, statsOnly, ref containsItems); - ConvertSoftwareLists(game.SoftwareList, machine, filename, indexId, statsOnly, ref containsItems); - ConvertRamOptions(game.RamOption, machine, filename, indexId, statsOnly, ref containsItems); - - // If we had no items, create a Blank placeholder - if (!containsItems) - { - var blank = new Blank(); - blank.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - blank.CopyMachineInformation(machine); - ParseAddHelper(blank, statsOnly); - } - } - - /// - /// Convert BiosSet information - /// - /// Array of deserialized models 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 ConvertBiosSets(Models.Listxml.BiosSet[]? biossets, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the BiosSet array is missing, we can't do anything - if (biossets == null || !biossets.Any()) - return; - - containsItems = true; - foreach (var biosset in biossets) - { - var item = new BiosSet(); - item.SetName(biosset.Name); - item.SetFieldValue(Models.Metadata.BiosSet.DefaultKey, biosset.Default?.AsYesNo()); - item.SetFieldValue(Models.Metadata.BiosSet.DescriptionKey, biosset.Description); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Rom information - /// - /// Array of deserialized models 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 ConvertRoms(Models.Listxml.Rom[]? roms, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Rom array is missing, we can't do anything - if (roms == null || !roms.Any()) - return; - - containsItems = true; - foreach (var rom in roms) - { - var item = new Rom(); - item.SetName(rom.Name); - item.SetFieldValue(Models.Metadata.Rom.SizeKey, NumberHelper.ConvertToInt64(rom.Size)); - item.SetFieldValue(Models.Metadata.Rom.BiosKey, rom.Bios); - item.SetFieldValue(Models.Metadata.Rom.CRCKey, rom.CRC); - item.SetFieldValue(Models.Metadata.Rom.DisposeKey, rom.Dispose.AsYesNo()); - item.SetFieldValue(Models.Metadata.Rom.MergeKey, rom.Merge); - item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.Offset); - item.SetFieldValue(Models.Metadata.Rom.OptionalKey, rom.Optional.AsYesNo()); - item.SetFieldValue(Models.Metadata.Rom.RegionKey, rom.Region); - item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.SHA1); - item.SetFieldValue(Models.Metadata.Rom.SoundOnlyKey, rom.SoundOnly.AsYesNo()); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Rom.StatusKey, rom.Status.AsEnumValue()); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Disk information - /// - /// Array of deserialized models 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 ConvertDisks(Models.Listxml.Disk[]? disks, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Disk array is missing, we can't do anything - if (disks == null || !disks.Any()) - return; - - containsItems = true; - foreach (var disk in disks) - { - var item = new Disk(); - item.SetName(disk.Name); - item.SetFieldValue(Models.Metadata.Disk.IndexKey, disk.Index); - item.SetFieldValue(Models.Metadata.Disk.StatusKey, disk.Status?.AsEnumValue() ?? ItemStatus.NULL); - item.SetFieldValue(Models.Metadata.Disk.MD5Key, disk.MD5); - item.SetFieldValue(Models.Metadata.Disk.MergeKey, disk.Merge); - item.SetFieldValue(Models.Metadata.Disk.OptionalKey, disk.Optional.AsYesNo()); - item.SetFieldValue(Models.Metadata.Disk.RegionKey, disk.Region); - item.SetFieldValue(Models.Metadata.Disk.SHA1Key, disk.SHA1); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Disk.WritableKey, disk.Writable.AsYesNo()); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert DeviceRef information - /// - /// Array of deserialized models 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 ConvertDeviceRefs(Models.Listxml.DeviceRef[]? devicerefs, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the DeviceRef array is missing, we can't do anything - if (devicerefs == null || !devicerefs.Any()) - return; - - containsItems = true; - foreach (var deviceref in devicerefs) - { - var item = new DeviceRef(); - item.SetName(deviceref.Name); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Sample information - /// - /// Array of deserialized models 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 ConvertSamples(Models.Listxml.Sample[]? samples, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Sample array is missing, we can't do anything - if (samples == null || !samples.Any()) - return; - - containsItems = true; - foreach (var sample in samples) - { - var item = new Sample(); - item.SetName(sample.Name); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Chip information - /// - /// Array of deserialized models 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 ConvertChips(Models.Listxml.Chip[]? chips, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Chip array is missing, we can't do anything - if (chips == null || !chips.Any()) - return; - - containsItems = true; - foreach (var chip in chips) - { - var item = new Chip(); - item.SetName(chip.Name); - item.SetFieldValue(Models.Metadata.Chip.ChipTypeKey, chip.Type.AsEnumValue()); - item.SetFieldValue(Models.Metadata.Chip.ClockKey, NumberHelper.ConvertToInt64(chip.Clock)); - item.SetFieldValue(Models.Metadata.Chip.SoundOnlyKey, chip.SoundOnly.AsYesNo()); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Chip.TagKey, chip.Tag); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Display information - /// - /// Array of deserialized models 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 ConvertDisplays(Models.Listxml.Display[]? displays, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Display array is missing, we can't do anything - if (displays == null || !displays.Any()) - return; - - containsItems = true; - foreach (var display in displays) - { - var item = new Display(); - item.SetFieldValue(Models.Metadata.Display.DisplayTypeKey, display.Type.AsEnumValue()); - item.SetFieldValue(Models.Metadata.Display.FlipXKey, display.FlipX.AsYesNo()); - item.SetFieldValue(Models.Metadata.Display.HBEndKey, NumberHelper.ConvertToInt64(display.HBEnd)); - item.SetFieldValue(Models.Metadata.Display.HBStartKey, NumberHelper.ConvertToInt64(display.HBStart)); - item.SetFieldValue(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(display.Height)); - item.SetFieldValue(Models.Metadata.Display.HTotalKey, NumberHelper.ConvertToInt64(display.HTotal)); - item.SetFieldValue(Models.Metadata.Display.PixClockKey, NumberHelper.ConvertToInt64(display.PixClock)); - item.SetFieldValue(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(display.Refresh)); - item.SetFieldValue(Models.Metadata.Display.RotateKey, NumberHelper.ConvertToInt64(display.Rotate)); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Display.TagKey, display.Tag); - item.SetFieldValue(Models.Metadata.Display.VBEndKey, NumberHelper.ConvertToInt64(display.VBEnd)); - item.SetFieldValue(Models.Metadata.Display.VBStartKey, NumberHelper.ConvertToInt64(display.VBStart)); - item.SetFieldValue(Models.Metadata.Display.VTotalKey, NumberHelper.ConvertToInt64(display.VTotal)); - item.SetFieldValue(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(display.Width)); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Video information - /// - /// Array of deserialized models 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 ConvertVideos(Models.Listxml.Video[]? videos, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Video array is missing, we can't do anything - if (videos == null || !videos.Any()) - return; - - containsItems = true; - foreach (var video in videos) - { - var item = new Display(); - item.SetFieldValue("ASPECTX", NumberHelper.ConvertToInt64(video.AspectX)); - item.SetFieldValue("ASPECTY", NumberHelper.ConvertToInt64(video.AspectY)); - item.SetFieldValue(Models.Metadata.Display.DisplayTypeKey, video.Screen?.AsEnumValue() ?? DisplayType.NULL); - item.SetFieldValue(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(video.Height)); - item.SetFieldValue(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(video.Refresh)); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(video.Width)); - - switch (video.Orientation) - { - case "horizontal": - item.SetFieldValue(Models.Metadata.Display.RotateKey, 0); - break; - case "vertical": - item.SetFieldValue(Models.Metadata.Display.RotateKey, 90); - break; - } - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Sound information - /// - /// 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 ConvertSound(Models.Listxml.Sound? sound, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Sound is missing, we can't do anything - if (sound == null) - return; - - containsItems = true; - var item = new Sound(); - item.SetFieldValue(Models.Metadata.Sound.ChannelsKey, NumberHelper.ConvertToInt64(sound.Channels)); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - - /// - /// Convert Input information - /// - /// 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 ConvertInput(Models.Listxml.Input? input, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Input is missing, we can't do anything - if (input == null) - return; - - containsItems = true; - var item = new Input(); - item.SetFieldValue(Models.Metadata.Input.ButtonsKey, NumberHelper.ConvertToInt64(input.Buttons)); - item.SetFieldValue(Models.Metadata.Input.CoinsKey, NumberHelper.ConvertToInt64(input.Coins)); - //item.SetFieldValue(Models.Metadata.Input.ControlKey, input.ControlAttr); - item.SetFieldValue(Models.Metadata.Input.PlayersKey, NumberHelper.ConvertToInt64(input.Players)); - item.SetFieldValue(Models.Metadata.Input.ServiceKey, input.Service?.AsYesNo()); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Input.TiltKey, input.Tilt?.AsYesNo()); - - var controls = new List(); - foreach (var control in input.Control ?? []) - { - var controlItem = new Control(); - controlItem.SetFieldValue(Models.Metadata.Control.ButtonsKey, NumberHelper.ConvertToInt64(control.Buttons)); - controlItem.SetFieldValue(Models.Metadata.Control.ControlTypeKey, control.Type.AsEnumValue()); - controlItem.SetFieldValue(Models.Metadata.Control.KeyDeltaKey, NumberHelper.ConvertToInt64(control.KeyDelta)); - controlItem.SetFieldValue(Models.Metadata.Control.MaximumKey, NumberHelper.ConvertToInt64(control.Maximum)); - controlItem.SetFieldValue(Models.Metadata.Control.MinimumKey, NumberHelper.ConvertToInt64(control.Minimum)); - controlItem.SetFieldValue(Models.Metadata.Control.PlayerKey, NumberHelper.ConvertToInt64(control.Player)); - controlItem.SetFieldValue(Models.Metadata.Control.ReqButtonsKey, NumberHelper.ConvertToInt64(control.ReqButtons)); - controlItem.SetFieldValue(Models.Metadata.Control.ReverseKey, control.Reverse.AsYesNo()); - controlItem.SetFieldValue(Models.Metadata.Control.SensitivityKey, NumberHelper.ConvertToInt64(control.Sensitivity)); - controlItem.SetFieldValue(Models.Metadata.Control.WaysKey, control.Ways); - controlItem.SetFieldValue(Models.Metadata.Control.Ways2Key, control.Ways2); - controlItem.SetFieldValue(Models.Metadata.Control.Ways3Key, control.Ways3); - - controls.Add(controlItem); - } - - if (controls.Any()) - item.SetFieldValue(Models.Metadata.Input.ControlKey, [.. controls]); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - - /// - /// Convert DipSwitch information - /// - /// Array of deserialized models 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 ConvertDipSwitches(Models.Listxml.DipSwitch[]? dipswitches, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the DipSwitch array is missing, we can't do anything - if (dipswitches == null || !dipswitches.Any()) - return; - - containsItems = true; - foreach (var dipswitch in dipswitches) - { - var item = new DipSwitch(); - item.SetName(dipswitch.Name); - item.SetFieldValue(Models.Metadata.DipSwitch.MaskKey, dipswitch.Mask); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.DipSwitch.TagKey, dipswitch.Tag); - - if (dipswitch.Condition != null) - { - var condition = new Condition(); - condition.SetFieldValue(Models.Metadata.Condition.MaskKey, dipswitch.Condition.Mask); - condition.SetFieldValue(Models.Metadata.Condition.RelationKey, dipswitch.Condition.Relation.AsEnumValue()); - condition.SetFieldValue(Models.Metadata.Condition.TagKey, dipswitch.Condition.Tag); - condition.SetFieldValue(Models.Metadata.Condition.ValueKey, dipswitch.Condition.Value); - - item.SetFieldValue(Models.Metadata.DipSwitch.ConditionKey, [condition]); - } - - var locations = new List(); - foreach (var diplocation in dipswitch.DipLocation ?? []) - { - var locationItem = new DipLocation(); - locationItem.SetName(diplocation.Name); - locationItem.SetFieldValue(Models.Metadata.DipLocation.InvertedKey, diplocation.Inverted.AsYesNo()); - locationItem.SetFieldValue(Models.Metadata.DipLocation.NumberKey, NumberHelper.ConvertToInt64(diplocation.Number)); - - locations.Add(locationItem); - } - - if (locations.Any()) - item.SetFieldValue(Models.Metadata.DipSwitch.DipLocationKey, [.. locations]); - - var settings = new List(); - foreach (var dipvalue in dipswitch.DipValue ?? []) - { - var dipValueItem = new DipValue(); - dipValueItem.SetName(dipvalue.Name); - dipValueItem.SetFieldValue(Models.Metadata.DipValue.DefaultKey, dipvalue.Default.AsYesNo()); - dipValueItem.SetFieldValue(Models.Metadata.DipValue.ValueKey, dipvalue.Value); - - if (dipvalue.Condition != null) - { - var condition = new Condition(); - condition.SetFieldValue(Models.Metadata.Condition.MaskKey, dipvalue.Condition.Mask); - condition.SetFieldValue(Models.Metadata.Condition.RelationKey, dipvalue.Condition.Relation.AsEnumValue()); - condition.SetFieldValue(Models.Metadata.Condition.TagKey, dipvalue.Condition.Tag); - condition.SetFieldValue(Models.Metadata.Condition.ValueKey, dipvalue.Condition.Value); - - dipValueItem.SetFieldValue(Models.Metadata.DipValue.ConditionKey, [condition]); - } - - settings.Add(dipValueItem); - } - - if (settings.Any()) - item.SetFieldValue(Models.Metadata.DipSwitch.DipValueKey, [.. settings]); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Configuration information - /// - /// Array of deserialized models 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 ConvertConfigurations(Models.Listxml.Configuration[]? configurations, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Configuration array is missing, we can't do anything - if (configurations == null || !configurations.Any()) - return; - - containsItems = true; - foreach (var configuration in configurations) - { - var item = new Configuration(); - item.SetName(configuration.Name); - item.SetFieldValue(Models.Metadata.Configuration.MaskKey, configuration.Mask); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Configuration.TagKey, configuration.Tag); - - if (configuration.Condition != null) - { - var condition = new DatItems.Formats.Condition(); - condition.SetFieldValue(Models.Metadata.Condition.MaskKey, configuration.Condition.Mask); - condition.SetFieldValue(Models.Metadata.Condition.RelationKey, configuration.Condition.Relation.AsEnumValue()); - condition.SetFieldValue(Models.Metadata.Condition.TagKey, configuration.Condition.Tag); - condition.SetFieldValue(Models.Metadata.Condition.ValueKey, configuration.Condition.Value); - - item.SetFieldValue(Models.Metadata.Configuration.ConditionKey, [condition]); - } - - var locations = new List(); - foreach (var confLocation in configuration.ConfLocation ?? []) - { - var locationItem = new ConfLocation(); - locationItem.SetName(confLocation.Name); - locationItem.SetFieldValue(Models.Metadata.ConfLocation.InvertedKey, confLocation.Inverted.AsYesNo()); - locationItem.SetFieldValue(Models.Metadata.ConfLocation.NumberKey, NumberHelper.ConvertToInt64(confLocation.Number)); - - locations.Add(locationItem); - } - - if (locations.Any()) - item.SetFieldValue(Models.Metadata.Configuration.ConfLocationKey, [.. locations]); - - var settings = new List(); - foreach (var dipvalue in configuration.ConfSetting ?? []) - { - var settingItem = new ConfSetting(); - settingItem.SetName(dipvalue.Name); - settingItem.SetFieldValue(Models.Metadata.ConfSetting.DefaultKey, dipvalue.Default.AsYesNo()); - settingItem.SetFieldValue(Models.Metadata.ConfSetting.ValueKey, dipvalue.Value); - - if (dipvalue.Condition != null) - { - var condition = new Condition(); - condition.SetFieldValue(Models.Metadata.Condition.MaskKey, dipvalue.Condition.Mask); - condition.SetFieldValue(Models.Metadata.Condition.RelationKey, dipvalue.Condition.Relation.AsEnumValue()); - condition.SetFieldValue(Models.Metadata.Condition.TagKey, dipvalue.Condition.Tag); - condition.SetFieldValue(Models.Metadata.Condition.ValueKey, dipvalue.Condition.Value); - - settingItem.SetFieldValue(Models.Metadata.ConfSetting.ConditionKey, [condition]); - } - - settings.Add(settingItem); - } - - if (settings.Any()) - item.SetFieldValue(Models.Metadata.Configuration.ConfSettingKey, [.. settings]); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Port information - /// - /// Array of deserialized models 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 ConvertPorts(Models.Listxml.Port[]? ports, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Port array is missing, we can't do anything - if (ports == null || !ports.Any()) - return; - - containsItems = true; - foreach (var port in ports) - { - var item = new Port(); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Port.TagKey, port.Tag); - - var analogs = new List(); - foreach (var analog in port.Analog ?? []) - { - var analogItem = new Analog(); - analogItem.SetFieldValue(Models.Metadata.Analog.MaskKey, analog.Mask); - - analogs.Add(analogItem); - } - - if (analogs.Any()) - item.SetFieldValue(Models.Metadata.Port.AnalogKey, [.. analogs]); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Adjuster information - /// - /// Array of deserialized models 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 ConvertAdjusters(Models.Listxml.Adjuster[]? adjusters, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Adjuster array is missing, we can't do anything - if (adjusters == null || !adjusters.Any()) - return; - - containsItems = true; - foreach (var adjuster in adjusters) - { - var item = new Adjuster(); - item.SetName(adjuster.Name); - item.SetFieldValue(Models.Metadata.Adjuster.DefaultKey, adjuster.Default.AsYesNo()); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - if (adjuster.Condition != null) - { - var condition = new Condition(); - condition.SetFieldValue(Models.Metadata.Condition.MaskKey, adjuster.Condition.Mask); - condition.SetFieldValue(Models.Metadata.Condition.RelationKey, adjuster.Condition.Relation.AsEnumValue()); - condition.SetFieldValue(Models.Metadata.Condition.TagKey, adjuster.Condition.Tag); - condition.SetFieldValue(Models.Metadata.Condition.ValueKey, adjuster.Condition.Value); - - item.SetFieldValue(Models.Metadata.Adjuster.ConditionKey, [condition]); - } - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Driver information - /// - /// 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 ConvertDriver(Models.Listxml.Driver? driver, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Driver is missing, we can't do anything - if (driver == null) - return; - - containsItems = true; - var item = new Driver(); - item.SetFieldValue(Models.Metadata.Driver.CocktailKey, driver.Cocktail?.AsEnumValue() ?? SupportStatus.NULL); - item.SetFieldValue(Models.Metadata.Driver.ColorKey, driver.Color?.AsEnumValue() ?? SupportStatus.NULL); - item.SetFieldValue(Models.Metadata.Driver.EmulationKey, driver.Emulation?.AsEnumValue() ?? SupportStatus.NULL); - item.SetFieldValue(Models.Metadata.Driver.IncompleteKey, driver.Incomplete.AsYesNo()); - item.SetFieldValue(Models.Metadata.Driver.NoSoundHardwareKey, driver.NoSoundHardware.AsYesNo()); - item.SetFieldValue(Models.Metadata.Driver.PaletteSizeKey, NumberHelper.ConvertToInt64(driver.PaletteSize)); - item.SetFieldValue(Models.Metadata.Driver.RequiresArtworkKey, driver.RequiresArtwork.AsYesNo()); - item.SetFieldValue(Models.Metadata.Driver.SaveStateKey, driver.SaveState?.AsEnumValue() ?? Supported.NULL); - item.SetFieldValue(Models.Metadata.Driver.SoundKey, driver.Sound?.AsEnumValue() ?? SupportStatus.NULL); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Driver.StatusKey, driver.Status?.AsEnumValue() ?? SupportStatus.NULL); - item.SetFieldValue(Models.Metadata.Driver.UnofficialKey, driver.Unofficial.AsYesNo()); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - - /// - /// Convert Feature information - /// - /// Array of deserialized models 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 ConvertFeatures(Models.Listxml.Feature[]? features, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Feature array is missing, we can't do anything - if (features == null || !features.Any()) - return; - - containsItems = true; - foreach (var feature in features) - { - var item = new Feature(); - item.SetFieldValue(Models.Metadata.Feature.FeatureTypeKey, feature.Type.AsEnumValue()); - item.SetFieldValue(Models.Metadata.Feature.OverallKey, feature.Overall.AsEnumValue()); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Feature.StatusKey, feature.Status.AsEnumValue()); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Device information - /// - /// Array of deserialized models 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 ConvertDevices(Models.Listxml.Device[]? devices, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Device array is missing, we can't do anything - if (devices == null || !devices.Any()) - return; - - containsItems = true; - foreach (var device in devices) - { - var item = new Device(); - item.SetFieldValue(Models.Metadata.Device.DeviceTypeKey, device.Type.AsEnumValue()); - item.SetFieldValue(Models.Metadata.Device.FixedImageKey, device.FixedImage); - item.SetFieldValue(Models.Metadata.Device.InterfaceKey, device.Interface); - item.SetFieldValue(Models.Metadata.Device.MandatoryKey, NumberHelper.ConvertToInt64(device.Mandatory)); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.Device.TagKey, device.Tag); - - if (device.Instance != null) - { - var instance = new Instance(); - instance.SetName(device.Instance.Name); - instance.SetFieldValue(Models.Metadata.Instance.BriefNameKey, device.Instance.BriefName); - - item.SetFieldValue(Models.Metadata.Device.InstanceKey, [instance]); - } - - var extensions = new List(); - foreach (var extension in device.Extension ?? []) - { - var extensionItem = new Extension(); - extensionItem.SetName(extension.Name); - - extensions.Add(extensionItem); - } - - if (extensions.Any()) - item.SetFieldValue(Models.Metadata.Device.ExtensionKey, extensions.ToArray()); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert Slot information - /// - /// Array of deserialized models 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 ConvertSlots(Models.Listxml.Slot[]? slots, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the Slot array is missing, we can't do anything - if (slots == null || !slots.Any()) - return; - - containsItems = true; - foreach (var slot in slots) - { - var item = new Slot(); - item.SetName(slot.Name); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - var slotoptions = new List(); - foreach (var slotoption in slot.SlotOption ?? []) - { - var slotoptionItem = new SlotOption(); - slotoptionItem.SetName(slotoption.Name); - slotoptionItem.SetFieldValue(Models.Metadata.SlotOption.DefaultKey, slotoption.Default.AsYesNo()); - slotoptionItem.SetFieldValue(Models.Metadata.SlotOption.DevNameKey, slotoption.DevName); - - slotoptions.Add(slotoptionItem); - } - - if (slotoptions.Any()) - item.SetFieldValue(Models.Metadata.Slot.SlotOptionKey, [.. slotoptions]); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert SoftwareList information - /// - /// Array of deserialized models 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 ConvertSoftwareLists(Models.Listxml.SoftwareList[]? softwarelists, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the SoftwareList array is missing, we can't do anything - if (softwarelists == null || !softwarelists.Any()) - return; - - containsItems = true; - foreach (var softwarelist in softwarelists) - { - var item = new DatItems.Formats.SoftwareList(); - item.SetName(softwarelist.Name); - item.SetFieldValue(Models.Metadata.SoftwareList.FilterKey, softwarelist.Filter); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - item.SetFieldValue(Models.Metadata.SoftwareList.StatusKey, softwarelist.Status.AsEnumValue()); - item.SetFieldValue(Models.Metadata.SoftwareList.TagKey, softwarelist.Tag); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - /// - /// Convert RamOption information - /// - /// Array of deserialized models 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 ConvertRamOptions(Models.Listxml.RamOption[]? ramoptions, Machine machine, string filename, int indexId, bool statsOnly, ref bool containsItems) - { - // If the RamOption array is missing, we can't do anything - if (ramoptions == null || !ramoptions.Any()) - return; - - containsItems = true; - foreach (var ramoption in ramoptions) - { - var item = new RamOption(); - item.SetName(ramoption.Name); - item.SetFieldValue(Models.Metadata.RamOption.ContentKey, ramoption.Content); - item.SetFieldValue(Models.Metadata.RamOption.DefaultKey, ramoption.Default.AsYesNo()); - item.SetFieldValue(DatItem.SourceKey, new Source { Index = indexId, Name = filename }); - - item.CopyMachineInformation(machine); - ParseAddHelper(item, statsOnly); - } - } - - #endregion } } diff --git a/SabreTools.DatItems/Formats/Display.cs b/SabreTools.DatItems/Formats/Display.cs index a5d1607e..892ffab2 100644 --- a/SabreTools.DatItems/Formats/Display.cs +++ b/SabreTools.DatItems/Formats/Display.cs @@ -1,6 +1,7 @@ using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; +using SabreTools.Core.Tools; namespace SabreTools.DatItems.Formats { @@ -27,8 +28,22 @@ namespace SabreTools.DatItems.Formats public Display(Models.Metadata.Video item) : base() { - // TODO: Determine what transformation is needed here - _internal = item; + SetFieldValue("ASPECTX", NumberHelper.ConvertToInt64(item.ReadString(Models.Metadata.Video.AspectXKey))); + SetFieldValue("ASPECTY", NumberHelper.ConvertToInt64(item.ReadString(Models.Metadata.Video.AspectYKey))); + SetFieldValue(Models.Metadata.Display.DisplayTypeKey, item.ReadString(Models.Metadata.Video.ScreenKey)?.AsEnumValue() ?? DisplayType.NULL); + SetFieldValue(Models.Metadata.Display.HeightKey, NumberHelper.ConvertToInt64(item.ReadString(Models.Metadata.Video.HeightKey))); + SetFieldValue(Models.Metadata.Display.RefreshKey, NumberHelper.ConvertToDouble(item.ReadString(Models.Metadata.Video.RefreshKey))); + SetFieldValue(Models.Metadata.Display.WidthKey, NumberHelper.ConvertToInt64(item.ReadString(Models.Metadata.Video.WidthKey))); + + switch (item.ReadString(Models.Metadata.Video.OrientationKey)) + { + case "horizontal": + SetFieldValue(Models.Metadata.Display.RotateKey, 0); + break; + case "vertical": + SetFieldValue(Models.Metadata.Display.RotateKey, 90); + break; + } } #endregion diff --git a/SabreTools.Filtering/Cleaner.cs b/SabreTools.Filtering/Cleaner.cs index 414a0219..6d058277 100644 --- a/SabreTools.Filtering/Cleaner.cs +++ b/SabreTools.Filtering/Cleaner.cs @@ -294,7 +294,7 @@ namespace SabreTools.Filtering { // Update machine name if (!string.IsNullOrEmpty(item.GetFieldValue(DatItem.MachineKey)!.GetFieldValue(Models.Metadata.Machine.NameKey)) && mapping.ContainsKey(item.GetFieldValue(DatItem.MachineKey)!.GetFieldValue(Models.Metadata.Machine.NameKey)!)) - item.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, value: mapping[item.GetFieldValue(DatItem.MachineKey)!.GetFieldValue(Models.Metadata.Machine.NameKey)!]); + item.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, mapping[item.GetFieldValue(DatItem.MachineKey)!.GetFieldValue(Models.Metadata.Machine.NameKey)!]); // Update cloneof if (!string.IsNullOrEmpty(item.GetFieldValue(DatItem.MachineKey)!.GetFieldValue(Models.Metadata.Machine.CloneOfKey)) && mapping.ContainsKey(item.GetFieldValue(DatItem.MachineKey)!.GetFieldValue(Models.Metadata.Machine.CloneOfKey)!))