diff --git a/.gitignore b/.gitignore
index 311dad85..2be996f7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,9 @@
/Deheader/obj
/Deheader/obj/Debug
/Deheader/obj/Release
+/OfflineMerge/obj
+/OfflineMerge/obj/Debug
+/OfflineMerge/obj/Release
/SabreHelper/obj
/SabreHelper/obj/Debug
/SabreHelper/obj/Release
diff --git a/OfflineMerge/App.config b/OfflineMerge/App.config
new file mode 100644
index 00000000..88fa4027
--- /dev/null
+++ b/OfflineMerge/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OfflineMerge/OfflineMerge.cs b/OfflineMerge/OfflineMerge.cs
new file mode 100644
index 00000000..f52505e0
--- /dev/null
+++ b/OfflineMerge/OfflineMerge.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using SabreTools.Helper;
+
+namespace SabreTools
+{
+ /*
+ "Special Merge" by Obiwantje
+ ------------------------
+ Inputs:
+ (1) All - Current all merged
+ (2) Missing - Current all missing
+ (3) Add - Current to add
+ (4) All-New - Current with replaced DATs (some add/remove)
+ (5) [Flag] Set all roms to have 0-byte values; if set, prepend "Offline" to DAT name/desc
+
+ 0-byte Values:
+ CRC - 00000000
+ MD5 - d41d8cd98f00b204e9800998ecf8427e
+ SHA-1 - da39a3ee5e6b4b0d3255bfef95601890afd80709
+ */
+ public class OfflineMerge
+ {
+ // Instance variables
+ private string _currentAllMerged;
+ private string _currentAllMissing;
+ private List _toAdd;
+ private string _currentWithReplaced;
+ private bool _fake;
+ private Logger _logger;
+
+ ///
+ /// Instantiate an OfflineMerge object
+ ///
+ /// Old-current DAT with merged values
+ /// Old-current missing DAT with merged values
+ /// List of new files to merge in
+ /// New-current DAT with merged values
+ /// True if all values should be replaced with default 0-byte values, false otherwise
+ /// Logger object for console and file output
+ public OfflineMerge (string currentAllMerged, string currentAllMissing, string toAdd, string currentWithReplaced, bool fake, Logger logger)
+ {
+ _currentAllMerged = currentAllMerged.Replace("\"", "");
+ _currentAllMissing = currentAllMissing.Replace("\"", "");
+ _toAdd = new List();
+ if (File.Exists(toAdd.Replace("\"", "")))
+ {
+ _toAdd.Add(toAdd.Replace("\"", ""));
+ }
+ else if (Directory.Exists(toAdd.Replace("\"", "")))
+ {
+ foreach (string file in Directory.EnumerateFiles(toAdd, "*", SearchOption.AllDirectories))
+ {
+ _toAdd.Add(file);
+ }
+ }
+ _currentWithReplaced = currentWithReplaced;
+ _fake = fake;
+ _logger = logger;
+ }
+
+ public static void Main(string[] args)
+ {
+ // Read in inputs and start the processing
+ }
+
+ ///
+ /// Process the supplied inputs and create the three required outputs:
+ /// (a) Net-New - (currentWithReplaced)-(currentAllMerged)
+ /// (b) New Missing - (a)+(currentAllMissing)
+ /// (c) Unneeded - (currentAllMerged)-(currentWithReplaced)
+ ///
+ /// True if the files were created properly, false otherwise
+ public bool Process()
+ {
+ return true;
+ }
+ }
+}
diff --git a/OfflineMerge/OfflineMerge.csproj b/OfflineMerge/OfflineMerge.csproj
new file mode 100644
index 00000000..0f076857
--- /dev/null
+++ b/OfflineMerge/OfflineMerge.csproj
@@ -0,0 +1,66 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {88310DB9-3B64-4268-AD48-2E0358D4CA5F}
+ Exe
+ Properties
+ OfflineMerge
+ OfflineMerge
+ v4.5.2
+ 512
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ ..\..\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ ..\..\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {225a1afd-0890-44e8-b779-7502665c23a5}
+ SabreHelper
+
+
+
+
+
\ No newline at end of file
diff --git a/OfflineMerge/Properties/AssemblyInfo.cs b/OfflineMerge/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..7a77ff03
--- /dev/null
+++ b/OfflineMerge/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("OfflineMerge")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("OfflineMerge")]
+[assembly: AssemblyCopyright("Copyright © 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("88310db9-3b64-4268-ad48-2e0358d4ca5f")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/SabreTools.sln b/SabreTools.sln
index b16ceebc..82b4a281 100644
--- a/SabreTools.sln
+++ b/SabreTools.sln
@@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreHelper", "SabreHelper\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DATFromDir", "DATFromDir\DATFromDir.csproj", "{382B75D3-079E-49D5-A830-54DD6EB5A02D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OfflineMerge", "OfflineMerge\OfflineMerge.csproj", "{88310DB9-3B64-4268-AD48-2E0358D4CA5F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -40,6 +42,10 @@ Global
{382B75D3-079E-49D5-A830-54DD6EB5A02D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{382B75D3-079E-49D5-A830-54DD6EB5A02D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{382B75D3-079E-49D5-A830-54DD6EB5A02D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {88310DB9-3B64-4268-AD48-2E0358D4CA5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {88310DB9-3B64-4268-AD48-2E0358D4CA5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {88310DB9-3B64-4268-AD48-2E0358D4CA5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {88310DB9-3B64-4268-AD48-2E0358D4CA5F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE