From bcd765b3750587433833298436eede24df29d738 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 20 Aug 2020 22:42:04 -0700 Subject: [PATCH] Wire up Logiqx TruRip/EmuArc fields --- SabreTools.Library/DatFiles/Json.cs | 140 ++++++++- SabreTools.Library/DatFiles/Logiqx.cs | 78 +++++- SabreTools.Library/DatFiles/SeparatedValue.cs | 77 +++++ SabreTools.Library/DatItems/DatItem.cs | 11 + SabreTools.Library/DatItems/Enums.cs | 56 +++- SabreTools.Library/DatItems/Machine.cs | 265 ++++++++++++++++-- SabreTools.Library/Filtering/Filter.cs | 116 ++++++++ SabreTools.Library/Tools/Converters.cs | 37 +++ 8 files changed, 726 insertions(+), 54 deletions(-) diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index 0282f67d..90528b5f 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -451,7 +451,8 @@ namespace SabreTools.Library.DatFiles switch (jtr.Value) { - // Common + #region Common + case "name": machine.Name = jtr.ReadAsString(); break; @@ -504,7 +505,10 @@ namespace SabreTools.Library.DatFiles ReadItems(sr, jtr, filename, indexId, machine); break; - // AttractMode + #endregion + + #region AttractMode + case "players": machine.Players = jtr.ReadAsString(); break; @@ -527,7 +531,10 @@ namespace SabreTools.Library.DatFiles machine.Buttons = jtr.ReadAsString(); break; - // ListXML + #endregion + + #region ListXML + case "sourcefile": machine.SourceFile = jtr.ReadAsString(); break; @@ -571,7 +578,10 @@ namespace SabreTools.Library.DatFiles break; - // Logiqx + #endregion + + #region Logiqx + case "board": machine.Board = jtr.ReadAsString(); break; @@ -579,11 +589,48 @@ namespace SabreTools.Library.DatFiles machine.RebuildTo = jtr.ReadAsString(); break; - // SoftwareList + #endregion + + #region Logiqx EmuArc + + case "titleid": + machine.TitleID = jtr.ReadAsString(); + break; + case "developer": + machine.Developer = jtr.ReadAsString(); + break; + case "genre": + machine.Genre = jtr.ReadAsString(); + break; + case "subgenre": + machine.Subgenre = jtr.ReadAsString(); + break; + case "ratings": + machine.Ratings = jtr.ReadAsString(); + break; + case "score": + machine.Score = jtr.ReadAsString(); + break; + case "enabled": + machine.Enabled = jtr.ReadAsString(); + break; + case "hascrc": + machine.HasCrc = jtr.ReadAsString().AsYesNo(); + break; + case "relatedto": + machine.RelatedTo = jtr.ReadAsString(); + break; + + #endregion + + #region SoftwareList + case "supported": machine.Supported = jtr.ReadAsString().AsYesNo(); break; + #endregion + default: break; } @@ -1382,7 +1429,8 @@ namespace SabreTools.Library.DatFiles // Build the state based on excluded fields jtw.WriteStartObject(); - // Common + #region Common + jtw.WritePropertyName("name"); jtw.WriteValue(datItem.GetField(Field.MachineName, Header.ExcludeFields)); @@ -1450,7 +1498,10 @@ namespace SabreTools.Library.DatFiles } } - // AttractMode + #endregion + + #region AttractMode + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Players, Header.ExcludeFields))) { jtw.WritePropertyName("players"); @@ -1487,7 +1538,10 @@ namespace SabreTools.Library.DatFiles jtw.WriteValue(datItem.Machine.Buttons); } - // ListXML + #endregion + + #region ListXML + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.SourceFile, Header.ExcludeFields))) { jtw.WritePropertyName("sourcefile"); @@ -1543,7 +1597,10 @@ namespace SabreTools.Library.DatFiles jtw.WriteEndArray(); } - // Logiqx + #endregion + + #region Logiqx + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Board, Header.ExcludeFields))) { jtw.WritePropertyName("board"); @@ -1555,7 +1612,68 @@ namespace SabreTools.Library.DatFiles jtw.WriteValue(datItem.Machine.RebuildTo); } - // SoftwareList + #endregion + + #region Logiqx EmuArc + + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.TitleID, Header.ExcludeFields))) + { + jtw.WritePropertyName("titleid"); + jtw.WriteValue(datItem.Machine.TitleID); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Developer, Header.ExcludeFields))) + { + jtw.WritePropertyName("developer"); + jtw.WriteValue(datItem.Machine.Developer); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Genre, Header.ExcludeFields))) + { + jtw.WritePropertyName("genre"); + jtw.WriteValue(datItem.Machine.Genre); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Subgenre, Header.ExcludeFields))) + { + jtw.WritePropertyName("subgenre"); + jtw.WriteValue(datItem.Machine.Subgenre); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Ratings, Header.ExcludeFields))) + { + jtw.WritePropertyName("ratings"); + jtw.WriteValue(datItem.Machine.Ratings); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Score, Header.ExcludeFields))) + { + jtw.WritePropertyName("score"); + jtw.WriteValue(datItem.Machine.Score); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Enabled, Header.ExcludeFields))) + { + jtw.WritePropertyName("enabled"); + jtw.WriteValue(datItem.Machine.Enabled); + } + if (!Header.ExcludeFields.Contains(Field.HasCrc) && datItem.Machine.HasCrc != null) + { + if (datItem.Machine.HasCrc == true) + { + jtw.WritePropertyName("hascrc"); + jtw.WriteValue("yes"); + } + else if (datItem.Machine.HasCrc == false) + { + jtw.WritePropertyName("hascrc"); + jtw.WriteValue("no"); + } + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.RelatedTo, Header.ExcludeFields))) + { + jtw.WritePropertyName("relatedto"); + jtw.WriteValue(datItem.Machine.RelatedTo); + } + + #endregion + + #region SoftwareList + if (!Header.ExcludeFields.Contains(Field.Supported) && datItem.Machine.Supported != null) { if (datItem.Machine.Supported == true) @@ -1570,6 +1688,8 @@ namespace SabreTools.Library.DatFiles } } + #endregion + jtw.WritePropertyName("items"); jtw.WriteStartArray(); diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs index 616abe26..2df07276 100644 --- a/SabreTools.Library/DatFiles/Logiqx.cs +++ b/SabreTools.Library/DatFiles/Logiqx.cs @@ -367,7 +367,7 @@ namespace SabreTools.Library.DatFiles machine.Category = reader.ReadElementContentAsString(); break; - case "trurip": // This is special metadata unique to TruRip + case "trurip": // This is special metadata unique to EmuArc ReadTruRip(reader.ReadSubtree(), machine); // Skip the trurip node now that we've processed it @@ -556,7 +556,7 @@ namespace SabreTools.Library.DatFiles } /// - /// Read TruRip information + /// Read EmuArc information /// /// True if full pathnames are to be kept, false otherwise (default) /// Machine information to pass to contained items @@ -582,15 +582,15 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "titleid": - reader.ReadElementContentAsString(); + machine.TitleID = reader.ReadElementContentAsString(); break; case "publisher": machine.Publisher = reader.ReadElementContentAsString(); break; - case "developer": // Manufacturer is as close as this gets - machine.Manufacturer = reader.ReadElementContentAsString(); + case "developer": + machine.Developer = reader.ReadElementContentAsString(); break; case "year": @@ -598,31 +598,31 @@ namespace SabreTools.Library.DatFiles break; case "genre": - machine.Category = reader.ReadElementContentAsString(); + machine.Genre = reader.ReadElementContentAsString(); break; case "subgenre": - reader.ReadElementContentAsString(); + machine.Subgenre = reader.ReadElementContentAsString(); break; case "ratings": - reader.ReadElementContentAsString(); + machine.Ratings = reader.ReadElementContentAsString(); break; case "score": - reader.ReadElementContentAsString(); + machine.Score = reader.ReadElementContentAsString(); break; case "players": - reader.ReadElementContentAsString(); + machine.Players = reader.ReadElementContentAsString(); break; case "enabled": - reader.ReadElementContentAsString(); + machine.Enabled = reader.ReadElementContentAsString(); break; case "crc": - reader.ReadElementContentAsString().AsYesNo(); + machine.HasCrc = reader.ReadElementContentAsString().AsYesNo(); break; case "source": @@ -634,7 +634,7 @@ namespace SabreTools.Library.DatFiles break; case "relatedto": - reader.ReadElementContentAsString(); + machine.RelatedTo = reader.ReadElementContentAsString(); break; default: @@ -1008,6 +1008,58 @@ namespace SabreTools.Library.DatFiles if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Category, Header.ExcludeFields))) xtw.WriteElementString("category", datItem.Machine.Category); + if (datItem.Machine.TitleID != null + || datItem.Machine.Developer != null + || datItem.Machine.Genre != null + || datItem.Machine.Subgenre != null + || datItem.Machine.Ratings != null + || datItem.Machine.Score != null + || datItem.Machine.Enabled != null + || datItem.Machine.HasCrc != null + || datItem.Machine.RelatedTo != null) + { + xtw.WriteStartElement("trurip"); + + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.TitleID, Header.ExcludeFields))) + xtw.WriteElementString("titleid", datItem.Machine.TitleID); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Publisher, Header.ExcludeFields))) + xtw.WriteElementString("publisher", datItem.Machine.Publisher); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Developer, Header.ExcludeFields))) + xtw.WriteElementString("developer", datItem.Machine.Developer); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Year, Header.ExcludeFields))) + xtw.WriteElementString("year", datItem.Machine.Year); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Genre, Header.ExcludeFields))) + xtw.WriteElementString("genre", datItem.Machine.Genre); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Subgenre, Header.ExcludeFields))) + xtw.WriteElementString("subgenre", datItem.Machine.Subgenre); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Ratings, Header.ExcludeFields))) + xtw.WriteElementString("ratings", datItem.Machine.Ratings); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Score, Header.ExcludeFields))) + xtw.WriteElementString("score", datItem.Machine.Score); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Players, Header.ExcludeFields))) + xtw.WriteElementString("players", datItem.Machine.Players); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Enabled, Header.ExcludeFields))) + xtw.WriteElementString("enabled", datItem.Machine.Enabled); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.TitleID, Header.ExcludeFields))) + xtw.WriteElementString("titleid", datItem.Machine.TitleID); + if (!Header.ExcludeFields.Contains(Field.HasCrc) && datItem.Machine.HasCrc != null) + { + if (datItem.Machine.HasCrc == true) + xtw.WriteElementString("crc", "yes"); + else if (datItem.Machine.HasCrc == false) + xtw.WriteElementString("crc", "no"); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.SourceFile, Header.ExcludeFields))) + xtw.WriteElementString("source", datItem.Machine.SourceFile); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.CloneOf, Header.ExcludeFields))) + xtw.WriteElementString("cloneof", datItem.Machine.CloneOf); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.RelatedTo, Header.ExcludeFields))) + xtw.WriteElementString("relatedto", datItem.Machine.RelatedTo); + + // End trurip + xtw.WriteEndElement(); + } + xtw.Flush(); } catch (Exception ex) diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index d663740f..e33baa2e 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -415,6 +415,46 @@ namespace SabreTools.Library.DatFiles #endregion + #region Logiqx EmuArc + + case "Machine.TitleID": + machine.TitleID = value; + break; + + case "Machine.Developer": + machine.Developer = value; + break; + + case "Machine.Genre": + machine.Genre = value; + break; + + case "Machine.Subgenre": + machine.Subgenre = value; + break; + + case "Machine.Ratings": + machine.Ratings = value; + break; + + case "Machine.Score": + machine.Score = value; + break; + + case "Machine.Enabled": + machine.Enabled = value; + break; + + case "Machine.HasCrc": + machine.HasCrc = value.AsYesNo(); + break; + + case "Machine.RelatedTo": + machine.RelatedTo = value; + break; + + #endregion + #region SoftwareList case "Machine.Supported": @@ -1089,6 +1129,43 @@ namespace SabreTools.Library.DatFiles #endregion + #region Logiqx EmuArc + + case "titleid": + case "title id": + case "title-id": + return "Machine.TitleID"; + + case "developer": + return "Machine.Developer"; + + case "genre": + return "Machine.Genre"; + + case "subgenre": + return "Machine.Subgenre"; + + case "ratings": + return "Machine.Ratings"; + + case "score": + return "Machine.Score"; + + case "enabled": + return "Machine.Enabled"; + + case "hascrc": + case "has crc": + case "has-crc": + return "Machine.HasCrc"; + + case "relatedto": + case "related to": + case "related-to": + return "Machine.RelatedTo"; + + #endregion + #region SoftwareList case "supported": diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index bf2bb082..48792f20 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -209,6 +209,17 @@ namespace SabreTools.Library.DatItems Field.Board, Field.RebuildTo, + // Logiqx EmuArc + Field.TitleID, + Field.Developer, + Field.Genre, + Field.Subgenre, + Field.Ratings, + Field.Score, + Field.Enabled, + Field.HasCrc, + Field.RelatedTo, + // SoftwareList Field.Supported, }; diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 830570e2..98fd0f45 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -28,7 +28,8 @@ namespace SabreTools.Library.DatItems #region Machine - // Common Machine + #region Common + MachineName, Comment, Description, @@ -41,7 +42,10 @@ namespace SabreTools.Library.DatItems SampleOf, MachineType, - // AttractMode Machine + #endregion + + #region AttractMode + Players, Rotation, Control, @@ -50,39 +54,73 @@ namespace SabreTools.Library.DatItems DisplayType, Buttons, - // ListXML Machine + #endregion + + #region ListXML + SourceFile, Runnable, Devices, SlotOptions, Infos, - // Logiqx Machine + #endregion + + #region Logiqx + Board, RebuildTo, - // SoftwareList Machine + #endregion + + #region Logiqx EmuArc + + TitleID, + Developer, + Genre, + Subgenre, + Ratings, + Score, + Enabled, + HasCrc, + RelatedTo, + + #endregion + + #region SoftwareList + Supported, #endregion + #endregion // Machine + #region DatItem - // Common DatItem + #region Common + Name, ItemType, - // AttractMode DatItem + #endregion + + #region AttractMode + AltName, AltTitle, - // SoftwareList DatItem + #endregion + + #region SoftwareList + PartName, PartInterface, Features, AreaName, AreaSize, + #endregion + // BiosSet Default, BiosDescription, @@ -114,7 +152,7 @@ namespace SabreTools.Library.DatItems Offset, Inverted, - #endregion + #endregion // DatItem } /// diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs index a8129731..1461f328 100644 --- a/SabreTools.Library/DatItems/Machine.cs +++ b/SabreTools.Library/DatItems/Machine.cs @@ -90,6 +90,7 @@ namespace SabreTools.Library.DatItems /// /// Player count /// + /// Also in Logiqx EmuArc [JsonProperty("players")] public string Players { get; set; } = null; @@ -184,6 +185,64 @@ namespace SabreTools.Library.DatItems #endregion + #region Logiqx EmuArc Fields + + /// + /// Title ID + /// + [JsonProperty("titleid")] + public string TitleID { get; set; } = null; + + /// + /// Machine developer + /// + [JsonProperty("developer")] + public string Developer { get; set; } = null; + + /// + /// Game genre + /// + [JsonProperty("genre")] + public string Genre { get; set; } = null; + + /// + /// Game subgenre + /// + [JsonProperty("genre")] + public string Subgenre { get; set; } = null; + + /// + /// Game ratings + /// + [JsonProperty("ratings")] + public string Ratings { get; set; } = null; + + /// + /// Game score + /// + [JsonProperty("score")] + public string Score { get; set; } = null; + + /// + /// Is the machine enabled + /// + [JsonProperty("enabled")] + public string Enabled { get; set; } = null; // bool? + + /// + /// Does the game have a CRC check + /// + [JsonProperty("hascrc")] + public bool? HasCrc { get; set; } = null; + + /// + /// Machine relations + /// + [JsonProperty("relatedto")] + public string RelatedTo { get; set; } = null; + + #endregion + #region SoftwareList Fields /// @@ -211,7 +270,8 @@ namespace SabreTools.Library.DatItems string fieldValue = null; switch (field) { - // Common + #region Common + case Field.MachineName: fieldValue = Name; break; @@ -246,7 +306,10 @@ namespace SabreTools.Library.DatItems fieldValue = MachineType.ToString(); break; - // AttractMode + #endregion + + #region AttractMode + case Field.Players: fieldValue = Players; break; @@ -269,7 +332,10 @@ namespace SabreTools.Library.DatItems fieldValue = Buttons; break; - // ListXML + #endregion + + #region ListXML + case Field.SourceFile: fieldValue = SourceFile; break; @@ -286,7 +352,10 @@ namespace SabreTools.Library.DatItems fieldValue = string.Join(";", (Infos ?? new List>()).Select(i => $"{i.Key}={i.Value}")); break; - // Logiqx + #endregion + + #region Logiqx + case Field.Board: fieldValue = Board; break; @@ -294,11 +363,48 @@ namespace SabreTools.Library.DatItems fieldValue = RebuildTo; break; - // SoftwareList + #endregion + + #region Logiqx EmuArc + + case Field.TitleID: + fieldValue = TitleID; + break; + case Field.Developer: + fieldValue = Developer; + break; + case Field.Genre: + fieldValue = Genre; + break; + case Field.Subgenre: + fieldValue = Subgenre; + break; + case Field.Ratings: + fieldValue = Ratings; + break; + case Field.Score: + fieldValue = Score; + break; + case Field.Enabled: + fieldValue = Enabled; + break; + case Field.HasCrc: + fieldValue = HasCrc.ToString(); + break; + case Field.RelatedTo: + fieldValue = RelatedTo; + break; + + #endregion + + #region SoftwareList + case Field.Supported: fieldValue = Supported?.ToString(); break; + #endregion + default: return null; } @@ -329,24 +435,7 @@ namespace SabreTools.Library.DatItems public Machine(string name, string description) { Name = name; - Comment = null; Description = description; - Year = null; - Manufacturer = null; - Publisher = null; - Category = null; - RomOf = null; - CloneOf = null; - SampleOf = null; - Supported = true; - SourceFile = null; - Runnable = null; - Board = null; - RebuildTo = null; - Devices = null; - SlotOptions = null; - Infos = null; - MachineType = MachineType.NULL; } #endregion @@ -406,6 +495,20 @@ namespace SabreTools.Library.DatItems #endregion + #region Logiqx EmuArc + + TitleID = this.TitleID, + Developer = this.Developer, + Genre = this.Genre, + Subgenre = this.Subgenre, + Ratings = this.Ratings, + Score = this.Score, + Enabled = this.Enabled, + HasCrc = this.HasCrc, + RelatedTo = this.RelatedTo, + + #endregion + #region SoftwareList Supported = this.Supported, @@ -614,6 +717,62 @@ namespace SabreTools.Library.DatItems #endregion + #region Logiqx EmuArc + + // Filter on title ID + if (filter.TitleID.MatchesPositiveSet(TitleID) == false) + return false; + if (filter.TitleID.MatchesNegativeSet(TitleID) == true) + return false; + + // Filter on developer + if (filter.Developer.MatchesPositiveSet(Developer) == false) + return false; + if (filter.Developer.MatchesNegativeSet(Developer) == true) + return false; + + // Filter on genre + if (filter.Genre.MatchesPositiveSet(Genre) == false) + return false; + if (filter.Genre.MatchesNegativeSet(Genre) == true) + return false; + + // Filter on rebuildto + if (filter.Subgenre.MatchesPositiveSet(Subgenre) == false) + return false; + if (filter.Subgenre.MatchesNegativeSet(Subgenre) == true) + return false; + + // Filter on subgenre + if (filter.Ratings.MatchesPositiveSet(Ratings) == false) + return false; + if (filter.Ratings.MatchesNegativeSet(Ratings) == true) + return false; + + // Filter on score + if (filter.Score.MatchesPositiveSet(Score) == false) + return false; + if (filter.Score.MatchesNegativeSet(Score) == true) + return false; + + // Filter on enabled + if (filter.Enabled.MatchesPositiveSet(Enabled) == false) + return false; + if (filter.Enabled.MatchesNegativeSet(Enabled) == true) + return false; + + // Filter on has CRC flag + if (filter.HasCrc.MatchesNeutral(null, HasCrc) == false) + return false; + + // Filter on related to + if (filter.RelatedTo.MatchesPositiveSet(RelatedTo) == false) + return false; + if (filter.RelatedTo.MatchesNegativeSet(RelatedTo) == true) + return false; + + #endregion + #region SoftwareList // Filter on supported @@ -722,6 +881,37 @@ namespace SabreTools.Library.DatItems #endregion + #region Logiqx EmuArc + + if (fields.Contains(Field.TitleID)) + TitleID = null; + + if (fields.Contains(Field.Developer)) + Developer = null; + + if (fields.Contains(Field.Genre)) + Genre = null; + + if (fields.Contains(Field.Subgenre)) + Subgenre = null; + + if (fields.Contains(Field.Ratings)) + Ratings = null; + + if (fields.Contains(Field.Score)) + Score = null; + + if (fields.Contains(Field.Enabled)) + Enabled = null; + + if (fields.Contains(Field.HasCrc)) + HasCrc = null; + + if (fields.Contains(Field.RelatedTo)) + RelatedTo = null; + + #endregion + #region SoftwareList if (fields.Contains(Field.Supported)) @@ -836,6 +1026,37 @@ namespace SabreTools.Library.DatItems #endregion + #region Logiqx EmuArc + + if (fields.Contains(Field.TitleID)) + TitleID = machine.TitleID; + + if (fields.Contains(Field.Developer)) + Developer = machine.Developer; + + if (fields.Contains(Field.Genre)) + Genre = machine.Genre; + + if (fields.Contains(Field.Subgenre)) + Subgenre = machine.Subgenre; + + if (fields.Contains(Field.Ratings)) + Ratings = machine.Ratings; + + if (fields.Contains(Field.Score)) + Score = machine.Score; + + if (fields.Contains(Field.Enabled)) + Enabled = machine.Enabled; + + if (fields.Contains(Field.HasCrc)) + HasCrc = machine.HasCrc; + + if (fields.Contains(Field.RelatedTo)) + RelatedTo = machine.RelatedTo; + + #endregion + #region SoftwareList if (fields.Contains(Field.Supported)) diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index c1816af8..ec5fa7db 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -156,6 +156,55 @@ namespace SabreTools.Library.Filtering #endregion + #region Logiqx EmuArc + + /// + /// Include or exclude machine title ID + /// + public FilterItem TitleID { get; private set; } = new FilterItem(); + + /// + /// Include or exclude machine developer + /// + public FilterItem Developer { get; private set; } = new FilterItem(); + + /// + /// Include or exclude machine genre + /// + public FilterItem Genre { get; private set; } = new FilterItem(); + + /// + /// Include or exclude machine subgenre + /// + public FilterItem Subgenre { get; private set; } = new FilterItem(); + + /// + /// Include or exclude machine ratings + /// + public FilterItem Ratings { get; private set; } = new FilterItem(); + + /// + /// Include or exclude machine score + /// + public FilterItem Score { get; private set; } = new FilterItem(); + + /// + /// Include or exclude machine enabled + /// + public FilterItem Enabled { get; private set; } = new FilterItem(); + + /// + /// Include or exclude items with the "crc" tag + /// + public FilterItem HasCrc { get; private set; } = new FilterItem() { Neutral = null }; + + /// + /// Include or exclude machine related to + /// + public FilterItem RelatedTo { get; private set; } = new FilterItem(); + + #endregion + #region SoftwareList /// @@ -624,6 +673,73 @@ namespace SabreTools.Library.Filtering #endregion + #region Logiqx EmuArc + + case Field.TitleID: + if (negate) + TitleID.NegativeSet.Add(value); + else + TitleID.PositiveSet.Add(value); + break; + + case Field.Developer: + if (negate) + Developer.NegativeSet.Add(value); + else + Developer.PositiveSet.Add(value); + break; + + case Field.Genre: + if (negate) + Genre.NegativeSet.Add(value); + else + Genre.PositiveSet.Add(value); + break; + + case Field.Subgenre: + if (negate) + Subgenre.NegativeSet.Add(value); + else + Subgenre.PositiveSet.Add(value); + break; + + case Field.Ratings: + if (negate) + Ratings.NegativeSet.Add(value); + else + Ratings.PositiveSet.Add(value); + break; + + case Field.Score: + if (negate) + Score.NegativeSet.Add(value); + else + Score.PositiveSet.Add(value); + break; + + case Field.Enabled: + if (negate) + Enabled.NegativeSet.Add(value); + else + Enabled.PositiveSet.Add(value); + break; + + case Field.HasCrc: + if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) + HasCrc.Neutral = false; + else + HasCrc.Neutral = true; + break; + + case Field.RelatedTo: + if (negate) + RelatedTo.NegativeSet.Add(value); + else + RelatedTo.PositiveSet.Add(value); + break; + + #endregion + #region SoftwareList case Field.Supported: diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index daf6a1ae..b9006a71 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -256,6 +256,43 @@ namespace SabreTools.Library.Tools #endregion + #region Logiqx EmuArc + + case "titleid": + case "title id": + case "title-id": + return Field.TitleID; + + case "developer": + return Field.Developer; + + case "genre": + return Field.Genre; + + case "subgenre": + return Field.Subgenre; + + case "ratings": + return Field.Ratings; + + case "score": + return Field.Score; + + case "enabled": + return Field.Enabled; + + case "hascrc": + case "has crc": + case "has-crc": + return Field.HasCrc; + + case "relatedto": + case "related to": + case "related-to": + return Field.RelatedTo; + + #endregion + #region SoftwareList case "supported":