Пример #1
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                var curdir = Path.Combine(Environment.CurrentDirectory, "current");
                var newdir = Path.Combine(Environment.CurrentDirectory, "new");
                CreatePatches(curdir, newdir, "Patchfile.patch");
                goto finished;
            }
            if (args[0] == "help")
            {
                Console.WriteLine("Commands:");
                Console.WriteLine("make-patcher");
                Console.WriteLine("\tMake a patcher from some input (run without extra arguments for more info)");
                Console.WriteLine("make-patches");
                Console.WriteLine("\tMake patches for multiple versions and such");
                Console.WriteLine("(no arguments)");
                Console.WriteLine("\tDefault behaviour: use the current/new folders to create Patchfile.patch");
                goto finished;
            }

            if (args[0] == "make-patcher")
            {
                if (args.Length != 6)
                {
                    Console.WriteLine("Run with arguments: from-dir to-dir base-patchfile notice-file output-file");
                    goto finished;
                }

                if (!Directory.Exists(args[1]))
                {
                    Console.WriteLine("Couldn't find from-dir.");
                    goto finished;
                }

                if (!Directory.Exists(args[2]))
                {
                    Console.WriteLine("Couldn't find to-dir.");
                    goto finished;
                }

                if (!File.Exists(args[3]))
                {
                    Console.WriteLine("Couldn't find base-patchfile.");
                    goto finished;
                }

                if (!File.Exists(args[4]))
                {
                    Console.WriteLine("Couldn't find notice-file.");
                    goto finished;
                }


                var fromDir       = args[1];
                var toDir         = args[2];
                var basePatchfile = args[3];
                var noticeFile    = args[4];
                var outputFile    = args[5];


                var patchfile = Path.Combine(Environment.CurrentDirectory, Path.GetFileNameWithoutExtension(outputFile) + ".patch");

                CreatePatches(fromDir, toDir, patchfile);

                CreatePatcher(patchfile, outputFile, File.ReadAllBytes(basePatchfile), File.ReadAllBytes(noticeFile));
            }
            else if (args[0] == "make-patches")
            {
                var patchesDir = Path.Combine(Environment.CurrentDirectory, "patches");

                var availableMapleInstallations = Directory.GetDirectories(Environment.CurrentDirectory, "v*")
                                                  .Select(Path.GetFileName)
                                                  .Where(x => x.StartsWith("v"))
                                                  .Select(InstalledVersion.FromFolderName)
                                                  .ToList();


                var basePatchfileBinary = File.ReadAllBytes(Path.Combine(patchesDir, "patch.base"));


                // Build Version.info files
                var newPatcherChecksum = CRC32.CalculateChecksumFile(Path.Combine(patchesDir, "NewPatcher.dat"));


                foreach (var currentMapleInstall in availableMapleInstallations)
                {
                    var subPatch = currentMapleInstall.subVersion != 0;
                    Console.WriteLine("Maple installation found: {0}", currentMapleInstall);

                    var mapleDir = Path.Combine(patchesDir, "" + currentMapleInstall);
                    if (!Directory.Exists(mapleDir))
                    {
                        Directory.CreateDirectory(mapleDir);
                    }

                    var noticeFile = Path.Combine(mapleDir, $"{currentMapleInstall.version:D5}.txt");
                    var noticeText = Encoding.ASCII.GetBytes("Please make " + noticeFile);
                    if (File.Exists(noticeFile))
                    {
                        noticeText = File.ReadAllBytes(noticeFile);
                    }
                    else
                    {
                        Console.WriteLine("Did not find the noticefile! " + noticeFile);
                    }

                    var patchables = availableMapleInstallations;
                    if (!subPatch)
                    {
                        // Main version, so all 'latest' versions
                        patchables = patchables
                                     .Where(x => x.version < currentMapleInstall.version)
                                     .GroupBy(x => x.version)
                                     .Select(x => x.OrderByDescending(y => y.subVersion).First())
                                     .ToList();
                    }
                    else
                    {
                        patchables = new List <InstalledVersion>
                        {
                            patchables
                            .Where(x => x.version == currentMapleInstall.version)
                            .OrderByDescending(x => x.subVersion)
                            .First(x => x.subVersion < currentMapleInstall.subVersion)
                        };
                    }

                    foreach (var olderMapleInstall in patchables)
                    {
                        var patchFilename = $"{olderMapleInstall.version:D5}to{currentMapleInstall.version:D5}";
                        if (subPatch)
                        {
                            // {currentversion}to1000
                            patchFilename = $"{currentMapleInstall.version:D5}to{((currentMapleInstall.subVersion - 1) + 1000):D5}";
                        }


                        if (!File.Exists(Path.Combine(mapleDir, patchFilename + ".patch")))
                        {
                            Console.WriteLine("Creating patchfile for {0} to {1}", olderMapleInstall, currentMapleInstall);

                            CreatePatches(
                                Path.Combine(Environment.CurrentDirectory, "v" + olderMapleInstall),
                                Path.Combine(Environment.CurrentDirectory, "v" + currentMapleInstall),
                                Path.Combine(mapleDir, patchFilename + ".patch")
                                );
                        }

                        if (!File.Exists(Path.Combine(mapleDir, patchFilename + ".exe")))
                        {
                            Console.WriteLine("Creating patcher for {0} to {1}", olderMapleInstall, currentMapleInstall);
                            CreatePatcher(
                                Path.Combine(mapleDir, patchFilename + ".patch"),
                                Path.Combine(mapleDir, patchFilename + ".exe"),
                                basePatchfileBinary,
                                noticeText
                                );
                        }
                    }


                    uint patcherChecksum = newPatcherChecksum;
                    if (File.Exists(Path.Combine(mapleDir, "NewPatcher.dat")))
                    {
                        patcherChecksum = CRC32.CalculateChecksumFile(Path.Combine(mapleDir, "NewPatcher.dat"));
                    }
                    else
                    {
                        File.Copy(
                            Path.Combine(patchesDir, "NewPatcher.dat"),
                            Path.Combine(mapleDir, "NewPatcher.dat")
                            );
                    }

                    using (var fs = File.Open(Path.Combine(mapleDir, "Version.info"), FileMode.Create))
                        using (var sw = new StreamWriter(fs))
                        {
                            sw.WriteLine($"0x{patcherChecksum:X8}");

                            foreach (var fromVersion in patchables.Select(x => x.version).Distinct())
                            {
                                sw.WriteLine($"{fromVersion:D5}");
                            }
                        }
                }
            }

            else if (File.Exists(args[0]))
            {
                var crc = CRC32.CalculateChecksumFile(args[0]);
                Console.WriteLine("CRC: {0:X8}", crc);
                Console.Read();
                return;
            }


finished:
            Console.WriteLine("Done! Press (the) any key to close");
            Console.Read();
            Console.WriteLine("Not the any key. whatever");
        }