get_bottle() { local architecture="${1/win/}" export WINEPREFIX="$HOME/.local/wine${architecture}" # Wine version for bottles if [[ "$game" =~ entombed ]]; then install_wine "6.18" "32" fi if [[ "$game" =~ rs-games ]]; then install_wine "7.0" "32" fi if [[ "$game" =~ shadow-line ]]; then install_wine "7.7" "32" fi } install_wine() { # Requires wine version, e.g. 7.7 and architecture, 32|64 if [[ $# -ne 2 ]]; then exit 1 fi # Figure out wineInstallationPath wineInstallationPath="${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/wine_$2/$1" export wine="${wineInstallationPath}/bin/wine" # If the path exists, wine should already be installed. # Just make sure we didn't wind up with a empty directory for some reason rmdir "${wineInstallationPath}" 2> /dev/null if [[ -d "${wineInstallationPath}" ]]; then return fi mkdir -p "${wineInstallationPath}" 2> /dev/null # This probably does not need to be cached, so download to tmp. installationFile="$(mktemp)" local v=$2 v="${v/32/x86}" v="${v/64/x64}" # Probably wrong, so just a place holder. # If this goes wrong, bail out set -e { curl -L --output "${installationFile}" "https://www.playonlinux.com/wine/binaries/phoenicis/upstream-linux-x86/PlayOnLinux-wine-${1}-upstream-linux-${v}.tar.gz" tar xf "${installationFile}" -C "${wineInstallationPath}"; } | dialog --progressbox "Installing $2 bit Wine version $1." -1 -1 set +e } winetricks() { # Report used packages to the winetricks maintainer so he knows they are being used. if ! [[ -e "${XDG_CACHE_HOME:-$HOME/.cache}/winetricks/track_usage" ]]; then mkdir -p "${XDG_CACHE_HOME:-$HOME/.cache}/winetricks/" echo "1" > "${XDG_CACHE_HOME:-$HOME/.cache}/winetricks/track_usage" fi # Temporary work around for winetricks git bugs. Requires winetricks be installed from package manager. /usr/bin/winetricks "$@" return # Download or update agm's copy of winetricks if [[ ! -e "${winetricksPath}/winetricks" ]]; then checkWinetricksUpdate="true" download "https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks" mv "${cache}/winetricks" "${winetricksPath}" chmod 755 "${winetricksPath}/winetricks" else if [[ "$checkWinetricksUpdate" != "true" ]]; then checkWinetricksUpdate="true" ${winetricksPath}/winetricks --self-update fi fi # Run the requested winetricks parameters if command -v FEXLoader &> /dev/null ; then WINE="" FEXLoader -- ${winetricksPath}/winetricks "$@" else ${winetricksPath}/winetricks "$@" fi } install_rhvoice() { if [[ -d "${WINEPREFIX}/drive_c/Program Files/Olga Yakovleva/" ]]; then return fi if [[ "$norh" == "true" ]]; then # Try to prevent the user from breaking speech # Also useful for games that do not work with RHVoice if [[ "${defaultVoice}" == "RHVoice" ]]; then unset defaultVoice fi return fi declare -A RHVoice=( [alan]="https://github.com/RHVoice/alan-eng/releases/download/4.0/RHVoice-voice-English-Alan-v4.0.2016.21-setup.exe" [bdl]="https://github.com/RHVoice/bdl-eng/releases/download/4.1/RHVoice-voice-English-Bdl-v4.1.2016.21-setup.exe" [clb]="https://github.com/RHVoice/clb-eng/releases/download/4.0/RHVoice-voice-English-Clb-v4.0.2016.21-setup.exe" [lyubov]="https://rhvoice.eu-central-1.linodeobjects.com/RHVoice-voice-English-Lyubov-v4.0.2008.15-setup.exe" [slt]="https://github.com/RHVoice/slt-eng/releases/download/4.1/RHVoice-voice-English-Slt-v4.1.2016.21-setup.exe" ) voiceName="${voiceName:-bdl}" voiceName="${voiceName,,}" if [[ "${RHVoice[${voiceName}]}" == "" ]]; then echo "Invalid RHVoice name specified, defaulting to Bdl." voiceName="bdl" fi local voiceFile="${RHVoice[${voiceName}]##*/}" download "${RHVoice[${voiceName}]}" winetricks -q win8 echo "Installing RHVoice ${voiceName^}..." ${wine} "${cache}/${voiceFile}" & sleep 20 ${wine}server -k } install_wine_bottle() { # Wine defaults to 64, so if you need 32 bit, don't forget export WINEARCH=win32 export WINEARCH="${WINEARCH:-win32}" # Figure out if we are using a specific version of wine export wine="${wine:-$(command -v wine)}" # Set the WINE and WINESERVER environmental variables so winetricks will use the right installation. export WINE="${wine}" export WINESERVER="${wine}server" # Installation paths are based on WINEARCH unless bottle is set. if [[ ${#bottle} -gt 0 ]]; then local bottle="${game,,}" bottle="${bottle//[[:space:]]/-}" if [[ -d "$HOME/.local/wine/${bottle}" ]]; then echo "$HOME/.local/wine/${bottle} exists. Please remove it before running this installer." exit 1 fi fi if [[ ( -z "$WINEARCH" || "$WINEARCH" == "win64" ) && ! "$*" =~ speechsdk ]]; then local architecture=64 else local architecture=32 fi export WINEPREFIX="$HOME/.local/wine${bottle:+/}${bottle:-$architecture}" # Arguments to the function are dependancies to be installed. # Get location of mono and gecko. monoPath="$(find /usr/share/wine/ -maxdepth 1 -type d -name mono 2> /dev/null)" geckoPath="$(find /usr/share/wine/ -maxdepth 1 -type d -name "gecko" 2> /dev/null)" if [[ -z "$monoPath" ]]; then download 'http://dl.winehq.org/wine/wine-mono/6.0.0/wine-mono-6.0.0-x86.msi' monoPath="${cache}/wine-mono-6.0.0-x86.msi" fi if [[ -z "$geckoPath" ]]; then download 'http://dl.winehq.org/wine/wine-gecko/2.40/wine_gecko-2.40-x86.msi' geckoPath="${cache}/wine_gecko-2.40-x86.msi" fi echo -n "Using " ${wine} --version DISPLAY="" ${wine}boot -u ${wine} msiexec /i z:"$monoPath" /quiet ${wine} msiexec /i z:"$geckoPath" /quiet if [[ "${*}" =~ (speechsdk|sapi) ]]; then install_rhvoice fi if [[ "${WINEARCH}" == "win64" ]]; then download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" fi if [[ "${WINEARCH}" == "win64" ]] && [[ ! -f "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" ]]; then cp "${cache}/nvda2speechd" "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" chmod +x "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" fi winetricks -q isolate_home $@ ${winVer:-win7} ${winetricksSettings} # make it easy for game scripts to know which version of wine to use. if [[ ${#bottle} -gt 1 ]]; then echo "WINE=\"${WINE}\"" > "$HOME/.local/wine/${bottle}/agm.conf" echo "WINESERVER=\"${WINESERVER}\"" >> "$HOME/.local/wine/${bottle}/agm.conf" echo "Setting default voice for bottle \"${bottle}\" to \"${defaultVoice}\"." "${0%/*}/speech/set-voice.sh" -b "${bottle}" -r "${defaultRate:-7}" -v "${defaultVoice}" fi # If default voice is set, change it for the current architecture if [[ -z "$bottle" ]]; then if [[ ${#defaultVoice} -ge 2 ]] && [[ "${*}" =~ (speechsdk|sapi) ]]; then echo "Setting default voice for wine${architecture}." "${0%/*}/speech/set-voice.sh" -b "${bottle}" -r "${defaultRate:-7}" -v "${defaultVoice}" fi fi } add_launcher() { local launchSettings="${WINEARCH:-win64}|${1}|${game}" shift while [[ $# -gt 0 ]]; do launchSettings+="|$1" shift done if ! grep -F -q -x "${launchSettings}" "${configFile}" 2> /dev/null ; then echo "${launchSettings}" >> "${configFile}" sort -o "${configFile}" "${configFile}" # Remove .lnk files because they don't work. find ~/Desktop -type f -iname '*.lnk' -exec bash -c ' for f ; do mimeType="$(file -b "$f")" mimeType="${mimeType%%,*}" if [[ "$mimeType" == "MS Windows shortcut" ]]; then rm -v "$f" fi done' _ {} + if [[ "${noCache}" == "true" ]]; then rm -f "${cache}/${1##*\\}" fi fi }