private static void ChangeStatusText(ChangeStatusTextDel f, String s)
 {
     if (f != null)
     {
         f(s);
     }
 }
        /// <summary>
        /// perform the merging of a vanilla df zip file, a mod zip file, an output dir, and whether to merge save and init dirs
        /// </summary>
        /// <param name="vanilla">vanilla df zip file</param>
        /// <param name="mod">mod df zip file</param>
        /// <param name="realoutput">output dir</param>
        /// <param name="mergesave">whether to persist save dir from orig output dir</param>
        /// <param name="mergeinit">whether to persist init dir from orig output dir</param>
        /// <param name="sf">a delegate to change status text</param>
        public static bool MergeOp(String vanilla, String mod, String realoutput, bool mergesave, bool mergeinit, ChangeStatusTextDel sf = null)
        {
            string vantemp = Directory.GetCurrentDirectory() + "\\vanillatemp";
            string modtemp = Directory.GetCurrentDirectory() + "\\modtemp";

            const string raw = "\\raw";
            const string art = "\\data\\art";
            const string init = "\\data\\init\\init.txt";
            const string initd = "\\data\\init\\d_init.txt";
            const string datainot = "\\data\\init";
            const string dsave = "\\data\\save";

            string outputtemp = Directory.GetCurrentDirectory() + "\\df";
            string outputtempsave = outputtemp + dsave;
            string outputtempinit = outputtemp + datainot;
            string outputinit = outputtemp + init;
            string outputdinit = outputtemp + initd;

            string realsavedir = realoutput + dsave;
            string realsaveinit = realoutput + datainot;

            string modinit = modtemp + init;
            string moddinit = modtemp + init;

            //delete temps if already exist
            FileExtras.DeleteDirectory(vantemp);
            FileExtras.DeleteDirectory(modtemp);
            FileExtras.DeleteDirectory(outputtemp);

            ChangeStatusText(sf, Resources.start_exct_van_zip);
            try
            {
                //unpack vanilla
                ZipExtras.ExtractZipFile(vanilla, vantemp);
                ChangeStatusText(sf, Resources.fin_exct_van_zip);
            }
            catch (Exception ex)
            {
                MessageBox.Show(Resources.error_van_zip + ex);
                return false;
            }

            try
            {
                //unpack mod
                ZipExtras.ExtractZipFile(mod, modtemp);
                ChangeStatusText(sf, Resources.fin_exct_mod_zip);
            }
            catch (Exception ex)
            {
                MessageBox.Show(Resources.error_mod_zip + ex);
                return false;
            }

            try
            {
                //move vanilla
                FileExtras.MergeDirectories(outputtemp, vantemp);

                //delete raw and art
                FileExtras.DeleteDirectory(outputtemp + raw);
                FileExtras.DeleteDirectory(outputtemp + art);

                //move mod raw and art
                FileExtras.MergeDirectories(outputtemp + raw, modtemp + raw);
                FileExtras.MergeDirectories(outputtemp + art, modtemp + art);
                //copy init/init.d
                if (File.Exists(modinit))
                    File.Copy(modinit, outputinit, true);
                if (File.Exists(moddinit))
                    File.Copy(moddinit, outputdinit, true);

                ChangeStatusText(sf, Resources.fin_merge);

                //get save games if required
                if (mergesave && Directory.Exists(realsavedir))
                {
                    FileExtras.CreateDirectory(outputtempsave);
                    FileExtras.MergeDirectories(outputtempsave, realsavedir);
                }

                //get init dir if required
                if (mergeinit && Directory.Exists(realsaveinit))
                {
                    FileExtras.MergeDirectories(outputtempinit, realsaveinit);
                }

                //delete temps
                FileExtras.DeleteDirectory(vantemp);
                FileExtras.DeleteDirectory(modtemp);

                //move temp to real
                FileExtras.DeleteDirectory(realoutput);
                FileExtras.MergeDirectories(realoutput, outputtemp);

                FileExtras.DeleteDirectory(outputtemp);
                ChangeStatusText(sf, Resources.ready);
            }

            catch (Exception ex)
            {
                MessageBox.Show("An error occured:" + ex);
                return false;
            }

            return true;
        }
 private static void ChangeStatusText(ChangeStatusTextDel f, String s)
 {
     if (f != null)
         f(s);
 }
        /// <summary>
        /// perform the merging of a vanilla df zip file, a mod zip file, an output dir, and whether to merge save and init dirs
        /// </summary>
        /// <param name="vanilla">vanilla df zip file</param>
        /// <param name="mod">mod df zip file</param>
        /// <param name="realoutput">output dir</param>
        /// <param name="mergesave">whether to persist save dir from orig output dir</param>
        /// <param name="mergeinit">whether to persist init dir from orig output dir</param>
        /// <param name="sf">a delegate to change status text</param>
        public static bool MergeOp(String vanilla, String mod, String realoutput, bool mergesave, bool mergeinit, ChangeStatusTextDel sf = null)
        {
            string vantemp = Directory.GetCurrentDirectory() + "\\vanillatemp";
            string modtemp = Directory.GetCurrentDirectory() + "\\modtemp";

            const string raw      = "\\raw";
            const string art      = "\\data\\art";
            const string init     = "\\data\\init\\init.txt";
            const string initd    = "\\data\\init\\d_init.txt";
            const string datainot = "\\data\\init";
            const string dsave    = "\\data\\save";

            string outputtemp     = Directory.GetCurrentDirectory() + "\\df";
            string outputtempsave = outputtemp + dsave;
            string outputtempinit = outputtemp + datainot;
            string outputinit     = outputtemp + init;
            string outputdinit    = outputtemp + initd;

            string realsavedir  = realoutput + dsave;
            string realsaveinit = realoutput + datainot;

            string modinit  = modtemp + init;
            string moddinit = modtemp + init;

            //delete temps if already exist
            FileExtras.DeleteDirectory(vantemp);
            FileExtras.DeleteDirectory(modtemp);
            FileExtras.DeleteDirectory(outputtemp);

            ChangeStatusText(sf, Resources.start_exct_van_zip);
            try
            {
                //unpack vanilla
                ZipExtras.ExtractZipFile(vanilla, vantemp);
                ChangeStatusText(sf, Resources.fin_exct_van_zip);
            }
            catch (Exception ex)
            {
                MessageBox.Show(Resources.error_van_zip + ex);
                return(false);
            }

            try
            {
                //unpack mod
                ZipExtras.ExtractZipFile(mod, modtemp);
                ChangeStatusText(sf, Resources.fin_exct_mod_zip);
            }
            catch (Exception ex)
            {
                MessageBox.Show(Resources.error_mod_zip + ex);
                return(false);
            }

            try
            {
                //move vanilla
                FileExtras.MergeDirectories(outputtemp, vantemp);

                //delete raw and art
                FileExtras.DeleteDirectory(outputtemp + raw);
                FileExtras.DeleteDirectory(outputtemp + art);

                //move mod raw and art
                FileExtras.MergeDirectories(outputtemp + raw, modtemp + raw);
                FileExtras.MergeDirectories(outputtemp + art, modtemp + art);
                //copy init/init.d
                if (File.Exists(modinit))
                {
                    File.Copy(modinit, outputinit, true);
                }
                if (File.Exists(moddinit))
                {
                    File.Copy(moddinit, outputdinit, true);
                }

                ChangeStatusText(sf, Resources.fin_merge);

                //get save games if required
                if (mergesave && Directory.Exists(realsavedir))
                {
                    FileExtras.CreateDirectory(outputtempsave);
                    FileExtras.MergeDirectories(outputtempsave, realsavedir);
                }

                //get init dir if required
                if (mergeinit && Directory.Exists(realsaveinit))
                {
                    FileExtras.MergeDirectories(outputtempinit, realsaveinit);
                }

                //delete temps
                FileExtras.DeleteDirectory(vantemp);
                FileExtras.DeleteDirectory(modtemp);

                //move temp to real
                FileExtras.DeleteDirectory(realoutput);
                FileExtras.MergeDirectories(realoutput, outputtemp);

                FileExtras.DeleteDirectory(outputtemp);
                ChangeStatusText(sf, Resources.ready);
            }

            catch (Exception ex)
            {
                MessageBox.Show("An error occured:" + ex);
                return(false);
            }

            return(true);
        }