diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs
index f7b12462..e58505b1 100644
--- a/SabreTools.DatFiles/ItemDictionaryDB.cs
+++ b/SabreTools.DatFiles/ItemDictionaryDB.cs
@@ -1206,6 +1206,72 @@ namespace SabreTools.DatFiles
#region Splitting
+ ///
+ /// Use cloneof tags to add roms to the children, setting the new romof tag in the process
+ ///
+ public void AddRomsFromParent()
+ {
+ List games = [.. SortedKeys];
+ foreach (string game in games)
+ {
+ // If the game has no items in it, we want to continue
+ var items = GetDatItemsForBucket(game);
+ if (items == null || items.Length == 0)
+ continue;
+
+ // Get the machine for the first item in the list
+ var machine = GetMachineForItem(items[0].Item1);
+ if (machine.Item2 == null)
+ continue;
+
+ // Determine if the game has a parent or not
+ (long, string?) parent = (-1, null);
+ if (!string.IsNullOrEmpty(machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey)))
+ {
+ string? cloneOf = machine.Item2.GetStringFieldValue(Models.Metadata.Machine.CloneOfKey);
+ var cloneOfMachine = GetMachine(cloneOf);
+ parent = (cloneOfMachine.Item1, cloneOf);
+ }
+
+ // If there is no parent, then we continue
+ if (string.IsNullOrEmpty(parent.Item2))
+ continue;
+
+ // If the parent doesn't have any items, we want to continue
+ var parentItems = GetDatItemsForBucket(parent.Item2!);
+ if (parentItems == null || parentItems.Length == 0)
+ continue;
+
+ // If the parent exists and has items, we copy the items from the parent to the current game
+ foreach (var item in parentItems)
+ {
+ DatItem datItem = (DatItem)item.Item2.Clone();
+ if (!items.Where(i => i.Item2.GetName()?.ToLowerInvariant() == datItem.GetName()?.ToLowerInvariant()).Any()
+ && !items.Any(i => i.Item2 == datItem))
+ {
+ AddItem(datItem, machine.Item1);
+ }
+ }
+
+ // Get the parent machine
+ var parentMachine = GetMachineForItem(GetDatItemsForBucket(parent.Item2!)![0].Item1);
+ if (parentMachine.Item2 == null)
+ continue;
+
+ // Now we want to get the parent romof tag and put it in each of the items
+ items = GetDatItemsForBucket(game);
+ string? romof = parentMachine.Item2.GetStringFieldValue(Models.Metadata.Machine.RomOfKey);
+ foreach ((long, DatItem) item in items!)
+ {
+ var itemMachine = GetMachineForItem(item.Item1);
+ if (itemMachine.Item2 == null)
+ continue;
+
+ itemMachine.Item2.SetFieldValue(Models.Metadata.Machine.RomOfKey, romof);
+ }
+ }
+ }
+
///
/// Use cloneof tags to add roms to the parents, removing the child sets in the process
///
diff --git a/SabreTools.Filtering/Splitter.cs b/SabreTools.Filtering/Splitter.cs
index 4d37299c..f0d35b3a 100644
--- a/SabreTools.Filtering/Splitter.cs
+++ b/SabreTools.Filtering/Splitter.cs
@@ -156,6 +156,7 @@ namespace SabreTools.Filtering
while (AddRomsFromDevices(datFile, true, true)) ;
AddRomsFromDevices(datFile, false, true);
AddRomsFromParent(datFile);
+ datFile.ItemsDB.AddRomsFromParent();
// Now that we have looped through the cloneof tags, we loop through the romof tags
AddRomsFromBios(datFile);
@@ -203,6 +204,7 @@ namespace SabreTools.Filtering
// Now we want to loop through all of the games and set the correct information
AddRomsFromParent(datFile);
+ datFile.ItemsDB.AddRomsFromParent();
// Now that we have looped through the cloneof tags, we loop through the romof tags
RemoveBiosRomsFromChild(datFile, false);
@@ -490,8 +492,6 @@ namespace SabreTools.Filtering
}
}
- // TODO: Add AddRomsFromParentDB
-
///
/// Use cloneof tags to add roms to the parents, removing the child sets in the process
///
@@ -613,8 +613,6 @@ namespace SabreTools.Filtering
}
}
- // TODO: Add AddRomsFromChildrenDB
-
///
/// Remove all BIOS and device sets
///