diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs
index 74431f5f..ecf66b62 100644
--- a/SabreTools.Library/DatFiles/ItemDictionary.cs
+++ b/SabreTools.Library/DatFiles/ItemDictionary.cs
@@ -161,6 +161,12 @@ namespace SabreTools.Library.DatFiles
[JsonIgnore]
public long FeatureCount { get; private set; } = 0;
+ ///
+ /// Number of Input items
+ ///
+ [JsonIgnore]
+ public long InputCount { get; private set; } = 0;
+
///
/// Number of Media items
///
@@ -593,6 +599,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Feature:
FeatureCount++;
break;
+ case ItemType.Input:
+ InputCount++;
+ break;
case ItemType.Media:
MediaCount++;
MD5Count += (string.IsNullOrWhiteSpace((item as Media).MD5) ? 0 : 1);
@@ -767,6 +776,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Feature:
FeatureCount--;
break;
+ case ItemType.Input:
+ InputCount--;
+ break;
case ItemType.Media:
MediaCount--;
MD5Count -= (string.IsNullOrWhiteSpace((item as Media).MD5) ? 0 : 1);
diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs
index ae1b3983..fa92d789 100644
--- a/SabreTools.Library/DatFiles/Json.cs
+++ b/SabreTools.Library/DatFiles/Json.cs
@@ -256,6 +256,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Feature:
datItem = datItemObj.ToObject();
break;
+ case ItemType.Input:
+ datItem = datItemObj.ToObject();
+ break;
case ItemType.Instance:
datItem = datItemObj.ToObject();
break;
diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index 4a456476..5d1d9b7b 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -419,6 +419,30 @@ namespace SabreTools.Library.DatFiles
reader.Read();
break;
+ case "input":
+ var input = new Input
+ {
+ Service = reader.GetAttribute("service").AsYesNo(),
+ Tilt = reader.GetAttribute("tilt").AsYesNo(),
+ Players = reader.GetAttribute("players"),
+ Coins = reader.GetAttribute("coins"),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
+ };
+
+ // Now read the internal tags
+ ReadInput(reader.ReadSubtree(), input);
+
+ datItems.Add(input);
+
+ // Skip the input now that we've processed it
+ reader.Skip();
+ break;
+
case "port":
var port = new Port
{
@@ -549,26 +573,6 @@ namespace SabreTools.Library.DatFiles
reader.Read();
break;
- case "input":
- var input = new Input();
- input.Service = reader.GetAttribute("service").AsYesNo();
- input.Tilt = reader.GetAttribute("tilt").AsYesNo();
- input.Players = reader.GetAttribute("players");
- input.Coins = reader.GetAttribute("coins");
-
- // Now read the internal tags
- ReadInput(reader.ReadSubtree(), input);
-
- // Ensure the list exists
- if (machine.Inputs == null)
- machine.Inputs = new List();
-
- machine.Inputs.Add(input);
-
- // Skip the input now that we've processed it
- reader.Skip();
- break;
-
default:
reader.Read();
break;
@@ -1254,40 +1258,6 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalElementString("year", datItem.Machine.Year);
xtw.WriteOptionalElementString("manufacturer", datItem.Machine.Manufacturer);
- // TODO: These are all going away due to promotions
- if (datItem.Machine.Inputs != null)
- {
- 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);
- xtw.WriteOptionalAttributeString("regbuttons", control.RegButtons);
- xtw.WriteOptionalAttributeString("minimum", control.Minimum);
- xtw.WriteOptionalAttributeString("maximum", control.Maximum);
- xtw.WriteOptionalAttributeString("sensitivity", control.Sensitivity);
- xtw.WriteOptionalAttributeString("keydelta", control.KeyDelta);
- xtw.WriteOptionalAttributeString("reverse", control.Reverse.FromYesNo());
- xtw.WriteOptionalAttributeString("ways", control.Ways);
- xtw.WriteOptionalAttributeString("ways2", control.Ways2);
- xtw.WriteOptionalAttributeString("ways3", control.Ways3);
- xtw.WriteEndElement();
- }
- }
- xtw.WriteEndElement();
- }
- }
-
xtw.Flush();
}
catch (Exception ex)
@@ -1576,6 +1546,36 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
break;
+ case ItemType.Input:
+ var input = datItem as Input;
+ 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);
+ xtw.WriteOptionalAttributeString("regbuttons", control.RegButtons);
+ xtw.WriteOptionalAttributeString("minimum", control.Minimum);
+ xtw.WriteOptionalAttributeString("maximum", control.Maximum);
+ xtw.WriteOptionalAttributeString("sensitivity", control.Sensitivity);
+ xtw.WriteOptionalAttributeString("keydelta", control.KeyDelta);
+ xtw.WriteOptionalAttributeString("reverse", control.Reverse.FromYesNo());
+ xtw.WriteOptionalAttributeString("ways", control.Ways);
+ xtw.WriteOptionalAttributeString("ways2", control.Ways2);
+ xtw.WriteOptionalAttributeString("ways3", control.Ways3);
+ xtw.WriteEndElement();
+ }
+ }
+ xtw.WriteEndElement();
+ break;
+
case ItemType.Port:
var port = datItem as Port;
xtw.WriteStartElement("port");
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index 9966d15a..fe9b7fb4 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -1473,6 +1473,37 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
break;
+ case ItemType.Input:
+ var input = datItem as Input;
+ xtw.WriteStartElement("file");
+ xtw.WriteAttributeString("type", "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);
+ xtw.WriteOptionalAttributeString("regbuttons", control.RegButtons);
+ xtw.WriteOptionalAttributeString("minimum", control.Minimum);
+ xtw.WriteOptionalAttributeString("maximum", control.Maximum);
+ xtw.WriteOptionalAttributeString("sensitivity", control.Sensitivity);
+ xtw.WriteOptionalAttributeString("keydelta", control.KeyDelta);
+ xtw.WriteOptionalAttributeString("reverse", control.Reverse.FromYesNo());
+ xtw.WriteOptionalAttributeString("ways", control.Ways);
+ xtw.WriteOptionalAttributeString("ways2", control.Ways2);
+ xtw.WriteOptionalAttributeString("ways3", control.Ways3);
+ xtw.WriteEndElement();
+ }
+ }
+ xtw.WriteEndElement();
+ break;
+
case ItemType.Media:
var media = datItem as Media;
xtw.WriteStartElement("file");
diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs
index 222296af..bee82e4b 100644
--- a/SabreTools.Library/DatItems/Auxiliary.cs
+++ b/SabreTools.Library/DatItems/Auxiliary.cs
@@ -99,48 +99,6 @@ namespace SabreTools.Library.DatItems
#endregion
}
- ///
- /// Represents one ListXML input
- ///
- /// TODO: Promote to DatItem level (contains list)
- [JsonObject("input")]
- public class Input
- {
- #region Fields
-
- ///
- /// Input service ID
- ///
- [JsonProperty("service", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public bool? Service { get; set; }
-
- ///
- /// Determins if this has a tilt sensor
- ///
- [JsonProperty("tilt", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public bool? Tilt { get; set; }
-
- ///
- /// Number of players on the input
- ///
- [JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public string Players { get; set; } // TODO: Int32?
-
- ///
- /// Number of coins required
- ///
- [JsonProperty("coins", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public string Coins { get; set; } // TODO: Int32?
-
- ///
- /// Set of controls for the input
- ///
- [JsonProperty("controls", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public List Controls { get; set; }
-
- #endregion
- }
-
///
/// Represents one ListXML conflocation or diplocation
///
diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs
index 509ea944..ff2200f3 100644
--- a/SabreTools.Library/DatItems/DatItem.cs
+++ b/SabreTools.Library/DatItems/DatItem.cs
@@ -503,6 +503,9 @@ namespace SabreTools.Library.DatItems
case ItemType.Feature:
return new Feature();
+ case ItemType.Input:
+ return new Input();
+
case ItemType.Instance:
return new Instance();
diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs
index 8e1a8cb2..97fb5ca1 100644
--- a/SabreTools.Library/DatItems/Enums.cs
+++ b/SabreTools.Library/DatItems/Enums.cs
@@ -186,28 +186,6 @@ namespace SabreTools.Library.DatItems
Machine_SourceFile,
Machine_Runnable,
- // Inputs
- Machine_Inputs,
- Machine_Input_Service,
- Machine_Input_Tilt,
- Machine_Input_Players,
- Machine_Input_Coins,
-
- // Inputs.Controls
- Machine_Input_Controls,
- Machine_Input_Control_Type,
- Machine_Input_Control_Player,
- Machine_Input_Control_Buttons,
- Machine_Input_Control_RegButtons,
- Machine_Input_Control_Minimum,
- Machine_Input_Control_Maximum,
- Machine_Input_Control_Sensitivity,
- Machine_Input_Control_KeyDelta,
- Machine_Input_Control_Reverse,
- Machine_Input_Control_Ways,
- Machine_Input_Control_Ways2,
- Machine_Input_Control_Ways3,
-
#endregion
#region Logiqx
@@ -418,6 +396,27 @@ namespace SabreTools.Library.DatItems
DatItem_FeatureStatus,
DatItem_FeatureOverall,
+ // Inputs
+ DatItem_Service,
+ DatItem_Tilt,
+ DatItem_Players,
+ DatItem_Coins,
+
+ // Inputs.Controls
+ DatItem_Controls,
+ DatItem_Control_Type,
+ DatItem_Control_Player,
+ DatItem_Control_Buttons,
+ DatItem_Control_RegButtons,
+ DatItem_Control_Minimum,
+ DatItem_Control_Maximum,
+ DatItem_Control_Sensitivity,
+ DatItem_Control_KeyDelta,
+ DatItem_Control_Reverse,
+ DatItem_Control_Ways,
+ DatItem_Control_Ways2,
+ DatItem_Control_Ways3,
+
// Port.Analogs
DatItem_Analogs,
DatItem_Analog_Mask,
@@ -491,6 +490,7 @@ namespace SabreTools.Library.DatItems
Driver,
Extension,
Feature,
+ Input,
Instance,
Port,
RamOption,
diff --git a/SabreTools.Library/DatItems/Input.cs b/SabreTools.Library/DatItems/Input.cs
new file mode 100644
index 00000000..e1ee9c0f
--- /dev/null
+++ b/SabreTools.Library/DatItems/Input.cs
@@ -0,0 +1,264 @@
+using System.Collections.Generic;
+using System.Linq;
+using SabreTools.Library.Filtering;
+using Newtonsoft.Json;
+using SabreTools.Library.Tools;
+
+///
+/// This holds all of the auxiliary types needed for proper parsing
+///
+namespace SabreTools.Library.DatItems
+{
+ ///
+ /// Represents one ListXML input
+ ///
+ [JsonObject("input")]
+ public class Input : DatItem
+ {
+ #region Fields
+
+ ///
+ /// Input service ID
+ ///
+ [JsonProperty("service", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public bool? Service { get; set; }
+
+ ///
+ /// Determins if this has a tilt sensor
+ ///
+ [JsonProperty("tilt", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public bool? Tilt { get; set; }
+
+ ///
+ /// Number of players on the input
+ ///
+ [JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Players { get; set; } // TODO: Int32?
+
+ ///
+ /// Number of coins required
+ ///
+ [JsonProperty("coins", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Coins { get; set; } // TODO: Int32?
+
+ ///
+ /// Set of controls for the input
+ ///
+ [JsonProperty("controls", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public List Controls { 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 Input-specific fields
+ if (mappings.Keys.Contains(Field.DatItem_Service))
+ Service = mappings[Field.DatItem_Service].AsYesNo();
+
+ if (mappings.Keys.Contains(Field.DatItem_Tilt))
+ Tilt = mappings[Field.DatItem_Tilt].AsYesNo();
+
+ if (mappings.Keys.Contains(Field.DatItem_Players))
+ Players = mappings[Field.DatItem_Players];
+
+ if (mappings.Keys.Contains(Field.DatItem_Coins))
+ Coins = mappings[Field.DatItem_Coins];
+
+ // TODO: Handle DatItem_Control*
+ }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Create a default, empty Input object
+ ///
+ public Input()
+ {
+ ItemType = ItemType.Input;
+ }
+
+ #endregion
+
+ #region Cloning Methods
+
+ public override object Clone()
+ {
+ return new Input()
+ {
+ 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,
+
+ Service = this.Service,
+ Tilt = this.Tilt,
+ Players = this.Players,
+ Coins = this.Coins,
+ Controls = this.Controls,
+ };
+ }
+
+ #endregion
+
+ #region Comparision Methods
+
+ public override bool Equals(DatItem other)
+ {
+ // If we don't have a Input, return false
+ if (ItemType != other.ItemType)
+ return false;
+
+ // Otherwise, treat it as a Input
+ Input newOther = other as Input;
+
+ // If the Input information matches
+ return (Service == newOther.Service
+ && Tilt == newOther.Tilt
+ && Players == newOther.Players
+ && Coins == newOther.Coins);
+
+ // TODO: Handle DatItem_Control*
+ }
+
+ #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 service
+ if (filter.DatItem_Service.MatchesNeutral(null, Service) == false)
+ return false;
+
+ // Filter on tilt
+ if (filter.DatItem_Tilt.MatchesNeutral(null, Tilt) == false)
+ return false;
+
+ // Filter on players
+ if (filter.DatItem_Players.MatchesPositiveSet(Players) == false)
+ return false;
+ if (filter.DatItem_Players.MatchesNegativeSet(Players) == true)
+ return false;
+
+ // Filter on coins
+ if (filter.DatItem_Coins.MatchesPositiveSet(Coins) == false)
+ return false;
+ if (filter.DatItem_Coins.MatchesNegativeSet(Coins) == true)
+ return false;
+
+ // TODO: Handle DatItem_Control*
+
+ 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_Service))
+ Service = null;
+
+ if (fields.Contains(Field.DatItem_Tilt))
+ Tilt = null;
+
+ if (fields.Contains(Field.DatItem_Players))
+ Players = null;
+
+ if (fields.Contains(Field.DatItem_Coins))
+ Coins = null;
+
+ if (fields.Contains(Field.DatItem_Controls))
+ Controls = null;
+
+ // TODO: Handle DatItem_Control*
+ }
+
+ #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 Input to replace from, ignore specific fields
+ if (item.ItemType != ItemType.Input)
+ return;
+
+ // Cast for easier access
+ Input newItem = item as Input;
+
+ // Replace the fields
+ if (fields.Contains(Field.DatItem_Service))
+ Service = newItem.Service;
+
+ if (fields.Contains(Field.DatItem_Tilt))
+ Tilt = newItem.Tilt;
+
+ if (fields.Contains(Field.DatItem_Players))
+ Players = newItem.Players;
+
+ if (fields.Contains(Field.DatItem_Coins))
+ Coins = newItem.Coins;
+
+ if (fields.Contains(Field.DatItem_Controls))
+ Controls = newItem.Controls;
+
+ // TODO: Handle DatItem_Control*
+ }
+
+ #endregion
+ }
+}
diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs
index 1ede23b0..687001b0 100644
--- a/SabreTools.Library/DatItems/Machine.cs
+++ b/SabreTools.Library/DatItems/Machine.cs
@@ -152,12 +152,6 @@ namespace SabreTools.Library.DatItems
[JsonProperty("runnable", DefaultValueHandling = DefaultValueHandling.Ignore)]
public Runnable Runnable { get; set; } = Runnable.NULL;
- ///
- /// List of associated inputs
- ///
- [JsonProperty("inputs", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public List Inputs { get; set; } = null;
-
#endregion
#region Logiqx Fields
@@ -493,7 +487,6 @@ namespace SabreTools.Library.DatItems
SourceFile = this.SourceFile,
Runnable = this.Runnable,
- Inputs = this.Inputs,
#endregion
diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs
index 38b9e84b..9a455209 100644
--- a/SabreTools.Library/Filtering/Filter.cs
+++ b/SabreTools.Library/Filtering/Filter.cs
@@ -50,28 +50,6 @@ namespace SabreTools.Library.Filtering
public FilterItem Machine_SourceFile { get; private set; } = new FilterItem();
public FilterItem Machine_Runnable { get; private set; } = new FilterItem() { Positive = Runnable.NULL, Negative = Runnable.NULL };
-
- // Inputs
- public FilterItem Machine_Inputs { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Input_Service { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Input_Tilt { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Input_Players { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Coins { get; private set; } = new FilterItem();
-
- // Inputs.Controls
- public FilterItem Machine_Input_Controls { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Input_Control_Type { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Player { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Buttons { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_RegButtons { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Minimum { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Maximum { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Sensitivity { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_KeyDelta { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Reverse { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Input_Control_Ways { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Ways2 { get; private set; } = new FilterItem();
- public FilterItem Machine_Input_Control_Ways3 { get; private set; } = new FilterItem();
#endregion
@@ -283,6 +261,27 @@ namespace SabreTools.Library.Filtering
public FilterItem DatItem_FeatureStatus { get; private set; } = new FilterItem() { Positive = FeatureStatus.NULL, Negative = FeatureStatus.NULL };
public FilterItem DatItem_FeatureOverall { get; private set; } = new FilterItem() { Positive = FeatureStatus.NULL, Negative = FeatureStatus.NULL };
+ // Input
+ public FilterItem DatItem_Service { get; private set; } = new FilterItem() { Neutral = null };
+ public FilterItem DatItem_Tilt { get; private set; } = new FilterItem() { Neutral = null };
+ public FilterItem DatItem_Players { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Coins { get; private set; } = new FilterItem();
+
+ // Input.Controls
+ public FilterItem DatItem_Controls { get; private set; } = new FilterItem() { Neutral = null };
+ public FilterItem DatItem_Control_Type { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Player { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Buttons { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_RegButtons { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Minimum { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Maximum { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Sensitivity { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_KeyDelta { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Reverse { get; private set; } = new FilterItem() { Neutral = null };
+ public FilterItem DatItem_Control_Ways { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Ways2 { get; private set; } = new FilterItem();
+ public FilterItem DatItem_Control_Ways3 { get; private set; } = new FilterItem();
+
// Port.Analogs
public FilterItem DatItem_Analogs { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Analog_Mask { get; private set; } = new FilterItem();
@@ -531,151 +530,7 @@ namespace SabreTools.Library.Filtering
Machine_Runnable.Negative |= value.AsRunnable();
else
Machine_Runnable.Positive |= value.AsRunnable();
- break;
-
- // Inputs
- case Field.Machine_Inputs:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Inputs.Neutral = false;
- else
- Machine_Inputs.Neutral = true;
- break;
-
- case Field.Machine_Input_Service:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Input_Service.Neutral = false;
- else
- Machine_Input_Service.Neutral = true;
- break;
-
- case Field.Machine_Input_Tilt:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Input_Tilt.Neutral = false;
- else
- Machine_Input_Tilt.Neutral = true;
- break;
-
- case Field.Machine_Input_Players:
- if (negate)
- Machine_Input_Players.NegativeSet.Add(value);
- else
- Machine_Input_Players.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Coins:
- if (negate)
- Machine_Input_Coins.NegativeSet.Add(value);
- else
- Machine_Input_Coins.PositiveSet.Add(value);
- break;
-
- // Inputs.Controls
- case Field.Machine_Input_Controls:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Input_Controls.Neutral = false;
- else
- Machine_Input_Controls.Neutral = true;
- break;
-
- case Field.Machine_Input_Control_Type:
- if (negate)
- Machine_Input_Control_Type.NegativeSet.Add(value);
- else
- Machine_Input_Control_Type.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Player:
- if (negate)
- Machine_Input_Control_Player.NegativeSet.Add(value);
- else
- Machine_Input_Control_Player.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Buttons:
- if (negate)
- Machine_Input_Control_Buttons.NegativeSet.Add(value);
- else
- Machine_Input_Control_Buttons.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_RegButtons:
- if (negate)
- Machine_Input_Control_RegButtons.NegativeSet.Add(value);
- else
- Machine_Input_Control_RegButtons.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Minimum:
- if (negate)
- Machine_Input_Control_Minimum.NegativeSet.Add(value);
- else
- Machine_Input_Control_Minimum.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Maximum:
- if (negate)
- Machine_Input_Control_Maximum.NegativeSet.Add(value);
- else
- Machine_Input_Control_Maximum.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Sensitivity:
- if (negate)
- Machine_Input_Control_Sensitivity.NegativeSet.Add(value);
- else
- Machine_Input_Control_Sensitivity.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_KeyDelta:
- if (negate)
- Machine_Input_Control_KeyDelta.NegativeSet.Add(value);
- else
- Machine_Input_Control_KeyDelta.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Reverse:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Input_Control_Reverse.Neutral = false;
- else
- Machine_Input_Control_Reverse.Neutral = true;
- break;
-
- case Field.Machine_Input_Control_Ways:
- if (negate)
- Machine_Input_Control_Ways.NegativeSet.Add(value);
- else
- Machine_Input_Control_Ways.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Ways2:
- if (negate)
- Machine_Input_Control_Ways2.NegativeSet.Add(value);
- else
- Machine_Input_Control_Ways2.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Input_Control_Ways3:
- if (negate)
- Machine_Input_Control_Ways3.NegativeSet.Add(value);
- else
- Machine_Input_Control_Ways3.PositiveSet.Add(value);
- break;
-
-
- // Ports.Analogs
- case Field.DatItem_Analogs:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- DatItem_Analogs.Neutral = false;
- else
- DatItem_Analogs.Neutral = true;
- break;
-
- case Field.DatItem_Analog_Mask:
- if (negate)
- DatItem_Analog_Mask.NegativeSet.Add(value);
- else
- DatItem_Analog_Mask.PositiveSet.Add(value);
- break;
+ break;
#endregion
@@ -1636,6 +1491,142 @@ namespace SabreTools.Library.Filtering
DatItem_FeatureOverall.Positive |= value.AsFeatureStatus();
break;
+ // Input
+ case Field.DatItem_Service:
+ if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
+ DatItem_Service.Neutral = false;
+ else
+ DatItem_Service.Neutral = true;
+ break;
+
+ case Field.DatItem_Tilt:
+ if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
+ DatItem_Tilt.Neutral = false;
+ else
+ DatItem_Tilt.Neutral = true;
+ break;
+
+ case Field.DatItem_Players:
+ if (negate)
+ DatItem_Players.NegativeSet.Add(value);
+ else
+ DatItem_Players.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Coins:
+ if (negate)
+ DatItem_Coins.NegativeSet.Add(value);
+ else
+ DatItem_Coins.PositiveSet.Add(value);
+ break;
+
+ // Input.Controls
+ case Field.DatItem_Controls:
+ if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
+ DatItem_Controls.Neutral = false;
+ else
+ DatItem_Controls.Neutral = true;
+ break;
+
+ case Field.DatItem_Control_Type:
+ if (negate)
+ DatItem_Control_Type.NegativeSet.Add(value);
+ else
+ DatItem_Control_Type.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Player:
+ if (negate)
+ DatItem_Control_Player.NegativeSet.Add(value);
+ else
+ DatItem_Control_Player.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Buttons:
+ if (negate)
+ DatItem_Control_Buttons.NegativeSet.Add(value);
+ else
+ DatItem_Control_Buttons.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_RegButtons:
+ if (negate)
+ DatItem_Control_RegButtons.NegativeSet.Add(value);
+ else
+ DatItem_Control_RegButtons.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Minimum:
+ if (negate)
+ DatItem_Control_Minimum.NegativeSet.Add(value);
+ else
+ DatItem_Control_Minimum.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Maximum:
+ if (negate)
+ DatItem_Control_Maximum.NegativeSet.Add(value);
+ else
+ DatItem_Control_Maximum.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Sensitivity:
+ if (negate)
+ DatItem_Control_Sensitivity.NegativeSet.Add(value);
+ else
+ DatItem_Control_Sensitivity.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_KeyDelta:
+ if (negate)
+ DatItem_Control_KeyDelta.NegativeSet.Add(value);
+ else
+ DatItem_Control_KeyDelta.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Reverse:
+ if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
+ DatItem_Control_Reverse.Neutral = false;
+ else
+ DatItem_Control_Reverse.Neutral = true;
+ break;
+
+ case Field.DatItem_Control_Ways:
+ if (negate)
+ DatItem_Control_Ways.NegativeSet.Add(value);
+ else
+ DatItem_Control_Ways.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Ways2:
+ if (negate)
+ DatItem_Control_Ways2.NegativeSet.Add(value);
+ else
+ DatItem_Control_Ways2.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_Control_Ways3:
+ if (negate)
+ DatItem_Control_Ways3.NegativeSet.Add(value);
+ else
+ DatItem_Control_Ways3.PositiveSet.Add(value);
+ break;
+
+ // Port.Analogs
+ case Field.DatItem_Analogs:
+ if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
+ DatItem_Analogs.Neutral = false;
+ else
+ DatItem_Analogs.Neutral = true;
+ break;
+
+ case Field.DatItem_Analog_Mask:
+ if (negate)
+ DatItem_Analog_Mask.NegativeSet.Add(value);
+ else
+ DatItem_Analog_Mask.PositiveSet.Add(value);
+ break;
+
// Ram Option
case Field.DatItem_Content:
if (negate)
diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs
index e0b8b100..0480cb40 100644
--- a/SabreTools.Library/Tools/Converters.cs
+++ b/SabreTools.Library/Tools/Converters.cs
@@ -570,61 +570,7 @@ namespace SabreTools.Library.Tools
return Field.Machine_SourceFile;
case "runnable":
- return Field.Machine_Runnable;
-
- case "inputs":
- return Field.Machine_Inputs;
-
- case "input_service":
- return Field.Machine_Input_Service;
-
- case "input_tilt":
- return Field.Machine_Input_Tilt;
-
- case "input_players":
- return Field.Machine_Input_Players;
-
- case "input_coins":
- return Field.Machine_Input_Coins;
-
- case "input_controls":
- return Field.Machine_Input_Controls;
-
- case "input_control_type":
- return Field.Machine_Input_Control_Type;
-
- case "input_control_player":
- return Field.Machine_Input_Control_Player;
-
- case "input_control_buttons":
- return Field.Machine_Input_Control_Buttons;
-
- case "input_control_regbuttons":
- return Field.Machine_Input_Control_RegButtons;
-
- case "input_control_minimum":
- return Field.Machine_Input_Control_Minimum;
-
- case "input_control_maximum":
- return Field.Machine_Input_Control_Maximum;
-
- case "input_control_sensitivity":
- return Field.Machine_Input_Control_Sensitivity;
-
- case "input_control_keydelta":
- return Field.Machine_Input_Control_KeyDelta;
-
- case "input_control_reverse":
- return Field.Machine_Input_Control_Reverse;
-
- case "input_control_ways":
- return Field.Machine_Input_Control_Ways;
-
- case "input_control_ways2":
- return Field.Machine_Input_Control_Ways2;
-
- case "input_control_ways3":
- return Field.Machine_Input_Control_Ways3;
+ return Field.Machine_Runnable;
#endregion
@@ -1098,6 +1044,58 @@ namespace SabreTools.Library.Tools
case "featureoverall":
return Field.DatItem_FeatureOverall;
+ // Input
+ case "service":
+ return Field.DatItem_Service;
+
+ case "tilt":
+ return Field.DatItem_Tilt;
+
+ case "players":
+ return Field.DatItem_Players;
+
+ case "coins":
+ return Field.DatItem_Coins;
+
+ case "controls":
+ return Field.DatItem_Controls;
+
+ case "control_type":
+ return Field.DatItem_Control_Type;
+
+ case "control_player":
+ return Field.DatItem_Control_Player;
+
+ case "control_buttons":
+ return Field.DatItem_Control_Buttons;
+
+ case "control_regbuttons":
+ return Field.DatItem_Control_RegButtons;
+
+ case "control_minimum":
+ return Field.DatItem_Control_Minimum;
+
+ case "control_maximum":
+ return Field.DatItem_Control_Maximum;
+
+ case "control_sensitivity":
+ return Field.DatItem_Control_Sensitivity;
+
+ case "control_keydelta":
+ return Field.DatItem_Control_KeyDelta;
+
+ case "control_reverse":
+ return Field.DatItem_Control_Reverse;
+
+ case "control_ways":
+ return Field.DatItem_Control_Ways;
+
+ case "control_ways2":
+ return Field.DatItem_Control_Ways2;
+
+ case "control_ways3":
+ return Field.DatItem_Control_Ways3;
+
// Port
case "analogs":
return Field.DatItem_Analogs;
@@ -1673,6 +1671,8 @@ namespace SabreTools.Library.Tools
return ItemType.Extension;
case "feature":
return ItemType.Feature;
+ case "input":
+ return ItemType.Input;
case "instance":
return ItemType.Instance;
case "media":
@@ -1715,6 +1715,7 @@ namespace SabreTools.Library.Tools
"driver" => ItemType.Driver,
"extension" => ItemType.Extension,
"feature" => ItemType.Feature,
+ "input" => ItemType.Input,
"instance" => ItemType.Instance,
"media" => ItemType.Media,
"port" => ItemType.Port,
@@ -2299,6 +2300,8 @@ namespace SabreTools.Library.Tools
return "extension";
case ItemType.Feature:
return "feature";
+ case ItemType.Input:
+ return "input";
case ItemType.Instance:
return "instance";
case ItemType.Media:
@@ -2341,6 +2344,7 @@ namespace SabreTools.Library.Tools
ItemType.Driver => "driver",
ItemType.Extension => "extension",
ItemType.Feature => "feature",
+ ItemType.Input => "input",
ItemType.Instance => "instance",
ItemType.Media => "media",
ItemType.Port => "port",