-
-
Save shmerl/dfbd8db87874ee4929f86fa070a80863 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# Usage: gog_tw3_extract_music.sh <game_dir> | |
# | |
# The script relies on these utilities: | |
# 1. QuickBMS extractor (quickbms) | |
# See http://aluigi.altervista.org/quickbms.htm | |
# Source: http://aluigi.altervista.org/papers/quickbms_src.zip | |
# | |
# 2. Witcher 3 BMS script to be used with QuickBMS (witcher3.bms) | |
# Source: http://aluigi.altervista.org/bms/witcher3.bms | |
# | |
# 3. Wwise BNK extractor | |
# Source: https://github.com/eXpl0it3r/bnkextr | |
# | |
# 4. Wwise WEM to ogg convertor | |
# Source: https://github.com/hcs64/ww2ogg | |
# | |
# 4.1 Binary codebooks for ww2ogg | |
# https://github.com/hcs64/ww2ogg/raw/master/packed_codebooks_aoTuV_603.bin | |
# | |
# Notes: | |
# | |
# 1. <game_dir> is the directory where the Witcher 3 is installed (which has subdir like content and etc.). | |
# | |
# 2. The script assumes, all extraction tools are placed in ${HOME}/bin/extractors | |
# override extractors variables when running the script if you placed them elsewhere or they are named differently. | |
# | |
# 3. By default the script will clean temporary files. If you want to preserve them for your own investigation, | |
# override clean variable. | |
# | |
# 4. [Optional]: To get titles for numbered files, use official TW3 Mod Kit (it works in Wine), and uncook | |
# <game_dir>/content/content0/bundles/xml.bundle | |
# | |
# Example (from Wine cmd, using <game_dir> relative to Wine's C:/ location): | |
# wcc_lite uncook -indir=C:/<game_dir>/content/content0/bundles -outdir=<target-dir> -infile=C:/<game_dir>/content/content0/bundles/xml.bundle | |
# | |
# Then locate <target-dir>/soundbanks/pc/soundbanksinfo.xml which contains needed mappings. | |
# | |
base_path="$1" | |
quickbms=${quickbms:-"$HOME/bin/extractors/quickbms"} | |
witcher3bms=${witcher3bms:-"$HOME/bin/extractors/witcher3.bms"} | |
ww2ogg=${ww2ogg:-"$HOME/bin/extractors/ww2ogg"} | |
codebooks=${codebooks:-"$HOME/bin/extractors/packed_codebooks_aoTuV_603.bin"} | |
bnkextr=${bnkextr:-"$HOME/bin/extractors/bnkextr"} | |
clean=${clean:-true} # Override as false if you want to keep temporary files. | |
sources=( | |
content/content0/soundspc.cache | |
content/content1/soundspc.cache | |
content/content2/soundspc.cache | |
content/content3/soundspc.cache | |
content/content4/soundspc.cache | |
content/content5/soundspc.cache | |
content/content6/soundspc.cache | |
content/content7/soundspc.cache | |
content/content10/soundspc.cache | |
) | |
function extract_tw3_soundcache() { | |
local source="$1" | |
local target_dir="$2" | |
echo "Extracting ${source} -> ${target_dir}" | |
$quickbms $witcher3bms "${source}" "${target_dir}" | |
} | |
function extract_wem() { | |
local source="$1" | |
local target_dir="$2" | |
local source_name=$(basename "$source") | |
local target="${target_dir}/${source_name%%.*}.ogg" | |
mkdir -v -p "$target_dir" | |
echo "Extracting ${source} -> ${target}" | |
$ww2ogg "$source" -o "$target" --pcb $codebooks | |
} | |
function extract_bnk() { | |
local source="$1" | |
local target_dir="$2" | |
cd "$target_dir" | |
$bnkextr "$source" | |
for tmpwem in *.wem; do | |
local name=$(basename $source) | |
mv -v "$tmpwem" "${name%%.*}_${tmpwem}" | |
done | |
cd - | |
} | |
for ((i=0; i < ${#sources[@]}; i++)); do | |
mkdir -p ${i} | |
mkdir tmp | |
extract_tw3_soundcache "${base_path}/${sources[$i]}" ${i} | |
for src in ${i}/*.bnk; do | |
extract_bnk "$(pwd)/$src" "tmp" | |
mv -v tmp/*.wem ${i} | |
if ${clean}; then | |
rm -v "$src" | |
fi | |
done | |
for src in ${i}/*.wem; do | |
source_dir=$(dirname "$src") | |
target_dir="${source_dir}/ogg" | |
extract_wem "$src" "${target_dir}" | |
if ${clean}; then | |
rm -v "$src" | |
fi | |
done | |
rmdir -v tmp | |
done |
@chris246: Yes, the \The Witcher 3\content\content0\bundles\xml.bundle contains the old soundbanksinfo.xml
The updated one including BaW mappings can be found here: \The Witcher 3\content\patch1\bundles\patch.bundle
Is there a difference between the GOG and Steam version? @shmerl
@chris246 @duracotton @sirwindfield: sorry, missed your comments because Github doesn't notify about them. Thanks for the heads up about the updated xml source for titles. I'll take a look and update the notes in the script.
Regarding differences with Steam, I didn't compare, since I only have GOG version. Thus the script name.
@duracotton: I just checked, and I actually don't have content\patch1\bundles\patch.bundle
at all. May be latest version combines them all in content/content0/bundles/xml.bundle
properly?
It seems as if <game_dir>/content/content0/bundles/xml.bundle does not contain mappings for Blood and Wine.
Does anybody know where to find those?