From c35d838a963f9ee5e32e3b375fbd38d7d5da7612 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Tue, 1 Aug 2023 02:03:25 -0400 Subject: [PATCH] Fix merging issue for SoftwareList --- .../Formats/SoftwareList.Writer.cs | 168 +++++++++++++----- 1 file changed, 125 insertions(+), 43 deletions(-) diff --git a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs index 24d4f99c..0d87a368 100644 --- a/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs +++ b/SabreTools.DatFiles/Formats/SoftwareList.Writer.cs @@ -243,49 +243,7 @@ namespace SabreTools.DatFiles.Formats } // Process the parts to ensure we don't have duplicates - if (parts.Count > 0) - { - var grouped = parts.GroupBy(p => p.Name); - - var tempParts = new List(); - foreach (var grouping in grouped) - { - var tempPart = new Models.SoftwareList.Part(); - - var tempFeatures = new List(); - var tempDataAreas = new List(); - var tempDiskAreas = new List(); - var tempDipSwitches = new List(); - - foreach (var part in grouping) - { - tempPart.Name ??= part.Name; - tempPart.Interface ??= part.Interface; - - if (part.Feature != null) - tempFeatures.AddRange(part.Feature); - if (part.DataArea != null) - tempDataAreas.AddRange(part.DataArea); - if (part.DiskArea != null) - tempDiskAreas.AddRange(part.DiskArea); - if (part.DipSwitch != null) - tempDipSwitches.AddRange(part.DipSwitch); - } - - if (tempFeatures.Count > 0) - tempPart.Feature = tempFeatures.ToArray(); - if (tempDataAreas.Count > 0) - tempPart.DataArea = tempDataAreas.ToArray(); - if (tempDiskAreas.Count > 0) - tempPart.DiskArea = tempDiskAreas.ToArray(); - if (tempDipSwitches.Count > 0) - tempPart.DipSwitch = tempDipSwitches.ToArray(); - - tempParts.Add(tempPart); - } - - parts = tempParts; - } + parts = SantitizeParts(parts); // Assign the values to the game sw.Info = infos.ToArray(); @@ -503,6 +461,130 @@ namespace SabreTools.DatFiles.Formats return new Models.SoftwareList.DipSwitch[] { dipSwitch }; } + /// + /// Sanitize Parts list to ensure no duplicates exist + /// + private static List SantitizeParts(List parts) + { + // If we have no parts, we can't do anything + if (parts == null || !parts.Any()) + return parts; + + var grouped = parts.GroupBy(p => p.Name); + + var tempParts = new List(); + foreach (var grouping in grouped) + { + var tempPart = new Models.SoftwareList.Part(); + + var tempFeatures = new List(); + var tempDataAreas = new List(); + var tempDiskAreas = new List(); + var tempDipSwitches = new List(); + + foreach (var part in grouping) + { + tempPart.Name ??= part.Name; + tempPart.Interface ??= part.Interface; + + if (part.Feature != null) + tempFeatures.AddRange(part.Feature); + if (part.DataArea != null) + tempDataAreas.AddRange(part.DataArea); + if (part.DiskArea != null) + tempDiskAreas.AddRange(part.DiskArea); + if (part.DipSwitch != null) + tempDipSwitches.AddRange(part.DipSwitch); + } + + tempDataAreas = SantitizeDataAreas(tempDataAreas); + tempDiskAreas = SantitizeDiskAreas(tempDiskAreas); + + if (tempFeatures.Count > 0) + tempPart.Feature = tempFeatures.ToArray(); + if (tempDataAreas.Count > 0) + tempPart.DataArea = tempDataAreas.ToArray(); + if (tempDiskAreas.Count > 0) + tempPart.DiskArea = tempDiskAreas.ToArray(); + if (tempDipSwitches.Count > 0) + tempPart.DipSwitch = tempDipSwitches.ToArray(); + + tempParts.Add(tempPart); + } + + return tempParts; + } + + /// + /// Sanitize DataAreas list to ensure no duplicates exist + /// + private static List SantitizeDataAreas(List dataAreas) + { + // If we have no DataAreas, we can't do anything + if (dataAreas == null || !dataAreas.Any()) + return dataAreas; + + var grouped = dataAreas.GroupBy(p => p.Name); + + var tempDataAreas = new List(); + foreach (var grouping in grouped) + { + var tempDataArea = new Models.SoftwareList.DataArea(); + var tempRoms = new List(); + + foreach (var dataArea in grouping) + { + tempDataArea.Name ??= dataArea.Name; + tempDataArea.Size ??= dataArea.Size; + tempDataArea.Width ??= dataArea.Width; + tempDataArea.Endianness ??= dataArea.Endianness; + + if (dataArea.Rom != null) + tempRoms.AddRange(dataArea.Rom); + } + + if (tempRoms.Count > 0) + tempDataArea.Rom = tempRoms.ToArray(); + + tempDataAreas.Add(tempDataArea); + } + + return tempDataAreas; + } + + /// + /// Sanitize DiskArea list to ensure no duplicates exist + /// + private static List SantitizeDiskAreas(List diskAreas) + { + // If we have no DiskAreas, we can't do anything + if (diskAreas == null || !diskAreas.Any()) + return diskAreas; + + var grouped = diskAreas.GroupBy(p => p.Name); + + var tempDiskAreas = new List(); + foreach (var grouping in grouped) + { + var tempDiskArea = new Models.SoftwareList.DiskArea(); + var tempDisks = new List(); + + foreach (var dataArea in grouping) + { + tempDiskArea.Name ??= dataArea.Name; + if (dataArea.Disk != null) + tempDisks.AddRange(dataArea.Disk); + } + + if (tempDisks.Count > 0) + tempDiskArea.Disk = tempDisks.ToArray(); + + tempDiskAreas.Add(tempDiskArea); + } + + return tempDiskAreas; + } + #endregion } }