Beispiel #1
0
        static void ReplaceAll(string archivePath, string replacementFolder, string newArchivePath)
        {
            CrafArchive archive = null;

            try
            {
                archive = CrafArchive.Open(archivePath);
                var task = archive.LoadAsync(new Progress <int>());
                task.Wait();
                archive.CloseReader();
            }
            catch (IOException)
            {
                Console.WriteLine("Could not open archive");
                Environment.Exit(-1);
            }

            var ct = archive.Count();

            Console.WriteLine("Loading replacement files...");
            for (var i = 0; i < ct; i++)
            {
                var fileInArchive = archive.DiskPath(i);
                var combined      = Path.Combine(replacementFolder, fileInArchive);
                if (File.Exists(combined))
                {
                    Console.WriteLine(string.Format("{0} ({1}/{2})", combined, i + 1, ct));
                    try
                    {
                        archive.Replace(i, File.ReadAllBytes(combined));
                    }
                    catch (IOException ex)
                    {
                        Console.WriteLine("Could not read replacement file");
                        Console.WriteLine("Details: " + ex.Message);
                        Environment.Exit(-1);
                    }
                }
            }

            Console.WriteLine("");

            Console.WriteLine("Writing back files...");
            var fivePercent = ct / 20;

            if (fivePercent == 0)
            {
                fivePercent = 1;
            }
            try
            {
                var task2 = archive.SaveAsync(newArchivePath, new Progress <int>((i) =>
                {
                    if (i % fivePercent == 0)
                    {
                        Console.Write(".");
                    }
                }));
                task2.Wait();
            }
            catch (IOException ex)
            {
                Console.WriteLine("");
                Console.WriteLine("Could not write new archive");
                Console.WriteLine("Details: " + ex.Message);
                Environment.Exit(-1);
            }
            Console.WriteLine("");
        }
Beispiel #2
0
        public Task PatchAsync(IProgress <int> progress, PatchMode mode, float multiplier)
        {
            return(Task.Run(() =>
            {
                var _multiplier = BitConverter.GetBytes(multiplier);

                for (var i = 0; i < _candidateIds.Count(); i++)
                {
                    var id = _candidateIds[i];
                    var binary = _archive.Get(id);

                    var disassembly = D3DCompiler.Disassemble(binary);
                    if (disassembly.Contains("FP_FadePower"))
                    {
                        // actor - patching these causes glitches with camera-overlap fade
                        progress.Report(i + 1);
                        continue;
                    }

                    bool found = false;
                    byte[] newBinary = (byte[])binary.Clone();

                    foreach (var pos in binary.SigScan(block_sig))
                    {
                        switch (mode)
                        {
                        case PatchMode.DisableDithering:
                            Buffer.BlockCopy(nop_12x, 0, newBinary, pos + block_discard_offset, 12);
                            break;

                        case PatchMode.NarrowDithering:
                            Buffer.BlockCopy(_multiplier, 0, newBinary, pos + block_float_offset, 4);
                            break;
                        }
                        found = true;
                    }

                    foreach (var pos in binary.SigScan(block2_sig))
                    {
                        switch (mode)
                        {
                        case PatchMode.DisableDithering:
                            Buffer.BlockCopy(nop_12x, 0, newBinary, pos + block2_discard_offset, 12);
                            break;

                        case PatchMode.NarrowDithering:
                            Buffer.BlockCopy(_multiplier, 0, newBinary, pos + block2_float_offset, 4);
                            break;
                        }
                        found = true;
                    }

                    if (found)
                    {
                        int[] checksum = DXBCChecksum.DXBCChecksum.CalculateDXBCChecksum(newBinary);
                        Buffer.BlockCopy(checksum, 0, newBinary, 4, 16);
                        _archive.Replace(id, newBinary);
                    }

                    progress.Report(i + 1);
                }
            }));
        }
Beispiel #3
0
        static void Replace(string archivePath, string fileInArchive, string fileOnDisk, string newArchivePath)
        {
            CrafArchive archive = null;

            try
            {
                archive = CrafArchive.Open(archivePath);
                var task = archive.LoadAsync(new Progress <int>());
                task.Wait();
                archive.CloseReader();
            }
            catch (IOException)
            {
                Console.WriteLine("Could not open archive");
                Environment.Exit(-1);
            }

            var id = archive.IndexOfDiskPath(fileInArchive);

            if (id == -1)
            {
                Console.WriteLine("File in archive not found");
                Environment.Exit(-1);
            }

            Console.WriteLine("Loading new file...");
            try
            {
                archive.Replace(id, File.ReadAllBytes(fileOnDisk));
            }
            catch (IOException ex)
            {
                Console.WriteLine("Could not read replacement file");
                Console.WriteLine("Details: " + ex.Message);
                Environment.Exit(-1);
            }

            Console.WriteLine("Writing back files...");
            var fivePercent = archive.Count() / 20;

            if (fivePercent == 0)
            {
                fivePercent = 1;
            }
            try
            {
                var task2 = archive.SaveAsync(newArchivePath, new Progress <int>((i) =>
                {
                    if (i % fivePercent == 0)
                    {
                        Console.Write(".");
                    }
                }));
                task2.Wait();
            }
            catch (IOException ex)
            {
                Console.WriteLine("");
                Console.WriteLine("Could not write new archive");
                Console.WriteLine("Details: " + ex.Message);
                Environment.Exit(-1);
            }
            Console.WriteLine("");
        }