From 51dde045ae7265f154cab48f447f584a00c1a06b Mon Sep 17 00:00:00 2001 From: Escartem Date: Tue, 3 Dec 2024 23:14:49 +0100 Subject: [PATCH] fix hdiff loading --- extract.py | 20 +++++++++++++++++--- wwise.py | 8 ++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/extract.py b/extract.py index 8d2671a..e240d05 100644 --- a/extract.py +++ b/extract.py @@ -46,6 +46,14 @@ class WwiseExtract: hdiff_files = [] if diff_path != "": hdiff_files = [f for f in os.listdir(diff_path) if f.endswith(".pck.hdiff")] + + # TODO: hdiff mode will only use .hdiff files and ignore .pck even in the update folder, i need to implement it, eventually + + # remove alone pck / hdiff + base_files = [os.path.basename(f) for f in files] + hdiff_files = [f for f in hdiff_files if os.path.basename(f.replace(".hdiff", "")) in base_files] + base_hfiles = [os.path.basename(f) for f in hdiff_files] + files = [f for f in files if f"{os.path.basename(f)}.hdiff" in base_hfiles] if len(files) == 0: return None @@ -72,11 +80,13 @@ class WwiseExtract: def get_wems(self, data, filename, hdiff): reader = FileReader(io.BytesIO(data), "little") files = wavescan.get_data(reader, filename) + if hdiff is not None: with open(hdiff, "rb") as f: hdiff_data = f.read() f.close() - hdiff_files = self.get_hdiff_files(data, hdiff_data, filename) + + hdiff_files, data = self.get_hdiff_files(data, hdiff_data, filename) files = self.compare_diff(files, hdiff_files) self.map_names(files, filename, hdiff is not None, data) @@ -114,6 +124,10 @@ class WwiseExtract: call(args) + if not os.path.exists(path(working_dir.name, "patch.pck")): + print(f"[ERROR] failed to patch {source_name}, skipping") + return [] + with open(path(working_dir.name, "patch.pck"), "rb") as f: data = f.read() f.close() @@ -127,7 +141,7 @@ class WwiseExtract: working_dir.cleanup() - return files + return files, data def map_names(self, files, filename, hdiff=False, data=None, skip_source=True): # disable skip source if required @@ -153,7 +167,7 @@ class WwiseExtract: } wem_data = data[file_data["offset"]:file_data["offset"]+file_data["size"]] - parsed_wem = wwise.parse_wwise(FileReader(io.BytesIO(wem_data), "little", name=f"{file[0]}:{file[1]}")) + parsed_wem = wwise.parse_wwise(FileReader(io.BytesIO(wem_data), "little", name=f"{file[3]}:{file[0]}:{file[1]}")) file_data["metadata"] = parsed_wem diff --git a/wwise.py b/wwise.py index b887ed1..0a0dd4b 100644 --- a/wwise.py +++ b/wwise.py @@ -58,7 +58,7 @@ def parse_wwise(reader): formatted_chunk_type = chunk_type.decode("utf-8").replace(" ", "") chunk_length = reader.ReadUInt32() - if chunk_type == b"data" and chunk_length > reader.GetRemainingLength(): + if chunk_length > reader.GetRemainingLength(): chunk_length = reader.GetRemainingLength() chunks[formatted_chunk_type] = { @@ -174,17 +174,13 @@ def parse_wwise(reader): setup_offset = reader.ReadUInt32(extra_offset + data_offset) audio_offset = reader.ReadUInt32(extra_offset + data_offset + 0x04) - print(metadata["numSamples"]) - print(setup_offset) - print(audio_offset) - block_size_1_exp = reader.ReadUInt8(extra_offset + blocks_offset) block_size_0_exp = reader.ReadUInt8(extra_offset + blocks_offset + 0x01) + # if both exp are equals and extra size is 0x30, then reset packet type to standard chunks["data"]["offset"] -= audio_offset # ignore packets update and codebooks parse attempts, not implemented - metadata["layoutType"] = "none" metadata["duration"] = metadata["numSamples"] / metadata["sampleRate"]