197 lines
8.4 KiB
Bash
197 lines
8.4 KiB
Bash
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
|
|
}
|