#!/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}" # Set wine executables based on architecture - FOR LAUNCHER if [[ "$architecture" == "32" ]] && [[ -n "$wine32" ]]; then # Set environment variables for winetricks compatibility export WINE="$wine32" export WINESERVER="$wine32server" # Also prepend to PATH for regular wine calls export PATH="${wine32%/*}:$PATH" # Unset WINEARCH to avoid conflicts with system wine unset WINEARCH echo "DEBUG: Using managed wine32 for LAUNCHER (WINE=$WINE, PATH updated, WINEARCH unset)" else # Clear wine variables for system wine unset WINE WINESERVER WINEARCH echo "DEBUG: Using system wine for LAUNCHER (architecture $architecture)" fi } # Set wine environment for installation (called from install_wine_bottle) set_wine_env() { local architecture="$1" if [[ "$architecture" == "32" ]] && [[ -n "$wine32" ]]; then export WINE="$wine32" export WINESERVER="$wine32server" export PATH="${wine32%/*}:$PATH" unset WINEARCH echo "DEBUG: Set wine32 environment for INSTALLATION (WINE=$WINE)" else unset WINE WINESERVER WINEARCH echo "DEBUG: Set system wine environment for INSTALLATION" fi } # 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 "${cache}/${voiceFile}" & sleep 20 | agm_progressbox "RHVoice Setup" "Installing RHVoice ${voiceName^} voice..." wineserver -k } install_wine_bottle() { # Simplified - bottles are now pre-created with dependencies # Just set up the wine environment for game installation # Determine architecture from WINEARCH or speechsdk dependency if [[ -z "$WINEARCH" ]]; then 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}" # Set wine environment set_wine_env "$architecture" echo "Using pre-configured wine${architecture} bottle at $WINEPREFIX" # Install any additional game-specific dependencies if specified if [[ $# -gt 0 ]]; then # Filter out dependencies that are already installed in bottle creation local depsToInstall=() local alreadyInstalled="speechsdk corefonts isolate_home" for dep in "$@"; do # Skip dependencies already installed during bottle creation if [[ ! " $alreadyInstalled " =~ " $dep " ]] && [[ ! "$dep" =~ ^win(7|8|10)$ ]]; then depsToInstall+=("$dep") fi done if [[ ${#depsToInstall[@]} -gt 0 ]]; then echo "Installing additional dependencies: ${depsToInstall[*]}" { env WINE="$WINE" WINESERVER="$WINESERVER" DISPLAY="${DISPLAY:-:0}" winetricks -q isolate_home "${depsToInstall[@]}" "${winVer:-win7}" ${winetricksSettings} } | agm_progressbox "Wine Setup" "Installing additional dependencies..." fi fi } add_launcher() { # Determine architecture from WINEPREFIX path instead of WINEARCH variable local architecture="win64" # default if [[ "$WINEPREFIX" =~ wine32 ]]; then architecture="win32" fi local launchSettings="${architecture}|${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 }