limn is an extractor for the bundle format used in the game Warhammer 40k Darktide.
limn requires Wine on Linux since it loads the compression library used by Darktide.
Extract all files:
limn -i "C:\Program Files (x86)\Steam\steamapps\common\Warhammer 40,000 Darktide\bundle" *
Extract only lua files:
limn -i "C:\Program Files (x86)\Steam\steamapps\common\Warhammer 40,000 Darktide\bundle" lua
With the Steam version of Darktide automatic directory lookup is used when no path is specified:
limn lua
See limn --help for more options.
By default limn reads the file dictionary.txt for reverse hash lookup.
To use a specific dictionary:
limn --dict dictionary_hashcat_dt.txt *
qasikfwn (GitLab) has a high quality dictionary as part of Bitsquid Blender Tools.
Download dictionary_hashcat_dt.txt from the dev branch.
Note: when using a dictionary limn will currently only extract files with known names.
limn only supports a few file types used in Darktide bundles.
Fatshark uses a private fork of LuaJIT in Darktide. All lua files are stored as LuaJIT bytecode that, aside from a header version change, is compatible with existing tooling for LuaJIT (like any decompilers).
package files in Darktide are a list of other files with a extension hash and name hash per entry.
For example most unit files share the same name as their package file which can then be referenced for the hashes of texture or other files used by that unit.
If filtering for only strings files then limn will either:
- extract strings with known keys if a dictionary is used
- extract all strings
texture files are stored as DDS. For mipmap levels 64KiB or larger Darktide deduplicates them to a resource file at data/**/*.
limn will export the highest quality mipmap level found.
For converting DDS to PNG texconv and ffmpeg can be used:
texconv -ft bmp -f B8G8R8A8_UNORM -y texture_file.dds
ffmpeg -i texture_file.BMP texture_file.pngConverts Wwise Vorbis streams to Ogg Vorbis. Other types of streams are sliently ignored.
To extract the original Wwise streams as wem files use --config force-wem:
limn --config force-wem wwise_stream