diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs
index c2b97605..1d86b603 100644
--- a/SabreTools.DatFiles/ItemDictionary.cs
+++ b/SabreTools.DatFiles/ItemDictionary.cs
@@ -4,6 +4,7 @@ using System.Collections;
using System.Collections.Concurrent;
#endif
using System.Collections.Generic;
+using System.IO;
using System.Linq;
#if NET40_OR_GREATER || NETCOREAPP
using System.Threading.Tasks;
@@ -954,6 +955,57 @@ namespace SabreTools.DatFiles
}
}
+ ///
+ /// Ensure that all roms are in their own game (or at least try to ensure)
+ ///
+ public void SetOneRomPerGame()
+ {
+ // For each rom, we want to update the game to be "/"
+#if NET452_OR_GREATER || NETCOREAPP
+ Parallel.ForEach(Keys, Globals.ParallelOptions, key =>
+#elif NET40_OR_GREATER
+ Parallel.ForEach(Keys, key =>
+#else
+ foreach (var key in Keys)
+#endif
+ {
+ var items = this[key];
+ if (items == null)
+#if NET40_OR_GREATER || NETCOREAPP
+ return;
+#else
+ continue;
+#endif
+
+ for (int i = 0; i < items.Count; i++)
+ {
+ SetOneRomPerGame(items[i]);
+ }
+#if NET40_OR_GREATER || NETCOREAPP
+ });
+#else
+ }
+#endif
+ }
+
+ ///
+ /// Set internal names to match One Rom Per Game (ORPG) logic
+ ///
+ /// DatItem to run logic on
+ internal static void SetOneRomPerGame(DatItem datItem)
+ {
+ if (datItem.GetName() == null)
+ return;
+
+ string[] splitname = datItem.GetName()!.Split('.');
+#if NET20 || NET35
+ datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1).ToArray())}");
+#else
+ datItem.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1))}");
+#endif
+ datItem.SetName(Path.GetFileName(datItem.GetName()));
+ }
+
#endregion
#region Statistics
diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs
index 8a6e1ff4..c285669e 100644
--- a/SabreTools.DatFiles/ItemDictionaryDB.cs
+++ b/SabreTools.DatFiles/ItemDictionaryDB.cs
@@ -1017,6 +1017,39 @@ namespace SabreTools.DatFiles
}
}
+ ///
+ /// Ensure that all roms are in their own game (or at least try to ensure)
+ ///
+ public void SetOneRomPerGame()
+ {
+ // For each rom, we want to update the game to be "/"
+#if NET452_OR_GREATER || NETCOREAPP
+ Parallel.ForEach(SortedKeys, Globals.ParallelOptions, key =>
+#elif NET40_OR_GREATER
+ Parallel.ForEach(SortedKeys, key =>
+#else
+ foreach (var key in SortedKeys)
+#endif
+ {
+ var items = GetDatItemsForBucket(key);
+ if (items == null)
+#if NET40_OR_GREATER || NETCOREAPP
+ return;
+#else
+ continue;
+#endif
+
+ for (int i = 0; i < items.Length; i++)
+ {
+ SetOneRomPerGame(items[i]);
+ }
+#if NET40_OR_GREATER || NETCOREAPP
+ });
+#else
+ }
+#endif
+ }
+
///
/// Execute all filters in a filter runner on a single bucket
///
@@ -1040,6 +1073,24 @@ namespace SabreTools.DatFiles
_buckets[bucketName] = newItems.Select(i => i.Item1).ToConcurrentList();
}
+ ///
+ /// Set internal names to match One Rom Per Game (ORPG) logic
+ ///
+ /// DatItem to run logic on
+ internal static void SetOneRomPerGame((long, DatItem) datItem)
+ {
+ if (datItem.Item1 < 0 || datItem.Item2.GetName() == null)
+ return;
+
+ string[] splitname = datItem.Item2.GetName()!.Split('.');
+#if NET20 || NET35
+ datItem.Item2.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, datItem.Item2.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1).ToArray())}");
+#else
+ datItem.Item2.GetFieldValue(DatItem.MachineKey)!.SetFieldValue(Models.Metadata.Machine.NameKey, datItem.Item2.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1))}");
+#endif
+ datItem.Item2.SetName(Path.GetFileName(datItem.Item2.GetName()));
+ }
+
#endregion
#region Statistics
diff --git a/SabreTools.Filtering/Cleaner.cs b/SabreTools.Filtering/Cleaner.cs
index 316392b8..b96ba060 100644
--- a/SabreTools.Filtering/Cleaner.cs
+++ b/SabreTools.Filtering/Cleaner.cs
@@ -323,32 +323,8 @@ namespace SabreTools.Filtering
// Because this introduces subfolders, we need to set the SuperDAT type
datFile.Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT");
- // For each rom, we want to update the game to be "/"
-#if NET452_OR_GREATER || NETCOREAPP
- Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key =>
-#elif NET40_OR_GREATER
- Parallel.ForEach(datFile.Items.Keys, key =>
-#else
- foreach (var key in datFile.Items.Keys)
-#endif
- {
- var items = datFile.Items[key];
- if (items == null)
-#if NET40_OR_GREATER || NETCOREAPP
- return;
-#else
- continue;
-#endif
-
- for (int i = 0; i < items.Count; i++)
- {
- SetOneRomPerGame(items[i]);
- }
-#if NET40_OR_GREATER || NETCOREAPP
- });
-#else
- }
-#endif
+ datFile.Items.SetOneRomPerGame();
+ datFile.ItemsDB.SetOneRomPerGame();
}
///