EmuDeck/tools/launchers/cemu.sh
rawdatafeel 1ed3b5757e Cemu: Hotfix Proton headaches
* Users keep selecting the Proton ver of Cemu in Steam ROM Manager and ES-DE, this increases support requests in the Cemu Discord (which they can't fix) and support requests in the EmuDeck Discord. This bandaid falls back to the AppImage if the EXE does not exist.
2024-06-28 18:03:09 -04:00

226 lines
No EOL
6.6 KiB
Bash
Executable file

#!/bin/bash
source $HOME/.config/EmuDeck/backend/functions/all.sh
emulatorInit "Cemu"
# cemu.sh
# Report Errors
reportError () {
echo "${1}"
if [ "${2}" == "true" ]; then
zenity --error \
--text="${1}" \
--width=250
fi
if [ "${3}" == "true" ]; then
exit 1
fi
}
# Check for file
checkFile () {
echo "Checking for file: ${1}"
if [ ! -f "${1}" ]; then
reportError "Error: Unable to find ${1##*/} in\n ${1%/*}" "true" "true"
fi
}
# Report all current arguments to the LOGFILE
showArguments () {
local arg
echo "Arguments -"
for arg; do
echo "Argument: $arg"
done
}
# Attempt to find the given program as an AppImage
getAppImage () {
local EMUDIR="${HOME}/Applications"
# Check for AppImage
local APPIMAGE
APPIMAGE="$( find "${EMUDIR}" -type f -iname "${NAME}*.AppImage" | sort -n | cut -d ' ' -f 2- | tail -n 1 2>/dev/null )"
# Check if APPIMAGE is unset or empty, and that the file exists
if [ -z ${APPIMAGE+x} ] || [ ! -f "${APPIMAGE}" ]; then
echo "Error: AppImage not found."
return 1
elif [ -f "${APPIMAGE}" ]; then
EMUPATH="${APPIMAGE}"
fi
}
# Attempt to find the given program as a Flatpak
getFlatpak () {
# Set Flatpak
local FLATPAK
FLATPAK="$( flatpak list --app --columns=application | grep -i "${NAME}" )"
if [ -z "${FLATPAK}" ]; then
echo "Error: Flatpak not found."
return 1
else
EMUPATH=("/usr/bin/flatpak" "run" "${FLATPAK}")
fi
}
# Main
main () {
source ~/emudeck/settings.sh
# NAME - Cemu
NAME="Cemu"
# EMUPATH
EMUPATH="false"
# doProton
doProton="false"
# Check for -W Flag override to windows version
if [ "$1" == "-w" ]; then
doProton="true"
shift
fi
# Check for an AppImage or Flatpak, and run through Proton if neither
echo "Checking for AppImage."
if ! getAppImage; then
echo "Checking for Flatpak."
if ! getFlatpak; then
echo "Attempting to run Cemu.exe through Proton."
doProton="true"
fi
fi
# Check for single quotes around the last argument
if [[ "${*:$#}" =~ ^\'.*\'$ ]]; then
ARGS=("${@}")
LASTARG="${ARGS[-1]#\'}"
ARGS[-1]="${LASTARG%\'}"
set -- "${ARGS[@]}"
fi
# Report arguments
showArguments "${@}"
# Run Emulator
if [[ "${doProton}" == "false" ]]; then
#If doProton is false, check that EMUPATH was set correctly
if [[ "${EMUPATH}" == "false" ]] || [[ -z "${EMUPATH}" ]]; then
echo "Error: Unable to emulator path."
reportError "Error: Unable to emulator path." "true" "true"
fi
# If doProton is false, check that EMUPATH is executable
if [ -f "${EMUPATH}" ] && [[ ! -x "${EMUPATH}" ]]; then
chmod +x "${EMUPATH}" || reportError "Error: ${EMUPATH} cannot be made executable" "true" "true"
fi
# Check for "z:" or "Z:" in the last argument and remove it
if [[ "${*:$#}" =~ ^[zZ]: ]]; then
ARGS=("${@}")
ARGS[-1]="${ARGS[-1]#[zZ]:}"
set -- "${ARGS[@]}"
fi
echo "${EMUPATH[@]}" "${@}"
"${EMUPATH[@]}" "${@}"
elif [[ "${doProton}" == "true" && ! -f "$emulationPath/roms/wiiu/Cemu.exe" ]]; then
# If user selects Proton parsers/Proton Cemu without having it installed, fall back to AppImage.
if [[ "${EMUPATH}" == "false" ]] || [[ -z "${EMUPATH}" ]]; then
echo "Error: Unable to emulator path."
reportError "Error: Unable to emulator path." "true" "true"
fi
# If doProton is false, check that EMUPATH is executable
if [ -f "${EMUPATH}" ] && [[ ! -x "${EMUPATH}" ]]; then
chmod +x "${EMUPATH}" || reportError "Error: ${EMUPATH} cannot be made executable" "true" "true"
fi
# Check for "z:" or "Z:" in the last argument and remove it
if [[ "${*:$#}" =~ ^[zZ]: ]]; then
ARGS=("${@}")
ARGS[-1]="${ARGS[-1]#[zZ]:}"
set -- "${ARGS[@]}"
fi
echo "${EMUPATH[@]}" "${@}"
"${EMUPATH[@]}" "${@}"
else
# Get SELFPATH
SELFPATH="$( realpath "${BASH_SOURCE[0]}" )"
if [ -z "${SELFPATH}" ]; then
reportError "Error: Unable to get own path" "true" "true"
else
echo "SELFPATH: ${SELFPATH}"
fi
# Set script CONFIG_FILE
CONFIG_FILE="${SELFPATH}.config"
# Get EXE
EXE="\"/usr/bin/bash\" \"${SELFPATH}\""
echo "EXE: ${EXE}"
# AppID.py
APPIDPY="$emulationPath/tools/appID.py"
checkFile "${APPIDPY}"
# Proton Launcher Script
PROTONLAUNCH="$emulationPath/tools/proton-launch.sh"
checkFile "${PROTONLAUNCH}"
# Cemu.exe location
CEMU="$emulationPath/roms/wiiu/Cemu.exe"
checkFile "${CEMU}"
# APPID
if [ -e "/usr/bin/python" ]; then
APPID=$( /usr/bin/python "${APPIDPY}" "${EXE}" "${NAME}" )
elif [ -e "/usr/bin/python3" ]; then
APPID=$( /usr/bin/python3 "${APPIDPY}" "${EXE}" "${NAME}" )
else
echo "Python not found."
fi
echo "APPID: ${APPID}"
if [ -z "${APPID}" ]; then
reportError "Unable to calculate AppID" "true" "true"
fi
# Proton Version:
# - use env FORCED_PROTON_VER if set (FORCED_PROTON_VER="GE-Proton8-16" ./xenia.sh)
# - if not set, try to use config file (xenia.sh.config, FORCED_PROTON_VER="GE-Proton8-16")
# - if stil not set, use default
DEFAULT_PROTON_VER="7.0"
if [[ -z "${FORCED_PROTON_VER}" ]]; then
FORCED_PROTON_VER="$(scriptConfigFileGetVar "$CONFIG_FILE" "FORCED_PROTON_VER")"
fi
if [[ -z "${FORCED_PROTON_VER}" ]]; then
PROTONVER="${DEFAULT_PROTON_VER}"
else
PROTONVER="${FORCED_PROTON_VER}"
fi
# Call the Proton launcher script and give the arguments
echo "${PROTONLAUNCH}" -p "${PROTONVER}" -i "${APPID}" -- "${CEMU}" "${@}"
"${PROTONLAUNCH}" -p "${PROTONVER}" -i "${APPID}" -- "${CEMU}" "${@}"
fi
}
# Only run if run directly
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
# Set a LOGFILE to proton-launch.log in the same directory this script runs from
# LogFile
LOGFILE="$( dirname "${BASH_SOURCE[0]}" )/cemu-launch.log"
# Report start time to log
echo "$( date +'%m/%d/%Y - %H:%M:%S' ) - Started" > "${LOGFILE}"
# All output should go to LOGFILE after here.
exec > >(tee "${LOGFILE}")
# Continue to main()
main "${@}"
fi
rm -rf "$savesPath/.gaming"