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(); } ///