Beispiel #1
0
        public static void DecodeReserializeAllCoreFilesTest()
        {
            var files = Directory.GetFiles(GameDataPathExtracted, "*.core", SearchOption.AllDirectories);

            foreach (string file in files)
            {
                Console.WriteLine(file);

                var core = CoreBinary.FromFile(file, true);

                string tempPath = Path.ChangeExtension(file, ".tmp");
                core.ToFile(tempPath);

                byte[] d1 = File.ReadAllBytes(file);
                byte[] d2 = File.ReadAllBytes(tempPath);

                if (d1.Length != d2.Length)
                {
                    throw new Exception("Re-serialized file length doesn't match");
                }

                for (int i = 0; i < d1.Length; i++)
                {
                    if (d1[i] != d2[i])
                    {
                        throw new Exception($"File data doesn't match at offset {i:X} in new file");
                    }
                }

                File.Delete(tempPath);
            }
        }
Beispiel #2
0
        public static void DecodeReserializeQuickCoreFilesTest()
        {
            foreach (string file in QuickTestFiles)
            {
                string fullPath = Path.Combine(GameDataPathExtracted, file);
                Console.WriteLine(fullPath);

                var core = CoreBinary.FromFile(fullPath);

                string tempPath = Path.ChangeExtension(fullPath, ".tmp");
                core.ToFile(tempPath);

                byte[] d1 = File.ReadAllBytes(fullPath);
                byte[] d2 = File.ReadAllBytes(tempPath);

                if (d1.Length != d2.Length)
                {
                    throw new Exception("Re-serialized file length doesn't match");
                }

                for (int i = 0; i < d1.Length; i++)
                {
                    if (d1[i] != d2[i])
                    {
                        throw new Exception($"File data doesn't match at offset {i:X} in new file");
                    }
                }

                File.Delete(tempPath);
            }
        }
Beispiel #3
0
        public static void ExtractHZDLocalization()
        {
            var files = Directory.GetFiles(@"E:\hzd9\localized\", "*.core", SearchOption.AllDirectories);
            var sb    = new StringBuilder();

            foreach (string file in files)
            {
                Console.WriteLine(file);
                bool first = true;

                var core = CoreBinary.FromFile(file);

                foreach (var obj in core)
                {
                    if (obj is Decima.HZD.LocalizedTextResource asResource)
                    {
                        if (first)
                        {
                            sb.AppendLine();
                            sb.AppendLine(file);
                            first = false;
                        }

                        sb.AppendLine(asResource.ObjectUUID + " " + asResource.GetStringForLanguage(Decima.HZD.ELanguage.English));
                    }
                }
            }

            File.WriteAllText(@"E:\hzd9\text_data_dump.txt", sb.ToString());
        }
Beispiel #4
0
        static void DecodeLocalizationTest()
        {
            var files      = Directory.GetFiles(@"C:\Program Files (x86)\Steam\steamapps\common\Horizon Zero Dawn\Packed_DX12\extracted\localized\", "*.core", SearchOption.AllDirectories);
            var allStrings = new List <string>();

            foreach (string file in files)
            {
                Console.WriteLine(file);

                allStrings.Add("\n");
                allStrings.Add(file);

                var objects = CoreBinary.Load(file);

                foreach (var obj in objects)
                {
                    if (obj is Decima.HZD.LocalizedTextResource asResource)
                    {
                        allStrings.Add(asResource.GetStringForLanguage(Decima.HZD.ELanguage.English));
                    }
                }
            }

            File.WriteAllLines(@"C:\text_data_dump.txt", allStrings);
        }
Beispiel #5
0
        public static void DecodeQuickCoreFilesTest()
        {
            foreach (string file in QuickTestFiles)
            {
                string fullPath = Path.Combine(GameDataPathExtracted, file);
                Console.WriteLine(fullPath);

                var core = CoreBinary.FromFile(fullPath);
            }
        }
Beispiel #6
0
        public static void DecodeAllCoreFilesTest()
        {
            var files = Directory.GetFiles(GameDataPathExtracted, "*.core", SearchOption.AllDirectories);

            foreach (string file in files)
            {
                Console.WriteLine(file);

                var core = CoreBinary.FromFile(file, true);
            }
        }
Beispiel #7
0
        static void DecodeAllFilesTest()
        {
            var files = Directory.GetFiles(@"C:\Program Files (x86)\Steam\steamapps\common\Horizon Zero Dawn\Packed_DX12\extracted\", "*.core", SearchOption.AllDirectories);

            foreach (string file in files)
            {
                Console.WriteLine(file);

                var objects = CoreBinary.Load(file, true);
            }
        }
Beispiel #8
0
        static void ExtractReferences()
        {
            var prefetchCore = CoreBinary.FromFile(@"C:\Program Files (x86)\Steam\steamapps\common\Horizon Zero Dawn\Packed_DX12\extracted\prefetch\fullgame.prefetch.core");
            var prefetchList = prefetchCore.First(x => x is Decima.HZD.PrefetchList) as Decima.HZD.PrefetchList;

            var files      = prefetchList.Files;
            var fileRefMap = new HashSet <int> [files.Count];

            // Keep a lookup table since linear searches are incredibly slow
            var fileIndexLUT = new Dictionary <string, int>();

            for (int i = 0; i < files.Count; i++)
            {
                fileIndexLUT[files[i].Path] = i;
            }

            // Gather every ExternalCoreUUID reference from every Core file and compile it into a list
            Parallel.ForEach(prefetchList.Files, (file, _, index) =>
            {
                fileRefMap[index] = new HashSet <int>();

                try
                {
                    var core = CoreBinary.FromFile(Path.Combine(@"C:\Program Files (x86)\Steam\steamapps\common\Horizon Zero Dawn\Packed_DX12\extracted\", $"{file.Path}.core"), true);

                    foreach (var baseRef in core.GetAllReferences())
                    {
                        if (baseRef.Type == BaseRef.Types.ExternalCoreUUID)
                        {
                            fileRefMap[index].Add(fileIndexLUT[baseRef.ExternalFile.Value]);
                        }
                    }
                }
                catch (Exception)
                {
                }
            });

            // Rebuild the index array - a counter (N) followed by N indices
            var indices = new List <int>();

            for (int i = 0; i < files.Count; i++)
            {
                indices.Add(fileRefMap[i].Count);

                foreach (int fileIndex in fileRefMap[i])
                {
                    indices.Add(fileIndex);
                }
            }
        }
Beispiel #9
0
        static void DecodeQuickTest()
        {
            var files = new string[]
            {
                @"models\weapons\anti_gravity_cannon\model\model.core",
                @"entities\characters\models\humanoid_player.core",
                @"models\characters\humans\heads\baby\babyaloy\animation\parts\head_lx.core",
                @"models\characters\humans\hair\aloy\model\model.core",
                @"models\animation_managers\characters\animals\blackrat\blackrat_blackrat.core",
                @"sounds\music\world\world.core",
                @"shaders\ecotope\texturesetarrays\terrain_texture_array.core",
                @"animation_objects\ledge_climb\network\moaf_honst_fight_intro_network.core",
                @"movies\movielist.core",
                @"entities\trackedgamestats.core",
                @"localized\sentences\aigenerated\nora_adult_male1_1\sentences.core",
                @"interface\textures\markers\ui_marker_compass_bunker.core",
                @"levels\worlds\world\tiles\tile_x05_y-01\layers\lighting\cubezones\cubemapzone_07_cube.core",
                @"levels\worlds\world\tiles\tile_x05_y-01\layers\lighting\cubezones\cubezones_foundry_1.core",
                @"textures\lighting_setups\skybox\star_field.core",
                @"textures\base_maps\clouds_512.core",
                @"textures\detail_textures\buildingblock\buildingblock_detailmap_array.core",
                @"sounds\effects\dlc1\weapons\firebreather\wav\fire_loop_flames_01_m.core",
                @"models\building_blocks\nora\dressing\components\dressing_b125_c006_resource.core",
                @"telemetry\designtelemetry.core",
                @"worlddata\worlddatapacking.core",
                @"entities\weapons\heavy_weapons\heavy_railgun_cables.core",
                @"entities\collectables\collectable_datapoint\datapoint_world.core",
                @"entities\shops\shops.core",
                @"levels\quests.core",
                @"levels\game.core",
                @"levels\worlds\world\leveldata\terrain.core",
                @"weather\defaultweathersystem.core",
                @"climates\regions\faro\faro_master_climate.core",
                @"entities\armor\outfits\outfits.core",
                @"models\weapons\raptordisc_playerversion\model\model.core",
                @"loadouts\loadout.core",
                @"levels\worlds\world\quests\mainquests\mq15_themountainthatfell_files\mq15_quest.core",
                @"entities\characters\models\humanoid_civilian.core",
                @"system\waves\white_noise_0dbfs.core",
            };

            foreach (string file in files)
            {
                string fullPath = Path.Combine(@"C:\Program Files (x86)\Steam\steamapps\common\Horizon Zero Dawn\Packed_DX12\extracted\", file);
                Console.WriteLine(fullPath);

                var objects = CoreBinary.Load(fullPath);
            }
        }
Beispiel #10
0
        private List <string> LoadPrefetch(PackfileReader pack)
        {
            var prefetchHash = Packfile.GetHashForPath(Prefetch);

            using var ms = new MemoryStream();
            pack.ExtractFile(prefetchHash, ms);
            ms.Position = 0;

            using var br = new BinaryReader(ms, Encoding.UTF8, true);
            var core = CoreBinary.FromData(br, true);

            return((core.First(x => x is PrefetchList) as PrefetchList).Files
                   .Select(x => x.Path?.Value)
                   .ToList());
        }
Beispiel #11
0
        static void DecodeAudioTest()
        {
            var files = Directory.GetFiles(@"C:\Program Files (x86)\Steam\steamapps\common\Horizon Zero Dawn\Packed_DX12\extracted\sounds\", "*.core", SearchOption.AllDirectories);

            foreach (string file in files)
            {
                Console.WriteLine(file);

                var coreObjects = CoreBinary.Load(file, true);

                foreach (var obj in coreObjects)
                {
                    var wave = obj as Decima.HZD.WaveResource;

                    if (wave == null)
                    {
                        continue;
                    }

                    if (wave.IsStreaming)
                    {
                        continue;
                    }

                    using (var ms = new System.IO.MemoryStream(wave.WaveData.ToArray()))
                    {
                        RawSourceWaveStream rs = null;

                        if (wave.Encoding == Decima.HZD.EWaveDataEncoding.MP3)
                        {
                            rs = new RawSourceWaveStream(ms, new Mp3WaveFormat(wave.SampleRate, wave.ChannelCount, wave.FrameSize, (int)wave.BitsPerSecond));
                        }
                        else if (wave.Encoding == Decima.HZD.EWaveDataEncoding.PCM)
                        {
                            rs = new RawSourceWaveStream(ms, new WaveFormat(wave.SampleRate, 16, wave.ChannelCount));
                        }

                        string outFile = Path.Combine(Path.GetDirectoryName(file), wave.Name.Value + ".wav");

                        if (rs != null)
                        {
                            WaveFileWriter.CreateWaveFile(outFile, rs);
                        }
                    }
                }
            }
        }
        public static HzdCore FromStream(Stream stream, string source)
        {
            try
            {
                using var br = new BinaryReader(stream, Encoding.UTF8, true);

                return(new HzdCore()
                {
                    Source = NormalizeSource(source),
                    Binary = CoreBinary.FromData(br, true)
                });
            }
            catch (Exception ex)
            {
                throw new HzdException($"Failed to load: {source ?? "null"}", ex);
            }
        }
Beispiel #13
0
        public static void ExtractHZDAudio()
        {
            var root    = @"E:\hzd9\";
            var outRoot = @"E:\hza\";

            var files = Directory.GetFiles(root + @"sounds\", "*.core", SearchOption.AllDirectories);

            foreach (string file in files)
            {
                try
                {
                    var core = CoreBinary.FromFile(file);

                    foreach (var obj in core)
                    {
                        var wave = obj as Decima.HZD.WaveResource;

                        if (wave == null)
                        {
                            continue;
                        }

                        string outFile = Path.Combine(outRoot,
                                                      Path.GetDirectoryName(file).Substring(root.Length),
                                                      wave.Name.Value + ".wav");
                        if (File.Exists(outFile))
                        {
                            continue;
                        }

                        Stream s = null;
                        if (file.Contains(@"E:\hzd9\sounds\music\menumusic\musicscape_01"))
                        {
                            ;
                        }
                        if (wave.IsStreaming && File.Exists(file + ".stream"))
                        {
                            s = File.OpenRead(file + ".stream");
                        }
                        else if (wave.WaveData.Count > 0)
                        {
                            s = new MemoryStream(wave.WaveData.ToArray());
                        }

                        if (s == null)
                        {
                            continue;
                        }

                        RawSourceWaveStream rs = null;

                        if (wave.Encoding == Decima.HZD.EWaveDataEncoding.MP3)
                        {
                            rs = new RawSourceWaveStream(s, new Mp3WaveFormat(wave.SampleRate, wave.ChannelCount, wave.FrameSize, (int)wave.BitsPerSecond));
                        }
                        else if (wave.Encoding == Decima.HZD.EWaveDataEncoding.PCM)
                        {
                            rs = new RawSourceWaveStream(s, new WaveFormat(wave.SampleRate, 16, wave.ChannelCount));// This is wrong
                        }
                        if (rs != null)
                        {
                            Debug.WriteLine(outFile);
                            if (!Directory.Exists(Path.GetDirectoryName(outFile)))
                            {
                                Directory.CreateDirectory(Path.GetDirectoryName(outFile));
                            }
                            WaveFileWriter.CreateWaveFile(outFile, rs);
                        }

                        s.Dispose();
                    }
                }
                catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                }
            }
        }
Beispiel #14
0
        static void RebuildLinksForFile(Decima.HZD.PrefetchList prefetchList, string fileName, CoreBinary coreBinary)
        {
            // Convert the old links to a dictionary
            var oldLinks  = new Dictionary <int, int[]>();
            int linkIndex = 0;

            for (int i = 0; i < prefetchList.Files.Count; i++)
            {
                int count = prefetchList.Links[linkIndex];

                var indices = prefetchList.Links
                              .Skip(linkIndex + 1)
                              .Take(count)
                              .ToArray();

                oldLinks.Add(i, indices);
                linkIndex += count + 1;
            }

            // Regenerate links for this specific file (don't forget to remove duplicates (Distinct()!!!))
            int getFileIndex(string path)
            {
                return(prefetchList.Files.IndexOf(prefetchList.Files.Single(x => x.Path.Value.Equals(path))));
            }

            oldLinks[getFileIndex(fileName)] = coreBinary.GetAllReferences()
                                               .Where(x => x.Type == BaseRef.Types.ExternalCoreUUID)
                                               .Select(x => getFileIndex(x.ExternalFile.Value))
                                               .Distinct()
                                               .ToArray();

            // Dictionary of links -> linear array
            prefetchList.Links.Clear();

            for (int i = 0; i < prefetchList.Files.Count; i++)
            {
                var indices = oldLinks[i];
                prefetchList.Links.Add(indices.Count());

                foreach (int index in indices)
                {
                    prefetchList.Links.Add(index);
                }
            }
        }
Beispiel #15
0
 static void RebuildLinksForFile(Decima.HZD.PrefetchList prefetchList, string fileName, string physicalFilePath)
 {
     RebuildLinksForFile(prefetchList, fileName, CoreBinary.FromFile(physicalFilePath));
 }