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); } }
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); } }
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()); }
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); }
public static void DecodeQuickCoreFilesTest() { foreach (string file in QuickTestFiles) { string fullPath = Path.Combine(GameDataPathExtracted, file); Console.WriteLine(fullPath); var core = CoreBinary.FromFile(fullPath); } }
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); } }
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); } }
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); } } }
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); } }
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()); }
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); } }
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); } } }
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); } } }
static void RebuildLinksForFile(Decima.HZD.PrefetchList prefetchList, string fileName, string physicalFilePath) { RebuildLinksForFile(prefetchList, fileName, CoreBinary.FromFile(physicalFilePath)); }