diff --git a/OfflineMerge/OfflineMerge.cs b/OfflineMerge/OfflineMerge.cs index ddce8c3a..e7d417ff 100644 --- a/OfflineMerge/OfflineMerge.cs +++ b/OfflineMerge/OfflineMerge.cs @@ -156,6 +156,7 @@ namespace SabreTools /// (a) Net New - (currentNewMerged)-(currentAllMerged) /// (b) Unneeded - (currentAllMerged)-(currentNewMerged) /// (c) New Missing - (a)+(currentMissingMerged-(b)) + /// (d) Have - (currentNewMerged)-(c) /// /// True if the files were created properly, false otherwise public bool Process() @@ -259,6 +260,66 @@ namespace SabreTools } } + // Now create the Have dictionary [(currentNewMerged)-(c)] + _logger.Log("Creating and populating Have dictionary"); + Dictionary> midHave = new Dictionary>(); + foreach (string key in newMissing.Keys) + { + if (midHave.ContainsKey(key)) + { + midHave[key].AddRange(newMissing[key]); + } + else + { + midHave.Add(key, newMissing[key]); + } + } + foreach (string key in completeDats.Keys) + { + if (midHave.ContainsKey(key)) + { + foreach (RomData rom in completeDats[key]) + { + if (rom.System == _currentNewMerged) + { + midHave[key].Add(rom); + } + } + } + else + { + List roms = new List(); + foreach (RomData rom in completeDats[key]) + { + if (rom.System == _currentNewMerged) + { + roms.Add(rom); + } + } + midHave.Add(key, roms); + } + } + Dictionary> have = new Dictionary>(); + foreach (string key in midHave.Keys) + { + if (midHave[key].Count == 1) + { + if (midHave[key][0].System == _currentNewMerged) + { + if (have.ContainsKey(key)) + { + have[key].Add(midHave[key][0]); + } + else + { + List temp = new List(); + temp.Add(midHave[key][0]); + have.Add(key, temp); + } + } + } + } + // If we are supposed to replace everything in the output with default values, do so if (_fake) { @@ -315,12 +376,31 @@ namespace SabreTools } newMissing[key] = temp; } + + _logger.Log("Replacing all hashes in Have with 0-byte values"); + keys = have.Keys.ToList(); + foreach (string key in keys) + { + List temp = new List(); + List roms = have[key]; + for (int i = 0; i < roms.Count; i++) + { + RomData rom = roms[i]; + rom.Size = sizezero; + rom.CRC = crczero; + rom.MD5 = md5zero; + rom.SHA1 = sha1zero; + temp.Add(rom); + } + have[key] = temp; + } } // Finally, output all of the files Output.WriteToDatFromDict("Net New", "Net New", "", DateTime.Now.ToString("yyyy-MM-dd"), "", "SabreTools", false, false, true, "", netNew, _logger); Output.WriteToDatFromDict("Unneeded", "Unneeded", "", DateTime.Now.ToString("yyyy-MM-dd"), "", "SabreTools", false, false, true, "", unneeded, _logger); Output.WriteToDatFromDict("New Missing", "New Missing", "", DateTime.Now.ToString("yyyy-MM-dd"), "", "SabreTools", false, false, true, "", newMissing, _logger); + Output.WriteToDatFromDict("Have", "Have", "", DateTime.Now.ToString("yyyy-MM-dd"), "", "SabreTools", false, false, true, "", have, _logger); return true; } diff --git a/SabreHelper/Build.cs b/SabreHelper/Build.cs index 62560f96..79b284a6 100644 --- a/SabreHelper/Build.cs +++ b/SabreHelper/Build.cs @@ -118,7 +118,7 @@ Options: -lso, --list-sources List all sources (id <= name) -lsy, --list-systems List all systems (id <= name) -m, --merge Merge one or more DATs - -ad, --all-diff Enable output of all diff variants (2 DATs only) + -ad, --all-diff Enable output of all diff variants -di, --diff Switch to diffdat mode -dd, --dedup Enable deduping in the created DAT -b, --bare Don't include date in file name @@ -183,7 +183,8 @@ Options: This program will output the following DATs: (a) Net New - (NewComplete)-(Complete) (b) Unneeded - (Complete)-(NewComplete) - (c) New Missing - (Net New)+(Missing-(Unneeded))"); + (c) New Missing - (Net New)+(Missing-(Unneeded)) + (d) Have - (NewComplete)-(New Missing)"); break; default: Console.Write("This is the default help output");