#!/usr/bin/env bash get_bottle() { # Simple rule: wine64 for everything, wine32 only for speech APIs local architecture="${1:-win64}" architecture="${architecture/win/}" export WINEPREFIX="$HOME/.local/wine${architecture}" } # Note: install_wine function removed - we now use system wine with simplified bottle management 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 | agm_progressbox "RHVoice Setup" "Preparing Windows environment for RHVoice..." echo "Installing RHVoice ${voiceName^}..." "${WINE:-wine}" "${cache}/${voiceFile}" & sleep 20 | agm_progressbox "RHVoice Setup" "Installing RHVoice ${voiceName^} voice..." "${WINESERVER:-wineserver}" -k } install_wine_bottle() { # Respect explicit WINEARCH settings, otherwise default to wine64 if [[ -z "$WINEARCH" ]]; then # Default behavior: wine32 only for legacy speechsdk, wine64 for everything else if [[ "$*" =~ speechsdk ]]; then export WINEARCH="win32" else export WINEARCH="win64" fi fi # Set architecture for WINEPREFIX path local architecture if [[ "$WINEARCH" == "win32" ]]; then architecture=32 else architecture=64 fi export WINEPREFIX="$HOME/.local/wine${architecture}" # Use managed wine32 for SAPI compatibility, system wine for everything else if [[ "$WINEARCH" == "win32" ]] && [[ -n "$wine32" ]]; then export WINE="$wine32" export WINESERVER="$wine32server" echo "Using managed Wine32 for SAPI compatibility" else export WINE="wine" export WINESERVER="wineserver" fi # Check if bottle already exists and is properly initialized local bottleExists=false if [[ -d "$WINEPREFIX" ]] && [[ -f "$WINEPREFIX/system.reg" ]] && [[ -f "$WINEPREFIX/user.reg" ]]; then bottleExists=true echo "Using existing wine${architecture} bottle at $WINEPREFIX" fi # Only do basic setup if bottle doesn't exist if [[ "$bottleExists" == false ]]; then echo -n "Creating new wine${architecture} bottle - Using " "$WINE" --version DISPLAY="" "$WINE" wineboot -u | agm_progressbox "Wine Setup" "Initializing wine bottle..." # Install mono and gecko only for new bottles 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 "$WINE" msiexec /i z:"$monoPath" /quiet | agm_progressbox "Wine Setup" "Installing .NET Framework..." "$WINE" msiexec /i z:"$geckoPath" /quiet | agm_progressbox "Wine Setup" "Installing Web Browser support..." fi # Install RHVoice only if needed and not already installed if [[ "${*}" =~ (speechsdk|sapi) ]]; then install_rhvoice fi # Setup nvda2speechd for wine64 bottles (only once) if [[ "${WINEARCH}" == "win64" ]]; then download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" if [[ ! -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 fi # Install winetricks dependencies - this is more complex to optimize # For now, let winetricks handle checking if packages are already installed if [[ $# -gt 0 ]] || [[ -n "${winVer}" ]] || [[ -n "${winetricksSettings}" ]]; then winetricks -q isolate_home "$@" "${winVer:-win7}" ${winetricksSettings} | agm_progressbox "Wine Setup" "Installing wine dependencies..." fi # Set default voice for speech-enabled games (only if not already set) if [[ ${#defaultVoice} -ge 2 ]] && [[ "$*" =~ (speechsdk|sapi) ]]; then echo "Setting default voice for wine${architecture}." "${0%/*}/speech/set-voice.sh" -b "wine${architecture}" -r "${defaultRate:-7}" -v "${defaultVoice}" 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 }