kotiq / wt-tools

War Thunder resource extraction tools
29 stars 3 forks source link

Распаковка blk из Enlisted\CRSED #1

Closed Viz-Allati closed 3 years ago

Viz-Allati commented 3 years ago

Enlisted и CRSED это две другие игры под издательством Gaijin, так же на движке Dagor Engine. Соответственно формат blk там используется примерно тот же, что и в War Thunder. Однако при распаковке возникают ошибки, например следующего рода:

D:\Soft\DataMining\blk-master\tests\demo>blk_unpack_demo.py ../../../e_ww2_common.vromfs.bin_u ... ../../../e_ww2_common.vromfs.bin_u\gamedata\items\avs_36_bayonet.blk Unknown file format ... ../../../e_ww2_common.vromfs.bin_u\gamedata\templates\base_soldier.blk Traceback (most recent call last): File "D:\Soft\DataMining\blk-master\tests\demo\blk_unpack_demo.py", line 160, in main() File "D:\Soft\Python3\lib\site-packages\click\core.py", line 829, in call return self.main(args, kwargs) File "D:\Soft\Python3\lib\site-packages\click\core.py", line 782, in main rv = self.invoke(ctx) File "D:\Soft\Python3\lib\site-packages\click\core.py", line 1066, in invoke return ctx.invoke(self.callback, ctx.params) File "D:\Soft\Python3\lib\site-packages\click\core.py", line 610, in invoke return callback(args, **kwargs) File "D:\Soft\DataMining\blk-master\tests\demo\blk_unpack_demo.py", line 156, in main process_dir(path, out_type, is_sorted) File "D:\Soft\DataMining\blk-master\tests\demo\blk_unpack_demo.py", line 132, in process_dir process_dir(entry.path, out_type, is_sorted) File "D:\Soft\DataMining\blk-master\tests\demo\blk_unpack_demo.py", line 132, in process_dir process_dir(entry.path, out_type, is_sorted) File "D:\Soft\DataMining\blk-master\tests\demo\blk_unpack_demo.py", line 134, in process_dir process_file(entry.path, None, out_type, is_sorted) File "D:\Soft\DataMining\blk-master\tests\demo\blk_unpack_demo.py", line 91, in process_file root = bin.compose_fat(istream) File "D:\Soft\DataMining\blk-master\src\blk\binary\constructor.py", line 277, in compose_fat return FileAdapter(FileStruct, names).parse_stream(istream) File "D:\Soft\Python3\lib\site-packages\construct\core.py", line 313, in parse_stream return self._parsereport(stream, context, "(parsing)") File "D:\Soft\Python3\lib\site-packages\construct\core.py", line 325, in _parsereport obj = self._parse(stream, context, path) File "D:\Soft\Python3\lib\site-packages\construct\core.py", line 710, in _parse return self._decode(obj, context, path) File "D:\Soft\DataMining\blk-master\src\blk\binary\constructor.py", line 151, in _decode name = names[name_id] IndexError: list index out of range

Версия Python 3.8.10, под Windows. Версия blk_unpack_demo.py (и остального) от 16 августа. Проверил на относительно свежем aces.vromfs.bin из WT - blk распаковались нормально, так что пока что предполагаю, что причина не в том, что я накосячил при установке инструментария. До всей этой заварухи со сменой формата WT Tools работал нормально с файлами из этих игр. Прикладываю примеры сбоящих blk и исходного vromfs.bin из Enlisted. sample files.zip

kotiq commented 3 years ago

Вы правы. У вас нормальный blk с именами внутри, в виде, каким он предполагался. Он должен начинаться с байта 0x1, так же как blk с именами снаружи начинается с 0x0, но его код формата не 0. Неточность во vromfs_unpacker.py. В War Thunder все blk нового формата содержатся в директориях "нового формата", в которых присутствуют blk c именами снаружи либо версия файла выше заданной 0x02_07_00_3a для War Thunder. Некоторые ветки для packed_type, фактически, оставались не протестированными к моменту написания парсера blk, поэтому, ко мне сначала попали файлы с 0x0 вначале, но не с 0x1. Позже датамайнер обнаружил файл типа 2 внутри архива сигнатуры VRFs с таблицей имен, и я добавил в условие "нового формата", что там должны быть файлы типа упаковки 2, 4 или 5. Все они сжаты zstd, раньше такого не было. Распакованная часть файла типа 2 начиналась с 0x1, и, чтобы не переписывать парсер blk, я этот первый байт пропускал, как и в случае с файлами типа 1. Архив с таким файлом regional.vromfs.bin, в массе был не нужен. Как решение, в файле vromfs_unpacker.py я не буду учитывать версию из расширения заголовка, а буду смотреть только по содержимому архива: есть ли среди них общий список строк/имен, словарь для декомпрессора или .blk файлы, у которых первый байт из 0x1 .. 0x5

Ветка с изменениями распаковщика vromfs

Viz-Allati commented 3 years ago

Действительно, теперь .blk распаковываются без ошибок, благодарю. Есть проблема с одним из .vromfs.bin файлов, но к blk это не относится, заведу issue в соответствующем репозитории. Спасибо.

Viz-Allati commented 3 years ago

Упс, не заведу, в kotiq/wt-tools это запрещено. В общем, проблема следующая:

D:\Soft\DataMining\wt-tools>vromfs_unpacker.exe ../aircraft.vromfs.bin Traceback (most recent call last): File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\site-packages\cxFreeze\initscripts\__startup_\.py", line 74, in run File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\site-packages\cx_Freeze\initscripts\Console.py", line 36, in run File "src/wt_tools/vromfsunpacker.py", line 208, in \<module> File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\site-packages\click\core.py", line 829, in __call_\ File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\site-packages\click\core.py", line 782, in main File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\site-packages\click\core.py", line 1066, in invoke File "C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\site-packages\click\core.py", line 610, in invoke File "src/wt_tools/vromfs_unpacker.py", line 204, in main File "src/wt_tools/vromfs_unpacker.py", line 60, in unpack File "src/wt_tools/vromfs_unpacker.py", line 60, in \<genexpr> File "src/wt_tools/vromfs_unpacker.py", line 58, in \<genexpr> IndexError: index out of range

Vromfs_unpacker собран так, aircraft.vromfs.bin из Enlisted, прикладываю. aircraft.vromfs.zip С остальными .vromfs.bin файлами проблем нет (по крайней мере с теми, которые меня интересуют).

kotiq commented 3 years ago

Добавил значение для генератора в случае пустого файла.

Viz-Allati commented 3 years ago

Ещё раз спасибо, всё работает.