diff --git a/SabreTools.Helper/Dats/DatItem.cs b/SabreTools.Helper/Dats/DatItem.cs index d81f81d1..b188accc 100644 --- a/SabreTools.Helper/Dats/DatItem.cs +++ b/SabreTools.Helper/Dats/DatItem.cs @@ -526,6 +526,66 @@ namespace SabreTools.Helper.Dats return outfiles; } + /// + /// Resolve name duplicates in an arbitrary set of ROMs based on the supplied information + /// + /// List of File objects representing the roms to be merged + /// Logger object for console and/or file output + /// A List of RomData objects representing the renamed roms + /// + /// Eventually, we want this to use the CRC/MD5/SHA-1 of relavent items instead of just _1 + /// + public static List ResolveNames(List infiles, Logger logger) + { + // Create the output list + List output = new List(); + + // First we want to make sure the list is in alphabetical order + Sort(ref infiles, true); + + // Now we want to loop through and check names + string last = null; + int lastid = 1; + for (int i = 0; i < infiles.Count; i++) + { + DatItem datItem = infiles[i]; + + // If the current name matches the previous name, rename the current item + if (datItem.Name == last) + { + if (datItem.Type == ItemType.Disk) + { + Disk disk = (Disk)datItem; + disk.Name += "_" + (!String.IsNullOrEmpty(disk.MD5) ? disk.MD5 : disk.SHA1); + datItem = disk; + } + else if (datItem.Type == ItemType.Rom) + { + Rom rom = (Rom)datItem; + rom.Name += "_" + (!String.IsNullOrEmpty(rom.CRC) ? rom.CRC : !String.IsNullOrEmpty(rom.MD5) ? rom.MD5 : rom.SHA1); + datItem = rom; + } + else + { + datItem.Name += "_" + lastid; + lastid++; + } + + output.Add(datItem); + } + + // Otherwise, we say that we have a valid named file + else + { + output.Add(datItem); + last = datItem.Name; + lastid = 1; + } + } + + return output; + } + /// /// Sort a list of File objects by SystemID, SourceID, Game, and Name (in order) /// diff --git a/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs b/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs index 78ea6bf6..09000e44 100644 --- a/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs +++ b/SabreTools.Helper/Dats/Partials/DatFile.Writers.cs @@ -140,6 +140,9 @@ namespace SabreTools.Helper.Dats { List roms = this[key]; + // Resolve the names in the block + DatItem.ResolveNames(roms, logger); + for (int index = 0; index < roms.Count; index++) { DatItem rom = roms[index];