diff --git a/SabreTools.Core/Filter/FilterRunner.cs b/SabreTools.Core/Filter/FilterRunner.cs
index 948cf7d1..7410877e 100644
--- a/SabreTools.Core/Filter/FilterRunner.cs
+++ b/SabreTools.Core/Filter/FilterRunner.cs
@@ -13,7 +13,7 @@ namespace SabreTools.Core.Filter
///
/// Set of filters to be run against an object
///
- public readonly FilterObject[] Filters;
+ public readonly Dictionary> Filters = [];
///
/// Cached item type names for filter selection
@@ -33,23 +33,36 @@ namespace SabreTools.Core.Filter
public FilterRunner(FilterObject[] filters)
{
- Filters = filters;
+ foreach (var filter in filters)
+ {
+ // Ensure the key exists
+ string key = filter.Key.ToString();
+ if (!Filters.ContainsKey(filter.Key.ToString()))
+ Filters[key] = [];
+
+ // Add the filter to the set
+ Filters[key].Add(filter);
+ }
}
public FilterRunner(string[] filterStrings)
{
- List filters = [];
foreach (string filterString in filterStrings)
{
try
{
var filter = new FilterObject(filterString);
- filters.Add(filter);
+
+ // Ensure the key exists
+ string key = filter.Key.ToString();
+ if (!Filters.ContainsKey(filter.Key.ToString()))
+ Filters[key] = [];
+
+ // Add the filter to the set
+ Filters[key].Add(filter);
}
catch { }
}
-
- Filters = [.. filters];
}
///
@@ -65,24 +78,9 @@ namespace SabreTools.Core.Filter
_ => null,
};
- // Group filters by key
- var filterDictionary = new Dictionary>();
- foreach (var filter in Filters)
- {
- // Skip filters not applicable to the item
- if (filter.Key.ItemName == "item" && Array.IndexOf(_datItemTypeNames, itemName) == -1)
- continue;
- else if (filter.Key.ItemName != "item" && filter.Key.ItemName != itemName)
- continue;
-
- // Ensure the key exists
- string key = filter.Key.ToString();
- if (!filterDictionary.ContainsKey(filter.Key.ToString()))
- filterDictionary[key] = [];
-
- // Add the filter to the set
- filterDictionary[key].Add(filter);
- }
+ // Null is invalid
+ if (itemName == null)
+ return false;
// TODO: REMOVE THIS ENTIRE BLOCK WHEN A PROPER IMPLEMENTATION IS FOUND
// Handle special keys that work in tandem
@@ -92,7 +90,7 @@ namespace SabreTools.Core.Filter
bool containsKey = false;
foreach (string key in _machineTypeKeys)
{
- if (filterDictionary.ContainsKey(key))
+ if (Filters.ContainsKey(key))
containsKey = true;
}
@@ -103,10 +101,10 @@ namespace SabreTools.Core.Filter
foreach (string filterKey in _machineTypeKeys)
{
// Skip missing keys
- if (!filterDictionary.ContainsKey(filterKey))
+ if (!Filters.ContainsKey(filterKey))
continue;
- foreach (var filter in filterDictionary[filterKey])
+ foreach (var filter in Filters[filterKey])
{
matchAny |= filter.Matches(dictionaryBase);
}
@@ -115,20 +113,24 @@ namespace SabreTools.Core.Filter
// If we don't get a match, it's a failure
if (!matchAny)
return false;
-
- // Remove the keys from the dictionary
- foreach (string key in _machineTypeKeys)
- {
- filterDictionary.Remove(key);
- }
}
}
// Loop through and run each filter in order
- foreach (var filterKey in filterDictionary.Keys)
+ foreach (var filterKey in Filters.Keys)
{
+ // Skip filters not applicable to the item
+ if (filterKey.StartsWith("item.") && Array.IndexOf(_datItemTypeNames, itemName) == -1)
+ continue;
+ else if (!filterKey.StartsWith("item.") && !filterKey.StartsWith(itemName))
+ continue;
+
+ // TODO: REMOVE THIS ENTIRE BLOCK WHEN A PROPER IMPLEMENTATION IS FOUND
+ if (Array.Exists(_machineTypeKeys, key => key == filterKey))
+ continue;
+
bool matchOne = false;
- foreach (var filter in filterDictionary[filterKey])
+ foreach (var filter in Filters[filterKey])
{
matchOne |= filter.Matches(dictionaryBase);
}