diff --git a/s3p_to_2dx.sh b/s3p_to_2dx.sh new file mode 100755 index 0000000..557f920 --- /dev/null +++ b/s3p_to_2dx.sh @@ -0,0 +1,83 @@ +#!/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