mirror of
https://github.com/dragoonDorise/EmuDeck.git
synced 2025-05-05 16:02:48 +00:00
* new paths * / * EmuDeck/ * mv * no & * ESDE new location * ESDE new path * no symlink load * bigpemu new path * force move * global vars * oopsie * missing $emudeckBackend * better migration detection * Keep Appimages in Applications * Keep Appimages in Applications
386 lines
12 KiB
Bash
386 lines
12 KiB
Bash
#!/bin/bash
|
|
|
|
#variables
|
|
suyu_emuName="suyu"
|
|
suyu_emuType="$emuDeckEmuTypeAppImage"
|
|
suyu_emuPath="$emusFolder/suyu.AppImage"
|
|
|
|
suyu_configFile="$HOME/.config/suyu/qt-config.ini"
|
|
|
|
declare -A suyu_languages
|
|
suyu_languages=(
|
|
["ja"]=0
|
|
["en"]=1
|
|
["fr"]=2
|
|
["de"]=3
|
|
["it"]=4
|
|
["es"]=5
|
|
["zh"]=6
|
|
["ko"]=7
|
|
["nl"]=8
|
|
["pt"]=9
|
|
["ru"]=10
|
|
["tw"]=11) # TODO: not all langs but we need to switch to full lang codes to support those
|
|
|
|
# https://github.com/suyu-emu/suyu/blob/master/src/suyu/configuration/configure_system.ui#L272-L309
|
|
declare -A suyu_regions
|
|
suyu_regions=(
|
|
["ja"]=0 # Japan
|
|
["en"]=1 # USA
|
|
["fr"]=2 # Europe
|
|
["de"]=2 # Europe
|
|
["it"]=2 # Europe
|
|
["es"]=2 # Europe
|
|
["zh"]=4 # China
|
|
["ko"]=5 # Korea
|
|
["nl"]=2 # Europe
|
|
["pt"]=2 # Europe
|
|
["ru"]=2 # Europe?
|
|
["tw"]=6 # Taiwan
|
|
) # TODO: split lang from region?
|
|
|
|
#cleanupOlderThings
|
|
|
|
|
|
#Install
|
|
suyu_install() {
|
|
echo "Begin suyu Install"
|
|
|
|
local showProgress=$1
|
|
local success="false"
|
|
if installEmuAI "$suyu_emuName" "https://gitlab.com/suyu-emu/suyu-releases/-/raw/master/v0.0.2-master/suyu-mainline--.AppImage" "suyu" "$showProgress"; then
|
|
success="true"
|
|
fi
|
|
|
|
if [ "$success" != "true" ]; then
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
#ApplyInitialSettings
|
|
suyu_init() {
|
|
echo "Begin suyu Init"
|
|
|
|
cp "$emudeckBackend/tools/launchers/suyu.sh" "$toolsPath/launchers/suyu.sh"
|
|
chmod +x "$toolsPath/launchers/suyu.sh"
|
|
mkdir -p "$HOME/.config/suyu"
|
|
mkdir -p "$HOME/.local/share/suyu"
|
|
rsync -avhp "$emudeckBackend/configs/org.suyu_emu.suyu/config/suyu/." "$HOME/.config/suyu"
|
|
rsync -avhp "$emudeckBackend/configs/org.suyu_emu.suyu/data/suyu/." "$HOME/.local/share/suyu"
|
|
suyu_migrate
|
|
configEmuAI "$suyu_emuName" "config" "$HOME/.config/suyu" "$emudeckBackend/configs/org.suyu_emu.suyu/config/suyu" "true"
|
|
configEmuAI "$suyu_emuName" "data" "$HOME/.local/share/suyu" "$emudeckBackend/configs/org.suyu_emu.suyu/data/suyu" "true"
|
|
|
|
suyu_setEmulationFolder
|
|
suyu_setupStorage
|
|
suyu_setupSaves
|
|
suyu_finalize
|
|
#SRM_createParsers
|
|
suyu_flushEmulatorLauncher
|
|
createDesktopShortcut "$HOME/.local/share/applications/suyu.desktop" \
|
|
"suyu (AppImage)" \
|
|
"${toolsPath}/launchers/suyu.sh" \
|
|
"False"
|
|
|
|
if [ -e "$ESDE_toolPath" ]; then
|
|
suyu_addESConfig
|
|
else
|
|
echo "ES-DE not found. Skipped adding custom system."
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
#update
|
|
suyu_update() {
|
|
echo "Begin suyu update"
|
|
|
|
suyu_migrate
|
|
|
|
configEmuAI "$suyu_emuName" "config" "$HOME/.config/suyu" "$emudeckBackend/configs/org.suyu_emu.suyu/config/suyu"
|
|
configEmuAI "$suyu_emuName" "data" "$HOME/.local/share/suyu" "$emudeckBackend/configs/org.suyu_emu.suyu/data/suyu"
|
|
|
|
suyu_setEmulationFolder
|
|
suyu_setupStorage
|
|
suyu_setupSaves
|
|
suyu_finalize
|
|
suyu_flushEmulatorLauncher
|
|
}
|
|
|
|
#ConfigurePaths
|
|
suyu_setEmulationFolder() {
|
|
echo "Begin suyu Path Config"
|
|
|
|
screenshotDirOpt='Screenshots\\screenshot_path='
|
|
gameDirOpt='Paths\\gamedirs\\4\\path='
|
|
dumpDirOpt='dump_directory='
|
|
loadDir='load_directory='
|
|
nandDirOpt='nand_directory='
|
|
sdmcDirOpt='sdmc_directory='
|
|
tasDirOpt='tas_directory='
|
|
newScreenshotDirOpt='Screenshots\\screenshot_path='"${storagePath}/suyu/screenshots"
|
|
newGameDirOpt='Paths\\gamedirs\\4\\path='"${romsPath}/switch"
|
|
newDumpDirOpt='dump_directory='"${storagePath}/suyu/dump"
|
|
newLoadDir='load_directory='"${storagePath}/suyu/load"
|
|
newNandDirOpt='nand_directory='"${storagePath}/suyu/nand"
|
|
newSdmcDirOpt='sdmc_directory='"${storagePath}/suyu/sdmc"
|
|
newTasDirOpt='tas_directory='"${storagePath}/suyu/tas"
|
|
|
|
sed -i "/${screenshotDirOpt}/c\\${newScreenshotDirOpt}" "$suyu_configFile"
|
|
sed -i "/${gameDirOpt}/c\\${newGameDirOpt}" "$suyu_configFile"
|
|
sed -i "/${dumpDirOpt}/c\\${newDumpDirOpt}" "$suyu_configFile"
|
|
sed -i "/${loadDir}/c\\${newLoadDir}" "$suyu_configFile"
|
|
sed -i "/${nandDirOpt}/c\\${newNandDirOpt}" "$suyu_configFile"
|
|
sed -i "/${sdmcDirOpt}/c\\${newSdmcDirOpt}" "$suyu_configFile"
|
|
sed -i "/${tasDirOpt}/c\\${newTasDirOpt}" "$suyu_configFile"
|
|
|
|
#Setup Bios symlinks
|
|
unlink "${biosPath}/suyu/keys" 2>/dev/null
|
|
unlink "${biosPath}/suyu/firmware" 2>/dev/null
|
|
mkdir -p ${biosPath}/suyu
|
|
mkdir -p "$HOME/.local/share/suyu/keys/"
|
|
mkdir -p "${storagePath}/suyu/nand/system/Contents/registered/"
|
|
|
|
ln -sn "$HOME/.local/share/suyu/keys/" "${biosPath}/suyu/keys"
|
|
ln -sn "${storagePath}/suyu/nand/system/Contents/registered/" "${biosPath}/suyu/firmware"
|
|
|
|
touch "${storagePath}/suyu/nand/system/Contents/registered/putfirmwarehere.txt"
|
|
|
|
}
|
|
|
|
#SetLanguage
|
|
suyu_setLanguage(){
|
|
setMSG "Setting suyu Language"
|
|
|
|
languageOpt="language_index="
|
|
languageDefaultOpt="language_index\\\\default="
|
|
newLanguageDefaultOpt="language_index\\\\default=false" # we need those or else itll reset
|
|
regionOpt="region_index="
|
|
regionDefaultOpt="region_index\\\\default="
|
|
newRegionDefaultOpt="region_index\\\\default=false"
|
|
#TODO: call this somewhere, and input the $language from somewhere (args?)
|
|
if [[ -f "${suyu_configFile}" ]]; then
|
|
if [ ${suyu_languages[$language]+_} ]; then
|
|
newLanguageOpt='language_index='"${suyu_languages[$language]}"
|
|
newRegionOpt='region_index='"${suyu_regions[$language]}"
|
|
changeLine "$languageOpt" "$newLanguageOpt" "$suyu_configFile"
|
|
changeLine "$languageDefaultOpt" "$newLanguageDefaultOpt" "$suyu_configFile"
|
|
changeLine "$regionOpt" "$newRegionOpt" "$suyu_configFile"
|
|
changeLine "$regionDefaultOpt" "$newRegionDefaultOpt" "$suyu_configFile"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
#SetupSaves
|
|
suyu_setupSaves() {
|
|
echo "Begin suyu save link"
|
|
unlink "${savesPath}/suyu/saves" 2>/dev/null # Fix for previous bad symlink2>/dev/null
|
|
linkToSaveFolder suyu saves "${storagePath}/suyu/nand/user/save/"
|
|
linkToSaveFolder suyu profiles "${storagePath}/suyu/nand/system/save/8000000000000010/su/avators/"
|
|
}
|
|
|
|
#SetupStorage
|
|
suyu_setupStorage() {
|
|
echo "Begin suyu storage config"
|
|
mkdir -p "${storagePath}/suyu/dump"
|
|
mkdir -p "${storagePath}/suyu/load"
|
|
mkdir -p "${storagePath}/suyu/sdmc"
|
|
mkdir -p "${storagePath}/suyu/nand"
|
|
mkdir -p "${storagePath}/suyu/screenshots"
|
|
mkdir -p "${storagePath}/suyu/tas"
|
|
#Symlink to saves for CloudSync
|
|
ln -sn "${storagePath}/suyu/nand/system/save/8000000000000010/su/avators/" "${savesPath}/suyu/profiles"
|
|
}
|
|
|
|
#WipeSettings
|
|
suyu_wipe() {
|
|
echo "Begin suyu delete config directories"
|
|
rm -rf "$HOME/.config/suyu"
|
|
rm -rf "$HOME/.local/share/suyu"
|
|
}
|
|
|
|
#Uninstall
|
|
suyu_uninstall() {
|
|
echo "Begin suyu uninstall"
|
|
rm -rf "$suyu_emuPath"
|
|
suyuEA_uninstall
|
|
}
|
|
|
|
|
|
#Migrate
|
|
suyu_migrate() {
|
|
echo "Begin suyu Migration"
|
|
migrationFlag="$emudeckFolder/.${suyu_emuName}MigrationCompleted"
|
|
#check if we have a nomigrateflag for $emu
|
|
if [ ! -f "$migrationFlag" ]; then
|
|
#suyu flatpak to appimage
|
|
#From -- > to
|
|
migrationTable=()
|
|
migrationTable+=("$HOME/.var/app/org.suyu_emu.suyu/data/suyu" "$HOME/.local/share/suyu")
|
|
migrationTable+=("$HOME/.var/app/org.suyu_emu.suyu/config/suyu" "$HOME/.config/suyu")
|
|
|
|
# migrateAndLinkConfig "$emu" "$migrationTable"
|
|
touch "${migrationFlag}"
|
|
fi
|
|
|
|
#move data from hidden folders out to these folders in case the user already put stuff here.
|
|
origPath="$HOME/.local/share/"
|
|
|
|
suyu_setupStorage
|
|
|
|
rsync -av "${origPath}suyu/dump" "${storagePath}/suyu/" && rm -rf "${origPath}suyu/dump"
|
|
rsync -av "${origPath}suyu/load" "${storagePath}/suyu/" && rm -rf "${origPath}suyu/load"
|
|
rsync -av "${origPath}suyu/sdmc" "${storagePath}/suyu/" && rm -rf "${origPath}suyu/sdmc"
|
|
rsync -av "${origPath}suyu/nand" "${storagePath}/suyu/" && rm -rf "${origPath}suyu/nand"
|
|
rsync -av "${origPath}suyu/screenshots" "${storagePath}/suyu/" && rm -rf "${origPath}suyu/screenshots"
|
|
rsync -av "${origPath}suyu/tas" "${storagePath}/suyu/" && rm -rf "${origPath}suyu/tas"
|
|
}
|
|
|
|
#setABXYstyle
|
|
suyu_setABXYstyle() {
|
|
echo "NYI"
|
|
}
|
|
|
|
#WideScreenOn
|
|
suyu_wideScreenOn() {
|
|
echo "NYI"
|
|
}
|
|
|
|
#WideScreenOff
|
|
suyu_wideScreenOff() {
|
|
echo "NYI"
|
|
}
|
|
|
|
#BezelOn
|
|
suyu_bezelOn() {
|
|
echo "NYI"
|
|
}
|
|
|
|
#BezelOff
|
|
suyu_bezelOff() {
|
|
echo "NYI"
|
|
}
|
|
|
|
#finalExec - Extra stuff
|
|
suyu_finalize() {
|
|
echo "Begin suyu finalize"
|
|
}
|
|
|
|
suyu_IsInstalled() {
|
|
if [ -e "$suyu_emuPath" ]; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
}
|
|
|
|
|
|
suyu_resetConfig() {
|
|
suyu_init &>/dev/null && echo "true" || echo "false"
|
|
}
|
|
|
|
|
|
|
|
|
|
### suyu EA
|
|
|
|
suyuEA_install() {
|
|
local jwtHost="https://api.suyu-emu.org/jwt/installer/"
|
|
local suyuEaHost="https://api.suyu-emu.org/downloads/earlyaccess/"
|
|
local suyuEaMetadata=$(curl -fSs ${suyuEaHost})
|
|
local fileToDownload=$(echo "$suyuEaMetadata" | jq -r '.files[] | select(.name|test(".*.AppImage")).url')
|
|
local currentVer=$(echo "$suyuEaMetadata" | jq -r '.files[] | select(.name|test(".*.AppImage")).name')
|
|
local tokenValue="$1"
|
|
local showProgress="$2"
|
|
local user
|
|
local auth
|
|
|
|
read -r user auth <<<"$(echo "$tokenValue"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode| awk -F":" '{print $1" "$2}')" || echo "invalid"
|
|
|
|
#echo "get bearer token"
|
|
BEARERTOKEN=$(curl -X POST ${jwtHost} -H "X-Username: ${user}" -H "X-Token: ${auth}" -H "User-Agent: EmuDeck")
|
|
|
|
#echo "download ea appimage"
|
|
|
|
if safeDownload "suyu-ea" "$fileToDownload" "${suyuEA_emuPath}" "$showProgress" "Authorization: Bearer ${BEARERTOKEN}"; then
|
|
chmod +x "$suyuEA_emuPath"
|
|
|
|
cp -v "$emudeckBackend/tools/launchers/suyu.sh" "${toolsPath}/launchers/" &>/dev/null
|
|
chmod +x "${toolsPath}/launchers/suyu.sh"
|
|
echo "true"
|
|
return 0
|
|
else
|
|
echo "fail"
|
|
return 1
|
|
fi
|
|
|
|
}
|
|
|
|
suyuEA_addToken(){
|
|
local tokenValue=$1
|
|
local user=""
|
|
local auth=""
|
|
|
|
read -r user auth <<<"$(echo "$tokenValue"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode| awk -F":" '{print $1" "$2}')" && suyuEA_install "$tokenValue" || echo "invalid"
|
|
}
|
|
|
|
|
|
suyuEA_IsInstalled() {
|
|
if [ -e "$suyuEA_emuPath" ]; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
}
|
|
|
|
|
|
suyuEA_uninstall() {
|
|
echo "Begin suyu EA uninstall"
|
|
rm -rf "$suyuEA_emuPath"
|
|
}
|
|
|
|
suyu_setResolution(){
|
|
|
|
case $suyuResolution in
|
|
"720P") multiplier=2; docked="false";;
|
|
"1080P") multiplier=2; docked="true";;
|
|
"1440P") multiplier=3; docked="false";;
|
|
"4K") multiplier=3; docked="true";;
|
|
*) echo "Error"; return 1;;
|
|
esac
|
|
|
|
RetroArch_setConfigOverride "resolution_setup" $multiplier "$suyu_configFile"
|
|
RetroArch_setConfigOverride "use_docked_mode" $docked "$suyu_configFile"
|
|
}
|
|
|
|
suyu_flushEmulatorLauncher(){
|
|
|
|
|
|
flushEmulatorLaunchers "suyu"
|
|
|
|
}
|
|
|
|
suyu_addESConfig(){
|
|
if [[ $(grep -rnw "$es_systemsFile" -e 'switch') == "" ]]; then
|
|
xmlstarlet ed -S --inplace --subnode '/systemList' --type elem --name 'system' \
|
|
--var newSystem '$prev' \
|
|
--subnode '$newSystem' --type elem --name 'name' -v 'switch' \
|
|
--subnode '$newSystem' --type elem --name 'fullname' -v 'Nintendo Switch' \
|
|
--subnode '$newSystem' --type elem --name 'path' -v '%ROMPATH%/switch' \
|
|
--subnode '$newSystem' --type elem --name 'extension' -v '.nca .NCA .nro .NRO .nso .NSO .nsp .NSP .xci .XCI' \
|
|
--subnode '$newSystem' --type elem --name 'commandB' -v "%EMULATOR_RYUJINX% %ROM%" \
|
|
--insert '$newSystem/commandB' --type attr --name 'label' --value "Ryujinx (Standalone)" \
|
|
--subnode '$newSystem' --type elem --name 'commandV' -v "%INJECT%=%BASENAME%.esprefix %EMULATOR_YUZU% -f -g %ROM%" \
|
|
--insert '$newSystem/commandV' --type attr --name 'label' --value "suyu (Standalone)" \
|
|
--subnode '$newSystem' --type elem --name 'platform' -v 'switch' \
|
|
--subnode '$newSystem' --type elem --name 'theme' -v 'switch' \
|
|
-r 'systemList/system/commandB' -v 'command' \
|
|
-r 'systemList/system/commandV' -v 'command' \
|
|
"$es_systemsFile"
|
|
|
|
|
|
|
|
xmlstarlet fo "$es_systemsFile" > "$es_systemsFile".tmp && mv "$es_systemsFile".tmp "$es_systemsFile"
|
|
fi
|
|
#Custom Systems config end
|
|
} |