scripts/s3p_to_2dx

84 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
# Set the directory containing sound files
# This is usually ./sound if youre running the script out of the games data directory
SOUND_DIR="please-set-this"
# Extract .ifs file and descend into its directory
extract_ifs() {
local ifs_file="$1"
echo "Extracting $ifs_file..."
ifstools "$ifs_file" || { echo "Failed to extract $ifs_file"; return 1; }
local extracted_dir="${ifs_file%.*}_ifs"
[ -d "$extracted_dir" ] && cd "$extracted_dir" || { echo "Directory $extracted_dir not found"; return 1; }
}
# Repack .ifs file and move it output to parent directory
repack_to_ifs() {
local ifs_dir=
echo "Repacking $ifs_dir to $output_name..."
# Get the current working directory name
dir_name=$(basename "$OLDPWD")
# Remove the "_ifs" suffix from the directory name if it exists
output_name="${dir_name%_ifs}"
ifstools "$output_name" || { echo "Failed to repack $dir_name"; return 1; }
mv "$output_name".ifs ..
}
# Extract and convert .s3p files
extract_convert_s3p() {
local s3p_file="$1"
echo "Processing $s3p_file..."
s3p_extract "$s3p_file" || { echo "Failed to extract $s3p_file"; return 1; }
local s3p_out_dir="${s3p_file}.out"
[ -d "$s3p_out_dir" ] && cd "$s3p_out_dir" || { echo "Directory $s3p_out_dir not found"; return 1; }
for wma_file in *.wma; do
[ -e "$wma_file" ] || continue
echo "Converting $wma_file..."
ffmpeg -loglevel error -i "$wma_file" -acodec adpcm_ms -b:a 256k "${wma_file%.*}.wav" && rm -f "$wma_file" # Write to /dev/null instead maybe? ffmpeg is loud asf
done
}
# Repack .wav files into .2dx
repack_to_2dx() {
echo "Repacking files to .2dx format..."
# Get the current working directory name
dir_name=$(basename "$OLDPWD")
# Remove the ".out" suffix from the directory name if it exists
output_name="${dir_name%.out}"
2dxBuild "$output_name".2dx || { echo "Failed to repack files"; return 1; }
mv "$output_name".2dx ..
cd ..
rm -rf *s3p* # This is kinda risky but whatever lol
}
# Iterate through directories and .ifs in $SOUND_DIR
process_sound_files() {
if [ ! -d "$SOUND_DIR" ]; then
echo "Directory $SOUND_DIR does not exist."
exit 1
fi
# Process directories for songs not contained in .ifs
for dir in "$SOUND_DIR"/*/; do
echo "Processing directory: $dir"
(cd "$dir" && extract_convert_s3p *.s3p && repack_to_2dx)
done
# Process .ifs files for songs contained in .ifs
for ifs_file in "$SOUND_DIR"/*.ifs; do
echo "Processing IFS file: $ifs_file"
(cd "$SOUND_DIR" && extract_ifs "$ifs_file" && extract_convert_s3p *.s3p && repack_to_2dx && repack_to_ifs)
done
}
# Execute the main function
process_sound_files