diff --git a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs b/SabreTools.DatFiles/Formats/Logiqx.Writer.cs index c8f46d64..bb472a47 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Writer.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.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; @@ -133,8 +132,6 @@ namespace SabreTools.DatFiles.Formats { logger.User($"Writing to '{outfile}'..."); - //var datafile = CreateDatafile(ignoreblanks);s - // Serialize the input file var metadata = ConvertMetadata(ignoreblanks); var datafile = new Serialization.CrossModel.Logiqx().Deserialize(metadata); @@ -161,491 +158,5 @@ namespace SabreTools.DatFiles.Formats logger.User($"'{outfile}' written!{Environment.NewLine}"); return true; } - - #region Converters - - /// - /// Create a Datafile from the current internal information - /// - /// True if blank roms should be skipped on output, false otherwise - private Models.Logiqx.Datafile CreateDatafile(bool ignoreblanks) - { - var datafile = new Models.Logiqx.Datafile - { - Build = Header.GetStringFieldValue(Models.Metadata.Header.BuildKey), - Debug = Header.GetBoolFieldValue(Models.Metadata.Header.DebugKey).FromYesNo(), - - Header = CreateHeader(), - Game = CreateGames(ignoreblanks) - }; - - if (!string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.IdKey))) - datafile.SchemaLocation = "https://datomatic.no-intro.org/stuff https://datomatic.no-intro.org/stuff/schema_nointro_datfile_v3.xsd"; - - return datafile; - } - - /// - /// Create a Header from the current internal information - /// - private Models.Logiqx.Header? CreateHeader() - { - // If we don't have a header, we can't do anything - if (this.Header == null) - return null; - - var header = new Models.Logiqx.Header - { - Id = Header.GetStringFieldValue(Models.Metadata.Header.IdKey), - Name = Header.GetStringFieldValue(Models.Metadata.Header.NameKey), - Description = Header.GetStringFieldValue(Models.Metadata.Header.DescriptionKey), - RootDir = Header.GetStringFieldValue(Models.Metadata.Header.RootDirKey), - Category = Header.GetStringFieldValue(Models.Metadata.Header.CategoryKey), - Version = Header.GetStringFieldValue(Models.Metadata.Header.VersionKey), - Date = Header.GetStringFieldValue(Models.Metadata.Header.DateKey), - Author = Header.GetStringFieldValue(Models.Metadata.Header.AuthorKey), - Email = Header.GetStringFieldValue(Models.Metadata.Header.EmailKey), - Homepage = Header.GetStringFieldValue(Models.Metadata.Header.HomepageKey), - Url = Header.GetStringFieldValue(Models.Metadata.Header.UrlKey), - Comment = Header.GetStringFieldValue(Models.Metadata.Header.CommentKey), - Type = Header.GetStringFieldValue(Models.Metadata.Header.TypeKey), - - ClrMamePro = CreateClrMamePro(), - RomCenter = CreateRomCenter(), - }; - - return header; - } - - /// - /// Create a ClrMamePro from the current internal information - /// - private Models.Logiqx.ClrMamePro? CreateClrMamePro() - { - // If we don't have subheader values, we can't do anything - if (Header.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue() == MergingFlag.None - && Header.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue() == NodumpFlag.None - && Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue() == PackingFlag.None - && string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey))) - { - return null; - } - - var subheader = new Models.Logiqx.ClrMamePro - { - Header = Header.GetStringFieldValue(Models.Metadata.Header.HeaderKey), - }; - - if (Header.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue() != MergingFlag.None) - subheader.ForceMerging = Header.GetStringFieldValue(Models.Metadata.Header.ForceMergingKey).AsEnumValue().AsStringValue(useSecond: false); - if (Header.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue() != NodumpFlag.None) - subheader.ForceNodump = Header.GetStringFieldValue(Models.Metadata.Header.ForceNodumpKey).AsEnumValue().AsStringValue(); - if (Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue() != PackingFlag.None) - subheader.ForcePacking = Header.GetStringFieldValue(Models.Metadata.Header.ForcePackingKey).AsEnumValue().AsStringValue(useSecond: false); - - return subheader; - } - - /// - /// Create a RomCenter from the current internal information - /// - private Models.Logiqx.RomCenter? CreateRomCenter() - { - // If we don't have subheader values, we can't do anything - if (string.IsNullOrEmpty(Header.GetStringFieldValue(Models.Metadata.Header.SystemKey)) - && Header.GetStringFieldValue(Models.Metadata.Header.BiosModeKey).AsEnumValue() == MergingFlag.None - && Header.GetBoolFieldValue(Models.Metadata.Header.LockBiosModeKey) == null - && Header.GetBoolFieldValue(Models.Metadata.Header.LockRomModeKey) == null - && Header.GetBoolFieldValue(Models.Metadata.Header.LockSampleModeKey) == null - && Header.GetStringFieldValue(Models.Metadata.Header.RomModeKey).AsEnumValue() == MergingFlag.None - && Header.GetStringFieldValue(Models.Metadata.Header.SampleModeKey).AsEnumValue() == MergingFlag.None) - { - return null; - } - - var subheader = new Models.Logiqx.RomCenter - { - Plugin = Header.GetStringFieldValue(Models.Metadata.Header.PluginKey), - }; - - if (Header.GetStringFieldValue(Models.Metadata.Header.RomModeKey).AsEnumValue() != MergingFlag.None) - subheader.RomMode = Header.GetStringFieldValue(Models.Metadata.Header.RomModeKey).AsEnumValue().AsStringValue(useSecond: true); - if (Header.GetStringFieldValue(Models.Metadata.Header.BiosModeKey).AsEnumValue() != MergingFlag.None) - subheader.BiosMode = Header.GetStringFieldValue(Models.Metadata.Header.BiosModeKey).AsEnumValue().AsStringValue(useSecond: true); - if (Header.GetStringFieldValue(Models.Metadata.Header.SampleModeKey).AsEnumValue() != MergingFlag.None) - subheader.SampleMode = Header.GetStringFieldValue(Models.Metadata.Header.SampleModeKey).AsEnumValue().AsStringValue(useSecond: true); - - if (Header.GetBoolFieldValue(Models.Metadata.Header.LockRomModeKey) != null) - subheader.LockRomMode = Header.GetBoolFieldValue(Models.Metadata.Header.LockRomModeKey).FromYesNo(); - if (Header.GetBoolFieldValue(Models.Metadata.Header.LockBiosModeKey) != null) - subheader.LockBiosMode = Header.GetBoolFieldValue(Models.Metadata.Header.LockBiosModeKey).FromYesNo(); - if (Header.GetBoolFieldValue(Models.Metadata.Header.LockSampleModeKey) != null) - subheader.LockSampleMode = Header.GetBoolFieldValue(Models.Metadata.Header.LockSampleModeKey).FromYesNo(); - - return subheader; - } - - /// - /// Create an array of GameBase from the current internal information - /// - /// True if blank roms should be skipped on output, false otherwise - private Models.Logiqx.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 = CreateGame(machine!); - - // Create holders for all item types - var releases = new List(); - var biossets = new List(); - var roms = new List(); - var disks = new List(); - var medias = new List(); - var samples = new List(); - var archives = new List(); - var devicerefs = new List(); - var softwarelists = 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 Release release: - releases.Add(CreateRelease(release)); - break; - 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 Media media: - medias.Add(CreateMedia(media)); - break; - case Sample sample: - samples.Add(CreateSample(sample)); - break; - case Archive archive: - archives.Add(CreateArchive(archive)); - break; - case DeviceRef deviceref: - devicerefs.Add(CreateDeviceRef(deviceref)); - break; - case Driver driver: - game.Driver = CreateDriver(driver); - break; - case DatItems.Formats.SoftwareList softwarelist: - softwarelists.Add(CreateSoftwareList(softwarelist)); - break; - } - } - - // Assign the values to the game - game.Release = [.. releases]; - game.BiosSet = [.. biossets]; - game.Rom = [.. roms]; - game.Disk = [.. disks]; - game.Media = [.. medias]; - game.Sample = [.. samples]; - game.Archive = [.. archives]; - game.DeviceRef = [.. devicerefs]; - game.SoftwareList = [.. softwarelists]; - - // Add the game to the list - games.Add(game); - } - - return [.. games]; - } - - /// - /// Create a GameBase from the current internal information - /// - private Models.Logiqx.GameBase CreateGame(Machine machine) - { - Models.Logiqx.GameBase game = _deprecated ? new Models.Logiqx.Game() : new Models.Logiqx.Machine(); - - game.Name = machine.GetStringFieldValue(Models.Metadata.Machine.NameKey); - game.SourceFile = machine.GetStringFieldValue(Models.Metadata.Machine.SourceFileKey); - 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"; - game.CloneOf = machine.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey); - game.RomOf = machine.GetStringFieldValue(Models.Metadata.Machine.RomOfKey); - game.SampleOf = machine.GetStringFieldValue(Models.Metadata.Machine.SampleOfKey); - game.Board = machine.GetStringFieldValue(Models.Metadata.Machine.BoardKey); - game.RebuildTo = machine.GetStringFieldValue(Models.Metadata.Machine.RebuildToKey); - game.Id = machine.GetStringFieldValue(Models.Metadata.Machine.IdKey); - game.CloneOfId = machine.GetStringFieldValue(Models.Metadata.Machine.CloneOfIdKey); - game.Runnable = machine.GetStringFieldValue(Models.Metadata.Machine.RunnableKey).AsEnumValue().AsStringValue(); - if (machine.GetStringFieldValue(Models.Metadata.Machine.CommentKey) != null) - { - if (machine.GetStringFieldValue(Models.Metadata.Machine.CommentKey)!.Contains(';')) - game.Comment = machine.GetStringFieldValue(Models.Metadata.Machine.CommentKey)!.Split(';'); - else - game.Comment = [machine.GetStringFieldValue(Models.Metadata.Machine.CommentKey)!]; - } - game.Description = machine.GetStringFieldValue(Models.Metadata.Machine.DescriptionKey); - game.Year = machine.GetStringFieldValue(Models.Metadata.Machine.YearKey); - game.Manufacturer = machine.GetStringFieldValue(Models.Metadata.Machine.ManufacturerKey); - game.Publisher = machine.GetStringFieldValue(Models.Metadata.Machine.PublisherKey); - if (machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey) != null) - { - if (machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey)!.Contains(';')) - game.Category = machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey)!.Split(';'); - else - game.Category = [machine.GetStringFieldValue(Models.Metadata.Machine.CategoryKey)!]; - } - game.Trurip = CreateTrurip(machine); - - return game; - } - - /// - /// Create a Trurip from the current internal information - /// - private static Models.Logiqx.Trurip? CreateTrurip(Machine machine) - { - // If we don't have subheader values, we can't do anything - if (string.IsNullOrEmpty(machine.TitleID) - && string.IsNullOrEmpty(machine.Developer) - && string.IsNullOrEmpty(machine.Genre) - && string.IsNullOrEmpty(machine.Subgenre) - && string.IsNullOrEmpty(machine.Ratings) - && string.IsNullOrEmpty(machine.Score) - && string.IsNullOrEmpty(machine.Enabled) - && !machine.CrcSpecified - && string.IsNullOrEmpty(machine.RelatedTo)) - { - return null; - } - - var trurip = new Models.Logiqx.Trurip - { - TitleID = machine.TitleID, - Publisher = machine.GetStringFieldValue(Models.Metadata.Machine.PublisherKey), - Developer = machine.Developer, - Year = machine.GetStringFieldValue(Models.Metadata.Machine.YearKey), - Genre = machine.Genre, - Subgenre = machine.Subgenre, - Ratings = machine.Ratings, - Score = machine.Score, - Players = machine.GetStringFieldValue(Models.Metadata.Machine.PlayersKey), - Enabled = machine.Enabled, - CRC = machine.Crc.FromYesNo(), - Source = machine.GetStringFieldValue(Models.Metadata.Machine.SourceFileKey), - CloneOf = machine.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey), - RelatedTo = machine.RelatedTo, - }; - - return trurip; - } - - /// - /// Create a Release from the current Release DatItem - /// - private static Models.Logiqx.Release CreateRelease(Release item) - { - var release = new Models.Logiqx.Release - { - Name = item.GetName(), - Region = item.GetStringFieldValue(Models.Metadata.Release.RegionKey), - Language = item.GetStringFieldValue(Models.Metadata.Release.LanguageKey), - Date = item.GetStringFieldValue(Models.Metadata.Release.DateKey), - Default = item.GetBoolFieldValue(Models.Metadata.Release.DefaultKey).FromYesNo(), - }; - - return release; - } - - /// - /// Create a BiosSet from the current BiosSet DatItem - /// - private static Models.Logiqx.BiosSet CreateBiosSet(BiosSet item) - { - var biosset = new Models.Logiqx.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.Logiqx.Rom CreateRom(Rom item) - { - var rom = new Models.Logiqx.Rom - { - Name = item.GetName(), - Size = item.GetStringFieldValue(Models.Metadata.Rom.SizeKey), - CRC = item.GetStringFieldValue(Models.Metadata.Rom.CRCKey), - MD5 = item.GetStringFieldValue(Models.Metadata.Rom.MD5Key), - SHA1 = item.GetStringFieldValue(Models.Metadata.Rom.SHA1Key), - SHA256 = item.GetStringFieldValue(Models.Metadata.Rom.SHA256Key), - SHA384 = item.GetStringFieldValue(Models.Metadata.Rom.SHA384Key), - SHA512 = item.GetStringFieldValue(Models.Metadata.Rom.SHA512Key), - SpamSum = item.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey), - xxHash364 = item.GetStringFieldValue(Models.Metadata.Rom.xxHash364Key), - xxHash3128 = item.GetStringFieldValue(Models.Metadata.Rom.xxHash3128Key), - Merge = item.GetStringFieldValue(Models.Metadata.Rom.MergeKey), - Serial = item.GetStringFieldValue(Models.Metadata.Rom.SerialKey), - Header = item.GetStringFieldValue(Models.Metadata.Rom.HeaderKey), - Date = item.GetStringFieldValue(Models.Metadata.Rom.DateKey), - Inverted = item.GetBoolFieldValue(Models.Metadata.Rom.InvertedKey).FromYesNo(), - MIA = item.GetBoolFieldValue(Models.Metadata.Rom.MIAKey).FromYesNo(), - }; - - if (item.ItemStatusSpecified) - rom.Status = item.GetStringFieldValue(Models.Metadata.Rom.StatusKey).AsEnumValue().AsStringValue(useSecond: false); - - return rom; - } - - /// - /// Create a Disk from the current Disk DatItem - /// - private static Models.Logiqx.Disk CreateDisk(Disk item) - { - var disk = new Models.Logiqx.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), - }; - - if (item.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue() != ItemStatus.NULL) - disk.Status = item.GetStringFieldValue(Models.Metadata.Disk.StatusKey).AsEnumValue().AsStringValue(useSecond: false); - - return disk; - } - - /// - /// Create a Media from the current Media DatItem - /// - private static Models.Logiqx.Media CreateMedia(Media item) - { - var media = new Models.Logiqx.Media - { - Name = item.GetName(), - MD5 = item.GetStringFieldValue(Models.Metadata.Media.MD5Key), - SHA1 = item.GetStringFieldValue(Models.Metadata.Media.SHA1Key), - SHA256 = item.GetStringFieldValue(Models.Metadata.Media.SHA256Key), - SpamSum = item.GetStringFieldValue(Models.Metadata.Media.SpamSumKey), - }; - return media; - } - - /// - /// Create a Sample from the current Sample DatItem - /// - private static Models.Logiqx.Sample CreateSample(Sample item) - { - var sample = new Models.Logiqx.Sample - { - Name = item.GetName(), - }; - return sample; - } - - /// - /// Create a Archive from the current Archive DatItem - /// - private static Models.Logiqx.Archive CreateArchive(Archive item) - { - var archive = new Models.Logiqx.Archive - { - Name = item.GetName(), - }; - return archive; - } - - /// - /// Create a DeviceRef from the current Chip DatItem - /// - private static Models.Logiqx.DeviceRef CreateDeviceRef(DeviceRef item) - { - var deviceref = new Models.Logiqx.DeviceRef - { - Name = item.GetName(), - }; - return deviceref; - } - - /// - /// Create a Driver from the current Driver DatItem - /// - private static Models.Logiqx.Driver CreateDriver(Driver item) - { - var driver = new Models.Logiqx.Driver - { - Status = item.GetStringFieldValue(Models.Metadata.Driver.StatusKey).AsEnumValue().AsStringValue(), - 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 SoftwareList from the current SoftwareList DatItem - /// - private static Models.Logiqx.SoftwareList CreateSoftwareList(DatItems.Formats.SoftwareList item) - { - var softwarelist = new Models.Logiqx.SoftwareList - { - Tag = item.GetStringFieldValue(Models.Metadata.SoftwareList.TagKey), - Name = item.GetName(), - Filter = item.GetStringFieldValue(Models.Metadata.SoftwareList.FilterKey), - }; - - if (item.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue() != SoftwareListStatus.None) - softwarelist.Status = item.GetStringFieldValue(Models.Metadata.SoftwareList.StatusKey).AsEnumValue().AsStringValue(); - - return softwarelist; - } - - #endregion } }