185 lines
7.1 KiB
Bash
185 lines
7.1 KiB
Bash
#!/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
|
|
}
|