From a063b7483545e49e74d9131da3db169d980cbfc8 Mon Sep 17 00:00:00 2001 From: Escartem Date: Fri, 26 Jul 2024 23:53:33 +0200 Subject: [PATCH] we can now load bnk files --- .gitignore | 1 + bnk.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ wavescan.py | 16 +++++++++++++++- 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 bnk.py diff --git a/.gitignore b/.gitignore index 6ac2d0f..0ae6381 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ output/ +input/ temp/ *.pck *.hdiff diff --git a/bnk.py b/bnk.py new file mode 100644 index 0000000..c9527da --- /dev/null +++ b/bnk.py @@ -0,0 +1,47 @@ +# bnk reader because they exist in the game +import io +from filereader import FileReader + +def bnk2wem(data): + # gets raws data from object + reader = FileReader(io.BytesIO(data), "little") + + bkhd_signature = reader.ReadBytes(4) + + if bkhd_signature != b"\x42\x4B\x48\x44": + raise Exception("not a valid bnk") + + bkhd_size = reader.ReadUInt32() + reader.ReadBytes(bkhd_size) + + if reader.GetBufferPos() == reader.GetStreamLength(): + return [] # empty bnk + + didx_signature = reader.ReadBytes(4) + + if didx_signature != b"\x44\x49\x44\x58": + return [] # invalid index signature (hirc block instead ?) + + didx_size = reader.ReadUInt32() + n_wems = didx_size // 12 + wems = [] + + for i in range(n_wems): + wem_id = reader.ReadUInt32() + wem_offset = reader.ReadUInt32() + wem_size = reader.ReadUInt32() + wem = [wem_id, wem_offset, wem_size] + wems.append([wem_id, wem_offset, wem_size]) + + data_signature = reader.ReadBytes(4) + + if data_signature != b"\x44\x41\x54\x41": + return [] # invalid data signature (missing sector ?) + + data_size = reader.ReadUInt32() + data_offset = reader.GetBufferPos() + + for wem in wems: + wem[1] += data_offset + + return wems diff --git a/wavescan.py b/wavescan.py index 581a006..8a09ed2 100644 --- a/wavescan.py +++ b/wavescan.py @@ -1,6 +1,7 @@ # Custom rewrite of the Wwise AKPK packages extractor, original by Nicknine and bnnm import os import traceback +from bnk import bnk2wem reader = None @@ -212,4 +213,17 @@ def extract_sector(section_size, is_sounds, is_externals, ext, endianness, lang_ continue # file infos - wwise_data.append([os.path.basename(name), offset, size, filename]) + if ext == "bnk": + # get data from bnk + print(offset) + pos = reader.GetBufferPos() + reader.SetBufferPos(offset) + bnk_data = reader.ReadBytes(size) + reader.SetBufferPos(pos) + + wems = bnk2wem(bnk_data) + + for wem in wems: + wwise_data.append([f"{os.path.basename(name).split('.')[0]}_{wem[0]}.wem", offset+wem[1], wem[2], filename]) + else: + wwise_data.append([os.path.basename(name), offset, size, filename])