Ejemplo n.º 1
0
        public Task DumpDiscardPsAsync(IProgress <int> progress)
        {
            return(Task.Run(() =>
            {
                if (!Directory.Exists("shaderDump"))
                {
                    Directory.CreateDirectory("shaderDump");
                }

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

                    var filename = _archive.VfsFilename(id);
                    var outputPath = "shaderDump/" + filename;

                    var binary = _archive.Get(id);
                    var disassembly = D3DCompiler.Disassemble(binary);

                    if (disassembly.Contains("discard_z"))
                    {
                        File.WriteAllBytes(outputPath, binary);
                        File.WriteAllText(outputPath + ".lst", disassembly);
                    }
                    progress.Report(i + 1);
                }
            }));
        }
Ejemplo n.º 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);
                }
            }));
        }