Exemple #1
0
        public static async Task <int> DumpXbmInfo(DumpXbmsOptions options)
        {
            // create output dir
            var    dt     = DateTime.Now;
            string idx    = RED.CRC32.Crc32Algorithm.Compute(Encoding.ASCII.GetBytes($"{dt.Year}{dt.Month}{dt.Day}{dt.Hour}{dt.Minute}{dt.Second}")).ToString();
            var    outDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "XBMTest", $"ExtractedFiles_{idx}");

            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }

            // Load bundle manager
            var bm     = new BundleManager();
            var W3_DIR = System.Environment.GetEnvironmentVariable("W3_DIR", EnvironmentVariableTarget.User);

            if (!Directory.Exists(W3_DIR))
            {
                return(0);
            }
            bm.LoadAll(W3_DIR);

            //Load MemoryMapped Bundles
            var memorymappedbundles = new Dictionary <string, MemoryMappedFile>();

            foreach (var b in bm.Bundles.Values)
            {
                var e = b.ArchiveAbsolutePath.GetHashMD5();

                memorymappedbundles.Add(e, MemoryMappedFile.CreateFromFile(b.ArchiveAbsolutePath, FileMode.Open, e, 0, MemoryMappedFileAccess.Read));
            }



            using (StreamWriter writer = File.CreateText(Path.Combine(outDir, $"__xbmdump_{idx}.txt")))
            {
                string head = "RedName\t" +
                              "Width\t" +
                              "Height\t" +
                              "Format\t" +
                              "Compression\t" +
                              "TextureGroup\t" +
                              "TextureCacheKey\t" +
                              "unk\t" +
                              "unk1\t" +
                              "unk2\t" +
                              "MipsCount\t"
                ;
                writer.WriteLine(head);
                System.Console.WriteLine(head);

                string ext   = "xbm";
                var    files = bm.FileList.Where(x => x.Name.EndsWith(ext)).ToList();
                using (var pb = new ConsoleProgressBar.ProgressBar())
                    using (var p1 = pb.Progress.Fork())
                    {
                        int progress = 0;

                        Parallel.For(0, files.Count, new ParallelOptions {
                            MaxDegreeOfParallelism = 8
                        }, i =>
                        {
                            var f = files[i];
                            if (f is BundleItem bi)
                            {
                                var buff = new byte[f.Size];
                                using (var s = new MemoryStream())
                                {
                                    bi.ExtractExistingMMF(s);

                                    using (var ms = new MemoryStream(s.ToArray()))
                                        using (var br = new BinaryReader(ms))
                                        {
                                            var crw = new CR2WFile();
                                            crw.Read(br);

                                            foreach (var c in crw.Chunks)
                                            {
                                                if (!(c.data is CBitmapTexture x))
                                                {
                                                    continue;
                                                }
                                                string info = $"{f.Name}\t" +
                                                              $"{x.Width.val}\t" +
                                                              $"{x.Height.val}\t" +
                                                              $"{x.Format}\t" +
                                                              $"{x.Compression}\t" +
                                                              $"{x.TextureGroup}\t" +
                                                              $"{x.TextureCacheKey}\t" +
                                                              $"{x.unk}\t" +
                                                              $"{x.unk1}\t" +
                                                              $"{x.unk2}\t" +
                                                              $"{x.MipsCount}\t"
                                                ;

                                                //System.Console.WriteLine(info);
                                                lock (writer)
                                                {
                                                    writer.WriteLine(info);
                                                }
                                            }
                                        }
                                }
Exemple #2
0
        private static async Task <int> DumpXbmInfo(DumpXbmsOptions options)
        {
            var    dt     = DateTime.Now;
            string idx    = RED.CRC32.Crc32Algorithm.Compute(Encoding.ASCII.GetBytes($"{dt.Year}{dt.Month}{dt.Day}{dt.Hour}{dt.Minute}{dt.Second}")).ToString();
            var    outDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "XBMTest", $"ExtractedFiles_{idx}");

            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }
            var mc = new BundleManager();

            mc.LoadAll("C:\\Steam\\steamapps\\common\\The Witcher 3\\bin\\x64");
            string ext = "xbm";

            using (StreamWriter writer = File.CreateText(Path.Combine(outDir, $"__xbmdump_{idx}.txt")))
            {
                string head = "RedName\t" +
                              "Width\t" +
                              "Height\t" +
                              "Format\t" +
                              "Compression\t" +
                              "TextureGroup\t" +
                              "TextureCacheKey\t"
                ;
                writer.WriteLine(head);
                System.Console.WriteLine(head);


                var files = mc.FileList.Where(x => x.Name.EndsWith(ext)).ToList();
                for (int i = 0; i < files.Count; i++)
                {
                    var f = files[i];
                    try
                    {
                        var buff = new byte[f.Size];
                        using (var s = new MemoryStream())
                        {
                            f.Extract(s);

                            using (var ms = new MemoryStream(s.ToArray()))
                                using (var br = new BinaryReader(ms))
                                {
                                    var crw = new CR2WFile();
                                    crw.Read(br);

                                    foreach (var c in crw.chunks)
                                    {
                                        if (c.data is CBitmapTexture)
                                        {
                                            var x = c.data as CBitmapTexture;

                                            string info = $"{f.Name}\t" +
                                                          $"{x.GetVariableByName("width")}\t" +
                                                          $"{x.GetVariableByName("height")}\t" +
                                                          $"{x.GetVariableByName("format")}\t" +
                                                          $"{x.GetVariableByName("compression")}\t" +
                                                          $"{x.GetVariableByName("textureGroup")}\t" +
                                                          $"{x.GetVariableByName("textureCacheKey")}\t"
                                            ;

                                            //System.Console.WriteLine(info);
                                            writer.WriteLine(info);
                                        }
                                    }
                                }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    //System.Console.WriteLine($"Finished extracting {f.Name}");
                }
            }

            System.Console.WriteLine($"Finished extracting.");
            System.Console.ReadLine();

            return(1);
        }