diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs index 7e95495f..5530773a 100644 --- a/SabreTools.Library/DatFiles/ItemDictionary.cs +++ b/SabreTools.Library/DatFiles/ItemDictionary.cs @@ -83,6 +83,12 @@ namespace SabreTools.Library.DatFiles [JsonIgnore] public long AdjusterCount { get; private set; } = 0; + /// + /// Number of Analog items + /// + [JsonIgnore] + public long AnalogCount { get; private set; } = 0; + /// /// Number of Archive items /// @@ -101,6 +107,12 @@ namespace SabreTools.Library.DatFiles [JsonIgnore] public long ChipCount { get; private set; } = 0; + /// + /// Number of top-level Condition items + /// + [JsonIgnore] + public long ConditionCount { get; private set; } = 0; + /// /// Number of Configuration items /// @@ -514,6 +526,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Adjuster: AdjusterCount++; break; + case ItemType.Analog: + AnalogCount++; + break; case ItemType.Archive: ArchiveCount++; break; @@ -523,6 +538,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Chip: ChipCount++; break; + case ItemType.Condition: + ConditionCount++; + break; case ItemType.Configuration: ConfigurationCount++; break; @@ -673,6 +691,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Adjuster: AdjusterCount--; break; + case ItemType.Analog: + AnalogCount--; + break; case ItemType.Archive: ArchiveCount--; break; @@ -682,6 +703,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Chip: ChipCount--; break; + case ItemType.Condition: + ConditionCount--; + break; case ItemType.Configuration: ConfigurationCount--; break; diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index 79ef1ae7..05102544 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -211,6 +211,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Adjuster: datItem = datItemObj.ToObject(); break; + case ItemType.Analog: + datItem = datItemObj.ToObject(); + break; case ItemType.Archive: datItem = datItemObj.ToObject(); break; @@ -223,6 +226,9 @@ namespace SabreTools.Library.DatFiles case ItemType.Chip: datItem = datItemObj.ToObject(); break; + case ItemType.Condition: + datItem = datItemObj.ToObject(); + break; case ItemType.Configuration: datItem = datItemObj.ToObject(); break; diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index 167497f1..7769de95 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -172,6 +172,12 @@ namespace SabreTools.Library.DatFiles Name = reader.GetAttribute("name"), Default = reader.GetAttribute("default").AsYesNo(), Conditions = new List(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }; // Now read the internal tags @@ -218,6 +224,24 @@ namespace SabreTools.Library.DatFiles reader.Read(); break; + case "condition": + datItems.Add(new Condition + { + Tag = reader.GetAttribute("tag"), + Mask = reader.GetAttribute("mask"), + Relation = reader.GetAttribute("relation"), + ConditionValue = reader.GetAttribute("value"), + + Source = new Source + { + Index = indexId, + Name = filename, + }, + }); + + reader.Read(); + break; + case "configuration": var configuration = new Configuration { @@ -227,6 +251,12 @@ namespace SabreTools.Library.DatFiles Conditions = new List(), Locations = new List(), Settings = new List(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }; // Now read the internal tags @@ -242,6 +272,12 @@ namespace SabreTools.Library.DatFiles datItems.Add(new DeviceReference { Name = reader.GetAttribute("name"), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }); reader.Read(); @@ -256,6 +292,12 @@ namespace SabreTools.Library.DatFiles Conditions = new List(), Locations = new List(), Values = new List(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }; // Now read the internal tags @@ -296,6 +338,12 @@ namespace SabreTools.Library.DatFiles Emulation = reader.GetAttribute("emulation").AsSupportStatus(), Cocktail = reader.GetAttribute("cocktail").AsSupportStatus(), SaveState = reader.GetAttribute("savestate").AsSupported(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }); reader.Read(); @@ -307,6 +355,12 @@ namespace SabreTools.Library.DatFiles Type = reader.GetAttribute("type").AsFeatureType(), Status = reader.GetAttribute("status").AsFeatureStatus(), Overall = reader.GetAttribute("overall").AsFeatureStatus(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }); reader.Read(); @@ -342,6 +396,12 @@ namespace SabreTools.Library.DatFiles Name = reader.GetAttribute("name"), Default = reader.GetAttribute("default").AsYesNo(), Content = reader.ReadElementContentAsString(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }); break; @@ -366,6 +426,12 @@ namespace SabreTools.Library.DatFiles { Name = reader.GetAttribute("name"), SlotOptions = new List(), + + Source = new Source + { + Index = indexId, + Name = filename, + }, }; // Now read the internal tags @@ -435,22 +501,6 @@ namespace SabreTools.Library.DatFiles reader.Read(); break; - case "condition": - var condition = new Condition(); - condition.Tag = reader.GetAttribute("tag"); - condition.Mask = reader.GetAttribute("mask"); - condition.Relation = reader.GetAttribute("relation"); - condition.Value = reader.GetAttribute("value"); - - // Ensure the list exists - if (machine.Conditions == null) - machine.Conditions = new List(); - - machine.Conditions.Add(condition); - - reader.Read(); - break; - case "input": var input = new Input(); input.Service = reader.GetAttribute("service").AsYesNo(); @@ -1190,13 +1240,12 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalElementString("year", datItem.Machine.Year); xtw.WriteOptionalElementString("manufacturer", datItem.Machine.Manufacturer); - // TODO: These should go *after* the datitems + // TODO: These are all going away due to promotions if (datItem.Machine.Displays != null) { foreach (var display in datItem.Machine.Displays) { xtw.WriteStartElement("display"); - xtw.WriteOptionalAttributeString("tag", display.Tag); xtw.WriteOptionalAttributeString("type", display.Type); xtw.WriteOptionalAttributeString("rotate", display.Rotate); @@ -1211,23 +1260,6 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("vtotal", display.VTotal); xtw.WriteOptionalAttributeString("vbend", display.VBEnd); xtw.WriteOptionalAttributeString("vbstart", display.VBStart); - - // End display - xtw.WriteEndElement(); - } - } - if (datItem.Machine.Conditions != null) - { - foreach (var condition in datItem.Machine.Conditions) - { - xtw.WriteStartElement("condition"); - - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); - - // End condition xtw.WriteEndElement(); } } @@ -1236,18 +1268,15 @@ namespace SabreTools.Library.DatFiles foreach (var input in datItem.Machine.Inputs) { xtw.WriteStartElement("input"); - xtw.WriteOptionalAttributeString("service", input.Service.FromYesNo()); xtw.WriteOptionalAttributeString("tilt", input.Tilt.FromYesNo()); xtw.WriteOptionalAttributeString("players", input.Players); xtw.WriteOptionalAttributeString("coins", input.Coins); - if (input.Controls != null) { foreach (var control in input.Controls) { xtw.WriteStartElement("control"); - xtw.WriteOptionalAttributeString("type", control.Type); xtw.WriteOptionalAttributeString("player", control.Player); xtw.WriteOptionalAttributeString("buttons", control.Buttons); @@ -1260,13 +1289,9 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("ways", control.Ways); xtw.WriteOptionalAttributeString("ways2", control.Ways2); xtw.WriteOptionalAttributeString("ways3", control.Ways3); - - // End control xtw.WriteEndElement(); } } - - // End input xtw.WriteEndElement(); } } @@ -1275,23 +1300,16 @@ namespace SabreTools.Library.DatFiles foreach (var port in datItem.Machine.Ports) { xtw.WriteStartElement("port"); - xtw.WriteOptionalAttributeString("tag", port.Tag); - if (port.Analogs != null) { foreach (var analog in port.Analogs) { xtw.WriteStartElement("analog"); - xtw.WriteOptionalAttributeString("mask", analog.Mask); - - // End analog xtw.WriteEndElement(); } } - - // End port xtw.WriteEndElement(); } } @@ -1300,23 +1318,18 @@ namespace SabreTools.Library.DatFiles foreach (var device in datItem.Machine.Devices) { xtw.WriteStartElement("device"); - xtw.WriteOptionalAttributeString("type", device.Type); xtw.WriteOptionalAttributeString("tag", device.Tag); xtw.WriteOptionalAttributeString("fixed_image", device.FixedImage); xtw.WriteOptionalAttributeString("mandatory", device.Mandatory); xtw.WriteOptionalAttributeString("interface", device.Interface); - if (device.Instances != null) { foreach (var instance in device.Instances) { xtw.WriteStartElement("instance"); - xtw.WriteOptionalAttributeString("name", instance.Name); xtw.WriteOptionalAttributeString("briefname", instance.BriefName); - - // End instance xtw.WriteEndElement(); } } @@ -1325,15 +1338,10 @@ namespace SabreTools.Library.DatFiles foreach (var extension in device.Extensions) { xtw.WriteStartElement("extension"); - xtw.WriteOptionalAttributeString("name", extension.Name); - - // End extension xtw.WriteEndElement(); } } - - // End device xtw.WriteEndElement(); } } @@ -1395,13 +1403,13 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("default", adjuster.Default.FromYesNo()); if (adjuster.Conditions != null) { - foreach (var condition in adjuster.Conditions) + foreach (var adjusterCondition in adjuster.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag); + xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask); + xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation); + xtw.WriteOptionalAttributeString("value", adjusterCondition.Value); xtw.WriteEndElement(); } } @@ -1427,6 +1435,16 @@ namespace SabreTools.Library.DatFiles xtw.WriteEndElement(); break; + case ItemType.Condition: + var condition = datItem as Condition; + xtw.WriteStartElement("condition"); + xtw.WriteOptionalAttributeString("tag", condition.Tag); + xtw.WriteOptionalAttributeString("mask", condition.Mask); + xtw.WriteOptionalAttributeString("relation", condition.Relation); + xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteEndElement(); + break; + case ItemType.Configuration: var configuration = datItem as Configuration; xtw.WriteStartElement("configuration"); @@ -1436,13 +1454,13 @@ namespace SabreTools.Library.DatFiles if (configuration.Conditions != null) { - foreach (var condition in configuration.Conditions) + foreach (var configurationCondition in configuration.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag); + xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask); + xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation); + xtw.WriteOptionalAttributeString("value", configurationCondition.Value); xtw.WriteEndElement(); } } @@ -1486,13 +1504,13 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("mask", dipSwitch.Mask); if (dipSwitch.Conditions != null) { - foreach (var condition in dipSwitch.Conditions) + foreach (var dipSwitchCondition in dipSwitch.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag); + xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask); + xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation); + xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value); xtw.WriteEndElement(); } } @@ -1517,13 +1535,13 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo()); if (value.Conditions != null) { - foreach (var condition in value.Conditions) + foreach (var dipValueCondition in value.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag); + xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask); + xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation); + xtw.WriteOptionalAttributeString("value", dipValueCondition.Value); xtw.WriteEndElement(); } } diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs index e26b38f1..75c9c9cc 100644 --- a/SabreTools.Library/DatFiles/SabreDat.cs +++ b/SabreTools.Library/DatFiles/SabreDat.cs @@ -1216,19 +1216,27 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("default", adjuster.Default.FromYesNo()); if (adjuster.Conditions != null) { - foreach (var condition in adjuster.Conditions) + foreach (var adjusterCondition in adjuster.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag); + xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask); + xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation); + xtw.WriteOptionalAttributeString("value", adjusterCondition.Value); xtw.WriteEndElement(); } } xtw.WriteEndElement(); break; + case ItemType.Analog: + var analog = datItem as Analog; + xtw.WriteStartElement("file"); + xtw.WriteAttributeString("type", "analog"); + xtw.WriteOptionalAttributeString("mask", analog.Mask); + xtw.WriteEndElement(); + break; + case ItemType.Archive: var archive = datItem as Archive; xtw.WriteStartElement("file"); @@ -1258,6 +1266,17 @@ namespace SabreTools.Library.DatFiles xtw.WriteEndElement(); break; + case ItemType.Condition: + var condition = datItem as Condition; + xtw.WriteStartElement("file"); + xtw.WriteAttributeString("type", "condition"); + xtw.WriteOptionalAttributeString("tag", condition.Tag); + xtw.WriteOptionalAttributeString("mask", condition.Mask); + xtw.WriteOptionalAttributeString("relation", condition.Relation); + xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteEndElement(); + break; + case ItemType.Configuration: var configuration = datItem as Configuration; xtw.WriteStartElement("file"); @@ -1268,13 +1287,13 @@ namespace SabreTools.Library.DatFiles if (configuration.Conditions != null) { - foreach (var condition in configuration.Conditions) + foreach (var configurationCondition in configuration.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag); + xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask); + xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation); + xtw.WriteOptionalAttributeString("value", configurationCondition.Value); xtw.WriteEndElement(); } } @@ -1320,13 +1339,13 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("mask", dipSwitch.Mask); if (dipSwitch.Conditions != null) { - foreach (var condition in dipSwitch.Conditions) + foreach (var dipSwitchCondition in dipSwitch.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag); + xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask); + xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation); + xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value); xtw.WriteEndElement(); } } @@ -1351,13 +1370,13 @@ namespace SabreTools.Library.DatFiles xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo()); if (value.Conditions != null) { - foreach (var condition in value.Conditions) + foreach (var dipValueCondition in value.Conditions) { xtw.WriteStartElement("condition"); - xtw.WriteOptionalAttributeString("tag", condition.Tag); - xtw.WriteOptionalAttributeString("mask", condition.Mask); - xtw.WriteOptionalAttributeString("relation", condition.Relation); - xtw.WriteOptionalAttributeString("value", condition.Value); + xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag); + xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask); + xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation); + xtw.WriteOptionalAttributeString("value", dipValueCondition.Value); xtw.WriteEndElement(); } } diff --git a/SabreTools.Library/DatItems/Analog.cs b/SabreTools.Library/DatItems/Analog.cs new file mode 100644 index 00000000..04338144 --- /dev/null +++ b/SabreTools.Library/DatItems/Analog.cs @@ -0,0 +1,173 @@ +using System.Collections.Generic; +using System.Linq; + +using SabreTools.Library.Filtering; +using Newtonsoft.Json; + +namespace SabreTools.Library.DatItems +{ + /// + /// Represents a single analog item + /// + [JsonObject("analog")] + public class Analog : DatItem + { + #region Fields + + /// + /// Analog mask value + /// + [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Mask { get; set; } + + #endregion + + #region Accessors + + /// + /// Set fields with given values + /// + /// Mappings dictionary + public override void SetFields(Dictionary mappings) + { + // Set base fields + base.SetFields(mappings); + + // Handle Analog-specific fields + if (mappings.Keys.Contains(Field.DatItem_Mask)) + Mask = mappings[Field.DatItem_Mask]; + } + + #endregion + + #region Constructors + + /// + /// Create a default, empty Analog object + /// + public Analog() + { + ItemType = ItemType.Analog; + } + + #endregion + + #region Cloning Methods + + public override object Clone() + { + return new Analog() + { + ItemType = this.ItemType, + DupeType = this.DupeType, + + AltName = this.AltName, + AltTitle = this.AltTitle, + + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + + Part = this.Part, + Features = this.Features, + AreaName = this.AreaName, + AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, + Value = this.Value, + LoadFlag = this.LoadFlag, + + Machine = this.Machine.Clone() as Machine, + Source = this.Source.Clone() as Source, + Remove = this.Remove, + + Mask = this.Mask, + }; + } + + #endregion + + #region Comparision Methods + + public override bool Equals(DatItem other) + { + // If we don't have a Analog, return false + if (ItemType != other.ItemType) + return false; + + // Otherwise, treat it as a Analog + Analog newOther = other as Analog; + + // If the Feature information matches + return (Mask == newOther.Mask); + } + + #endregion + + #region Filtering + + /// + /// Check to see if a DatItem passes the filter + /// + /// Filter to check against + /// True if the item passed the filter, false otherwise + public override bool PassesFilter(Filter filter) + { + // Check common fields first + if (!base.PassesFilter(filter)) + return false; + + // Filter on mask + if (filter.DatItem_Mask.MatchesPositiveSet(Mask) == false) + return false; + if (filter.DatItem_Mask.MatchesNegativeSet(Mask) == true) + return false; + + return true; + } + + /// + /// Remove fields from the DatItem + /// + /// List of Fields to remove + public override void RemoveFields(List fields) + { + // Remove common fields first + base.RemoveFields(fields); + + // Remove the fields + if (fields.Contains(Field.DatItem_Mask)) + Mask = null; + } + + #endregion + + #region Sorting and Merging + + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List fields) + { + // Replace common fields first + base.ReplaceFields(item, fields); + + // If we don't have a Analog to replace from, ignore specific fields + if (item.ItemType != ItemType.Analog) + return; + + // Cast for easier access + Analog newItem = item as Analog; + + // Replace the fields + if (fields.Contains(Field.DatItem_Mask)) + Mask = newItem.Mask; + } + + #endregion + } +} diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index 3e49a094..9a7eb7f8 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -1,5 +1,8 @@ using System.Collections.Generic; +using System.Linq; +using SabreTools.Library.DatItems; +using SabreTools.Library.Filtering; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -12,77 +15,87 @@ namespace SabreTools.Library.DatItems #region ListXML - /// - /// Represents one ListXML analog - /// - [JsonObject("analog")] - public class Analog - { - [JsonProperty("mask")] - public string Mask { get; set; } - } - - /// - /// Represents one ListXML condition - /// - /// TODO: Promote to DatItem level (Both used at ListXML level AND under a lot of stuff) - [JsonObject("condition")] - public class Condition - { - [JsonProperty("tag")] - public string Tag { get; set; } - - [JsonProperty("mask")] - public string Mask { get; set; } - - [JsonProperty("relation")] - public string Relation { get; set; } // TODO: (eq|ne|gt|le|lt|ge) - - [JsonProperty("value")] - public string Value { get; set; } - } - /// /// Represents one ListXML control /// [JsonObject("control")] public class Control { - [JsonProperty("type")] + #region Fields + + /// + /// Control type + /// + [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Type { get; set; } - [JsonProperty("player")] + /// + /// Player ID + /// + [JsonProperty("player", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Player { get; set; } // TODO: Int32? - [JsonProperty("buttons")] + /// + /// Button count + /// + [JsonProperty("buttons", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Buttons { get; set; } // TODO: Int32? - [JsonProperty("regbuttons")] + /// + /// Regular button count + /// + [JsonProperty("regbuttons", DefaultValueHandling = DefaultValueHandling.Ignore)] public string RegButtons { get; set; } // TODO: Int32? - [JsonProperty("minimum")] + /// + /// Minimum value + /// + [JsonProperty("minimum", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Minimum { get; set; } // TODO: Int32? Float? - [JsonProperty("maximum")] + /// + /// Maximum value + /// + [JsonProperty("maximum", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Maximum { get; set; } // TODO: Int32? Float? - [JsonProperty("sensitivity")] + /// + /// Sensitivity value + /// + [JsonProperty("sensitivity", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Sensitivity { get; set; } // TODO: Int32? Float? - [JsonProperty("keydelta")] + /// + /// Keypress delta + /// + [JsonProperty("keydelta", DefaultValueHandling = DefaultValueHandling.Ignore)] public string KeyDelta { get; set; } // TODO: Int32? Float? - [JsonProperty("reverse")] + /// + /// Determines if the control is reversed + /// + [JsonProperty("reverse", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? Reverse { get; set; } - [JsonProperty("ways")] + /// + /// First set of ways + /// + [JsonProperty("ways", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Ways { get; set; } // TODO: Int32? Float? - [JsonProperty("ways2")] + /// + /// Second set of ways + /// + [JsonProperty("ways2", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Ways2 { get; set; } // TODO: Int32? Float? - [JsonProperty("ways3")] + /// + /// Third set of ways + /// + [JsonProperty("ways3", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Ways3 { get; set; } // TODO: Int32? Float? + + #endregion } /// @@ -92,26 +105,51 @@ namespace SabreTools.Library.DatItems [JsonObject("device")] public class Device { - [JsonProperty("type")] + #region Fields + + /// + /// Device type + /// + [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Type { get; set; } - [JsonProperty("tag")] + /// + /// Device tag + /// + [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Tag { get; set; } - [JsonProperty("fixed_image")] + /// + /// Fixed image format + /// + [JsonProperty("fixed_image", DefaultValueHandling = DefaultValueHandling.Ignore)] public string FixedImage { get; set; } - [JsonProperty("mandatory")] + /// + /// Determines if the devices is mandatory + /// + [JsonProperty("mandatory", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Mandatory { get; set; } // TODO: bool? - [JsonProperty("interface")] + /// + /// Device interface + /// + [JsonProperty("interface", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Interface { get; set; } - [JsonProperty("instances")] + /// + /// Device instances + /// + [JsonProperty("instances", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Instances { get; set; } - [JsonProperty("extensions")] + /// + /// Device extensions + /// + [JsonProperty("extensions", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Extensions { get; set; } + + #endregion } /// @@ -121,47 +159,93 @@ namespace SabreTools.Library.DatItems [JsonObject("display")] public class Display { - [JsonProperty("tag")] + #region Fields + + /// + /// Display tag + /// + [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Tag { get; set; } - [JsonProperty("type")] + /// + /// Display type + /// + [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Type { get; set; } // TODO: (raster|vector|lcd|svg|unknown) - [JsonProperty("rotate")] + /// + /// Display rotation + /// + [JsonProperty("rotate", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Rotate { get; set; } // TODO: (0|90|180|270) Int32? - [JsonProperty("flipx")] + /// + /// Determines if display is flipped in the X-coordinates + /// + [JsonProperty("flipx", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? FlipX { get; set; } - [JsonProperty("width")] + /// + /// Display width + /// + [JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Width { get; set; } // TODO: Int32? - [JsonProperty("height")] + /// + /// Display height + /// + [JsonProperty("height", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Height { get; set; } // TODO: Int32? - [JsonProperty("refresh")] + /// + /// Refresh rate + /// + [JsonProperty("refresh", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Refresh { get; set; } // TODO: Int32? Float? - [JsonProperty("pixclock")] + /// + /// Pixel clock timer + /// + [JsonProperty("pixclock", DefaultValueHandling = DefaultValueHandling.Ignore)] public string PixClock { get; set; } // TODO: Int32? Float? - [JsonProperty("htotal")] + /// + /// Total horizontal lines + /// + [JsonProperty("htotal", DefaultValueHandling = DefaultValueHandling.Ignore)] public string HTotal { get; set; } // TODO: Int32? Float? - [JsonProperty("hbend")] + /// + /// Horizontal blank end + /// + [JsonProperty("hbend", DefaultValueHandling = DefaultValueHandling.Ignore)] public string HBEnd { get; set; } // TODO: Int32? Float? - [JsonProperty("hbstart")] + /// + /// Horizontal blank start + /// + [JsonProperty("hbstart", DefaultValueHandling = DefaultValueHandling.Ignore)] public string HBStart { get; set; } // TODO: Int32? Float? - [JsonProperty("vtotal")] + /// + /// Total vertical lines + /// + [JsonProperty("vtotal", DefaultValueHandling = DefaultValueHandling.Ignore)] public string VTotal { get; set; } // TODO: Int32? Float? - [JsonProperty("vbend")] + /// + /// Vertical blank end + /// + [JsonProperty("vbend", DefaultValueHandling = DefaultValueHandling.Ignore)] public string VBEnd { get; set; } // TODO: Int32? Float? - [JsonProperty("vbstart")] + /// + /// Vertical blank start + /// + [JsonProperty("vbstart", DefaultValueHandling = DefaultValueHandling.Ignore)] public string VBStart { get; set; } // TODO: Int32? Float? + + #endregion } /// @@ -170,8 +254,15 @@ namespace SabreTools.Library.DatItems [JsonObject("extension")] public class Extension { - [JsonProperty("name")] + #region Fields + + /// + /// Extension name + /// + [JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Name { get; set; } + + #endregion } /// @@ -181,20 +272,39 @@ namespace SabreTools.Library.DatItems [JsonObject("input")] public class Input { - [JsonProperty("service")] + #region Fields + + /// + /// Input service ID + /// + [JsonProperty("service", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? Service { get; set; } - [JsonProperty("tilt")] + /// + /// Determins if this has a tilt sensor + /// + [JsonProperty("tilt", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? Tilt { get; set; } - [JsonProperty("players")] + /// + /// Number of players on the input + /// + [JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Players { get; set; } // TODO: Int32? - [JsonProperty("coins")] + /// + /// Number of coins required + /// + [JsonProperty("coins", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Coins { get; set; } // TODO: Int32? - [JsonProperty("controls")] + /// + /// Set of controls for the input + /// + [JsonProperty("controls", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Controls { get; set; } + + #endregion } /// @@ -203,11 +313,21 @@ namespace SabreTools.Library.DatItems [JsonObject("instance")] public class Instance { + #region Fields + + /// + /// Name of the instance + /// [JsonProperty("name")] public string Name { get; set; } - [JsonProperty("briefname")] + /// + /// Short name for the instance + /// + [JsonProperty("briefname", DefaultValueHandling = DefaultValueHandling.Ignore)] public string BriefName { get; set; } + + #endregion } /// @@ -216,14 +336,27 @@ namespace SabreTools.Library.DatItems [JsonObject("location")] public class Location { + #region Fields + + /// + /// Location name + /// [JsonProperty("name")] public string Name { get; set; } - [JsonProperty("number")] + /// + /// Location ID + /// + [JsonProperty("number", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Number { get; set; } - [JsonProperty("inverted")] + /// + /// Determines if location is inverted or not + /// + [JsonProperty("inverted", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? Inverted { get; set; } + + #endregion } /// @@ -233,11 +366,21 @@ namespace SabreTools.Library.DatItems [JsonObject("port")] public class Port { - [JsonProperty("tag")] + #region Fields + + /// + /// Tag for the port + /// + [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Tag { get; set; } - [JsonProperty("analogs")] + /// + /// List of analogs on the port + /// + [JsonProperty("analogs", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Analogs { get; set; } + + #endregion } /// @@ -246,17 +389,33 @@ namespace SabreTools.Library.DatItems [JsonObject("setting")] public class Setting { + #region Fields + + /// + /// Setting name + /// [JsonProperty("name")] public string Name { get; set; } - [JsonProperty("value")] + /// + /// Setting value + /// + [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore)] public string Value { get; set; } - [JsonProperty("default")] + /// + /// Determines if the setting is default or not + /// + [JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? Default { get; set; } - [JsonProperty("conditions")] + /// + /// List of conditions on the setting + /// + [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Conditions { get; set; } + + #endregion } /// @@ -265,14 +424,27 @@ namespace SabreTools.Library.DatItems [JsonObject("slotoption")] public class SlotOption { + #region Fields + + /// + /// Slot option name + /// [JsonProperty("name")] public string Name { get; set; } + /// + /// Referenced device name + /// [JsonProperty("devname")] public string DeviceName { get; set; } - [JsonProperty("default")] + /// + /// Determines if this slot option is default or not + /// + [JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore)] public bool? Default { get; set; } + + #endregion } #endregion diff --git a/SabreTools.Library/DatItems/Condition.cs b/SabreTools.Library/DatItems/Condition.cs new file mode 100644 index 00000000..97c4c820 --- /dev/null +++ b/SabreTools.Library/DatItems/Condition.cs @@ -0,0 +1,246 @@ +using System.Collections.Generic; +using System.Linq; + +using SabreTools.Library.Filtering; +using Newtonsoft.Json; + +/// +/// This holds all of the auxiliary types needed for proper parsing +/// +namespace SabreTools.Library.DatItems +{ + /// + /// Represents a condition on a machine or other item + /// + [JsonObject("condition")] + public class Condition : DatItem + { + // TODO: Handle obscure field mappings due to this being used *under* other items as well + #region Fields + + /// + /// Condition tag value + /// + [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Tag { get; set; } + + /// + /// Condition mask + /// + [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Mask { get; set; } + + /// + /// Condition relationship + /// + [JsonProperty("relation", DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Relation { get; set; } // TODO: (eq|ne|gt|le|lt|ge) + + /// + /// Condition value + /// + [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore)] + public string ConditionValue { get; set; } + + #endregion + + #region Accessors + + /// + /// Set fields with given values + /// + /// Mappings dictionary + public override void SetFields(Dictionary mappings) + { + // Set base fields + base.SetFields(mappings); + + // Handle Condition-specific fields + if (mappings.Keys.Contains(Field.DatItem_Tag)) + Tag = mappings[Field.DatItem_Tag]; + + if (mappings.Keys.Contains(Field.DatItem_Mask)) + Mask = mappings[Field.DatItem_Mask]; + + if (mappings.Keys.Contains(Field.DatItem_Relation)) + Relation = mappings[Field.DatItem_Relation]; + + if (mappings.Keys.Contains(Field.DatItem_ConditionValue)) + ConditionValue = mappings[Field.DatItem_ConditionValue]; + } + + #endregion + + #region Constructors + + /// + /// Create a default, empty Condition object + /// + public Condition() + { + ItemType = ItemType.Condition; + } + + #endregion + + #region Cloning Methods + + public override object Clone() + { + return new Condition() + { + ItemType = this.ItemType, + DupeType = this.DupeType, + + AltName = this.AltName, + AltTitle = this.AltTitle, + + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + + Part = this.Part, + Features = this.Features, + AreaName = this.AreaName, + AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, + Value = this.Value, + LoadFlag = this.LoadFlag, + + Machine = this.Machine.Clone() as Machine, + Source = this.Source.Clone() as Source, + Remove = this.Remove, + + Tag = this.Tag, + Mask = this.Mask, + Relation = this.Relation, + ConditionValue = this.ConditionValue, + }; + } + + #endregion + + #region Comparision Methods + + public override bool Equals(DatItem other) + { + // If we don't have a Condition, return false + if (ItemType != other.ItemType) + return false; + + // Otherwise, treat it as a Condition + Condition newOther = other as Condition; + + // If the Feature information matches + return (Tag == newOther.Tag + && Mask == newOther.Mask + && Relation == newOther.Relation + && ConditionValue == newOther.ConditionValue); + } + + #endregion + + #region Filtering + + /// + /// Check to see if a DatItem passes the filter + /// + /// Filter to check against + /// True if the item passed the filter, false otherwise + public override bool PassesFilter(Filter filter) + { + // Check common fields first + if (!base.PassesFilter(filter)) + return false; + + // Filter on tag + if (filter.DatItem_Tag.MatchesPositiveSet(Tag) == false) + return false; + if (filter.DatItem_Tag.MatchesNegativeSet(Tag) == true) + return false; + + // Filter on mask + if (filter.DatItem_Mask.MatchesPositiveSet(Mask) == false) + return false; + if (filter.DatItem_Mask.MatchesNegativeSet(Mask) == true) + return false; + + // Filter on mask + if (filter.DatItem_Relation.MatchesPositiveSet(Relation) == false) + return false; + if (filter.DatItem_Relation.MatchesNegativeSet(Relation) == true) + return false; + + // Filter on value + if (filter.DatItem_ConditionValue.MatchesPositiveSet(ConditionValue) == false) + return false; + if (filter.DatItem_ConditionValue.MatchesNegativeSet(ConditionValue) == true) + return false; + + return true; + } + + /// + /// Remove fields from the DatItem + /// + /// List of Fields to remove + public override void RemoveFields(List fields) + { + // Remove common fields first + base.RemoveFields(fields); + + // Remove the fields + if (fields.Contains(Field.DatItem_Tag)) + Tag = null; + + if (fields.Contains(Field.DatItem_Mask)) + Mask = null; + + if (fields.Contains(Field.DatItem_Relation)) + Relation = null; + + if (fields.Contains(Field.DatItem_ConditionValue)) + ConditionValue = null; + } + + #endregion + + #region Sorting and Merging + + /// + /// Replace fields from another item + /// + /// DatItem to pull new information from + /// List of Fields representing what should be updated + public override void ReplaceFields(DatItem item, List fields) + { + // Replace common fields first + base.ReplaceFields(item, fields); + + // If we don't have a Condition to replace from, ignore specific fields + if (item.ItemType != ItemType.Condition) + return; + + // Cast for easier access + Condition newItem = item as Condition; + + // Replace the fields + if (fields.Contains(Field.DatItem_Tag)) + Tag = newItem.Tag; + + if (fields.Contains(Field.DatItem_Mask)) + Mask = newItem.Mask; + + if (fields.Contains(Field.DatItem_Relation)) + Relation = newItem.Relation; + + if (fields.Contains(Field.DatItem_ConditionValue)) + ConditionValue = newItem.ConditionValue; + } + + #endregion + } +} diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index d5f56c14..5fea2620 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -458,6 +458,9 @@ namespace SabreTools.Library.DatItems case ItemType.Adjuster: return new Adjuster(); + case ItemType.Analog: + return new Analog(); + case ItemType.Archive: return new Archive(); @@ -470,6 +473,9 @@ namespace SabreTools.Library.DatItems case ItemType.Chip: return new Chip(); + case ItemType.Condition: + return new Condition(); + case ItemType.Configuration: return new Configuration(); @@ -519,10 +525,12 @@ namespace SabreTools.Library.DatItems return itemType switch { ItemType.Adjuster => new Adjuster(), + ItemType.Analog => new Analog(), ItemType.Archive => new Archive(), ItemType.BiosSet => new BiosSet(), ItemType.Blank => new Blank(), ItemType.Chip => new Chip(), + ItemType.Condition => new Condition(), ItemType.Configuration => new Configuration(), ItemType.DeviceReference => new DeviceReference(), ItemType.DipSwitch => new DipSwitch(), diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 71d4f4c7..6c5b61e0 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -203,13 +203,6 @@ namespace SabreTools.Library.DatItems Machine_Display_VBEnd, Machine_Display_VBStart, - // Conditions - Machine_Conditions, - Machine_Condition_Tag, - Machine_Condition_Mask, - Machine_Condition_Relation, - Machine_Condition_Value, - // Inputs Machine_Inputs, Machine_Input_Service, @@ -393,6 +386,9 @@ namespace SabreTools.Library.DatItems DatItem_Condition_Relation, DatItem_Condition_Value, + // Analog + DatItem_Mask, + // BiosSet DatItem_Description, @@ -401,8 +397,9 @@ namespace SabreTools.Library.DatItems DatItem_ChipType, DatItem_Clock, - // Configuration - DatItem_Mask, + // Condition + DatItem_ConditionValue, + DatItem_Relation, // Configuration.Locations DatItem_Locations, @@ -489,9 +486,11 @@ namespace SabreTools.Library.DatItems // "Auxiliary" item types Adjuster, + Analog, Archive, BiosSet, Chip, + Condition, Configuration, DeviceReference, DipSwitch, diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs index a477d1d8..b57f260b 100644 --- a/SabreTools.Library/DatItems/Machine.cs +++ b/SabreTools.Library/DatItems/Machine.cs @@ -158,12 +158,6 @@ namespace SabreTools.Library.DatItems [JsonProperty("displays", DefaultValueHandling = DefaultValueHandling.Ignore)] public List Displays { get; set; } = null; - /// - /// List of associated conditions - /// - [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore)] - public List Conditions { get; set; } = null; - /// /// List of associated inputs /// @@ -535,7 +529,6 @@ namespace SabreTools.Library.DatItems SourceFile = this.SourceFile, Runnable = this.Runnable, Displays = this.Displays, - Conditions = this.Conditions, Inputs = this.Inputs, Ports = this.Ports, Devices = this.Devices, @@ -1018,105 +1011,13 @@ namespace SabreTools.Library.DatItems #endregion - #region Conditions - - // Machine_Conditions - if (filter.Machine_Conditions.MatchesNeutral(null, Conditions?.Any() ?? null) == false) - return false; - - // Machine_Condition_Tag - if (Conditions?.Any() == true) - { - bool anyPositive = false; - bool anyNegative = false; - - foreach (var condition in Conditions) - { - if (filter.Machine_Condition_Tag.MatchesPositiveSet(condition?.Tag) != false) - anyPositive = true; - if (filter.Machine_Condition_Tag.MatchesNegativeSet(condition?.Tag) == true) - anyNegative = true; - } - - if (!anyPositive) - return false; - if (anyNegative) - return false; - } - - // Machine_Condition_Mask - if (Conditions?.Any() == true) - { - bool anyPositive = false; - bool anyNegative = false; - - foreach (var condition in Conditions) - { - if (filter.Machine_Condition_Mask.MatchesPositiveSet(condition?.Mask) != false) - anyPositive = true; - if (filter.Machine_Condition_Mask.MatchesNegativeSet(condition?.Mask) == true) - anyNegative = true; - } - - if (!anyPositive) - return false; - if (anyNegative) - return false; - } - - // Machine_Condition_Relation - if (Conditions?.Any() == true) - { - bool anyPositive = false; - bool anyNegative = false; - - foreach (var condition in Conditions) - { - if (filter.Machine_Condition_Relation.MatchesPositiveSet(condition?.Relation) != false) - anyPositive = true; - if (filter.Machine_Condition_Relation.MatchesNegativeSet(condition?.Relation) == true) - anyNegative = true; - } - - if (!anyPositive) - return false; - if (anyNegative) - return false; - } - - // Machine_Condition_Value - if (Conditions?.Any() == true) - { - bool anyPositive = false; - bool anyNegative = false; - - foreach (var condition in Conditions) - { - if (filter.Machine_Condition_Value.MatchesPositiveSet(condition?.Value) != false) - anyPositive = true; - if (filter.Machine_Condition_Value.MatchesNegativeSet(condition?.Value) == true) - anyNegative = true; - } - - if (!anyPositive) - return false; - if (anyNegative) - return false; - } - - #endregion - // TODO: Inputs // TODO: Inputs.Controls // TODO: Ports // TODO: Ports.Analogs - // TODO: Drivers - // TODO: Features // TODO: Devices // TODO: Devices.Instances // TODO: Devices.Extensions - // TODO: Slots - // TODO: Slots.SlotOptions #endregion // ListXML diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index 5946ceb2..72803432 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -68,13 +68,6 @@ namespace SabreTools.Library.Filtering public FilterItem Machine_Display_VBEnd { get; private set; } = new FilterItem(); public FilterItem Machine_Display_VBStart { get; private set; } = new FilterItem(); - // Conditions - public FilterItem Machine_Conditions { get; private set; } = new FilterItem() { Neutral = null }; - public FilterItem Machine_Condition_Tag { get; private set; } = new FilterItem(); - public FilterItem Machine_Condition_Mask { get; private set; } = new FilterItem(); - public FilterItem Machine_Condition_Relation { get; private set; } = new FilterItem(); - public FilterItem Machine_Condition_Value { get; private set; } = new FilterItem(); - // Inputs public FilterItem Machine_Inputs { get; private set; } = new FilterItem() { Neutral = null }; public FilterItem Machine_Input_Service { get; private set; } = new FilterItem() { Neutral = null }; @@ -257,6 +250,9 @@ namespace SabreTools.Library.Filtering public FilterItem DatItem_Condition_Relation { get; private set; } = new FilterItem(); public FilterItem DatItem_Condition_Value { get; private set; } = new FilterItem(); + // Analog + public FilterItem DatItem_Mask { get; private set; } = new FilterItem(); + // BiosSet public FilterItem DatItem_Description { get; private set; } = new FilterItem(); public FilterItem DatItem_Default { get; private set; } = new FilterItem() { Neutral = null }; @@ -266,8 +262,9 @@ namespace SabreTools.Library.Filtering public FilterItem DatItem_ChipType { get; private set; } = new FilterItem() { Positive = ChipType.NULL, Negative = ChipType.NULL }; public FilterItem DatItem_Clock { get; private set; } = new FilterItem(); - // Configuration - public FilterItem DatItem_Mask { get; private set; } = new FilterItem(); + // Condition + public FilterItem DatItem_Relation { get; private set; } = new FilterItem(); + public FilterItem DatItem_ConditionValue { get; private set; } = new FilterItem(); // Configuration.Locations public FilterItem DatItem_Locations { get; private set; } = new FilterItem() { Neutral = null }; @@ -650,42 +647,6 @@ namespace SabreTools.Library.Filtering Machine_Display_VBStart.PositiveSet.Add(value); break; - // Conditions - case Field.Machine_Conditions: - if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) - Machine_Conditions.Neutral = false; - else - Machine_Conditions.Neutral = true; - break; - - case Field.Machine_Condition_Tag: - if (negate) - Machine_Condition_Tag.NegativeSet.Add(value); - else - Machine_Condition_Tag.PositiveSet.Add(value); - break; - - case Field.Machine_Condition_Mask: - if (negate) - Machine_Condition_Mask.NegativeSet.Add(value); - else - Machine_Condition_Mask.PositiveSet.Add(value); - break; - - case Field.Machine_Condition_Relation: - if (negate) - Machine_Condition_Relation.NegativeSet.Add(value); - else - Machine_Condition_Relation.PositiveSet.Add(value); - break; - - case Field.Machine_Condition_Value: - if (negate) - Machine_Condition_Value.NegativeSet.Add(value); - else - Machine_Condition_Value.PositiveSet.Add(value); - break; - // Inputs case Field.Machine_Inputs: if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) @@ -1534,6 +1495,14 @@ namespace SabreTools.Library.Filtering DatItem_Condition_Value.PositiveSet.Add(value); break; + // Analog + case Field.DatItem_Mask: + if (negate) + DatItem_Mask.NegativeSet.Add(value); + else + DatItem_Mask.PositiveSet.Add(value); + break; + // BiosSet case Field.DatItem_Description: if (negate) @@ -1564,12 +1533,19 @@ namespace SabreTools.Library.Filtering DatItem_Clock.PositiveSet.Add(value); break; - // Configuration - case Field.DatItem_Mask: + // Condition + case Field.DatItem_Relation: if (negate) - DatItem_Mask.NegativeSet.Add(value); + DatItem_Relation.NegativeSet.Add(value); else - DatItem_Mask.PositiveSet.Add(value); + DatItem_Relation.PositiveSet.Add(value); + break; + + case Field.DatItem_ConditionValue: + if (negate) + DatItem_ConditionValue.NegativeSet.Add(value); + else + DatItem_ConditionValue.PositiveSet.Add(value); break; // Configurations.Locations diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index 635ba3f8..2c20cdcf 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -617,21 +617,6 @@ namespace SabreTools.Library.Tools case "display_vbstart": return Field.Machine_Display_VBStart; - case "conditions": - return Field.Machine_Conditions; - - case "condition_tag": - return Field.Machine_Condition_Tag; - - case "condition_mask": - return Field.Machine_Condition_Mask; - - case "condition_relation": - return Field.Machine_Condition_Relation; - - case "condition_value": - return Field.Machine_Condition_Value; - case "inputs": return Field.Machine_Inputs; @@ -1046,6 +1031,10 @@ namespace SabreTools.Library.Tools case "condition_value": return Field.DatItem_Condition_Value; + // Analog + case "mask": + return Field.DatItem_Mask; + // BiosSet case "description": case "biosdescription": @@ -1063,10 +1052,14 @@ namespace SabreTools.Library.Tools case "clock": return Field.DatItem_Clock; - // Configuration - case "mask": - return Field.DatItem_Mask; + // Condition + case "relation": + return Field.DatItem_Relation; + case "conditionvalue": + return Field.DatItem_ConditionValue; + + // Configuration case "locations": return Field.DatItem_Locations; @@ -1665,6 +1658,8 @@ namespace SabreTools.Library.Tools { case "adjuster": return ItemType.Adjuster; + case "analog": + return ItemType.Analog; case "archive": return ItemType.Archive; case "biosset": @@ -1673,6 +1668,8 @@ namespace SabreTools.Library.Tools return ItemType.Blank; case "chip": return ItemType.Chip; + case "condition": + return ItemType.Condition; case "configuration": return ItemType.Configuration; case "device_ref": @@ -1708,10 +1705,12 @@ namespace SabreTools.Library.Tools return itemType?.ToLowerInvariant() switch { "adjuster" => ItemType.Adjuster, + "analog" => ItemType.Analog, "archive" => ItemType.Archive, "biosset" => ItemType.BiosSet, "blank" => ItemType.Blank, "chip" => ItemType.Chip, + "condition" => ItemType.Condition, "configuration" => ItemType.Configuration, "device_ref" => ItemType.DeviceReference, "dipswitch" => ItemType.DipSwitch, @@ -2270,6 +2269,8 @@ namespace SabreTools.Library.Tools { case ItemType.Adjuster: return "adjuster"; + case ItemType.Analog: + return "analog"; case ItemType.Archive: return "archive"; case ItemType.BiosSet: @@ -2278,6 +2279,8 @@ namespace SabreTools.Library.Tools return "blank"; case ItemType.Chip: return "chip"; + case ItemType.Condition: + return "condition"; case ItemType.Configuration: return "configuration"; case ItemType.DeviceReference: @@ -2313,10 +2316,12 @@ namespace SabreTools.Library.Tools return itemType switch { ItemType.Adjuster => "adjuster", + ItemType.Analog => "analog", ItemType.Archive => "archive", ItemType.BiosSet => "biosset", ItemType.Blank => "blank", ItemType.Chip => "chip", + ItemType.Condition => "condition", ItemType.Configuration => "configuration", ItemType.DeviceReference => "device_ref", ItemType.DipSwitch => "dipswitch",