diff --git a/SabreTools.Core/Enums.cs b/SabreTools.Core/Enums.cs index ecdb35c1..6b5ce01c 100644 --- a/SabreTools.Core/Enums.cs +++ b/SabreTools.Core/Enums.cs @@ -652,6 +652,10 @@ namespace SabreTools.Core EmulationStatus, CocktailStatus, SaveStateStatus, + RequiresArtwork, + Unofficial, + NoSoundHardware, + Incomplete, // Extension Extension_Name, diff --git a/SabreTools.Core/Tools/Converters.cs b/SabreTools.Core/Tools/Converters.cs index 948f9d95..57f866d0 100644 --- a/SabreTools.Core/Tools/Converters.cs +++ b/SabreTools.Core/Tools/Converters.cs @@ -665,6 +665,18 @@ namespace SabreTools.Core.Tools case "savestatestatus": return DatItemField.SaveStateStatus; + case "requiresartwork": + return DatItemField.RequiresArtwork; + + case "unofficial": + return DatItemField.Unofficial; + + case "nosoundhardware": + return DatItemField.NoSoundHardware; + + case "incomplete": + return DatItemField.Incomplete; + // Extension case "extension_name": return DatItemField.Extension_Name; diff --git a/SabreTools.DatFiles/Formats/Listxml.cs b/SabreTools.DatFiles/Formats/Listxml.cs index d137d9c3..e2722c4b 100644 --- a/SabreTools.DatFiles/Formats/Listxml.cs +++ b/SabreTools.DatFiles/Formats/Listxml.cs @@ -569,6 +569,10 @@ namespace SabreTools.DatFiles.Formats Emulation = reader.GetAttribute("emulation").AsSupportStatus(), Cocktail = reader.GetAttribute("cocktail").AsSupportStatus(), SaveState = reader.GetAttribute("savestate").AsSupported(), + RequiresArtwork = reader.GetAttribute("requiresartwork").AsYesNo(), + Unofficial = reader.GetAttribute("unofficial").AsYesNo(), + NoSoundHardware = reader.GetAttribute("nosoundhardware").AsYesNo(), + Incomplete = reader.GetAttribute("incomplete").AsYesNo(), Source = new Source { @@ -1592,6 +1596,18 @@ namespace SabreTools.DatFiles.Formats xtw.WriteRequiredAttributeString("name", setting.Name); xtw.WriteRequiredAttributeString("value", setting.Value); xtw.WriteOptionalAttributeString("default", setting.Default.FromYesNo()); + if (setting.ConditionsSpecified) + { + foreach (var confsettingCondition in setting.Conditions) + { + xtw.WriteStartElement("condition"); + xtw.WriteRequiredAttributeString("tag", confsettingCondition.Tag); + xtw.WriteRequiredAttributeString("mask", confsettingCondition.Mask); + xtw.WriteRequiredAttributeString("relation", confsettingCondition.Relation.FromRelation()); + xtw.WriteRequiredAttributeString("value", confsettingCondition.Value); + xtw.WriteEndElement(); + } + } xtw.WriteEndElement(); } } @@ -1731,6 +1747,10 @@ namespace SabreTools.DatFiles.Formats xtw.WriteRequiredAttributeString("emulation", driver.Emulation.FromSupportStatus()); xtw.WriteOptionalAttributeString("cocktail", driver.Cocktail.FromSupportStatus()); xtw.WriteRequiredAttributeString("savestate", driver.SaveState.FromSupported(true)); + xtw.WriteOptionalAttributeString("requiresartwork", driver.RequiresArtwork.FromYesNo()); + xtw.WriteOptionalAttributeString("unofficial", driver.Unofficial.FromYesNo()); + xtw.WriteOptionalAttributeString("nosoundhardware", driver.NoSoundHardware.FromYesNo()); + xtw.WriteOptionalAttributeString("incomplete", driver.Incomplete.FromYesNo()); xtw.WriteEndElement(); break; diff --git a/SabreTools.DatFiles/Setter.cs b/SabreTools.DatFiles/Setter.cs index d4b61d27..64a659ba 100644 --- a/SabreTools.DatFiles/Setter.cs +++ b/SabreTools.DatFiles/Setter.cs @@ -826,6 +826,18 @@ namespace SabreTools.DatFiles if (DatItemMappings.Keys.Contains(DatItemField.SaveStateStatus)) driver.SaveState = DatItemMappings[DatItemField.SaveStateStatus].AsSupported(); + + if (DatItemMappings.Keys.Contains(DatItemField.RequiresArtwork)) + driver.RequiresArtwork = DatItemMappings[DatItemField.RequiresArtwork].AsYesNo(); + + if (DatItemMappings.Keys.Contains(DatItemField.Unofficial)) + driver.Unofficial = DatItemMappings[DatItemField.Unofficial].AsYesNo(); + + if (DatItemMappings.Keys.Contains(DatItemField.NoSoundHardware)) + driver.NoSoundHardware = DatItemMappings[DatItemField.NoSoundHardware].AsYesNo(); + + if (DatItemMappings.Keys.Contains(DatItemField.Incomplete)) + driver.Incomplete = DatItemMappings[DatItemField.Incomplete].AsYesNo(); } /// diff --git a/SabreTools.DatItems/Formats/Driver.cs b/SabreTools.DatItems/Formats/Driver.cs index b27f183c..79ab6565 100644 --- a/SabreTools.DatItems/Formats/Driver.cs +++ b/SabreTools.DatItems/Formats/Driver.cs @@ -58,6 +58,46 @@ namespace SabreTools.DatItems.Formats [JsonIgnore] public bool SaveStateSpecified { get { return SaveState != Supported.NULL; } } + /// + /// Requires artwork + /// + [JsonProperty("requiresartwork", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("requiresartwork")] + public bool? RequiresArtwork { get; set; } + + [JsonIgnore] + public bool RequiresArtworkSpecified { get { return RequiresArtwork != null; } } + + /// + /// Unofficial + /// + [JsonProperty("unofficial", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("unofficial")] + public bool? Unofficial { get; set; } + + [JsonIgnore] + public bool UnofficialSpecified { get { return Unofficial != null; } } + + /// + /// No sound hardware + /// + [JsonProperty("nosoundhardware", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("nosoundhardware")] + public bool? NoSoundHardware { get; set; } + + [JsonIgnore] + public bool NoSoundHardwareSpecified { get { return NoSoundHardware != null; } } + + /// + /// Incomplete + /// + [JsonProperty("incomplete", DefaultValueHandling = DefaultValueHandling.Ignore)] + [XmlElement("incomplete")] + public bool? Incomplete { get; set; } + + [JsonIgnore] + public bool IncompleteSpecified { get { return Incomplete != null; } } + #endregion #region Constructors @@ -89,6 +129,10 @@ namespace SabreTools.DatItems.Formats Emulation = this.Emulation, Cocktail = this.Cocktail, SaveState = this.SaveState, + RequiresArtwork = this.RequiresArtwork, + Unofficial = this.Unofficial, + NoSoundHardware = this.NoSoundHardware, + Incomplete = this.Incomplete, }; } @@ -109,7 +153,11 @@ namespace SabreTools.DatItems.Formats return (Status == newOther.Status && Emulation == newOther.Emulation && Cocktail == newOther.Cocktail - && SaveState == newOther.SaveState); + && SaveState == newOther.SaveState + && RequiresArtwork == newOther.RequiresArtwork + && Unofficial == newOther.Unofficial + && NoSoundHardware == newOther.NoSoundHardware + && Incomplete == newOther.Incomplete); } #endregion diff --git a/SabreTools.Filtering/DatItemFilter.cs b/SabreTools.Filtering/DatItemFilter.cs index c25889c7..8a32e6c9 100644 --- a/SabreTools.Filtering/DatItemFilter.cs +++ b/SabreTools.Filtering/DatItemFilter.cs @@ -143,6 +143,10 @@ namespace SabreTools.Filtering public FilterItem EmulationStatus { get; private set; } = new FilterItem() { Positive = Core.SupportStatus.NULL, Negative = Core.SupportStatus.NULL }; public FilterItem CocktailStatus { get; private set; } = new FilterItem() { Positive = Core.SupportStatus.NULL, Negative = Core.SupportStatus.NULL }; public FilterItem SaveStateStatus { get; private set; } = new FilterItem() { Positive = Supported.NULL, Negative = Supported.NULL }; + public FilterItem RequiresArtwork { get; private set; } = new FilterItem() { Neutral = null }; + public FilterItem Unofficial { get; private set; } = new FilterItem() { Neutral = null }; + public FilterItem NoSoundHardware { get; private set; } = new FilterItem() { Neutral = null }; + public FilterItem Incomplete { get; private set; } = new FilterItem() { Neutral = null }; // Extension public FilterItem Extension_Name { get; private set; } = new FilterItem(); @@ -653,6 +657,22 @@ namespace SabreTools.Filtering SaveStateStatus.Positive |= value.AsSupported(); break; + case DatItemField.RequiresArtwork: + SetBooleanFilter(RequiresArtwork, value, negate); + break; + + case DatItemField.Unofficial: + SetBooleanFilter(Unofficial, value, negate); + break; + + case DatItemField.NoSoundHardware: + SetBooleanFilter(NoSoundHardware, value, negate); + break; + + case DatItemField.Incomplete: + SetBooleanFilter(Incomplete, value, negate); + break; + // Extension case DatItemField.Extension_Name: SetStringFilter(Extension_Name, value, negate); @@ -1430,7 +1450,23 @@ namespace SabreTools.Filtering return false; if (SaveStateStatus.MatchesNegative(Supported.NULL, driver.SaveState) == true) return false; - + + // Filter on requires artwork + if (!PassBoolFilter(RequiresArtwork, driver.RequiresArtwork)) + return false; + + // Filter on unofficial + if (!PassBoolFilter(Unofficial, driver.Unofficial)) + return false; + + // Filter on no sound hardware + if (!PassBoolFilter(NoSoundHardware, driver.NoSoundHardware)) + return false; + + // Filter on incomplete + if (!PassBoolFilter(Incomplete, driver.Incomplete)) + return false; + return true; } diff --git a/SabreTools.Filtering/DatItemRemover.cs b/SabreTools.Filtering/DatItemRemover.cs index 760d6b3c..a9e83e0d 100644 --- a/SabreTools.Filtering/DatItemRemover.cs +++ b/SabreTools.Filtering/DatItemRemover.cs @@ -666,6 +666,18 @@ namespace SabreTools.Filtering if (DatItemFields.Contains(DatItemField.SaveStateStatus)) driver.SaveState = Supported.NULL; + + if (DatItemFields.Contains(DatItemField.RequiresArtwork)) + driver.RequiresArtwork = null; + + if (DatItemFields.Contains(DatItemField.Unofficial)) + driver.Unofficial = null; + + if (DatItemFields.Contains(DatItemField.NoSoundHardware)) + driver.NoSoundHardware = null; + + if (DatItemFields.Contains(DatItemField.Incomplete)) + driver.Incomplete = null; } /// diff --git a/SabreTools.Filtering/Replacer.cs b/SabreTools.Filtering/Replacer.cs index 8534cf63..f26741ac 100644 --- a/SabreTools.Filtering/Replacer.cs +++ b/SabreTools.Filtering/Replacer.cs @@ -608,6 +608,18 @@ namespace SabreTools.Filtering if (datItemFields.Contains(DatItemField.SaveStateStatus)) driver.SaveState = newItem.SaveState; + + if (datItemFields.Contains(DatItemField.RequiresArtwork)) + driver.RequiresArtwork = newItem.RequiresArtwork; + + if (datItemFields.Contains(DatItemField.Unofficial)) + driver.Unofficial = newItem.Unofficial; + + if (datItemFields.Contains(DatItemField.NoSoundHardware)) + driver.NoSoundHardware = newItem.NoSoundHardware; + + if (datItemFields.Contains(DatItemField.Incomplete)) + driver.Incomplete = newItem.Incomplete; } ///