diff --git a/SabreTools.DatFiles/DatFile.ToMetadata.cs b/SabreTools.DatFiles/DatFile.ToMetadata.cs index 15507a8a..eeaa6143 100644 --- a/SabreTools.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.DatFiles/DatFile.ToMetadata.cs @@ -498,6 +498,7 @@ namespace SabreTools.DatFiles // Create a Part for every DipSwitch that includes it if (dipSwitchItem.ContainsKey(DatItems.Formats.DipSwitch.PartKey)) { + // TODO: Figure out how to do Part-level aggregation // TODO: Handle DipSwitch in Part inversion } @@ -517,6 +518,8 @@ namespace SabreTools.DatFiles // Create a Part and a DiskArea for every Disk that includes them if (diskItem.ContainsKey(DatItems.Formats.Disk.PartKey) && diskItem.ContainsKey(DatItems.Formats.Disk.DiskAreaKey)) { + // TODO: Figure out how to do Part-level aggregation + // TODO: Figure out how to do DiskArea-level aggregation // TODO: Handle Disk in Part inversion // TODO: Handle Disk in DiskArea inversion } @@ -699,6 +702,8 @@ namespace SabreTools.DatFiles // Create a Part and a DataArea for every Rom that includes them if (romItem.ContainsKey(DatItems.Formats.Rom.PartKey) && romItem.ContainsKey(DatItems.Formats.Rom.DataAreaKey)) { + // TODO: Figure out how to do Part-level aggregation + // TODO: Figure out how to do DataArea-level aggregation // TODO: Handle Rom in Part inversion // TODO: Handle Rom in DataArea inversion } diff --git a/SabreTools.DatFiles/Formats/Listxml.Writer.cs b/SabreTools.DatFiles/Formats/Listxml.Writer.cs index cae34dbe..32becf8b 100644 --- a/SabreTools.DatFiles/Formats/Listxml.Writer.cs +++ b/SabreTools.DatFiles/Formats/Listxml.Writer.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.DatItems; @@ -185,7 +184,9 @@ namespace SabreTools.DatFiles.Formats { logger.User($"Writing to '{outfile}'..."); - var mame = CreateMame(ignoreblanks); + // Serialize the input file + var metadata = ConvertMetadata(ignoreblanks); + var mame = new Serialization.CrossModel.Listxml().Deserialize(metadata); if (!(new Serialization.Files.Listxml().Serialize(mame, outfile))) { logger.Warning($"File '{outfile}' could not be written! See the log for more details."); @@ -201,755 +202,5 @@ namespace SabreTools.DatFiles.Formats logger.User($"'{outfile}' written!{Environment.NewLine}"); return true; } - - #region Converters - - /// - /// Create a Mame from the current internal information - /// - /// True if blank roms should be skipped on output, false otherwise - private Models.Listxml.Mame CreateMame(bool ignoreblanks) - { - var datafile = new Models.Listxml.Mame - { - Build = Header.GetStringFieldValue(Models.Metadata.Header.NameKey) - ?? Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey) - ?? Header.GetStringFieldValue(Models.Metadata.Header.BuildKey), - Debug = Header.GetBoolFieldValue(Models.Metadata.Header.DebugKey).FromYesNo(), - MameConfig = Header.GetStringFieldValue(Models.Metadata.Header.MameConfigKey), - - Game = CreateGames(ignoreblanks) - }; - - return datafile; - } - - /// - /// Create an array of GameBase from the current internal information - /// - /// True if blank roms should be skipped on output, false otherwise - private Models.Listxml.GameBase[]? CreateGames(bool ignoreblanks) - { - // If we don't have items, we can't do anything - if (this.Items == null || !this.Items.Any()) - return null; - - // Create a list of hold the games - var games = 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; - - // Get the first item for game information - var machine = items[0].GetFieldValue(DatItem.MachineKey); - var game = Listxml.CreateGame(machine!); - - // Create holders for all item types - var biosSets = new List(); - var roms = new List(); - var disks = new List(); - var deviceRefs = new List(); - var samples = new List(); - var chips = new List(); - var displays = new List(); - var dipSwitches = new List(); - var configurations = new List(); - var ports = new List(); - var adjusters = new List(); - var features = new List(); - var devices = new List(); - var slots = new List(); - var softwareLists = new List(); - var ramOptions = new List(); - - // 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 BiosSet biosset: - biosSets.Add(CreateBiosSet(biosset)); - break; - case Rom rom: - roms.Add(CreateRom(rom)); - break; - case Disk disk: - disks.Add(CreateDisk(disk)); - break; - case DeviceRef deviceref: - deviceRefs.Add(CreateDeviceRef(deviceref)); - break; - case Sample sample: - samples.Add(CreateSample(sample)); - break; - case Chip chip: - chips.Add(CreateChip(chip)); - break; - case Display display: - displays.Add(CreateDisplay(display)); - break; - case Sound sound: - game.Sound = CreateSound(sound); - break; - case Input input: - game.Input = CreateInput(input); - break; - case DipSwitch dipswitch: - dipSwitches.Add(CreateDipSwitch(dipswitch)); - break; - case Configuration configuration: - configurations.Add(CreateConfiguration(configuration)); - break; - case Port port: - ports.Add(CreatePort(port)); - break; - case Adjuster adjuster: - adjusters.Add(CreateAdjuster(adjuster)); - break; - case Driver driver: - game.Driver = CreateDriver(driver); - break; - case Feature feature: - features.Add(CreateFeature(feature)); - break; - case Device device: - devices.Add(CreateDevice(device)); - break; - case Slot slot: - slots.Add(CreateSlot(slot)); - break; - case DatItems.Formats.SoftwareList softwarelist: - softwareLists.Add(CreateSoftwareList(softwarelist)); - break; - case RamOption ramoption: - ramOptions.Add(CreateRamOption(ramoption)); - break; - } - } - - // Assign the values to the game - game.BiosSet = [.. biosSets]; - game.Rom = [.. roms]; - game.Disk = [.. disks]; - game.DeviceRef = [.. deviceRefs]; - game.Sample = [.. samples]; - game.Chip = [.. chips]; - game.Display = [.. displays]; - game.Video = null; - game.DipSwitch = [.. dipSwitches]; - game.Configuration = [.. configurations]; - game.Port = [.. ports]; - game.Adjuster = [.. adjusters]; - game.Feature = [.. features]; - game.Device = [.. devices]; - game.Slot = [.. slots]; - game.SoftwareList = [.. softwareLists]; - game.RamOption = [.. ramOptions]; - - // Add the game to the list - games.Add(game); - } - - return [.. games]; - } - - /// - /// Create a GameBase from the current internal information - /// - private static Models.Listxml.GameBase CreateGame(Machine machine) - { - var game = new Models.Listxml.Machine - { - Name = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey), - SourceFile = machine.GetStringFieldValue(Models.Metadata.Machine.SourceFileKey), - Runnable = machine.GetStringFieldValue(Models.Metadata.Machine.RunnableKey).AsEnumValue().AsStringValue(), - CloneOf = machine.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey), - RomOf = machine.GetStringFieldValue(Models.Metadata.Machine.RomOfKey), - SampleOf = machine.GetStringFieldValue(Models.Metadata.Machine.SampleOfKey), - Description = machine.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey), - Year = machine.GetStringFieldValue(Models.Metadata.Machine.YearKey), - Manufacturer = machine.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey), - History = machine.GetStringFieldValue(Models.Metadata.Machine.HistoryKey), - }; - - if (machine.GetBoolFieldValue(Models.Metadata.Machine.IsBiosKey) == true) - game.IsBios = "yes"; - if (machine.GetBoolFieldValue(Models.Metadata.Machine.IsDeviceKey) == true) - game.IsDevice = "yes"; - if (machine.GetBoolFieldValue(Models.Metadata.Machine.IsMechanicalKey) == true) - game.IsMechanical = "yes"; - - return game; - } - - /// - /// Create a BiosSet from the current BiosSet DatItem - /// - private static Models.Listxml.BiosSet CreateBiosSet(BiosSet item) - { - var biosset = new Models.Listxml.BiosSet - { - Name = item.GetName(), - Default = item.GetBoolFieldValue(Models.Metadata.BiosSet.DefaultKey).FromYesNo(), - Description = item.GetStringFieldValue(Models.Metadata.BiosSet.DescriptionKey), - }; - - return biosset; - } - - /// - /// Create a Rom from the current Rom DatItem - /// - private static Models.Listxml.Rom CreateRom(Rom item) - { - var rom = new Models.Listxml.Rom - { - Name = item.GetName(), - Bios = item.GetStringFieldValue(Models.Metadata.Rom.BiosKey), - Size = item.GetStringFieldValue(Models.Metadata.Rom.SizeKey), - CRC = item.GetStringFieldValue(Models.Metadata.Rom.CRCKey), - SHA1 = item.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), - Merge = item.GetStringFieldValue(Models.Metadata.Rom.MergeKey), - Region = item.GetStringFieldValue(Models.Metadata.Rom.RegionKey), - Offset = item.GetStringFieldValue(Models.Metadata.Rom.OffsetKey), - Status = item.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue().AsStringValue(useSecond: false), - Optional = item.GetBoolFieldValue(Models.Metadata.Rom.OptionalKey).FromYesNo(), - Dispose = item.GetBoolFieldValue(Models.Metadata.Rom.DisposeKey).FromYesNo(), - SoundOnly = item.GetBoolFieldValue(Models.Metadata.Rom.SoundOnlyKey).FromYesNo(), - }; - - return rom; - } - - /// - /// Create a Disk from the current Disk DatItem - /// - private static Models.Listxml.Disk CreateDisk(Disk item) - { - var disk = new Models.Listxml.Disk - { - Name = item.GetName(), - MD5 = item.GetStringFieldValue(Models.Metadata.Disk.MD5Key), - SHA1 = item.GetStringFieldValue(Models.Metadata.Disk.SHA1Key), - Merge = item.GetStringFieldValue(Models.Metadata.Disk.MergeKey), - Region = item.GetStringFieldValue(Models.Metadata.Disk.RegionKey), - Index = item.GetStringFieldValue(Models.Metadata.Disk.IndexKey), - Writable = item.GetBoolFieldValue(Models.Metadata.Disk.WritableKey).FromYesNo(), - Status = item.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue().AsStringValue(useSecond: false), - Optional = item.GetBoolFieldValue(Models.Metadata.Disk.OptionalKey).FromYesNo(), - }; - - return disk; - } - - /// - /// Create a DeviceRef from the current DeviceReference DatItem - /// - private static Models.Listxml.DeviceRef CreateDeviceRef(DeviceRef item) - { - var deviceref = new Models.Listxml.DeviceRef - { - Name = item.GetName(), - }; - - return deviceref; - } - - /// - /// Create a Sample from the current Sample DatItem - /// - private static Models.Listxml.Sample CreateSample(Sample item) - { - var sample = new Models.Listxml.Sample - { - Name = item.GetName(), - }; - - return sample; - } - - /// - /// Create a Chip from the current Chip DatItem - /// - private static Models.Listxml.Chip CreateChip(Chip item) - { - var chip = new Models.Listxml.Chip - { - Name = item.GetName(), - Tag = item.GetStringFieldValue(Models.Metadata.Chip.TagKey), - Type = item.GetStringFieldValue(Models.Metadata.Chip.ChipTypeKey).AsEnumValue().AsStringValue(), - SoundOnly = item.GetBoolFieldValue(Models.Metadata.Chip.SoundOnlyKey).FromYesNo(), - Clock = item.GetInt64FieldValue(Models.Metadata.Chip.TagKey)?.ToString(), - }; - - return chip; - } - - /// - /// Create a Display from the current Display DatItem - /// - private static Models.Listxml.Display CreateDisplay(Display item) - { - var display = new Models.Listxml.Display - { - Tag = item.GetStringFieldValue(Models.Metadata.Display.TagKey), - Type = item.GetStringFieldValue(Models.Metadata.Display.DisplayTypeKey).AsEnumValue().AsStringValue(), - Rotate = item.GetInt64FieldValue(Models.Metadata.Display.RotateKey)?.ToString(), - FlipX = item.GetBoolFieldValue(Models.Metadata.Display.FlipXKey).FromYesNo(), - Width = item.GetStringFieldValue(Models.Metadata.Display.WidthKey)?.ToString(), - Height = item.GetStringFieldValue(Models.Metadata.Display.HeightKey)?.ToString(), - Refresh = item.GetDoubleFieldValue(Models.Metadata.Display.RefreshKey)?.ToString(), - PixClock = item.GetStringFieldValue(Models.Metadata.Display.PixClockKey)?.ToString(), - HTotal = item.GetStringFieldValue(Models.Metadata.Display.HTotalKey)?.ToString(), - HBEnd = item.GetStringFieldValue(Models.Metadata.Display.HBEndKey)?.ToString(), - HBStart = item.GetStringFieldValue(Models.Metadata.Display.HBStartKey)?.ToString(), - VTotal = item.GetStringFieldValue(Models.Metadata.Display.VTotalKey)?.ToString(), - VBEnd = item.GetStringFieldValue(Models.Metadata.Display.VBEndKey)?.ToString(), - VBStart = item.GetStringFieldValue(Models.Metadata.Display.VBStartKey)?.ToString(), - }; - - return display; - } - - /// - /// Create a Sound from the current Sound DatItem - /// - private static Models.Listxml.Sound CreateSound(Sound item) - { - var sound = new Models.Listxml.Sound - { - Channels = item.GetInt64FieldValue(Models.Metadata.Sound.ChannelsKey)?.ToString(), - }; - - return sound; - } - - /// - /// Create an Input from the current Input DatItem - /// - private static Models.Listxml.Input CreateInput(Input item) - { - var input = new Models.Listxml.Input - { - Service = item.GetBoolFieldValue(Models.Metadata.Input.ServiceKey).FromYesNo(), - Tilt = item.GetBoolFieldValue(Models.Metadata.Input.TiltKey).FromYesNo(), - Players = item.GetInt64FieldValue(Models.Metadata.Input.PlayersKey)?.ToString(), - //ControlAttr = item.GetStringFieldValue(Models.Metadata.Input.ControlKey), - Buttons = item.GetInt64FieldValue(Models.Metadata.Input.ButtonsKey)?.ToString(), - Coins = item.GetInt64FieldValue(Models.Metadata.Input.CoinsKey)?.ToString(), - }; - - var controls = new List(); - foreach (var controlItem in item.GetFieldValue(Models.Metadata.Input.ControlKey) ?? []) - { - var control = CreateControl(controlItem); - controls.Add(control); - } - - if (controls.Any()) - input.Control = [.. controls]; - - return input; - } - - /// - /// Create an Control from the current Input DatItem - /// - private static Models.Listxml.Control CreateControl(Control item) - { - var control = new Models.Listxml.Control - { - Type = item.GetStringFieldValue(Models.Metadata.Control.ControlTypeKey).AsEnumValue().AsStringValue(), - Player = item.GetInt64FieldValue(Models.Metadata.Control.PlayerKey)?.ToString(), - Buttons = item.GetInt64FieldValue(Models.Metadata.Control.ButtonsKey)?.ToString(), - ReqButtons = item.GetInt64FieldValue(Models.Metadata.Control.ReqButtonsKey)?.ToString(), - Minimum = item.GetInt64FieldValue(Models.Metadata.Control.MinimumKey)?.ToString(), - Maximum = item.GetInt64FieldValue(Models.Metadata.Control.MaximumKey)?.ToString(), - Sensitivity = item.GetInt64FieldValue(Models.Metadata.Control.SensitivityKey)?.ToString(), - KeyDelta = item.GetInt64FieldValue(Models.Metadata.Control.KeyDeltaKey)?.ToString(), - Reverse = item.GetBoolFieldValue(Models.Metadata.Control.ReverseKey).FromYesNo(), - Ways = item.GetStringFieldValue(Models.Metadata.Control.WaysKey), - Ways2 = item.GetStringFieldValue(Models.Metadata.Control.Ways2Key), - Ways3 = item.GetStringFieldValue(Models.Metadata.Control.Ways3Key), - }; - - return control; - } - - /// - /// Create an DipSwitch from the current DipSwitch DatItem - /// - private static Models.Listxml.DipSwitch CreateDipSwitch(DipSwitch item) - { - var dipswitch = new Models.Listxml.DipSwitch - { - Name = item.GetName(), - Tag = item.GetStringFieldValue(Models.Metadata.DipSwitch.TagKey), - Mask = item.GetStringFieldValue(Models.Metadata.DipSwitch.MaskKey), - }; - - if (item.ConditionsSpecified) - { - var conditionItem = item.GetFieldValue(Models.Metadata.DipSwitch.ConditionKey)?.FirstOrDefault(); - var condition = new Models.Listxml.Condition - { - Tag = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.TagKey), - Mask = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.MaskKey), - Relation = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue(), - Value = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.ValueKey), - }; - dipswitch.Condition = condition; - } - - var diplocations = new List(); - foreach (var locationItem in item.GetFieldValue(Models.Metadata.DipSwitch.DipLocationKey) ?? []) - { - var control = CreateDipLocation(locationItem); - diplocations.Add(control); - } - - if (diplocations.Any()) - dipswitch.DipLocation = [.. diplocations]; - - var dipvalues = new List(); - foreach (var dipValueItem in item.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey) ?? []) - { - var dipvalue = CreateDipValue(dipValueItem); - dipvalues.Add(dipvalue); - } - - if (dipvalues.Any()) - dipswitch.DipValue = [.. dipvalues]; - - return dipswitch; - } - - /// - /// Create a DipLocation from the current DipLocation DatItem - /// - private static Models.Listxml.DipLocation CreateDipLocation(DipLocation item) - { - var diplocation = new Models.Listxml.DipLocation - { - Name = item.GetName(), - Number = item.GetInt64FieldValue(Models.Metadata.DipLocation.NumberKey)?.ToString(), - Inverted = item.GetBoolFieldValue(Models.Metadata.DipLocation.InvertedKey).FromYesNo(), - }; - - return diplocation; - } - - /// - /// Create a DipValue from the current DipValue DatItem - /// - private static Models.Listxml.DipValue CreateDipValue(DipValue item) - { - var dipvalue = new Models.Listxml.DipValue - { - Name = item.GetName(), - Value = item.GetStringFieldValue(Models.Metadata.DipValue.ValueKey), - Default = item.GetBoolFieldValue(Models.Metadata.DipValue.DefaultKey).FromYesNo(), - }; - - if (item.ConditionsSpecified) - { - var conditionItem = item.GetFieldValue(Models.Metadata.DipValue.ConditionKey)?.FirstOrDefault(); - var condition = new Models.Listxml.Condition - { - Tag = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.TagKey), - Mask = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.MaskKey), - Relation = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue(), - Value = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.ValueKey), - }; - dipvalue.Condition = condition; - } - - return dipvalue; - } - - /// - /// Create an Configuration from the current Configuration DatItem - /// - private static Models.Listxml.Configuration CreateConfiguration(Configuration item) - { - var configuration = new Models.Listxml.Configuration - { - Name = item.GetName(), - Tag = item.GetStringFieldValue(Models.Metadata.Configuration.TagKey), - Mask = item.GetStringFieldValue(Models.Metadata.Configuration.MaskKey), - }; - - if (item.ConditionsSpecified) - { - var conditionItem = item.GetFieldValue(Models.Metadata.Configuration.ConditionKey)?.FirstOrDefault(); - var condition = new Models.Listxml.Condition - { - Tag = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.TagKey), - Mask = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.MaskKey), - Relation = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue(), - Value = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.ValueKey), - }; - configuration.Condition = condition; - } - - var confLocations = new List(); - foreach (var location in item.GetFieldValue(Models.Metadata.Configuration.ConfLocationKey) ?? []) - { - var control = CreateConfLocation(location); - confLocations.Add(control); - } - - if (confLocations.Any()) - configuration.ConfLocation = [.. confLocations]; - - var confsettings = new List(); - foreach (var confSettingItem in item.GetFieldValue(Models.Metadata.Configuration.ConfSettingKey) ?? []) - { - var dipvalue = CreateConfSetting(confSettingItem); - confsettings.Add(dipvalue); - } - - if (confsettings.Any()) - configuration.ConfSetting = [.. confsettings]; - - return configuration; - } - - /// - /// Create a ConfLocation from the current ConfLocation DatItem - /// - private static Models.Listxml.ConfLocation CreateConfLocation(ConfLocation item) - { - var conflocation = new Models.Listxml.ConfLocation - { - Name = item.GetName(), - Number = item.GetInt64FieldValue(Models.Metadata.ConfLocation.NumberKey)?.ToString(), - Inverted = item.GetBoolFieldValue(Models.Metadata.ConfLocation.InvertedKey).FromYesNo(), - }; - - return conflocation; - } - - /// - /// Create a ConfSetting from the current ConfSetting DatItem - /// - private static Models.Listxml.ConfSetting CreateConfSetting(ConfSetting item) - { - var confsetting = new Models.Listxml.ConfSetting - { - Name = item.GetName(), - Value = item.GetStringFieldValue(Models.Metadata.ConfSetting.ValueKey), - Default = item.GetBoolFieldValue(Models.Metadata.ConfSetting.DefaultKey).FromYesNo(), - }; - - if (item.ConditionsSpecified) - { - var conditionItem = item.GetFieldValue(Models.Metadata.ConfSetting.ConditionKey)?.FirstOrDefault(); - var condition = new Models.Listxml.Condition - { - Tag = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.TagKey), - Mask = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.MaskKey), - Relation = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue(), - Value = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.ValueKey), - }; - confsetting.Condition = condition; - } - - return confsetting; - } - - /// - /// Create a Port from the current Port DatItem - /// - private static Models.Listxml.Port CreatePort(Port item) - { - var port = new Models.Listxml.Port - { - Tag = item.GetStringFieldValue(Models.Metadata.Port.TagKey), - }; - - return port; - } - - /// - /// Create a Adjuster from the current Adjuster DatItem - /// - private static Models.Listxml.Adjuster CreateAdjuster(Adjuster item) - { - var adjuster = new Models.Listxml.Adjuster - { - Name = item.GetName(), - Default = item.GetBoolFieldValue(Models.Metadata.Adjuster.DefaultKey).FromYesNo(), - }; - - if (item.ConditionsSpecified) - { - var conditionItem = item.GetFieldValue(Models.Metadata.Adjuster.ConditionKey)?.FirstOrDefault(); - var condition = new Models.Listxml.Condition - { - Tag = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.TagKey), - Mask = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.MaskKey), - Relation = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.RelationKey).AsEnumValue().AsStringValue(), - Value = conditionItem?.GetStringFieldValue(Models.Metadata.Condition.ValueKey), - }; - adjuster.Condition = condition; - } - - return adjuster; - } - - /// - /// Create a Driver from the current Driver DatItem - /// - private static Models.Listxml.Driver CreateDriver(Driver item) - { - var driver = new Models.Listxml.Driver - { - Status = item.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue().AsStringValue(), - Color = item.GetStringFieldValue(Models.Metadata.Driver.ColorKey).AsEnumValue().AsStringValue(), - Sound = item.GetStringFieldValue(Models.Metadata.Driver.SoundKey).AsEnumValue().AsStringValue(), - PaletteSize = item.GetInt64FieldValue(Models.Metadata.Driver.PaletteSizeKey)?.ToString(), - Emulation = item.GetStringFieldValue(Models.Metadata.Driver.EmulationKey).AsEnumValue().AsStringValue(), - Cocktail = item.GetStringFieldValue(Models.Metadata.Driver.CocktailKey).AsEnumValue().AsStringValue(), - SaveState = item.GetStringFieldValue(Models.Metadata.Driver.SaveStateKey).AsEnumValue().AsStringValue(useSecond: true), - RequiresArtwork = item.GetBoolFieldValue(Models.Metadata.Driver.RequiresArtworkKey).FromYesNo(), - Unofficial = item.GetBoolFieldValue(Models.Metadata.Driver.UnofficialKey).FromYesNo(), - NoSoundHardware = item.GetBoolFieldValue(Models.Metadata.Driver.NoSoundHardwareKey).FromYesNo(), - Incomplete = item.GetBoolFieldValue(Models.Metadata.Driver.IncompleteKey).FromYesNo(), - }; - - return driver; - } - - /// - /// Create a Feature from the current Feature DatItem - /// - private static Models.Listxml.Feature CreateFeature(Feature item) - { - var feature = new Models.Listxml.Feature - { - Type = item.GetStringFieldValue(Models.Metadata.Feature.FeatureTypeKey).AsEnumValue().AsStringValue(), - Status = item.GetStringFieldValue(Models.Metadata.Feature.StatusKey).AsEnumValue().AsStringValue(), - Overall = item.GetStringFieldValue(Models.Metadata.Feature.OverallKey).AsEnumValue().AsStringValue(), - }; - - return feature; - } - - /// - /// Create a Device from the current Device DatItem - /// - private static Models.Listxml.Device CreateDevice(Device item) - { - var device = new Models.Listxml.Device - { - Type = item.GetStringFieldValue(Models.Metadata.Device.DeviceTypeKey).AsEnumValue().AsStringValue(), - Tag = item.GetStringFieldValue(Models.Metadata.Device.TagKey), - FixedImage = item.GetStringFieldValue(Models.Metadata.Device.FixedImageKey), - Mandatory = item.GetInt64FieldValue(Models.Metadata.Device.MandatoryKey)?.ToString(), - Interface = item.GetStringFieldValue(Models.Metadata.Device.InterfaceKey), - }; - - if (item.InstancesSpecified) - { - var instanceItem = item.GetFieldValue(Models.Metadata.Device.InstanceKey)?.FirstOrDefault(); - var instance = new Models.Listxml.Instance - { - Name = instanceItem?.GetName(), - BriefName = instanceItem?.GetStringFieldValue(Models.Metadata.Instance.BriefNameKey), - }; - device.Instance = instance; - } - - var extensions = new List(); - foreach (var extensionItem in item.GetFieldValue(Models.Metadata.Device.ExtensionKey) ?? []) - { - var extension = new Models.Listxml.Extension - { - Name = extensionItem.GetName(), - }; - extensions.Add(extension); - } - - if (extensions.Any()) - device.Extension = [.. extensions]; - - return device; - } - - /// - /// Create a Slot from the current Slot DatItem - /// - private static Models.Listxml.Slot CreateSlot(Slot item) - { - var slot = new Models.Listxml.Slot - { - Name = item.GetName(), - }; - - var slotoptions = new List(); - foreach (var slotoptionItem in item.GetFieldValue(Models.Metadata.Slot.SlotOptionKey) ?? []) - { - var slotoption = new Models.Listxml.SlotOption - { - Name = slotoptionItem.GetName(), - DevName = slotoptionItem.GetStringFieldValue(Models.Metadata.SlotOption.DevNameKey), - Default = slotoptionItem.GetBoolFieldValue(Models.Metadata.SlotOption.DefaultKey).FromYesNo(), - }; - slotoptions.Add(slotoption); - } - - if (slotoptions.Any()) - slot.SlotOption = [.. slotoptions]; - - return slot; - } - - /// - /// Create a SoftwareList from the current SoftwareList DatItem - /// - private static Models.Listxml.SoftwareList CreateSoftwareList(DatItems.Formats.SoftwareList item) - { - var softwarelist = new Models.Listxml.SoftwareList - { - Tag = item.GetStringFieldValue(Models.Metadata.SoftwareList.TagKey), - Name = item.GetName(), - Status = item.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue().AsStringValue(), - Filter = item.GetStringFieldValue(Models.Metadata.SoftwareList.FilterKey), - }; - - return softwarelist; - } - - /// - /// Create a RamOption from the current RamOption DatItem - /// - private static Models.Listxml.RamOption CreateRamOption(RamOption item) - { - var softwarelist = new Models.Listxml.RamOption - { - Name = item.GetName(), - Default = item.GetBoolFieldValue(Models.Metadata.RamOption.DefaultKey).FromYesNo(), - Content = item.GetStringFieldValue(Models.Metadata.RamOption.ContentKey), - }; - - return softwarelist; - } - - #endregion } } diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs index 38162a1b..5a1bbbb9 100644 --- a/SabreTools.DatItems/DatItem.cs +++ b/SabreTools.DatItems/DatItem.cs @@ -1,5 +1,7 @@ using System; using System.IO; +using System.Linq; +using System.Reflection; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; @@ -858,8 +860,12 @@ namespace SabreTools.DatItems /// Clone of the DatItem public override object Clone() { - var clone = Activator.CreateInstance>(); - clone._internal = _internal?.Clone() as T ?? Activator.CreateInstance(); + var concrete = Assembly.GetExecutingAssembly() + .GetTypes() + .FirstOrDefault(t => !t.IsAbstract && t.IsClass && t.BaseType == typeof(DatItem)); + + var clone = Activator.CreateInstance(concrete!); + (clone as DatItem)!._internal = _internal?.Clone() as T ?? Activator.CreateInstance(); return clone; } diff --git a/SabreTools.DatItems/Formats/BiosSet.cs b/SabreTools.DatItems/Formats/BiosSet.cs index 7564941c..22eaa0d1 100644 --- a/SabreTools.DatItems/Formats/BiosSet.cs +++ b/SabreTools.DatItems/Formats/BiosSet.cs @@ -13,7 +13,7 @@ namespace SabreTools.DatItems.Formats #region Fields /// /> - protected override ItemType ItemType => ItemType.Analog; + protected override ItemType ItemType => ItemType.BiosSet; /// /> protected override string? NameKey => Models.Metadata.BiosSet.NameKey;