diff --git a/SabreTools.Filtering/ExtraIni.cs b/SabreTools.Filtering/ExtraIni.cs index a992c2d5..2558eea1 100644 --- a/SabreTools.Filtering/ExtraIni.cs +++ b/SabreTools.Filtering/ExtraIni.cs @@ -144,6 +144,68 @@ namespace SabreTools.Filtering return true; } + /// + /// Apply a set of Extra INIs on the DatFile + /// + /// Current DatFile object to run operations on + /// True if the error that is thrown should be thrown back to the caller, false otherwise + /// True if the extras were applied, false on error + public bool ApplyExtrasDB(DatFile datFile, bool throwOnError = false) + { + // If we have no extras, don't attempt to apply and just return true + if (Items == null || !Items.Any()) + return true; + + var watch = new InternalStopwatch("Applying extra mappings to DAT"); + + try + { + // Bucket by game first + datFile.ItemsDB.BucketBy(ItemKey.Machine, DedupeType.None); + + // Create mappings based on the extra items + var combinedMaps = CombineExtras(); + var games = combinedMaps.Keys; + + // Apply the mappings + foreach (string game in games) + { + // Get the list of DatItems for the machine + var datItems = datFile.ItemsDB.GetDatItemsForBucket(game); + if (datItems == null) + continue; + + // Try to get the map values, if possible + combinedMaps.TryGetValue(game, out var mappings); + + // Create a setter with the new mappings + var setter = new Setter(); + setter.PopulateSettersFromDictionary(mappings); + + // Loop through and set the fields accordingly + foreach (var datItem in datItems) + { + var machine = datFile.ItemsDB.GetMachineForItem(datItem.Item1); + if (machine.Item2 != null) + setter.SetFields(machine.Item2); + + setter.SetFields(datItem.Item2); + } + } + } + catch (Exception ex) when (!throwOnError) + { + logger.Error(ex); + return false; + } + finally + { + watch.Stop(); + } + + return true; + } + /// /// Combine ExtraIni fields /// diff --git a/SabreTools/Features/Batch.cs b/SabreTools/Features/Batch.cs index 897728cd..e9512638 100644 --- a/SabreTools/Features/Batch.cs +++ b/SabreTools/Features/Batch.cs @@ -350,6 +350,7 @@ Reset the internal state: reset();"; // Apply the extra INI blindly extraIni.ApplyExtras(batchState.DatFile); + extraIni.ApplyExtrasDB(batchState.DatFile); } } diff --git a/SabreTools/Features/DatFromDir.cs b/SabreTools/Features/DatFromDir.cs index f733bb60..d5143a1c 100644 --- a/SabreTools/Features/DatFromDir.cs +++ b/SabreTools/Features/DatFromDir.cs @@ -99,6 +99,7 @@ namespace SabreTools.Features { // Perform additional processing steps Extras!.ApplyExtras(datdata); + Extras!.ApplyExtrasDB(datdata); Splitter!.ApplySplitting(datdata, useTags: false); datdata.ExecuteFilters(FilterRunner!); Cleaner!.ApplyCleaning(datdata); diff --git a/SabreTools/Features/Update.cs b/SabreTools/Features/Update.cs index a99ee628..2168fe16 100644 --- a/SabreTools/Features/Update.cs +++ b/SabreTools/Features/Update.cs @@ -173,6 +173,7 @@ namespace SabreTools.Features // Perform additional processing steps Extras!.ApplyExtras(datFile); + Extras!.ApplyExtrasDB(datFile); Splitter!.ApplySplitting(datFile, useTags: false); datFile.ExecuteFilters(FilterRunner!); Cleaner!.ApplyCleaning(datFile); @@ -216,6 +217,7 @@ namespace SabreTools.Features // Perform additional processing steps Extras!.ApplyExtras(userInputDat); + Extras!.ApplyExtrasDB(userInputDat); Splitter!.ApplySplitting(userInputDat, useTags: false); userInputDat.ExecuteFilters(FilterRunner!); Cleaner!.ApplyCleaning(userInputDat); @@ -345,6 +347,7 @@ namespace SabreTools.Features // Perform additional processing steps Extras.ApplyExtras(repDat); + Extras.ApplyExtrasDB(repDat); Splitter.ApplySplitting(repDat, useTags: false); repDat.ExecuteFilters(FilterRunner!); Cleaner.ApplyCleaning(repDat); @@ -381,6 +384,7 @@ namespace SabreTools.Features // Perform additional processing steps Extras.ApplyExtras(repDat); + Extras.ApplyExtrasDB(repDat); Splitter.ApplySplitting(repDat, useTags: false); repDat.ExecuteFilters(FilterRunner!); Cleaner.ApplyCleaning(repDat); diff --git a/SabreTools/Features/Verify.cs b/SabreTools/Features/Verify.cs index c24c1770..4b2c3694 100644 --- a/SabreTools/Features/Verify.cs +++ b/SabreTools/Features/Verify.cs @@ -66,6 +66,7 @@ namespace SabreTools.Features // Perform additional processing steps Extras!.ApplyExtras(datdata); + Extras!.ApplyExtrasDB(datdata); Splitter!.ApplySplitting(datdata, useTags: true); datdata.ExecuteFilters(FilterRunner!); Cleaner!.ApplyCleaning(datdata); @@ -114,6 +115,7 @@ namespace SabreTools.Features // Perform additional processing steps Extras!.ApplyExtras(datdata); + Extras!.ApplyExtrasDB(datdata); Splitter!.ApplySplitting(datdata, useTags: true); datdata.ExecuteFilters(FilterRunner!); Cleaner!.ApplyCleaning(datdata);