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");