#!/bin/bash # This patcher is NOT OFFICIAL AND DOES NOT COME WITH ANY WARRANTY. echo echo ==================================== echo Riibalanced ISO Patcher echo ==================================== echo # check for riibalanced files --------------------------------------------------- if [[ ! -d "./V5/" ]]; then echo "ERROR: The Riibalanced patch files do not exist. Please download the zip file from the Riibalanced Discord, and extract the contents so that the folder 'V5' is in the same directory as 'patch_iso.sh'" echo echo "Like this:" echo "/your/current/directory" echo "├── patch_iso.sh └── V5    ├── Mario Kart Riibalanced V5.cover.png    ├── Mario Kart Riibalanced V5.json    ├── Mario Kart Riibalanced V5.png    ├── readme.txt    ├── Riibalanced    ├── Riibalanced Extras    └── riivolution " exit 3; fi # check if correct programs are installed --------------------------------------- # curl ------ type curl ERROR="$?" if [[ ERROR -ne 0 ]]; then echo echo "You must install 'curl' in order for this script to work correctly." if [[ "$OSTYPE" == "darwin"* ]]; then echo "Try running 'xcode-select --install'." else echo "Please consult your system's package manager." fi exit 0 fi # wit ------- type wit ERROR="$?" echo if [[ ERROR -ne 0 ]]; then echo "In order for the patcher to work, Wiimm's ISO Tools (https://wit.wiimm.de/) must be installed. By answering yes, you allow this script to download and install the software. Don't worry! This is completely safe. This program is developed by the same person who created Wiimmfi. The patcher cannot continue if wit is not installed." printf "Would you like to install wit? [y/n] " while read -r key; do case $key in n) echo "ERROR: Without wit, the patcher cannot continue."; exit 1 ;; y) break ;; esac printf "Would you like to install wit? [y/n] " done arch=$(uname -m) if [[ "$OSTYPE" == "linux"* ]]; then if [[ $arch == x86_64* ]]; then curl https://wit.wiimm.de/download/wit-v3.04a-r8427-x86_64.tar.gz > wit.tar.gz elif [[ $arch == i*86 ]]; then curl https://wit.wiimm.de/download/wit-v3.04a-r8427-i386.tar.gz > wit.tar.gz else echo "ERROR: Your system's architecture ($arch) does not support Wiimm's ISO Tools. Please refer to wit's website for more information on how to install the tools. https://wit.wiimm.de/" fi elif [[ "$OSTYPE" == "darwin"* ]]; then curl https://wit.wiimm.de/download/wit-v3.04a-r8427-mac.tar.gz > wit.tar.gz elif [[ "$OSTYPE" == "cygwin" ]]; then if [[ $arch == x86_64* ]]; then curl https://wit.wiimm.de/download/wit-v3.04a-r8427-cygwin64.zip > wit.zip elif [[ $arch == i*86 ]]; then curl https://wit.wiimm.de/download/wit-v3.04a-r8427-cygwin32.zip > wit.zip else echo "ERROR: Your system's architecture ($arch) does not support Wiimm's ISO Tools. Please refer to wit's website for more information on how to install the tools. https://wit.wiimm.de/" fi export CYGWIN='yes' else echo "Riibalanced Patcher: Your operating system ($OSTYPE) does not support Wiimm's ISO Tools. Please refer to wit's website for more information on how to install the tools. https://wit.wiimm.de/" exit 2; fi if [[ $CYGWIN ]]; then powershell -command "Expand-Archive -Force .\wit.zip ." cd wit-v*/ if [[ $(id -u) == 197108 ]]; then ./windows-install.exe else echo "ERROR: Please run Cygwin as Administrator to install wit." exit 9 fi else tar -xvf wit.tar.gz cd wit-v*/ if [[ $(id -u) == 0 ]]; then chown Administrator:None . ./install.sh export PATH="$PATH:/cygdrive/c/Program Files/Wiimm/WIT:/cygdrive/c/Program Files (x86)/Wiimm/WIT" else echo "You will now be prompted to enter your password for sudo in order for wit to install." sudo ./install.sh fi fi cd .. rm -rf wit-v*/ # check if wit is installed now type wit ERROR="$?" echo if [[ ERROR -ne 0 ]]; then echo "ERROR: wit still does not seem to be installed. Try running 'sudo ./patch_iso.sh' or use another privledge escalator and make sure that '/usr/local/bin' is on your PATH by running 'echo \$PATH'." exit 4 fi fi # check for cygwin -------------------------------------------------------------- if [[ "$OSTYPE" == "cygwin" ]]; then export CYGWIN='yes' fi # check for image --------------------------------------------------------------- if [[ ! $1 ]]; then echo "ERROR: Please start this script with the path to the Mario Kart Wii ISO image to start the patch." echo "example: ./patch_iso.sh image/RMCE01.wbfs" exit 7 fi # check if image exists --------------------------------------------------------- if [[ ! -f "$1" ]]; then echo "ERROR: The file specified does not exist." exit 8 fi # check for previous image extraction ------------------------------------------- if [[ -d "./RMCE01/" ]]; then echo "The output directory for the image extraction exists (./RMCE01) and will be DELETED to get a fresh extraction." echo "Press [ENTER] to DELETE this directory and patch the image. Otherwise, press ^C now." read rm -rf ./RMCE01 fi # start extract ----------------------------------------------------------------- if [[ $CYGWIN ]]; then cmd /C "wit extract $1 RMCE01\DATA" ERROR="$?" else wit extract $1 RMCE01 ERROR="$?" fi if [[ ERROR -ne 0 ]]; then echo "ERROR: wit has returned non-zero exit code $ERROR. Please check that your disc image is authentic and valid." exit $ERROR fi # start patch ------------------------------------------------------------------- echo "Extraction seems to be complete. Patching..." #set -x cp V5/Riibalanced/Core/StaticRU.rel RMCE01/DATA/files/rel/StaticR.rel cp V5/Riibalanced/Core/MainU.dol RMCE01/DATA/sys/main.dol cp V5/Riibalanced/Tracks/* RMCE01/DATA/files/Race/Course/ cp V5/Riibalanced/Textures/* RMCE01/DATA/files/Race/Kart/ cp V5/Riibalanced/Menus/* RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Award.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Event.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Font.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Globe.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Present.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Race.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/Title.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/MenuMulti.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/MenuOther.szs RMCE01/DATA/files/Scene/UI/ #cp V5/Riibalanced/Menus/MenuSingle.szs RMCE01/DATA/files/Scene/UI/ #music folder skipped to copy manually cp V5/Riibalanced/Ghosts/ghost1_* RMCE01/DATA/files/Race/TimeAttack/ghost1/ cp V5/Riibalanced/Ghosts/ghost2_* RMCE01/DATA/files/Race/TimeAttack/ghost2/ cp V5/Riibalanced/Music/RKart/revo_kart.brsar RMCE01/DATA/files/sound/revo_kart.brsar cp V5/Riibalanced/Core/Common.szs RMCE01/DATA/files/Race/Common.szs #skipping trailer thp since its identical #there are no remaining thps in the menus folder #using menusingle inside the menu folder for now since it doesnt exist in the languages folder #cp V5/Riibalanced/Menus/MenuSingle.szs RMCE01/DATA/files/Scene/UI/ cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_E.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_I.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_F.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_G.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_S.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_J.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_K.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_U.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_M.szs cp V5/Riibalanced/Languages/Title_E.szs RMCE01/DATA/files/Scene/UI/Title_Q.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_E.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_I.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_F.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_G.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_S.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_U.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_M.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_J.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_K.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Race_Q.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_E.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_I.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_F.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_G.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_S.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_U.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_M.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_J.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_K.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/Globe_Q.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_E.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_I.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_F.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_G.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_S.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_U.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_M.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_J.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_K.szs cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuMulti_Q.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_E.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_I.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_F.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_G.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_S.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_U.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_M.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_J.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_K.szs #cp V5/Riibalanced/Languages/Race_E.szs RMCE01/DATA/files/Scene/UI/MenuSingle_Q.szs #Copy all the music here cp V5/Riibalanced/Music/n_block_F.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/n_block_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/n_circuit32_f.brstm RMCE01/DATA/files/sound/strm/n_Circuit32_f.brstm cp V5/Riibalanced/Music/n_circuit32_n.brstm RMCE01/DATA/files/sound/strm/n_Circuit32_n.brstm cp V5/Riibalanced/Music/n_daisy32_f.brstm RMCE01/DATA/files/sound/strm/n_Daisy32_f.brstm cp V5/Riibalanced/Music/n_daisy32_n.brstm RMCE01/DATA/files/sound/strm/n_Daisy32_n.brstm cp V5/Riibalanced/Music/n_farm_f.brstm RMCE01/DATA/files/sound/strm/n_Farm_F.brstm cp V5/Riibalanced/Music/n_farm_n.brstm RMCE01/DATA/files/sound/strm/n_Farm_n.brstm cp V5/Riibalanced/Music/n_kinoko_f.brstm RMCE01/DATA/files/sound/strm/n_Kinoko_F.brstm cp V5/Riibalanced/Music/n_kinoko_n.brstm RMCE01/DATA/files/sound/strm/n_Kinoko_n.brstm cp V5/Riibalanced/Music/n_maple_f.brstm RMCE01/DATA/files/sound/strm/n_maple_F.brstm cp V5/Riibalanced/Music/n_maple_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/n_rainbow32_f.brstm RMCE01/DATA/files/sound/strm/n_Rainbow32_f.brstm cp V5/Riibalanced/Music/n_rainbow32_n.brstm RMCE01/DATA/files/sound/strm/n_Rainbow32_n.brstm cp V5/Riibalanced/Music/n_shopping32_f.brstm RMCE01/DATA/files/sound/strm/n_Shopping32_f.brstm cp V5/Riibalanced/Music/n_shopping32_n.brstm RMCE01/DATA/files/sound/strm/n_Shopping32_n.brstm cp V5/Riibalanced/Music/n_skate_F.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/n_skate_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/n_snowboard32_f.brstm RMCE01/DATA/files/sound/strm/n_Snowboard32_F.brstm cp V5/Riibalanced/Music/n_snowboard32_n.brstm RMCE01/DATA/files/sound/strm/n_Snowboard32_n.brstm cp V5/Riibalanced/Music/r_64_battle_F.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_64_battle_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_64_jungle32_f.brstm RMCE01/DATA/files/sound/strm/r_64_Jungle32_f.brstm cp V5/Riibalanced/Music/r_64_kuppa32_f.brstm RMCE01/DATA/files/sound/strm/r_64_Kuppa32_f.brstm cp V5/Riibalanced/Music/r_64_kuppa32_n.brstm RMCE01/DATA/files/sound/strm/r_64_Kuppa32_n.brstm cp V5/Riibalanced/Music/r_64_sherbet32_f.brstm RMCE01/DATA/files/sound/strm/r_64_Sherbet32_f.brstm cp V5/Riibalanced/Music/r_64_sherbet32_n.brstm RMCE01/DATA/files/sound/strm/r_64_Sherbet32_n.brstm cp V5/Riibalanced/Music/r_agb_battle_F.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_agb_battle_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_agb_kuppa32_f.brstm RMCE01/DATA/files/sound/strm/r_AGB_Kuppa32_f.brstm cp V5/Riibalanced/Music/r_agb_kuppa32_n.brstm RMCE01/DATA/files/sound/strm/r_AGB_Kuppa32_n.brstm cp V5/Riibalanced/Music/r_DS_battle_F.brstm RMCE01/DATA/files/sound/strm/r_ds_battle_F.brstm cp V5/Riibalanced/Music/r_DS_battle_n.brstm RMCE01/DATA/files/sound/strm/r_ds_battle_n.brstm cp V5/Riibalanced/Music/r_ds_desert32_f.brstm RMCE01/DATA/files/sound/strm/r_DS_Desert32_f.brstm cp V5/Riibalanced/Music/r_ds_desert32_n.brstm RMCE01/DATA/files/sound/strm/r_DS_Desert32_n.brstm cp V5/Riibalanced/Music/r_ds_garden32_f.brstm RMCE01/DATA/files/sound/strm/r_DS_Garden32_f.brstm cp V5/Riibalanced/Music/r_ds_garden32_n.brstm RMCE01/DATA/files/sound/strm/r_DS_Garden32_n.brstm cp V5/Riibalanced/Music/r_ds_jungle32_f.brstm RMCE01/DATA/files/sound/strm/r_DS_Jungle32_f.brstm cp V5/Riibalanced/Music/r_ds_jungle32_n.brstm RMCE01/DATA/files/sound/strm/r_DS_Jungle32_n.brstm cp V5/Riibalanced/Music/r_ds_town32_f.brstm RMCE01/DATA/files/sound/strm/r_DS_Town32_f.brstm cp V5/Riibalanced/Music/r_ds_town32_n.brstm RMCE01/DATA/files/sound/strm/r_DS_Town32_n.brstm cp V5/Riibalanced/Music/r_GC_Battle32_F.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_GC_Battle32_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_gc_beach32_f.brstm RMCE01/DATA/files/sound/strm/r_GC_Beach32_f.brstm cp V5/Riibalanced/Music/r_gc_beach32_n.brstm RMCE01/DATA/files/sound/strm/r_GC_Beach32_n.brstm cp V5/Riibalanced/Music/r_gc_mountain32_f.brstm RMCE01/DATA/files/sound/strm/r_GC_Mountain32_f.brstm cp V5/Riibalanced/Music/r_gc_mountain32_n.brstm RMCE01/DATA/files/sound/strm/r_GC_Mountain32_n.brstm cp V5/Riibalanced/Music/r_gc_stadium32_f.brstm RMCE01/DATA/files/sound/strm/r_GC_Stadium32_f.brstm cp V5/Riibalanced/Music/r_gc_stadium32_n.brstm RMCE01/DATA/files/sound/strm/r_GC_Stadium32_n.brstm cp V5/Riibalanced/Music/r_sfc_battle_F.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_sfc_battle_n.brstm RMCE01/DATA/files/sound/strm/ cp V5/Riibalanced/Music/r_sfc_circuit32_f.brstm RMCE01/DATA/files/sound/strm/r_SFC_Circuit32_f.brstm cp V5/Riibalanced/Music/r_sfc_circuit32_n.brstm RMCE01/DATA/files/sound/strm/r_SFC_Circuit32_n.brstm cp V5/Riibalanced/Music/r_sfc_obake32_f.brstm RMCE01/DATA/files/sound/strm/r_SFC_Obake32_f.brstm cp V5/Riibalanced/Music/r_sfc_obake32_n.brstm RMCE01/DATA/files/sound/strm/r_SFC_Obake32_n.brstm cp V5/Riibalanced/Music/STRM_N_FACTORY_N.brstm RMCE01/DATA/files/sound/strm/ #set +x echo echo "Patch complete. wit will now compile the resulting disc image." # overwrite check --------------------------------------------------------------- if [[ -f "./riibalanced.wbfs" ]]; then echo "The file 'riibalanced.wbfs' exists in this directory." printf "Would you like to overwrite this file? Answering 'n' will move the file to 'riibalanced.wbfs.old' before continuing. [y/n] " while read -r key; do case $key in n) mv riibalanced.wbfs riibalanced.wbfs.old ; echo "Moved 'riibalanced.wbfs' to 'riibalanced.wbfs.old'"; break ;; y) rm riibalanced.wbfs ; break ;; esac printf "\n" printf "Would you like to overwrite this file? Answering 'n' will move the file to 'riibalanced.wbfs.old' before continuing. [y/n] " done fi # build ------------------------------------------------------------------------- if [[ $CYGWIN ]]; then cmd /C wit mix RMCE01\ -B --dest riibalanced.wbfs cmd /C wit edit riibalanced.wbfs --name MarioKartRiibalanced else wit mix RMCE01/ -B --dest riibalanced.wbfs wit edit riibalanced.wbfs --name MarioKartRiibalanced fi rm -rf RMCE01/ echo "The patch is now complete. The resulting file is 'riibalanced.wbfs'. Enjoy!"