Files
dotFile/.local/bin/gameScript_osu-wine
2026-04-17 19:57:29 +02:00

359 lines
15 KiB
Bash
Executable File

#!/usr/bin/env bash
export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
export BINDIR="${BINDIR:-$HOME/.local/bin}"
## Welcome to your osu! launch script!
set -a
## Add your launch options to a file in $XDG_DATA_HOME/osuconfig/configs, likely ~/.local/share/osuconfig/configs
## You can look at the $XDG_DATA_HOME/osuconfig/configs/example.cfg for some common options (also on the git repo under 'stuff/').
## This example file won't be overwritten, but you can copy/rename it etc. as long as it ends in .cfg
## Variables are explained with comments, but if you just need to prepend
## any argument (like gamemoderun or mangohud) before osu!, use 'PRE_LAUNCH_ARGS'!
source "$XDG_DATA_HOME/osuconfig/configs/"*.cfg 2>/dev/null
set +a
###################################################################################################
# osu-winello internal variables, you probably don't have to touch these!
###################################################################################################
set -a
# Don't change this 'winello-default' file! It'll be overwritten on updates.
source "$XDG_DATA_HOME/osuconfig/update/stuff/winello-default.cfg"
set +a
export WINE="${WINE:-$XDG_DATA_HOME/osuconfig/yawl-winello}"
export WINESERVER="${WINESERVER:-${WINE}server}"
export WINEPREFIX="${WINEPREFIX:-$XDG_DATA_HOME/wineprefixes/osu-wineprefix}"
export WINE_INSTALL_PATH="${WINE_INSTALL_PATH:-$XDG_DATA_HOME/osuconfig/wine-osu}"
export WINETRICKS="${WINETRICKS:-$XDG_DATA_HOME/osuconfig/winetricks}"
export WINEDLLOVERRIDES="winemenubuilder.exe=;" # Blocks wine from creating .desktop files
LAUNCHERPATH="$(realpath "$0")"
export LAUNCHERPATH
# Make all paths visible to pressure-vessel
_mainscriptpath="$(realpath "$XDG_DATA_HOME/osuconfig/update/osu-winello.sh")"
_mountline="$(df -P "$_mainscriptpath" 2>/dev/null | tail -1)" && [ -n "${_mountline}" ] && _mainscript_mount="${_mountline##* }:" # mountpoint to main script path
_mountline="$(df -P "$LAUNCHERPATH" 2>/dev/null | tail -1)" && [ -n "${_mountline}" ] && _curdir_mount="${_mountline##* }:" # mountpoint to current directory
_mountline="$(df -P "$XDG_DATA_HOME" 2>/dev/null | tail -1)" && [ -n "${_mountline}" ] && _home_mount="${_mountline##* }:" # mountpoint to XDG_DATA_HOME
PRESSURE_VESSEL_FILESYSTEMS_RW+="${_mainscript_mount:-}${_curdir_mount:-}${_home_mount:-}/mnt:/media:/run/media"
[ -r "$XDG_DATA_HOME/osuconfig/osupath" ] && OSUPATH=$(</"$XDG_DATA_HOME/osuconfig/osupath") &&
PRESSURE_VESSEL_FILESYSTEMS_RW+=":$(realpath "$OSUPATH"):$(realpath "$OSUPATH"/Songs 2>/dev/null)" # mountpoint to osu/songs directory
export PRESSURE_VESSEL_FILESYSTEMS_RW="${PRESSURE_VESSEL_FILESYSTEMS_RW//\/:/:}" OSUPATH # clean any "just /" mounts, pressure-vessel doesn't like that
mapfile -t configs < <(find "$XDG_DATA_HOME/osuconfig/configs" -name '*.cfg')
###################################################################################################
# Helper functions for the launcher script
###################################################################################################
Help() {
Info "NOTE: Any command can be prefixed by the letter 'n' to avoid updating when running it
e.g. \`osu-wine n --fixprefix\` will run \`--fixprefix\` without overwriting any of your files from the osu-winello git repo
Script features:
osu-wine: Runs osu!
osu-wine --help: Show this help
osu-wine --info: Troubleshooting and more info
osu-wine --edit-config: Open your configuration file to edit launch arguments and other customizations
osu-wine --winecfg : Runs winecfg on the osu! Wineprefix
osu-wine --winetricks: Install packages on osu! Wineprefix
osu-wine --regedit: Opens regedit on osu! Wineprefix
osu-wine --wine <args>: Runs wine + your arguments as if it was normal wine
osu-wine --kill: Kills osu! and related processes in osu! Wineprefix
osu-wine --kill9: Kills osu! but with wineserver -k9
osu-wine --update: Updates wine-osu to the latest version
osu-wine --fixprefix: Reinstalls the osu! Wineprefix from system
osu-wine --fixfolders: Reconfigure osu-handler and native file integration (run this if osu!direct/.osz/.osk handling, or opening folders/.osu/.osb files from ingame is broken)
osu-wine --fix-yawl: Reinstalls files related to yawl and the Steam Runtime in case something went wrong
osu-wine --fixrpc: Reinstalls rpc-bridge if needed!
osu-wine --remove: Uninstalls osu! and the script
osu-wine --changedir: Changes directory of the install according to the user
osu-wine --devserver <address>: Runs osu with an alternative server (e.g. --devserver akatsuki.gg)
osu-wine --runinprefix <file>: Launches a custom executable within osu!'s Wineprefix
osu-wine --osuhandler <beatmap, skin..>: Launches osu-handler-wine with the specified file/link
osu-wine --gosumemory: Installs and runs gosumemory without any needed config!
osu-wine --tosu: Installs and runs tosu without any needed config!
osu-wine --disable-memory-reader: Turn off gosumemory and tosu
osu-wine --akatsuki: Installs and runs Akatsuki patcher
osu-wine --mappingtools: Installs and runs osu! Mapping Tools (experimental, WINE_USE_CACHY=true recommended)"
}
# Won't return failure if there's no internet connection, but tries to update the main script first before calling the function
MainScriptUpdate() {
_clone() { GIT_TERMINAL_PROMPT=0 git clone "https://github.com/NelloKudo/osu-winello.git" "$XDG_DATA_HOME/osuconfig/update" --quiet 2>/dev/null; }
_pull() { GIT_TERMINAL_PROMPT=0 git -C "$XDG_DATA_HOME/osuconfig/update" pull --quiet 2>/dev/null; }
_reset() { GIT_TERMINAL_PROMPT=0 git -C "$XDG_DATA_HOME/osuconfig/update" reset --hard "${1:-HEAD}" --quiet 2>/dev/null; }
if [ ! -d "$XDG_DATA_HOME/osuconfig/update" ]; then
_clone # where did the update directory go? need to clone it first.
else
_pull || { _reset origin/main && _pull; } # I think this should handle when a branch is deleted/main branch changes?
fi
_reset
# check again, doesn't hurt
[ -d "$XDG_DATA_HOME/osuconfig/update" ] || ErrorAndExit "Your osu-winello folder is broken, please reinstall from scratch..."
MainScript "${@:-}"
return $?
}
# Same as above, but without checking for updates
MainScript() {
declare -a CMD POST_ARGS
POST_ARGS=("${@:-}")
CMD=("bash")
# Check for MainScript(Update) exec <command> to not re-enter the launcher after calling the main script
[[ "${POST_ARGS[0]}" = exec* ]] && CMD=("exec" "bash") && POST_ARGS=("${POST_ARGS[@]:1}")
[ -z "${POST_ARGS[*]}" ] && ErrorAndExit "(internal) Missing arguments?"
"${CMD[@]}" "$XDG_DATA_HOME/osuconfig/update/osu-winello.sh" "${POST_ARGS[@]}"
return $? # shouldn't reach this if using exec
}
# Use wine-osu-cachy when enabled in the configuration file
if [ "$WINE_USE_CACHY" == "true" ]; then
MainScript winecachy-setup
export WINE="$XDG_DATA_HOME/osuconfig/yawl-winello-cachy"
export WINE_INSTALL_PATH="$XDG_DATA_HOME/osuconfig/wine-osu-cachy-10.0"
fi
# Allow using bundled gstreamer
if [ -f "${WINE_INSTALL_PATH}/lib/wine/x86_64-unix/libgstfaad.so" ]; then
export GST_PLUGIN_SYSTEM_PATH_1_0="${WINE_INSTALL_PATH}/lib/wine/x86_64-unix"
export WINE_GST_REGISTRY_DIR="${WINEPREFIX}/gstreamer-1.0"
mkdir -p "${WINE_GST_REGISTRY_DIR}"
fi
LaunchOsu() {
declare -a PRE_ARGS POST_ARGS
# only add custom arguments from config if there were none passed to LaunchOsu
if [ -z "${*}" ]; then
# this is sketchy because double spaces won't be handled properly
IFS=" " read -r -a POST_ARGS <<<"${POST_LAUNCH_ARGS}"
else
POST_ARGS=("${@:-}")
fi
IFS=" " read -r -a PRE_ARGS <<<"env ${PRE_LAUNCH_ARGS}"
Info "Opening: $OSUPATH/osu!.exe ${POST_ARGS[*]}"
if [ -f "${OSUPATH}/launch_with_memory.bat" ]; then
if command -v pgrep &>/dev/null; then
{ pgrep 'osu!.exe' &>/dev/null; } || $WINESERVER -k # stop lingering tosu process if any
fi
OSU_EXE=("launch_with_memory.bat")
Info "Click here to open the tosu/gosumemory page: http://localhost:24050 or http://127.0.0.1:24050"
else
OSU_EXE=("osu!.exe")
fi
WINELLO_LOGS_PATH="${XDG_DATA_HOME}/osuconfig/winello.log"
echo "Using configs: ${configs[*]}" &>"${WINELLO_LOGS_PATH}"
Info "The run log is located in ${WINELLO_LOGS_PATH}. Attach this file if you make an issue on GitHub or ask for help on Discord."
Info "Launching: ${PRE_ARGS[*]} ${WINE} ${OSU_EXE[*]} ${POST_ARGS[*]}"
export WINEDEBUG="+timestamp,+pid,+tid,+threadname,+debugstr,+loaddll,+winebrowser,+exec${WINEDEBUG:+,${WINEDEBUG}}"
cd "${OSUPATH}" || { Error "Couldn't change the working directory to your osu! folder... Did you remove it? Try \`osu-wine --changedir\`." && return 1; }
exec "${PRE_ARGS[@]}" "${WINE}" "${OSU_EXE[@]}" "${POST_ARGS[@]}" &>>"${WINELLO_LOGS_PATH}" || return 1
return 0
}
Info() {
echo -e '\033[1;34m'"Winello:\033[0m $*"
}
Warning() {
echo -e '\033[0;33m'"Winello:\033[0m $*"
}
Error() {
echo -e '\033[1;31m'"Winello (error):\033[0m $*"
}
ErrorAndExit() {
echo -e '\033[1;31m'"Script failed:\033[0m $*"
exit 1
}
###################################################################################################
# Begin argument handling
###################################################################################################
# default to MainSciptUpdate, allow overriding from config
: "${mainscriptcommand:=MainScriptUpdate}"
case "$1" in
'n')
# Don't update the launcher before running a command
# e.g. osu-wine n --fixprefix
mainscriptcommand=MainScript
export NOLAUNCHERUPDATE=1 # let osu-winello.sh know we don't want osu-wine to be updated/overwritten
shift
;;
esac
shopt -s extglob
case "$1" in
'--devserver')
if [ -z "$2" ]; then ErrorAndExit "You need to specify a server, e.g. --devserver akatsuki.gg"; fi
LaunchOsu "-devserver" "${@:2}"
;;
###################################################################################################
'--wine')
"$WINE" "${@:2}"
;;
###################################################################################################
'--regedit')
"$WINE" regedit
;;
###################################################################################################
'--winecfg')
"$WINE" winecfg
;;
###################################################################################################
'--edit-config')
Info "Opening your configuration files: ${configs[*]}"
command -v "${CUSTOMEDITOR}" >/dev/null 2>&1 && exec "${CUSTOMEDITOR}" "${configs[*]}"
xdg-open "${configs[*]}" || ErrorAndExit "No text editors were able to open your configuration files..."
;;
###################################################################################################
'--winetricks')
[ ! -x "$XDG_DATA_HOME/osuconfig/winetricks" ] && { $mainscriptcommand "installwinetricks" || ErrorAndExit "Couldn't install winetricks..."; }
"$WINETRICKS" "${@:2}" || ErrorAndExit "Your winetricks command completed with errors..."
;;
###################################################################################################
'--changedir')
$mainscriptcommand "changedir" || ErrorAndExit "Changing directories failed..."
;;
###################################################################################################
'--remove')
$mainscriptcommand "uninstall" || ErrorAndExit "You may have to uninstall/remove the folders manually..."
;;
###################################################################################################
'--kill')
"$WINESERVER" -k
;;
###################################################################################################
'--kill9')
"$WINESERVER" -k9
;;
###################################################################################################
'--update')
# It might look pointless to allow "not-updating" if you want to update... but it's better to leave it predictable
$mainscriptcommand "exec" "update" || ErrorAndExit "The update partially or completely failed..."
;;
###################################################################################################
'--fixfolders')
$mainscriptcommand "fixfolders" || Error "The native file manager integration failed. Will still try to fix osu-handler..."
$mainscriptcommand "fixosuhandler" || ErrorAndExit "The osu-handler setup was unsuccessful..."
;;
###################################################################################################
*--fix*yawl*)
$mainscriptcommand "fixyawl" || ErrorAndExit "yawl may not have been fixed..."
;;
###################################################################################################
'--fixrpc')
$mainscriptcommand "discordrpc" || ErrorAndExit "The Discord RPC bridge installation completed with errors..."
;;
###################################################################################################
'--fixprefix')
$mainscriptcommand "fixprefix" ||
ErrorAndExit "The prefix setup completed with issues... It might have worked, though, so try osu!, or --fixprefix again if it didn't work."
$mainscriptcommand "fixosuhandler" || ErrorAndExit "The osu-handler setup was unsuccessful..."
;;
###################################################################################################
'--tosu')
$mainscriptcommand "tosu" || ErrorAndExit "Couldn't set up tosu..."
;;
'--gosumemory')
$mainscriptcommand "gosumemory" || ErrorAndExit "Couldn't set up gosumemory..."
;;
###################################################################################################
'--akatsuki')
MainScript "akatsukiPatcher" || ErrorAndExit "Couldn't launch akatsuki patcher..."
;;
###################################################################################################
'--mappingtools')
MainScript "mappingTools" || ErrorAndExit "Couldn't launch Mapping Tools..."
;;
###################################################################################################
*--disable-@(*osu*|memory*))
rm -f "$OSUPATH/launch_with_memory.bat"
Info "Memory reader (tosu/gosumemory) disabled."
;;
###################################################################################################
'--osuhandler')
# don't update to avoid unnecessary slowdown
MainScript "exec" "handle" "${@:2}"
;;
###################################################################################################
'--info')
Info "Need info?:
Wineprefix location: $WINEPREFIX
osu! folder: '$OSUPATH'
If you need to add more options to osu!, check the Launch function of the script (ex. nano $BINDIR/osu-wine)
You can run 'osu-wine --help' to see all the script's functions (fix prefix, change dir etc.)
You can find more troubleshooting and info at here: https://osu.ppy.sh/community/forums/topics/1248084?n=1
If you get an error like 'Runtime Platform missing or download incomplete', try running 'osu-wine --fix-yawl'."
;;
###################################################################################################
*--help*)
Help
;;
###################################################################################################
*)
# Fall through to osu
LaunchOsu "${@:1}"
;;
esac